Endpoints
items array with up to 100 records. For bulk file-based ingestion, see Importing Contacts; for field definitions, see Managing Contact Fields.
Contact writes support partial success. Tented processes each item independently and returns accepted or rejected results in request order.
Look Up Contacts
GET /v1/contacts has two modes. With an email or phone query parameter it is an identifier lookup returning zero or one contact (shown here). Without an identifier it becomes a paginated listing — see List Contacts.
Query Parameters
Lookup Request Example
Lookup Response Example
Returnsitems with the matching contact, or an empty array when no contact matches. custom_fields is keyed by each custom field’s API name.
Get a Contact
contact_id returned by create, update, and lookup responses.
Path Parameters
Get Request Example
Get Response Example
Returns the contact object directly, includingcustom_fields keyed by each custom field’s API name — the same shape as a lookup item.
List Contacts
email/phone identifier, GET /v1/contacts pages through the workspace’s contacts.
Returns
{items, pagination}. List items do not include custom_fields — fetch a single contact for those.
Update a Single Contact
contact_id), returns the updated contact directly, 404 when missing, and 409 with existing_contact when an email/phone change collides with another contact.
Delete a Single Contact
204 on success, 404 when the contact does not exist.
Contact Activities
contact_created, contact_updated, email engagement events (sent, delivered, opened, clicked, bounced, unsubscribed), and flow entry/exit — each with a type, timestamp, and event-specific metadata.
Create Contacts
Request Body
Create Item Fields
Create Request Example
Create Response Example
201 Created
Duplicate Contacts
Tented checks normalized email and phone values before creating a contact. If an item matches an existing contact, that item is rejected witherror_code: "conflict". If you want matches to be updated instead of rejected, use Upsert Contacts.
Upsert Contacts
100) is matched by its normalized email (or phone, for phone-only items): a match updates that contact, no match creates one. Items accept the full update field set including custom_fields, and each result reports status: "created" or "updated".
Matching is identifier-scoped: an item is only ever matched on its own identifier. If a new email’s item carries a phone that belongs to a different contact, the item is rejected with
error_code: "conflict" and the existing_contact — it never silently modifies the phone-matched contact.created_count, updated_count, and rejected_count.
Search Contacts
Discover the available fields and operators with
GET /v1/contact-fields/rule-metadata.
Update Contacts
Request Body
Update Item Fields
marketing_email_invalid is system-managed and read-only: Tented sets it to true when a marketing email to the contact hard-bounces, and resets it to false when the contact’s email address changes. It appears in contact responses and audience rules, but requests that include it are rejected.Update Request Example
Update Response Example
200 OK
Delete Contacts
POST /v1/contacts/delete if your HTTP client does not support request bodies on DELETE.
Request Body
Delete Item Fields
Delete Request Example
Delete Response Example
200 OK
Batch Response Format
Every contacts write endpoint returns:
Rejected items include:
Common Item-Level Rejections
Common Request Errors
Back to API Overview
Review the full Tented API endpoint map.