Manage contacts — the people you track through your go-to-market process.
See also: Contacts & Companies concepts
| Method | Path | Description |
|---|---|---|
| POST | /contacts | Create a contact |
| GET | /contacts | List contacts |
| GET | /contacts/:id | Get a contact |
| PATCH | /contacts/:id | Update a contact |
| DELETE | /contacts/:id | Delete a contact |
| GET | /contacts/:id/deals | List deals for a contact |
| GET | /contacts/:id/activities | List activities for a contact |
| GET | /contacts/:id/tasks | List tasks for a contact |
| POST | /contacts/merge | Merge duplicate contacts |
POST /contacts
| Field | Type | Required | Description |
|---|---|---|---|
email | string | yes | Email address (unique per org) |
first_name | string | no | First name |
last_name | string | no | Last name |
phone | string | no | Phone number |
title | string | no | Job title |
stage | string | no | Lifecycle stage: lead, prospect, customer, churned |
source | string | no | Acquisition source: organic, referral, paid, social, email, event, outbound, other |
source_detail | string | no | Freeform source detail (e.g. campaign name) |
company_id | string | no | Link to a company |
owner_id | string | no | Assigned team member |
icp_score | integer | no | Ideal customer profile score |
icp_score_reason | string | no | Explanation for the ICP score |
icp_scored_at | datetime | no | When the ICP score was computed |
metadata | object | no | Arbitrary key-value data |
curl -X POST "$REX_URL/contacts" \
-H "X-Api-Key: $REX_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"email": "ada@example.com",
"first_name": "Ada",
"last_name": "Lovelace",
"stage": "lead",
"source": "organic"
}'
{
"data": {
"id": "cont_01HQ...",
"email": "ada@example.com",
"first_name": "Ada",
"last_name": "Lovelace",
"stage": "lead",
"source": "organic",
"created_at": "2026-03-16T12:00:00Z",
"updated_at": "2026-03-16T12:00:00Z"
}
}
GET /contacts
| Parameter | Type | Description |
|---|---|---|
cursor | string | Pagination cursor |
limit | integer | Results per page (default 50, max 200) |
stage | string | Filter by lifecycle stage |
source | string | Filter by acquisition source |
company_id | string | Filter by company |
owner_id | string | Filter by owner |
search | string | Search by name or email |
icp_score_min | integer | Minimum ICP score |
icp_score_max | integer | Maximum ICP score |
icp_scored_after | datetime | ICP score computed after this time |
icp_scored_before | datetime | ICP score computed before this time |
created_after | datetime | Created after this time |
created_before | datetime | Created before this time |
curl "$REX_URL/contacts?stage=prospect&limit=25" \
-H "X-Api-Key: $REX_API_KEY"
{
"data": [
{
"id": "cont_01HQ...",
"email": "ada@example.com",
"first_name": "Ada",
"last_name": "Lovelace",
"stage": "prospect",
"source": "organic",
"created_at": "2026-03-16T12:00:00Z",
"updated_at": "2026-03-16T12:00:00Z"
}
],
"has_more": true,
"next_cursor": "eyJpZCI6..."
}
GET /contacts/:id
curl "$REX_URL/contacts/cont_01HQ..." \
-H "X-Api-Key: $REX_API_KEY"
{
"data": {
"id": "cont_01HQ...",
"email": "ada@example.com",
"first_name": "Ada",
"last_name": "Lovelace",
"phone": "+1-555-0100",
"title": "CTO",
"stage": "prospect",
"source": "organic",
"company_id": "comp_01HQ...",
"owner_id": "user_01HQ...",
"icp_score": 85,
"icp_score_reason": "Strong title match, target industry",
"icp_scored_at": "2026-03-15T10:00:00Z",
"metadata": {},
"relationships": {
"company": { "type": "company", "id": "comp_01HQ...", "name": "Acme Corp" },
"owner": { "type": "user", "id": "user_01HQ...", "name": "Jane Smith" }
},
"created_at": "2026-03-16T12:00:00Z",
"updated_at": "2026-03-16T12:00:00Z"
},
"included": [
{ "type": "company", "id": "comp_01HQ...", "name": "Acme Corp" }
]
}
PATCH /contacts/:id
All fields from the create request body are accepted. Only provided fields are updated.
curl -X PATCH "$REX_URL/contacts/cont_01HQ..." \
-H "X-Api-Key: $REX_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"stage": "customer",
"title": "VP Engineering"
}'
Returns the full updated contact object in the same format as Get a contact.
DELETE /contacts/:id
curl -X DELETE "$REX_URL/contacts/cont_01HQ..." \
-H "X-Api-Key: $REX_API_KEY"
204 No Content on success.
GET /contacts/:id/deals
Returns deals linked to this contact. Supports cursor and limit query parameters.
curl "$REX_URL/contacts/cont_01HQ.../deals" \
-H "X-Api-Key: $REX_API_KEY"
{
"data": [
{
"id": "deal_01HQ...",
"name": "Acme Enterprise Plan",
"pipeline_id": "pipe_01HQ...",
"stage_id": "stg_01HQ...",
"value": 500000,
"currency": "USD",
"status": "open",
"created_at": "2026-03-16T12:00:00Z",
"updated_at": "2026-03-16T12:00:00Z"
}
],
"has_more": false
}
GET /contacts/:id/activities
Returns activities linked to this contact. Supports cursor and limit query parameters.
curl "$REX_URL/contacts/cont_01HQ.../activities" \
-H "X-Api-Key: $REX_API_KEY"
{
"data": [
{
"id": "act_01HQ...",
"type": "email",
"status": "completed",
"subject": "Follow-up on proposal",
"occurred_at": "2026-03-15T14:30:00Z",
"created_at": "2026-03-15T14:30:00Z",
"updated_at": "2026-03-15T14:30:00Z"
}
],
"has_more": false
}
GET /contacts/:id/tasks
Returns tasks linked to this contact. Supports cursor and limit query parameters.
curl "$REX_URL/contacts/cont_01HQ.../tasks" \
-H "X-Api-Key: $REX_API_KEY"
{
"data": [
{
"id": "task_01HQ...",
"title": "Send contract",
"priority": "high",
"status": "pending",
"due_at": "2026-03-20T17:00:00Z",
"created_at": "2026-03-16T12:00:00Z",
"updated_at": "2026-03-16T12:00:00Z"
}
],
"has_more": false
}
POST /contacts/merge
Merges two contacts. The winner keeps its ID; the loser's relationships (deals, activities, tasks) transfer to the winner. The loser is deleted.
| Field | Type | Required | Description |
|---|---|---|---|
winner_id | string | yes | Contact ID to keep |
loser_id | string | yes | Contact ID to merge into the winner and delete |
curl -X POST "$REX_URL/contacts/merge" \
-H "X-Api-Key: $REX_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"winner_id": "cont_01HQ...",
"loser_id": "cont_01HQ..."
}'
Returns the merged (winner) contact in the same format as Get a contact.