Contacts · lists · tags · segments

A contact is one per email address within a workspace. POST /api/v1/contacts updates the existing record if the email already exists (upsert). Pass tags by name and they're created if they don't exist.

curl
curl -X POST https://send.ad/api/v1/contacts -H "Authorization: Bearer $SEND_API_KEY" -H "content-type: application/json" \\\n  -d '{"email":"kim@example.com","first_name":"Minsu","attrs":{"plan":"pro","city":"Seoul"},"list_ids":["<list-uuid>"],"tags":["VIP"]}'

Bulk

POST /api/v1/contacts/bulk { contacts: [ … ≤5,000 ], list_ids: [ … ] }  → { imported, updated, skipped, suppressed }\nPOST /api/v1/contacts/import  (multipart: file=CSV, list_id, mapping?)  — auto-detects Mailchimp export column names

Lists · tags · segments

EndpointDescription
GET/POST /api/v1/listsList and create lists {name, description, double_opt_in}
POST /api/v1/lists/{id}/contactsAdd to a list by {emails|contact_ids}
GET/POST /api/v1/tags · POST /api/v1/tags/{id}/contactsTags · apply tags
POST /api/v1/segments{name, rules:{match:"all"|"any", conditions:[{field, op, value}]}}
POST /api/v1/segments/previewSend rules only to preview the count and a sample

Suppression list

Unsubscribed, bounced, and complaint addresses are added automatically and excluded from every send. Load a Mailchimp "Unsubscribed" CSV with POST /api/v1/suppressions/import . Only remove someone from the suppression list when a person explicitly asks for it.