Menu

API reference · CRM

Sequence enrollments

crm · sequence_enrollments · 10 operations

GET/v1/crm/sequences/{sequence_id}/enrollments

List the enrollments of a sequence

crm.sequences.enrollments.list

ReadIdempotentSince 2026-11-01

Lists the enrollments of a sequence (one per contact and pass through it), newest first, paginated by cursor (limit up to 200); filter by status (pending, active, paused, waiting_task, completed, exited, failed: one, or a list of them). Each item has the person id, the linked deal (deal_id, deal_title, deal_pipeline_id), the status, the current step, when the next step runs (next_action_at), why it is paused (pause_reason, pause_cause, pause_step_id) or how it ended (exit_reason), the email and WhatsApp counters, history_count and last_history (the last step the engine ran: step_id, executed_at, result and error_message when it failed; null if nothing ran yet). With include_step_results=true each item also has step_results, one row per step and result over the whole stored history ({step_id, result, count}); with include_person=true, person ({id, full_name, email}, or null if the person no longer exists), one read per person of the page. The full step history comes with crm.sequences.enrollments.get. A seller with restricted scope only sees the enrollments of persons they can see, so a page can bring fewer items than limit while has_more is true. Not found (sequence_not_found) if the sequence does not exist. Requires view access to the CRM.

Scope
crm:read
Permission
View the module
MCP tool
crm_sequences_enrollments_listOn the full surface; on the compact one, mb_execute_operation with id: "crm.sequences.enrollments.list".

Declared cost: up to 403 reads and 0 writes per call (they count against the daily quota).

Parameters

sequence_idstringpathrequired

The sequence: an id from crm.sequences.list.

limitintegerqueryoptional

How many items this page brings at most (see the maximum and the default in the schema).

Default: 25

cursorstringqueryoptional

The next_cursor of the previous page, exactly as it came (only for the same list and filters); without it, the first page.

statusenum | array<enum>queryoptional

Only the enrollments in this status, or in any of several: pending (waiting for the sequence to be activated), active, paused, waiting_task, completed, exited or failed.

Values: pending, active, paused, waiting_task, completed, exited, failed

include_step_resultsbooleanqueryoptional

Also return step_results: how many times each step ended with each result, over the whole saved history. No extra reads, but heavier rows.

include_personbooleanqueryoptional

Also return person (id, full name and main email) on each row: one extra read per person of the page.

Response

dataarray<object>
has_moreboolean
next_cursorstring

Errors

Example

curl "https://api.mb-suite.com/v1/crm/sequences/{sequence_id}/enrollments" \
  -H "Authorization: Bearer $MB_API_KEY"

Try it with your test API key

With a test API key the request always goes to your practice organization: example data you can reset.

curl "https://api.mb-suite.com/v1/crm/sequences/{sequence_id}/enrollments" \
  -H "Authorization: Bearer $MB_TEST_KEY"
GET/v1/crm/sequence-enrollments/{enrollment_id}

Get one enrollment with its step history

crm.sequences.enrollments.get

ReadIdempotentSince 2026-11-01

Returns one sequence enrollment with its last 100 history entries (each step the engine ran: when, and the result such as sent, task_created, condition_evaluated, whatsapp_replied or error with error_message), besides its status, current step, pause reason and cause, exit reason, counters, last_history and person ({id, full_name, email}, or null if the person no longer exists). Use it to explain why a contact is paused or failed before resuming or retrying it. Not found (sequence_enrollment_not_found) if the id does not exist or, for a seller with restricted scope, the person is not one they can see. Requires view access to the CRM.

Scope
crm:read
Permission
View the module
MCP tool
crm_sequences_enrollments_getOn the full surface; on the compact one, mb_execute_operation with id: "crm.sequences.enrollments.get".

Declared cost: up to 3 reads and 0 writes per call (they count against the daily quota).

Parameters

enrollment_idstringpathrequired

The enrollment: an id from crm.sequences.enrollments.list (or crm.persons.enrollments.list).

Response

idstring
sequence_idstring
person_idstring
statusenum

Values: pending, active, paused, waiting_task, completed, exited, failed

history_countnumber
last_historyobject | null
deal_idstring | null
deal_titlestring | null
deal_pipeline_idstring | null
current_step_idstring | null
current_step_indexnumber
current_branch_idstring | null
next_action_atnumber | null

