Skip to main content
POST
/
contacts
Upsert a contact
curl --request POST \
  --url https://api.sendkit.dev/contacts \
  --header 'Authorization: Bearer <token>' \
  --header 'Content-Type: application/json' \
  --data '
{
  "email": "john@example.com",
  "first_name": "John",
  "last_name": "Doe",
  "user_id": "ext_123",
  "unsubscribed": false,
  "list_ids": [
    "550e8400-e29b-41d4-a716-446655440000"
  ],
  "properties": {
    "company": "Acme",
    "plan": "pro"
  }
}
'
{
  "id": "550e8400-e29b-41d4-a716-446655440000",
  "email": "john@example.com",
  "first_name": "John",
  "last_name": "Doe",
  "user_id": "ext_123",
  "unsubscribed": false,
  "properties": {
    "COMPANY": "Acme",
    "PLAN": "pro"
  },
  "lists": [
    {
      "id": "550e8400-e29b-41d4-a716-446655440000",
      "name": "Newsletter",
      "created_at": "2026-03-03 10:00:00",
      "updated_at": "2026-03-03 10:00:00"
    }
  ],
  "created_at": "2026-03-03 10:00:00",
  "updated_at": "2026-03-03 10:00:00"
}

Authorizations

Authorization
string
header
required

API key from your SendKit dashboard. Pass it as a Bearer token in the Authorization header.

Body

application/json
email
string<email>
required

The contact's email address. If a contact with this email already exists, it will be updated.

Maximum string length: 255
Example:

"john@example.com"

first_name
string | null

The contact's first name.

Maximum string length: 255
Example:

"John"

last_name
string | null

The contact's last name.

Maximum string length: 255
Example:

"Doe"

user_id
string | null

An external user identifier from your application.

Maximum string length: 255
Example:

"ext_123"

unsubscribed
boolean
default:false

Whether the contact should be marked as unsubscribed.

Example:

false

list_ids
string<uuid>[]

List IDs to attach the contact to. Replaces existing list memberships.

Example:
["550e8400-e29b-41d4-a716-446655440000"]
properties
object

Property values to set on the contact. Keys must match existing property keys.

Example:
{ "company": "Acme", "plan": "pro" }

Response

Existing contact updated (upsert)

id
string<uuid>

Unique identifier.

Example:

"550e8400-e29b-41d4-a716-446655440000"

email
string<email>

The contact's email address.

Example:

"john@example.com"

first_name
string | null

The contact's first name.

Example:

"John"

last_name
string | null

The contact's last name.

Example:

"Doe"

user_id
string | null

An external user identifier from your application.

Example:

"ext_123"

unsubscribed
boolean

Whether the contact has unsubscribed.

Example:

false

properties
object

Custom property values. Keys are uppercased property names.

Example:
{ "COMPANY": "Acme", "PLAN": "pro" }
lists
object[]

Lists this contact belongs to.

created_at
string<date-time>

When the contact was created.

Example:

"2026-03-03 10:00:00"

updated_at
string<date-time>

When the contact was last updated.

Example:

"2026-03-03 10:00:00"