MillionSend Docs

Create contacts in bulk

POST
/contacts/batch

MillionSend extension: creates up to 1000 contacts in one request (Resend imports contacts only via CSV). Each item is a CreateContactRequest. on_conflict decides what happens to an email that already belongs to a contact — error (default), skip, or upsert. An upsert updates first_name/last_name only when provided, merges properties (provided keys overwrite), adds segments and upserts topics. unsubscribed: true opts the contact out; unsubscribed: false on an already unsubscribed contact is ignored — a batch never re-subscribes anyone, that stays an explicit PATCH /contacts/{id}. The x-batch-validation header picks strict (default, all-or-nothing) or permissive (valid subset written, failures listed in errors).

Query Parameters

on_conflict?string

What to do with an item whose email (case-insensitive) already belongs to a contact: error fails the item, skip leaves the contact untouched and reports its id, upsert merges the item into it. Also decides how an email repeated inside the batch is handled: error fails the later occurrence, skip keeps the first, upsert collapses them into one write (later scalar fields win, associations are unioned).

Default"error"
Value in"error""skip""upsert"

Header Parameters

x-batch-validation?string

strict (default): any invalid item rejects the whole batch with that item's status and a contacts.{index}: message prefix, writing nothing. permissive: invalid items are listed in errors and the valid subset is written.

Value in"strict""permissive"

Request Body

application/json
  1. body

1-1000 CreateContactRequest items

Items1 <= items <= 1000
[index: integer]?unknown

A CreateContactRequest item

Response Body

Batch processed

application/json
  1. response
data*array<>

One entry per successful item, in request order

counts*

Per-status totals over the request items; they sum to the request length

errors?array<>

Permissive mode only: the failed items by request index, each with the statusCode and name strict mode would answer for it

Example Request
curl -X POST 'https://api.millionsend.com/contacts/batch' \  -H 'Content-Type: application/json' \  -d '[  null]'
Example Response
{  "data": [    {      "object": "contact",      "index": 0,      "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",      "status": "created"    }  ],  "counts": {    "created": 0,    "updated": 0,    "skipped": 0,    "failed": 0  },  "errors": [    {      "index": 0,      "statusCode": 0,      "name": "string",      "message": "string"    }  ]}