When the next step runs (epoch ms); null once it ended (completed, exited or failed).

first_step_armed_atnumber | null
pause_reasonstring | null
pause_causestring | null
pause_step_idstring | null
paused_untilnumber | null
waiting_task_idstring | null
waiting_step_idstring | null
waiting_task_deadlinenumber | null
exit_reasonstring | null
exited_atnumber | null
completed_atnumber | null
end_reasonstring | null
end_step_idstring | null
enrolled_atnumber
enrolled_by_idstring | null
enrolled_by_namestring | null

The name of the member who enrolled the contact (null for automatic enrollments or a former member).

enrollment_sourceobject | null
chain_depthnumber | null
chain_fromobject | null
emails_openednumber
emails_clickednumber
emails_repliednumber
emails_bouncednumber
emails_sentnumber | null
whatsapp_repliednumber | null
branch_historyarray<object>
assigned_variant_by_stepobject

The A/B variant each automatic email step assigned to this contact: step id → variant id.

account_idstring | null

The company whose replies the sending rules' account_reply_delay watches.

historyarray<object>
step_resultsarray<object>
personobject | null
updated_atnumber

Errors

Example

curl "https://api.mb-suite.com/v1/crm/sequence-enrollments/{enrollment_id}" \
  -H "Authorization: Bearer $MB_API_KEY"

Try it with your test API key

With a test API key the request always goes to your practice organization: example data you can reset.

curl "https://api.mb-suite.com/v1/crm/sequence-enrollments/{enrollment_id}" \
  -H "Authorization: Bearer $MB_TEST_KEY"
POST/v1/crm/sequences/{sequence_id}/enrollments

Enroll contacts in a sequence (they may start receiving messages)

crm.sequences.enrollments.create

WriteBulk · up to 200Since 2026-11-01

Enrolls contacts in a sequence: send person_ids (up to 200 person ids) or list_id (every member of a CRM list, processed in batches of 200), not both. The bulk limit of 200 applies to person_ids: with list_id every current member of the list is enrolled, however many there are (the dry run says how many; members who join the list between the dry run and the confirmation are enrolled too); deal_id goes only with person_ids, links that deal (with its title and pipeline) to every enrollment and must be a deal of those persons. Persons already in progress in the sequence are skipped, and so are, for a seller with restricted scope, the persons they cannot see or whose deal they do not work. If the sequence is ACTIVE the engine sends them step 1 within minutes (honoring its wait, the schedule and the sending rules) and what is sent cannot be recalled; if it is inactive they wait as pending until crm.sequences.activate. start_at (optional, ISO 8601 with its time zone, e.g. 2026-10-12T10:37:00-03:00): a future one is the earliest time step 1 can go out (the engine picks the enrollments up then, and step 1's wait, the schedule and the sending rules apply from that time); a past one, up to 30 days back, counts step 1's wait from that time, so if the wait is already over step 1 goes out on the engine's next run, within the schedule. More than 30 days ahead or back is invalid_input (param start_at, with details.max_start_at or details.min_start_at), and on an inactive sequence any start_at is sequence_inactive (its contacts would all start together when it is activated and the time would be lost). To enroll ONE person, crm.sequences.enrollments.add does it in a single call. Sequences that link deals attach each person's most recent open deal. Outside the app it always runs in two steps: dry_run=true returns how many are enrolled and skipped, the first names and a confirm_token (10 minutes); then call again with the same input and that confirm_token. No webhook event is sent for enrollments yet. The declared cost is the worst case (a whole list); a call is charged what it really reads and writes. Errors: sequence_not_found, sequence_without_steps, list_not_found, deal_not_found, deal_not_of_person, invalid_input, sequence_inactive, crm_action_denied (enroll_in_sequence: a deal outside the seller's scope). Returns enrolled, skipped, deal_linked, total and, with start_at, start_at (ms). Requires enroll_in_sequence (every member except viewers).

Instructions for agents

Run the dry run first and tell the person how many contacts will be enrolled and whether the sequence is active (then they start receiving messages); enroll them only after they confirm.

Needs confirmation: first dry_run: true (preview and confirm_token, valid 10 minutes and for one run), then the same body with confirm_token. In a few operations only with certain data: the description says when. Why and how: Dry run and confirm_token.

Scope
crm:write
Permission
Edit in the module · CRM action: enroll_in_sequence
MCP tool
crm_sequences_enrollments_createOn the full surface; on the compact one, mb_execute_operation with id: "crm.sequences.enrollments.create".

Declared cost: up to 30001 reads and 5001 writes per call (they count against the daily quota).

Parameters

sequence_idstringpathrequired

The sequence: an id from crm.sequences.list.

person_idsarray<string>bodyoptional

The people to enroll (up to 200): ids from crm.persons.list. Send person_ids or list_id, not both.

list_idstringbodyoptional

A CRM list whose members are enrolled, all of them: an id from crm.lists.list. Send person_ids or list_id, not both.

deal_idstring | ""bodyoptional

The deal the enrollment works on: an id from crm.deals.list of one of the person's deals. Without it, sequences that link deals take the person's most recent open deal. Only with person_ids.

start_atstring (date-time)bodyoptional

When the first step may go out, ISO 8601 with its time zone (2026-10-12T10:37:00-03:00 or …Z), up to 30 days ahead or back: a future time holds the first step until then; a past one counts the first step's wait from that time. Without it, now.

Response

enrollednumber
skippednumber
deal_linkednumber
totalnumber
start_atnumber

Errors

Example

curl -X POST "https://api.mb-suite.com/v1/crm/sequences/{sequence_id}/enrollments" \
  -H "Authorization: Bearer $MB_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
  "dry_run": true
}'

Try it with your test API key

With a test API key the request always goes to your practice organization: example data you can reset.

curl -X POST "https://api.mb-suite.com/v1/crm/sequences/{sequence_id}/enrollments" \
  -H "Authorization: Bearer $MB_TEST_KEY" \
  -H "Content-Type: application/json" \
  -d '{
  "dry_run": true
}'
POST/v1/crm/sequence-enrollments/{enrollment_id}/exit

