API reference · Contacts
Upsert contacts in batch
POST
https://api.pidgely.com/contacts/batchCreates or updates up to 1,000 contacts in one request (each row is an upsert by email, like Create a contact). Rows are saved independently: invalid rows are reported in errors with their index and the others are kept. Pass segment_id to add every row to a segment.
Each row is saved independently; invalid rows are reported in errors with their index.
Authorization: Bearer pdg_…. An API key with full_access. A sending_access key gets 401 restricted_api_key.
Body parameters
JSON object.
| Name | Type | Required | Description |
|---|---|---|---|
contacts |
object[] | Yes | — |
contacts[].email |
string | No | Email address. |
contacts[].first_name |
string | No | First name, up to 200 characters. Available as {{{FIRST_NAME}}} in broadcasts. |
contacts[].last_name |
string | No | Last name, up to 200 characters. Available as {{{LAST_NAME}}} in broadcasts. |
contacts[].unsubscribed |
boolean | No | Whether the contact opted out of broadcasts. Kept in sync with the suppression list. |
contacts[].properties |
object (map of string | number | boolean | null) | No | Custom properties: up to 100 keys matching ^[A-Za-z_][A-Za-z0-9_]{0,49}$, values string (up to 2,000 characters), number, boolean, or null to delete. |
contacts[].segments |
object[] | No | Segments to add the contact to. |
contacts[].segments[].id |
string | Yes | Unique id (UUID). UUID. |
contacts[].topics |
any[] | No | Not supported yet. |
segment_id |
string | No | Added to every row. UUID. |
Request
This endpoint is not in the SDKs yet; call it over HTTP.
curl -X POST 'https://api.pidgely.com/contacts/batch' \
-H "Authorization: Bearer $PIDGELY_API_KEY" \
-H 'Content-Type: application/json' \
-d '{
"segment_id": "0199d7f5-9a3e-7d4b-a1c2-7e5f0b3d6c48",
"contacts": [
{
"email": "steve@example.com",
"first_name": "Steve"
},
{
"email": "ada@example.com",
"first_name": "Ada",
"properties": {
"plan": "pro"
}
}
]
}'Response
200 OK
{
"object": "contact",
"data": [
{
"index": 1,
"id": "0199d8a2-6f3c-7c51-9e2a-3b1f0c6d4e21"
}
],
"errors": [
{
"index": 1,
"message": "The `to` field is required."
}
]
}Response fields
| Name | Type | Required | Description |
|---|---|---|---|
object |
string | Yes | Object type. One of list. |
data |
object[] | Yes | Items of this page. |
data[].index |
integer | Yes | — |
data[].id |
string | Yes | Unique id (UUID). UUID. |
errors |
object[] | Yes | — |
errors[].index |
integer | Yes | — |
errors[].message |
string | Yes | — |
Errors
Errors have the shape {"statusCode", "name", "message"}. See Errors for the full list.
| Status | Name | When |
|---|---|---|
| 401 | missing_api_key, restricted_api_key |
No Authorization: Bearer header, or a sending_access key called an endpoint that needs full_access. |
| 403 | invalid_api_key, validation_error |
The API key is invalid or revoked, or the request is not allowed for this account (unverified domain, plan limit, paused account). |
| 404 | not_found |
The resource does not exist in this account (or the id is not a valid UUID). |
| 422 | validation_error |
A field is missing or invalid; message names it. |
| 429 | rate_limit_exceeded |
Too many requests per second. Wait for Retry-After seconds. |