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 namesLists · tags · segments
| Endpoint | Description |
|---|---|
| GET/POST /api/v1/lists | List and create lists {name, description, double_opt_in} |
| POST /api/v1/lists/{id}/contacts | Add to a list by {emails|contact_ids} |
| GET/POST /api/v1/tags · POST /api/v1/tags/{id}/contacts | Tags · apply tags |
| POST /api/v1/segments | {name, rules:{match:"all"|"any", conditions:[{field, op, value}]}} |
| POST /api/v1/segments/preview | Send 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.