Take a contact out of a sequence

crm.sequences.enrollments.exit

WriteSince 2026-11-01

Takes one contact out of a sequence (exit_reason manual): they get no more steps; a CRM task the sequence already created stays for the seller. Only an enrollment in progress (pending, active, paused or waiting for a task) can exit: otherwise sequence_enrollment_status_conflict. No webhook event is sent for it yet. Allowed to the sequence's author, the person's owner, Managers and admins (crm_action_denied manage_sequences otherwise). Requires full access to the CRM.

Scope
crm:write
Permission
Edit in the module
MCP tool
crm_sequences_enrollments_exitOn the full surface; on the compact one, mb_execute_operation with id: "crm.sequences.enrollments.exit".

Declared cost: up to 3 reads and 2 writes per call (they count against the daily quota).

Parameters

enrollment_idstringpathrequired

The enrollment: an id from crm.sequences.enrollments.list (or crm.persons.enrollments.list).

reasonenumbodyoptional

Why the contact leaves: manual (the only value; it is recorded as exit_reason).

Values: manual · Default: "manual"

Response

oktrue

Errors

Example

curl -X POST "https://api.mb-suite.com/v1/crm/sequence-enrollments/{enrollment_id}/exit" \
  -H "Authorization: Bearer $MB_API_KEY"

Try it with your test API key

With a test API key the request always goes to your practice organization: example data you can reset.

curl -X POST "https://api.mb-suite.com/v1/crm/sequence-enrollments/{enrollment_id}/exit" \
  -H "Authorization: Bearer $MB_TEST_KEY"
POST/v1/crm/sequences/{sequence_id}/enrollments/bulk/exit

Take many contacts out of one sequence

crm.sequences.enrollments.bulk.exit

WriteBulk · up to 200IdempotentSince 2026-11-01

Takes up to 200 contacts out of one sequence at once (exit_reason manual). Ids that are not enrollments in progress of THAT sequence (another sequence, finished, or not found) are skipped without touching them. Allowed to the sequence's author, Managers and admins. Bulk: outside the screen it requires a dry run (how many exit and how many are skipped) and a confirm_token. Returns exited. Requires full access to the CRM.

Needs confirmation: first dry_run: true (preview and confirm_token, valid 10 minutes and for one run), then the same body with confirm_token. In a few operations only with certain data: the description says when. Why and how: Dry run and confirm_token.

Scope
crm:write
Permission
Edit in the module
MCP tool
crm_sequences_enrollments_bulk_exitOn the full surface; on the compact one, mb_execute_operation with id: "crm.sequences.enrollments.bulk.exit".

