Core

Sequences

Sequences are multi-step lifecycle journeys built in the dashboard. You can enroll contacts directly via the API, though most teams let automations enroll based on synced state.

You usually don't enroll from code

Prefer syncing state and letting an automation enroll the contact (e.g. "when a contact is created, enroll in onboarding"). Direct enrollment is here for the cases where your app is the right place to decide.

Enroll a contact

POST/sequences/enroll/scope: sequences:enroll

Enrolls a contact in a sequence by its slug. The contact is auto-created if it doesn't exist. The sequence must be active.

FieldTypeDescription
emailrequiredstringThe contact to enroll (created if absent).
sequence_slugrequiredstringThe sequence's slug. Must be an active sequence (see list below).
metadataobjectOptional data attached to the enrollment.
trigger_sourcestringOptional label for where the enrollment came from. Defaults to api.
override_unsubscribebooleanOptional. Enroll even if normally suppressed. Use with care.
enroll
curl -X POST "https://api.meisa.io/api/v1/sequences/enroll/" \
  -H "X-API-Key: meisa_live_your_key" \
  -H "Content-Type: application/json" \
  -d '{
    "email": "[email protected]",
    "sequence_slug": "onboarding",
    "metadata": { "signup_source": "website" }
  }'

A contact already active or paused in that sequence is rejected, so it's safe to call without double-enrolling.

Bulk enroll

POST/sequences/api/bulk-enroll/scope: sequences:enroll

Enroll up to 500 emails at once. Already-enrolled and (unless overridden) suppressed addresses are skipped, and the response details each outcome.

bulk enroll
curl -X POST "https://api.meisa.io/api/v1/sequences/api/bulk-enroll/" \
  -H "X-API-Key: meisa_live_your_key" \
  -H "Content-Type: application/json" \
  -d '{
    "sequence_slug": "reactivation",
    "emails": ["[email protected]", "[email protected]"]
  }'

List sequences

GET/sequences/api/list/scope: sequences:read

Lists sequences and their slugs so you know what to enroll into. By default returns active sequences; pass ?status=all for every status, or ?search= to filter by name.

list
curl "https://api.meisa.io/api/v1/sequences/api/list/" \
  -H "X-API-Key: meisa_live_your_key"

# -> { "results": [ { "slug": "onboarding", "name": "Onboarding", "status": "active", "total_enrolled": 312 }, ... ] }

Read a contact's enrollments

GET/sequences/api/contact-enrollments/scope: sequences:read

Pass ?email= to see every sequence a contact is in and its status. An unknown email returns contact_exists: false rather than a 404.

contact enrollments
curl "https://api.meisa.io/api/v1/sequences/api/contact-enrollments/[email protected]" \
  -H "X-API-Key: meisa_live_your_key"