Contacts
Create contact
Create one contact. Returns 201 with the contact, or 409 if the email already exists — use POST /contacts/bulk to upsert.
POST
https://api.sndr.sh/v1/contactsCreate contact
curl -X POST 'https://api.sndr.sh/v1/contacts' \
-H "Authorization: Bearer $SNDR_API_KEY" \
-H 'Content-Type: application/json' \
-d '{
"email": "jane@example.com",
"first_name": "Jane",
"last_name": "Doe",
"attributes": { "plan": "pro", "city": "Berlin" },
"source": "checkout",
"group_ids": ["grp_4d8a0c5e-1f7"]
}'201Created
{
"id": "con_0e6b7f21-c58",
"organization_id": "org_8d41c7a2-3f6",
"email": "jane@example.com",
"first_name": "Jane",
"last_name": "Doe",
"attributes": { "plan": "pro", "city": "Berlin" },
"status": "subscribed",
"source": "checkout",
"created_at": "2026-06-01T12:00:00Z",
"updated_at": "2026-06-01T12:00:00Z"
}Authorization
AuthorizationstringheaderrequiredBearer followed by your API key. Needs the send scope.
Body
application/jsonemailstringrequiredEmail address. Stored lowercase and unique per account.
first_namestringFirst name, max 100 characters.
last_namestringLast name, max 100 characters.
statusstringsubscribed (default), unsubscribed, bounced or complained. Only subscribed contacts receive broadcasts.
attributesobjectFree-form key-value data, e.g. {"plan":"pro"}.
sourcestringLabel for where the contact came from. Defaults to manual.
group_idsstring[]Groups (grp_...) to add the new contact to. Unknown IDs are ignored.
Errors
401
unauthenticatedMissing or invalid API key.400
invalid_requestBody is not valid JSON, has an unknown field, or a field has the wrong type.403
insufficient_scopeThe API key is missing the send scope.409
conflictA contact with this email already exists.422
validation_failedemail is missing or invalid, a name is over 100 characters, or status is not one of the four values.