Declared cost: up to 201 reads and 201 writes per call (they count against the daily quota).

Parameters

sequence_idstringpathrequired

The sequence: an id from crm.sequences.list.

enrollment_idsarray<string>bodyrequired

The enrollments of that sequence that leave (up to 200): ids from crm.sequences.enrollments.list.

Response

exitednumber

Errors

Example

curl -X POST "https://api.mb-suite.com/v1/crm/sequences/{sequence_id}/enrollments/bulk/exit" \
  -H "Authorization: Bearer $MB_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
  "enrollment_ids": [
    "ENROLLMENT_ID"
  ],
  "dry_run": true
}'

Try it with your test API key

With a test API key the request always goes to your practice organization: example data you can reset.

curl -X POST "https://api.mb-suite.com/v1/crm/sequences/{sequence_id}/enrollments/bulk/exit" \
  -H "Authorization: Bearer $MB_TEST_KEY" \
  -H "Content-Type: application/json" \
  -d '{
  "enrollment_ids": [
    "ENROLLMENT_ID"
  ],
  "dry_run": true
}'
POST/v1/crm/sequence-enrollments/{enrollment_id}/pause

Pause one contact in a sequence

crm.sequences.enrollments.pause

WriteSince 2026-11-01

Pauses one active contact in a sequence: the engine skips them until they are resumed with crm.sequences.enrollments.resume (activating the sequence does not resume a pause made by hand). Only an active enrollment can be paused: otherwise sequence_enrollment_status_conflict. Allowed to the sequence's author, the person's owner, Managers and admins (crm_action_denied manage_sequences otherwise). Requires full access to the CRM.

Scope
crm:write
Permission
Edit in the module
MCP tool
crm_sequences_enrollments_pauseOn the full surface; on the compact one, mb_execute_operation with id: "crm.sequences.enrollments.pause".

Declared cost: up to 3 reads and 1 writes per call (they count against the daily quota).

Parameters

enrollment_idstringpathrequired

The enrollment: an id from crm.sequences.enrollments.list (or crm.persons.enrollments.list).

Response

oktrue

Errors

Example

curl -X POST "https://api.mb-suite.com/v1/crm/sequence-enrollments/{enrollment_id}/pause" \
  -H "Authorization: Bearer $MB_API_KEY"

Try it with your test API key

With a test API key the request always goes to your practice organization: example data you can reset.

curl -X POST "https://api.mb-suite.com/v1/crm/sequence-enrollments/{enrollment_id}/pause" \
  -H "Authorization: Bearer $MB_TEST_KEY"
POST/v1/crm/sequence-enrollments/{enrollment_id}/resume

Resume one paused contact (their next step may send right away)

crm.sequences.enrollments.resume

WriteSince 2026-11-01

Resumes one paused contact (paused by hand, by the engine or by a configuration problem) and clears the pause reason: the engine runs their pending step within minutes (if step 1 has not run yet, its wait keeps counting from when they were enrolled or from their start_at, not from the resume), so an email or WhatsApp message may go out right away. Only a paused enrollment can be resumed: otherwise sequence_enrollment_status_conflict. Outside the app it needs a dry run and its confirm_token. Allowed to the sequence's author, the person's owner, Managers and admins (crm_action_denied manage_sequences otherwise). Requires full access to the CRM.

Needs confirmation: first dry_run: true (preview and confirm_token, valid 10 minutes and for one run), then the same body with confirm_token. In a few operations only with certain data: the description says when. Why and how: Dry run and confirm_token.

Scope
crm:write
Permission
Edit in the module
MCP tool
crm_sequences_enrollments_resumeOn the full surface; on the compact one, mb_execute_operation with id: "crm.sequences.enrollments.resume".

Declared cost: up to 3 reads and 1 writes per call (they count against the daily quota).

Parameters

enrollment_idstringpathrequired

The enrollment: an id from crm.sequences.enrollments.list (or crm.persons.enrollments.list).

Response

oktrue

Errors

Example

curl -X POST "https://api.mb-suite.com/v1/crm/sequence-enrollments/{enrollment_id}/resume" \
  -H "Authorization: Bearer $MB_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
  "dry_run": true
}'

Try it with your test API key

With a test API key the request always goes to your practice organization: example data you can reset.

