Getting started

Authentication & scopes

Every request is authenticated with an API key sent in the X-API-Key header. Keys carry scopes, an environment, and rate limits.

Base URL

base url
https://api.meisa.io/api/v1

The X-API-Key header

Send your key in the X-API-Key header on every request. Requests are JSON (Content-Type: application/json).

authenticated request
curl -X POST "https://api.meisa.io/api/v1/contacts/upsert/" \
  -H "X-API-Key: meisa_live_your_key" \
  -H "Content-Type: application/json" \
  -d '{ "email": "[email protected]" }'

Keep keys server-side

API keys grant write access to your contacts and can send email. Never embed a key in frontend, mobile, or any client the user controls. Call Meisa from your backend only.

Environments

Keys are either live or test. Use a test key while building so you don't touch real contacts or send real email. GET /ping/ echoes which environment a key belongs to.

Scopes

Each key is granted a set of scopes. A request to an endpoint whose scope the key lacks returns 403. Grant the minimum a given integration needs.

ScopeGrants
contacts:readRead contacts and the unsubscribed-emails list.
contacts:writeCreate/update contacts, upsert, and add/remove tags on a contact.
events:trackRecord custom events.
sequences:readList sequences and read a contact's enrollments.
sequences:enrollEnroll contacts in sequences.
emails:triggerSend triggered/transactional emails.

A note on tags:write

You may see a tags:write scope when creating a key. Tag changes are currently authorized by contacts:write (via the contact's add_tag/remove_tag actions), so you don't need tags:write for anything today.

Rate limits

Default limits are 60 requests per minute and 1,000 per hour per key. Exceeding them returns 429. Limits can be raised per key — reach out if you need more headroom.

Errors

StatusMeaning
200 / 201Success.
202Accepted — the work was scheduled (e.g. a delayed triggered email).
400Bad request — invalid or missing fields.
401Invalid or missing API key.
403The key is valid but lacks the required scope.
404Resource not found (e.g. no matching contact).
422Unprocessable — e.g. the recipient is unsubscribed, or no sender is configured.
429Rate limit exceeded.

Errors return JSON with a human-readable message. For retries, retry on 5xx and 429 with backoff; do not retry 4xx (they won't succeed on repeat).