Add contacts to a segment
POST/api/v1/segments/{id}/contacts
scope
contacts:writeAdds up to 100 contacts to the segment and returns the segment with its new count. A contact that is already in it is left as it is, so repeating the call is safe. If any id is not a contact of this account, nothing is added and the answer is 422 unprocessable with reason: "contact_not_found", listing the ids.
Path parameters
| Name | Type | Description |
|---|---|---|
idrequired | string (uuid) | Segment id |
Body
application/json| Name | Type | Description |
|---|---|---|
contact_idsrequired | string (uuid)[] | Contacts to add; 1 to 100 per call |
Request
curl -X POST "https://your-crm.example.com/api/v1/segments/5e6f7a8b-9c0d-4e1f-8a2b-3c4d5e6f7a8b/contacts" \
-H "Authorization: Bearer $RAABTA_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"contact_ids": [
"9d7e4c11-5a2b-4f7c-8e3d-2a1b0c9d8e7f"
]
}'Response · 200 OK
{
"data": {
"id": "5e6f7a8b-9c0d-4e1f-8a2b-3c4d5e6f7a8b",
"name": "Website leads — September",
"description": "Everyone who booked through the website this month",
"color": "#3b82f6",
"member_count": 43,
"created_at": "2026-09-01T08:00:00.000Z",
"updated_at": "2026-09-02T10:00:00.000Z"
}
}Response
Wrapped in { data: … }| Name | Type | Description |
|---|---|---|
idrequired | string (uuid) | UUID |
namerequired | string | The segment’s name |
descriptionrequired | string | null | What the segment is for |
colorrequired | string | Hex colour used for the segment in the dashboard |
member_countrequired | integer | How many contacts are in the segment. Counts contacts on a member’s private number too, which the API never lists, so it can be higher than the contacts you can page through |
created_atrequired | string (date-time) | ISO 8601 timestamp |
updated_atrequired | string (date-time) | ISO 8601 timestamp |
Errors
| Status | Code | When |
|---|---|---|
| 400 | bad_request | The request could not be parsed: malformed JSON, an invalid cursor, or a query parameter of the wrong shape. |
| 400 | validation_error | The body or query failed validation. `details` lists each failing field with a `path` and a `message`. |
| 401 | unauthorized | No usable API key: the Authorization header is missing or malformed, or the key is unknown, revoked or expired. The three are deliberately indistinguishable. |
| 403 | forbidden | The key is valid but lacks the scope this endpoint requires, or the request came from an address outside the key’s IP allowlist. The message says which. |
| 403 | account_suspended | The account this key belongs to is suspended. Rotating the key will not help; contact support. |
| 404 | not_found | No such resource in this account. A resource that exists in another account also returns this. |
| 422 | unprocessable | The request was well-formed but cannot be carried out. `reason` is a stable string saying why (for example `outside_window` or `stage_not_in_pipeline`). |
| 429 | rate_limited | The per-key budget, or the per-IP budget for failed authentication, is exhausted. Honour `Retry-After` before retrying. |
| 500 | internal | Something failed on our side. Safe to retry with the same Idempotency-Key; quote `request_id` if it persists. |