curl -X POST "https://api.mb-suite.com/v1/crm/sequence-enrollments/{enrollment_id}/resume" \
  -H "Authorization: Bearer $MB_TEST_KEY" \
  -H "Content-Type: application/json" \
  -d '{
  "dry_run": true
}'
POST/v1/crm/sequence-enrollments/{enrollment_id}/retry

Retry a failed enrollment

crm.sequences.enrollments.retry

WriteSince 2026-11-01

Retries a failed enrollment: it goes back to active in the same step that failed and the engine tries that step again within minutes, with a fresh error streak. Use it after fixing the cause (the WhatsApp line, the template, the sender). Only a failed enrollment can be retried (sequence_enrollment_status_conflict), and only in an active sequence (sequence_inactive). Outside the app it needs a dry run and its confirm_token. Allowed to the sequence's author, the person's owner, Managers and admins (crm_action_denied manage_sequences otherwise). Requires full access to the CRM.

Needs confirmation: first dry_run: true (preview and confirm_token, valid 10 minutes and for one run), then the same body with confirm_token. In a few operations only with certain data: the description says when. Why and how: Dry run and confirm_token.

Scope
crm:write
Permission
Edit in the module
MCP tool
crm_sequences_enrollments_retryOn the full surface; on the compact one, mb_execute_operation with id: "crm.sequences.enrollments.retry".

Declared cost: up to 3 reads and 2 writes per call (they count against the daily quota).

Parameters

enrollment_idstringpathrequired

The enrollment: an id from crm.sequences.enrollments.list (or crm.persons.enrollments.list).

Response

oktrue

Errors

Example

curl -X POST "https://api.mb-suite.com/v1/crm/sequence-enrollments/{enrollment_id}/retry" \
  -H "Authorization: Bearer $MB_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
  "dry_run": true
}'

Try it with your test API key

With a test API key the request always goes to your practice organization: example data you can reset.

curl -X POST "https://api.mb-suite.com/v1/crm/sequence-enrollments/{enrollment_id}/retry" \
  -H "Authorization: Bearer $MB_TEST_KEY" \
  -H "Content-Type: application/json" \
  -d '{
  "dry_run": true
}'
POST/v1/crm/sequences/{sequence_id}/enrollments/resume-paused

Resume every contact paused by a configuration problem

crm.sequences.enrollments.resume_paused

WriteBulk · up to 1IdempotentSince 2026-11-01

Resumes at once every contact the engine paused in a sequence because of a configuration problem (pause_reason config_error; only the ones paused at step_id, if sent) and closes the health warnings of those steps: they get their pending step within minutes. If the configuration is still broken they pause again on the next run and the warning comes back. Contacts paused by hand are not touched. Only for an active sequence (sequence_inactive). Outside the app it runs in two steps, like a bulk operation: dry_run=true returns how many resume and a confirm_token. Returns resumed. Allowed to the sequence's author, Managers and admins. Requires full access to the CRM.

Needs confirmation: first dry_run: true (preview and confirm_token, valid 10 minutes and for one run), then the same body with confirm_token. In a few operations only with certain data: the description says when. Why and how: Dry run and confirm_token.

Scope
crm:write
Permission
Edit in the module
MCP tool
crm_sequences_enrollments_resume_pausedOn the full surface; on the compact one, mb_execute_operation with id: "crm.sequences.enrollments.resume_paused".

Declared cost: up to 2001 reads and 2001 writes per call (they count against the daily quota).

Parameters

sequence_idstringpathrequired

The sequence: an id from crm.sequences.list.

step_idstringbodyoptional

Only the contacts paused at this step: a step id from crm.sequences.get (or the step_id of a crm.sequences.health.list issue). Without it, all the paused ones.

Response

resumednumber

Errors

Example

curl -X POST "https://api.mb-suite.com/v1/crm/sequences/{sequence_id}/enrollments/resume-paused" \
  -H "Authorization: Bearer $MB_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
  "dry_run": true
}'

Try it with your test API key

With a test API key the request always goes to your practice organization: example data you can reset.

curl -X POST "https://api.mb-suite.com/v1/crm/sequences/{sequence_id}/enrollments/resume-paused" \
  -H "Authorization: Bearer $MB_TEST_KEY" \
  -H "Content-Type: application/json" \
  -d '{
  "dry_run": true
}'
POST/v1/crm/sequences/{sequence_id}/enrollments/add

