MailboHelp CenterOpen the app

REST API reference — every endpoint

Full list of /api/v1/* endpoints grouped by resource, with what each one does in one line.


Every endpoint requires Authorization: Bearer mb_…. read scope is enough for GETs; mutating requests (POST / PATCH / DELETE) need write.

Path placeholders like {id} are UUIDs unless noted.

Workspace

MethodPathWhat it does
GET/api/v1/meReturn the workspace this key belongs to + its scopes. Use as a connection test.

Contacts

MethodPathWhat it does
GET/api/v1/contactsList contacts. Filter by status (subscribed/unsubscribed/pending) or q (email substring). Paginate with limit + offset.
POST/api/v1/contactsUpsert a contact by email. Honors double-opt-in if enabled; existing contacts'' names aren''t overwritten unless you pass them. attrs is merged into existing custom fields by default — partial updates do NOT clear unrelated keys. Pass attrs_mode: "replace" to wholesale overwrite when re-syncing from a source of truth.
GET/api/v1/contacts/{id_or_email}Get one contact, including its tags + lists. The path accepts either a contact UUID or a URL-encoded email (e.g. user%40example.com) — handy when you only have the email.
PATCH/api/v1/contacts/{id_or_email}Update name / status / attrs. Only fields you pass are changed. attrs is merged into existing custom fields by default; pass attrs_mode: "replace" to wholesale overwrite. Path accepts UUID or URL-encoded email.
DELETE/api/v1/contacts/{id_or_email}Permanent delete. Prefer POST /unsubscribe for opt-outs. Path accepts UUID or URL-encoded email.

Tags

MethodPathWhat it does
GET/api/v1/tagsList all tags in the workspace.
POST/api/v1/tagsCreate a tag (idempotent by name per workspace).
POST/api/v1/contacts/{id}/tagsAttach tag names to a contact. Names that don't exist yet are auto-created.
DELETE/api/v1/contacts/{id}/tags/{tagId}Detach one tag from one contact.

Lists

MethodPathWhat it does
GET/api/v1/listsList static + dynamic lists.
POST/api/v1/listsCreate a list. type='static' (manual) or 'dynamic' (query-driven).
POST/api/v1/contacts/{id}/lists/{listId}Add a contact to a static list. (400 on dynamic lists.)
DELETE/api/v1/contacts/{id}/lists/{listId}Remove a contact from a list.

Sequences

MethodPathWhat it does
GET/api/v1/sequencesList sequences.
POST/api/v1/sequencesCreate a sequence with its steps + email content in one call.
GET/api/v1/sequences/{id}Get one sequence + its ordered steps.
PATCH/api/v1/sequences/{id}Update name / description / status / triggers. Pass steps to replace the whole step array.
POST/api/v1/sequences/{id}/enrollEnroll a contact (by email or contact_id).

Campaigns

MethodPathWhat it does
GET/api/v1/campaignsList campaigns. Filter by status.
GET/api/v1/campaigns/{id}Get one campaign, including body + stats.
PATCH/api/v1/campaigns/{id}Update name / subject / from / status / scheduled_at / body / layout. Use status paused / cancelled to halt a scheduled send.

Automations

MethodPathWhat it does
GET/api/v1/automationsList automations (metadata only, no graph).
POST/api/v1/automationsCreate an automation with an optional full graph. Graph is validated (node types, edges, conditional handles).
GET/api/v1/automations/{id}Get one automation with full graph.
PATCH/api/v1/automations/{id}Update name / status / triggers / graph. Graph swap is validated the same way as create.
DELETE/api/v1/automations/{id}Permanent delete. CASCADE deletes the automation_runs too.

Events

MethodPathWhat it does
POST/api/v1/eventsFire a lifecycle event for a contact (by email or contact_id). Auto-creates the contact if needed. Use this for behavioural signals.

Purchases

MethodPathWhat it does
GET/api/v1/purchasesList purchases. Filter by email / contact_id / source.
POST/api/v1/purchasesRecord a purchase. external_id deduplicates so retries are safe.

Unsubscribe

MethodPathWhat it does
POST/api/v1/unsubscribeMark an email as unsubscribed. Adds to suppression. Idempotent.

Response shape

Successful responses return JSON with data (and total / limit / offset for lists). Errors return {"error": "…"} with the appropriate HTTP status.

{
  "data": { "id": "uuid", "email": "…", "status": "subscribed", ... }
}

Status codes

CodeMeaning
200OK
201Created
400Invalid JSON
401Missing / invalid / revoked token
403Token lacks required scope
404Not found
422Validation error — see error for which field
500Server error
Still have a question?
Can't find what you need in this guide? We're happy to help.
Contact us
Last updated 6/23/2026← More in API & MCP Reference