Enroll one person in a sequence (optional start time)

crm.sequences.enrollments.add

WriteSince 2026-11-01

Enrolls ONE person in a sequence: person_id, optionally deal_id (a deal of that person, saved with its title and pipeline; for a seller with restricted scope, one they work) and start_at. If the sequence is ACTIVE the engine sends their step 1 from now, or from start_at (ISO 8601 with its time zone, e.g. 2026-10-12T10:37:00-03:00): a future one is the earliest time step 1 can go out (step 1's wait, the schedule and the sending rules apply from that time); a past one, up to 30 days back, counts step 1's wait from that time, so if the wait is already over step 1 goes out on the engine's next run, within the schedule. What is sent cannot be recalled; if the sequence is inactive they wait as pending until crm.sequences.activate. More than 30 days ahead or back is invalid_input (param start_at, with details.max_start_at or details.min_start_at); any start_at on an inactive sequence is sequence_inactive. Sequences that link deals attach their most recent open deal when no deal_id is sent. If they are already in progress in the sequence nothing is written and it returns enrolled false with reason already_enrolled and that enrollment (enrollment_id, status, next_action_at); for a seller with restricted scope, a linked deal they do not work returns enrolled false with reason out_of_scope. Otherwise it returns enrolled true, enrollment_id, status (active or pending), next_action_at (ms; null while pending; with a past start_at it can be a past time: the engine takes them on its next run) and deal_id. No webhook event is sent for enrollments yet. Errors: sequence_not_found, person_not_found (also a person a seller with restricted scope cannot see), sequence_without_steps, deal_not_found, deal_not_of_person, invalid_input, sequence_inactive, crm_action_denied (enroll_in_sequence). Requires enroll_in_sequence (every member except viewers). To enroll many people at once use crm.sequences.enrollments.create. add is the path for one lead at a time, with a small declared cost; since it leaves the sequence writing to that person, outside the app it runs in two steps like create: dry_run=true checks the sequence, the person and the deal and returns a confirm_token (10 minutes), then call again with the same input and that confirm_token. With an active sequence it starts sending, so ask the person first when they did not ask for it.

Instructions for agents

Tell the person which sequence and whether it is active (then they start receiving its messages from now or from start_at); enroll only after they agree.

Needs confirmation: first dry_run: true (preview and confirm_token, valid 10 minutes and for one run), then the same body with confirm_token. In a few operations only with certain data: the description says when. Why and how: Dry run and confirm_token.

Scope
crm:write
Permission
Edit in the module · CRM action: enroll_in_sequence
MCP tool
crm_sequences_enrollments_addOn the full surface; on the compact one, mb_execute_operation with id: "crm.sequences.enrollments.add".

Declared cost: up to 25 reads and 2 writes per call (they count against the daily quota).

Parameters

sequence_idstringpathrequired

The sequence: an id from crm.sequences.list.

person_idstringbodyrequired

The person to enroll: an id from crm.persons.list.

deal_idstring | ""bodyoptional

The deal the enrollment works on: an id from crm.deals.list of one of the person's deals. Without it, sequences that link deals take the person's most recent open deal.

start_atstring (date-time)bodyoptional

When the first step may go out, ISO 8601 with its time zone (2026-10-12T10:37:00-03:00 or …Z), up to 30 days ahead or back: a future time holds the first step until then; a past one counts the first step's wait from that time. Without it, now.

Response

enrolledboolean
reasonenum

Values: already_enrolled, out_of_scope

enrollment_idstring
statusenum

Values: pending, active, paused, waiting_task, completed, exited, failed

next_action_atnumber | null
deal_idstring | null

Errors

Example

curl -X POST "https://api.mb-suite.com/v1/crm/sequences/{sequence_id}/enrollments/add" \
  -H "Authorization: Bearer $MB_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
  "person_id": "PERSON_ID",
  "dry_run": true
}'

Try it with your test API key

With a test API key the request always goes to your practice organization: example data you can reset.

curl -X POST "https://api.mb-suite.com/v1/crm/sequences/{sequence_id}/enrollments/add" \
  -H "Authorization: Bearer $MB_TEST_KEY" \
  -H "Content-Type: application/json" \
  -d '{
  "person_id": "PERSON_ID",
  "dry_run": true
}'