REST API reference
Contacts
Users and leads: create, update, search, tag, merge and delete the people you talk to.
A contact is a person: a user (someone your product knows, usually with an externalId) or a lead (an anonymous Messenger visitor). Reads need contacts:read; changes need contacts:write.
Creating people counts toward your plan’s contact limit. Changes made through the API update the inbox live and fire the same webhooks and workflows as changes made by teammates.
The contact object
Every response that returns a person uses this shape.
Fields
-
objectstring - Always
contact. -
idstring - Unique id (UUID).
-
roleenum user(identified customer) orlead(anonymous visitor).-
externalIdstring | null - Your product’s user id. Unique per workspace.
-
emailstring | null - Email address (lower-cased).
-
phonestring | null - Phone number as entered.
-
namestring | null - Full name.
-
avatarUrlstring | null - Image URL.
-
ownerIdstring | null - Teammate who owns this person.
-
locationobject | null city,region,country,countryCodeandtimezone, from the Messenger.-
languagestring | null - Preferred language (
de,pt-BR…). -
browserstring | null - Last browser seen by the Messenger.
-
osstring | null - Last operating system seen by the Messenger.
-
lastSeenAttimestamp | null - Last activity in the Messenger.
-
lastContactedAttimestamp | null - Last message from your team.
-
lastRepliedAttimestamp | null - Last message from this person.
-
signedUpAttimestamp | null - When they signed up for your product.
-
sessionCountinteger - Messenger sessions so far.
-
unsubscribedFromEmailsboolean - Opted out of outbound emails.
-
blockedboolean - Blocked people can’t start conversations.
-
customAttributesobject - Your data attributes by key.
-
tagsarray - Tags as
{ id, name }. -
companiesarray - Companies as
{ id, name }. -
createdAttimestamp - First seen.
-
updatedAttimestamp - Last change.
{ "object": "contact", "id": "0199c512-6a7b-7c8d-9e0f-1a2b3c4d5e6f", "role": "user", "externalId": "usr_48213", "email": "[email protected]", "phone": "+49 30 1234567", "name": "Lena Fischer", "avatarUrl": null, "ownerId": "0199a8f2-2d3e-7f4a-9b5c-6d7e8f9a0b1c", "location": { "city": "Berlin", "region": "Berlin", "country": "Germany", "countryCode": "DE", "timezone": "Europe/Berlin" }, "language": "de", "browser": "Chrome", "os": "macOS", "lastSeenAt": "2026-10-02T13:58:20.000Z", "lastContactedAt": "2026-10-02T14:11:08.000Z", "lastRepliedAt": "2026-10-02T14:05:31.000Z", "signedUpAt": "2025-03-08T10:00:00.000Z", "sessionCount": 214, "unsubscribedFromEmails": false, "blocked": false, "customAttributes": { "plan": "business", "seats": 12, "mrr": 1490 }, "tags": [ { "id": "0199a8f3-5d6e-7f7a-8b8c-9d0e1f2a3b4c", "name": "VIP" } ], "companies": [ { "id": "0199c514-2b3c-7d4e-9f5a-6b7c8d9e0f1a", "name": "Northwind Analytics" } ], "createdAt": "2026-09-14T09:12:44.000Z", "updatedAt": "2026-10-02T16:40:03.000Z"} List contacts
/v1 /contacts contacts:read People, newest first by default. Pass email or externalId for an exact lookup (users before leads); the other filters narrow the list. The first page includes total.
Query parameters
-
roleenum userorlead.-
emailstring - Exact email lookup.
-
externalIdstring - Exact lookup by your user id.
-
segmentIdstring - A saved segment id.
-
qstring - Free text: name, email, phone or user id.
-
sortenum name,email,lastSeenAt,createdAt,signedUpAt,sessionCount,lastContactedAt,lastRepliedAt. DefaultcreatedAt.-
directionenum ascordesc. Defaultdesc.-
limitinteger - Items per page, 1–100. Default
25. -
cursorstring - The
nextCursorof the previous page.
curl https://api.rabbitblaze.com/v1/contacts?role=user&limit=2 \ -H "Authorization: Bearer $RABBITBLAZE_API_KEY" const res = await fetch("https://api.rabbitblaze.com/v1/contacts?role=user&limit=2", { headers: { Authorization: `Bearer ${process.env.RABBITBLAZE_API_KEY}`, },})const data = await res.json() import osimport requests res = requests.get( "https://api.rabbitblaze.com/v1/contacts", headers={"Authorization": f"Bearer {os.environ['RABBITBLAZE_API_KEY']}"}, params={ "role": "user", "limit": "2", },)res.raise_for_status()data = res.json() { "items": [ { "object": "contact", "id": "0199c512-6a7b-7c8d-9e0f-1a2b3c4d5e6f", "role": "user", "externalId": "usr_48213", "email": "[email protected]", "phone": "+49 30 1234567", "name": "Lena Fischer", "avatarUrl": null, "ownerId": "0199a8f2-2d3e-7f4a-9b5c-6d7e8f9a0b1c", "location": { "city": "Berlin", "region": "Berlin", "country": "Germany", "countryCode": "DE", "timezone": "Europe/Berlin" }, "language": "de", "browser": "Chrome", "os": "macOS", "lastSeenAt": "2026-10-02T13:58:20.000Z", "lastContactedAt": "2026-10-02T14:11:08.000Z", "lastRepliedAt": "2026-10-02T14:05:31.000Z", "signedUpAt": "2025-03-08T10:00:00.000Z", "sessionCount": 214, "unsubscribedFromEmails": false, "blocked": false, "customAttributes": { "plan": "business", "seats": 12, "mrr": 1490 }, "tags": [ { "id": "0199a8f3-5d6e-7f7a-8b8c-9d0e1f2a3b4c", "name": "VIP" } ], "companies": [ { "id": "0199c514-2b3c-7d4e-9f5a-6b7c8d9e0f1a", "name": "Northwind Analytics" } ], "createdAt": "2026-09-14T09:12:44.000Z", "updatedAt": "2026-10-02T16:40:03.000Z" } ], "nextCursor": "WyIyMDI2LTEwLTAyVDE0OjA1OjMxLjAwMFoiLCIwMTk5YzUyMC03ZThmIl0", "total": 1284} Search contacts
/v1 /contacts/search contacts:read Filter people with the same rules as segments: filter is a rule group of attribute paths (contact.email, contact.custom.plan, company.name, contact.tags…) and operators (eq, contains, gt, within_last_days, in…). Groups nest with and / or.
Body
-
querystring - Free text, like
qabove. -
filterrule group { combinator: 'and' | 'or', rules: [{ attribute, operator, value? } | group] }.-
roleenum userorlead.-
segmentIdstring - Only people in this segment.
-
sortenum - Same fields as listing.
-
directionenum ascordesc.-
limitinteger - Items per page, 1–100. Default
25. -
cursorstring - The
nextCursorof the previous page.
curl -X POST https://api.rabbitblaze.com/v1/contacts/search \ -H "Authorization: Bearer $RABBITBLAZE_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "filter": { "combinator": "and", "rules": [ { "attribute": "contact.custom.plan", "operator": "eq", "value": "business" }, { "attribute": "contact.last_seen_at", "operator": "within_last_days", "value": 30 } ] }, "limit": 50}' const res = await fetch("https://api.rabbitblaze.com/v1/contacts/search", { method: "POST", headers: { Authorization: `Bearer ${process.env.RABBITBLAZE_API_KEY}`, "Content-Type": "application/json", }, body: JSON.stringify({ filter: { combinator: "and", rules: [ { attribute: "contact.custom.plan", operator: "eq", value: "business", }, { attribute: "contact.last_seen_at", operator: "within_last_days", value: 30, }, ], }, limit: 50, }),})const data = await res.json() import osimport requests res = requests.post( "https://api.rabbitblaze.com/v1/contacts/search", headers={"Authorization": f"Bearer {os.environ['RABBITBLAZE_API_KEY']}"}, json={ "filter": { "combinator": "and", "rules": [ { "attribute": "contact.custom.plan", "operator": "eq", "value": "business", }, { "attribute": "contact.last_seen_at", "operator": "within_last_days", "value": 30, }, ], }, "limit": 50, },)res.raise_for_status()data = res.json() { "items": [ { "object": "contact", "id": "0199c512-6a7b-7c8d-9e0f-1a2b3c4d5e6f", "role": "user", "externalId": "usr_48213", "email": "[email protected]", "phone": "+49 30 1234567", "name": "Lena Fischer", "avatarUrl": null, "ownerId": "0199a8f2-2d3e-7f4a-9b5c-6d7e8f9a0b1c", "location": { "city": "Berlin", "region": "Berlin", "country": "Germany", "countryCode": "DE", "timezone": "Europe/Berlin" }, "language": "de", "browser": "Chrome", "os": "macOS", "lastSeenAt": "2026-10-02T13:58:20.000Z", "lastContactedAt": "2026-10-02T14:11:08.000Z", "lastRepliedAt": "2026-10-02T14:05:31.000Z", "signedUpAt": "2025-03-08T10:00:00.000Z", "sessionCount": 214, "unsubscribedFromEmails": false, "blocked": false, "customAttributes": { "plan": "business", "seats": 12, "mrr": 1490 }, "tags": [ { "id": "0199a8f3-5d6e-7f7a-8b8c-9d0e1f2a3b4c", "name": "VIP" } ], "companies": [ { "id": "0199c514-2b3c-7d4e-9f5a-6b7c8d9e0f1a", "name": "Northwind Analytics" } ], "createdAt": "2026-09-14T09:12:44.000Z", "updatedAt": "2026-10-02T16:40:03.000Z" } ], "nextCursor": null, "total": 1} Retrieve a contact
/v1 /contacts/{id} contacts:read One person by id.
Path parameters
-
idstring required - The contact id.
curl https://api.rabbitblaze.com/v1/contacts/0199c512-6a7b-7c8d-9e0f-1a2b3c4d5e6f \ -H "Authorization: Bearer $RABBITBLAZE_API_KEY" const res = await fetch("https://api.rabbitblaze.com/v1/contacts/0199c512-6a7b-7c8d-9e0f-1a2b3c4d5e6f", { headers: { Authorization: `Bearer ${process.env.RABBITBLAZE_API_KEY}`, },})const data = await res.json() import osimport requests res = requests.get( "https://api.rabbitblaze.com/v1/contacts/0199c512-6a7b-7c8d-9e0f-1a2b3c4d5e6f", headers={"Authorization": f"Bearer {os.environ['RABBITBLAZE_API_KEY']}"},)res.raise_for_status()data = res.json() { "object": "contact", "id": "0199c512-6a7b-7c8d-9e0f-1a2b3c4d5e6f", "role": "user", "externalId": "usr_48213", "email": "[email protected]", "phone": "+49 30 1234567", "name": "Lena Fischer", "avatarUrl": null, "ownerId": "0199a8f2-2d3e-7f4a-9b5c-6d7e8f9a0b1c", "location": { "city": "Berlin", "region": "Berlin", "country": "Germany", "countryCode": "DE", "timezone": "Europe/Berlin" }, "language": "de", "browser": "Chrome", "os": "macOS", "lastSeenAt": "2026-10-02T13:58:20.000Z", "lastContactedAt": "2026-10-02T14:11:08.000Z", "lastRepliedAt": "2026-10-02T14:05:31.000Z", "signedUpAt": "2025-03-08T10:00:00.000Z", "sessionCount": 214, "unsubscribedFromEmails": false, "blocked": false, "customAttributes": { "plan": "business", "seats": 12, "mrr": 1490 }, "tags": [ { "id": "0199a8f3-5d6e-7f7a-8b8c-9d0e1f2a3b4c", "name": "VIP" } ], "companies": [ { "id": "0199c514-2b3c-7d4e-9f5a-6b7c8d9e0f1a", "name": "Northwind Analytics" } ], "createdAt": "2026-09-14T09:12:44.000Z", "updatedAt": "2026-10-02T16:40:03.000Z"} Create a contact
/v1 /contacts contacts:write Creates a user (default) or a lead. Users need an email or an externalId; leads need a name, email or phone (and never get an externalId). An email or externalId that already belongs to someone answers 409 conflict — look the person up first and update them instead.
Body
-
roleenum user(default) orlead.-
namestring | null - Full name, up to 200 characters.
-
emailstring | null - Email address. Must be unique among users.
-
phonestring | null - Phone number, up to 40 characters.
-
externalIdstring | null - Your product’s user id, up to 255 characters.
-
ownerIdstring | null - A teammate id.
-
customAttributesobject - Values by attribute key (up to 100 at once). Values are checked against each attribute’s type;
nullclears one. -
companyIdstring | null - Link the person to a company.
-
tagIdsstring[] - Up to 20 tag ids.
curl -X POST https://api.rabbitblaze.com/v1/contacts \ -H "Authorization: Bearer $RABBITBLAZE_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "role": "user", "name": "Lena Fischer", "email": "[email protected]", "externalId": "usr_48213", "companyId": "0199c514-2b3c-7d4e-9f5a-6b7c8d9e0f1a", "customAttributes": { "plan": "business", "seats": 12 }}' const res = await fetch("https://api.rabbitblaze.com/v1/contacts", { method: "POST", headers: { Authorization: `Bearer ${process.env.RABBITBLAZE_API_KEY}`, "Content-Type": "application/json", }, body: JSON.stringify({ role: "user", name: "Lena Fischer", email: "[email protected]", externalId: "usr_48213", companyId: "0199c514-2b3c-7d4e-9f5a-6b7c8d9e0f1a", customAttributes: { plan: "business", seats: 12, }, }),})const data = await res.json() import osimport requests res = requests.post( "https://api.rabbitblaze.com/v1/contacts", headers={"Authorization": f"Bearer {os.environ['RABBITBLAZE_API_KEY']}"}, json={ "role": "user", "name": "Lena Fischer", "email": "[email protected]", "externalId": "usr_48213", "companyId": "0199c514-2b3c-7d4e-9f5a-6b7c8d9e0f1a", "customAttributes": { "plan": "business", "seats": 12, }, },)res.raise_for_status()data = res.json() { "object": "contact", "id": "0199c512-6a7b-7c8d-9e0f-1a2b3c4d5e6f", "role": "user", "externalId": "usr_48213", "email": "[email protected]", "phone": "+49 30 1234567", "name": "Lena Fischer", "avatarUrl": null, "ownerId": "0199a8f2-2d3e-7f4a-9b5c-6d7e8f9a0b1c", "location": { "city": "Berlin", "region": "Berlin", "country": "Germany", "countryCode": "DE", "timezone": "Europe/Berlin" }, "language": "de", "browser": "Chrome", "os": "macOS", "lastSeenAt": "2026-10-02T13:58:20.000Z", "lastContactedAt": "2026-10-02T14:11:08.000Z", "lastRepliedAt": "2026-10-02T14:05:31.000Z", "signedUpAt": "2025-03-08T10:00:00.000Z", "sessionCount": 214, "unsubscribedFromEmails": false, "blocked": false, "customAttributes": { "plan": "business", "seats": 12, "mrr": 1490 }, "tags": [ { "id": "0199a8f3-5d6e-7f7a-8b8c-9d0e1f2a3b4c", "name": "VIP" } ], "companies": [ { "id": "0199c514-2b3c-7d4e-9f5a-6b7c8d9e0f1a", "name": "Northwind Analytics" } ], "createdAt": "2026-09-14T09:12:44.000Z", "updatedAt": "2026-10-02T16:40:03.000Z"} Update a contact
/v1 /contacts/{id} contacts:write Changes only the fields you send. Send role: "user" to turn a lead into a user. Custom attributes merge into the existing ones.
Path parameters
-
idstring required - The contact id.
Body
-
namestring | null - Full name, up to 200 characters.
-
emailstring | null - Email address. Must be unique among users.
-
phonestring | null - Phone number, up to 40 characters.
-
externalIdstring | null - Your product’s user id, up to 255 characters.
-
ownerIdstring | null - A teammate id.
-
customAttributesobject - Values by attribute key (up to 100 at once). Values are checked against each attribute’s type;
nullclears one. -
avatarUrlstring | null - An http(s) image URL.
-
role"user" - Convert a lead into a user.
-
signedUpAttimestamp | null - ISO-8601 with a timezone.
-
unsubscribedFromEmailsboolean - Opt out of outbound emails.
-
blockedboolean - Block the person from starting conversations.
curl -X PATCH https://api.rabbitblaze.com/v1/contacts/0199c512-6a7b-7c8d-9e0f-1a2b3c4d5e6f \ -H "Authorization: Bearer $RABBITBLAZE_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "name": "Lena Fischer", "customAttributes": { "seats": 14 }}' const res = await fetch("https://api.rabbitblaze.com/v1/contacts/0199c512-6a7b-7c8d-9e0f-1a2b3c4d5e6f", { method: "PATCH", headers: { Authorization: `Bearer ${process.env.RABBITBLAZE_API_KEY}`, "Content-Type": "application/json", }, body: JSON.stringify({ name: "Lena Fischer", customAttributes: { seats: 14, }, }),})const data = await res.json() import osimport requests res = requests.patch( "https://api.rabbitblaze.com/v1/contacts/0199c512-6a7b-7c8d-9e0f-1a2b3c4d5e6f", headers={"Authorization": f"Bearer {os.environ['RABBITBLAZE_API_KEY']}"}, json={ "name": "Lena Fischer", "customAttributes": { "seats": 14, }, },)res.raise_for_status()data = res.json() { "object": "contact", "id": "0199c512-6a7b-7c8d-9e0f-1a2b3c4d5e6f", "role": "user", "externalId": "usr_48213", "email": "[email protected]", "phone": "+49 30 1234567", "name": "Lena Fischer", "avatarUrl": null, "ownerId": "0199a8f2-2d3e-7f4a-9b5c-6d7e8f9a0b1c", "location": { "city": "Berlin", "region": "Berlin", "country": "Germany", "countryCode": "DE", "timezone": "Europe/Berlin" }, "language": "de", "browser": "Chrome", "os": "macOS", "lastSeenAt": "2026-10-02T13:58:20.000Z", "lastContactedAt": "2026-10-02T14:11:08.000Z", "lastRepliedAt": "2026-10-02T14:05:31.000Z", "signedUpAt": "2025-03-08T10:00:00.000Z", "sessionCount": 214, "unsubscribedFromEmails": false, "blocked": false, "customAttributes": { "plan": "business", "seats": 14, "mrr": 1490 }, "tags": [ { "id": "0199a8f3-5d6e-7f7a-8b8c-9d0e1f2a3b4c", "name": "VIP" } ], "companies": [ { "id": "0199c514-2b3c-7d4e-9f5a-6b7c8d9e0f1a", "name": "Northwind Analytics" } ], "createdAt": "2026-09-14T09:12:44.000Z", "updatedAt": "2026-10-02T16:40:03.000Z"} Delete a contact
/v1 /contacts/{id} contacts:write Deletes the person with their conversations, events and notes. This can’t be undone; the deletion is recorded in the audit log.
Path parameters
-
idstring required - The contact id.
curl -X DELETE https://api.rabbitblaze.com/v1/contacts/0199c513-0d1e-7f2a-8b3c-4d5e6f7a8b9c \ -H "Authorization: Bearer $RABBITBLAZE_API_KEY" const res = await fetch("https://api.rabbitblaze.com/v1/contacts/0199c513-0d1e-7f2a-8b3c-4d5e6f7a8b9c", { method: "DELETE", headers: { Authorization: `Bearer ${process.env.RABBITBLAZE_API_KEY}`, },})const data = await res.json() import osimport requests res = requests.delete( "https://api.rabbitblaze.com/v1/contacts/0199c513-0d1e-7f2a-8b3c-4d5e6f7a8b9c", headers={"Authorization": f"Bearer {os.environ['RABBITBLAZE_API_KEY']}"},)res.raise_for_status()data = res.json() { "object": "contact", "id": "0199c513-0d1e-7f2a-8b3c-4d5e6f7a8b9c", "deleted": true} Merge a lead into a user
/v1 /contacts/merge contacts:write Moves the lead’s conversations, events, notes, tags and companies onto the user, fills in details the user doesn’t have yet, and deletes the lead — for example after an anonymous visitor signs up. Returns the user.
Body
-
leadIdstring required - The lead to merge (deleted afterwards).
-
userIdstring required - The user that keeps everything.
curl -X POST https://api.rabbitblaze.com/v1/contacts/merge \ -H "Authorization: Bearer $RABBITBLAZE_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "leadId": "0199c513-0d1e-7f2a-8b3c-4d5e6f7a8b9c", "userId": "0199c512-6a7b-7c8d-9e0f-1a2b3c4d5e6f"}' const res = await fetch("https://api.rabbitblaze.com/v1/contacts/merge", { method: "POST", headers: { Authorization: `Bearer ${process.env.RABBITBLAZE_API_KEY}`, "Content-Type": "application/json", }, body: JSON.stringify({ leadId: "0199c513-0d1e-7f2a-8b3c-4d5e6f7a8b9c", userId: "0199c512-6a7b-7c8d-9e0f-1a2b3c4d5e6f", }),})const data = await res.json() import osimport requests res = requests.post( "https://api.rabbitblaze.com/v1/contacts/merge", headers={"Authorization": f"Bearer {os.environ['RABBITBLAZE_API_KEY']}"}, json={ "leadId": "0199c513-0d1e-7f2a-8b3c-4d5e6f7a8b9c", "userId": "0199c512-6a7b-7c8d-9e0f-1a2b3c4d5e6f", },)res.raise_for_status()data = res.json() { "object": "contact", "id": "0199c512-6a7b-7c8d-9e0f-1a2b3c4d5e6f", "role": "user", "externalId": "usr_48213", "email": "[email protected]", "phone": "+49 30 1234567", "name": "Lena Fischer", "avatarUrl": null, "ownerId": "0199a8f2-2d3e-7f4a-9b5c-6d7e8f9a0b1c", "location": { "city": "Berlin", "region": "Berlin", "country": "Germany", "countryCode": "DE", "timezone": "Europe/Berlin" }, "language": "de", "browser": "Chrome", "os": "macOS", "lastSeenAt": "2026-10-02T13:58:20.000Z", "lastContactedAt": "2026-10-02T14:11:08.000Z", "lastRepliedAt": "2026-10-02T14:05:31.000Z", "signedUpAt": "2025-03-08T10:00:00.000Z", "sessionCount": 214, "unsubscribedFromEmails": false, "blocked": false, "customAttributes": { "plan": "business", "seats": 12, "mrr": 1490 }, "tags": [ { "id": "0199a8f3-5d6e-7f7a-8b8c-9d0e1f2a3b4c", "name": "VIP" } ], "companies": [ { "id": "0199c514-2b3c-7d4e-9f5a-6b7c8d9e0f1a", "name": "Northwind Analytics" } ], "createdAt": "2026-09-14T09:12:44.000Z", "updatedAt": "2026-10-02T16:40:03.000Z"} Tag a contact
/v1 /contacts/{id}/tags contacts:write Adds a tag (fires contact.tag.added). Remove it with DELETE /contacts/{id}/tags/{tagId}. Both return the contact.
Path parameters
-
idstring required - The contact id.
Body
-
tagIdstring required - A tag id.
curl -X POST https://api.rabbitblaze.com/v1/contacts/0199c512-6a7b-7c8d-9e0f-1a2b3c4d5e6f/tags \ -H "Authorization: Bearer $RABBITBLAZE_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "tagId": "0199a8f3-5d6e-7f7a-8b8c-9d0e1f2a3b4c"}' const res = await fetch("https://api.rabbitblaze.com/v1/contacts/0199c512-6a7b-7c8d-9e0f-1a2b3c4d5e6f/tags", { method: "POST", headers: { Authorization: `Bearer ${process.env.RABBITBLAZE_API_KEY}`, "Content-Type": "application/json", }, body: JSON.stringify({ tagId: "0199a8f3-5d6e-7f7a-8b8c-9d0e1f2a3b4c", }),})const data = await res.json() import osimport requests res = requests.post( "https://api.rabbitblaze.com/v1/contacts/0199c512-6a7b-7c8d-9e0f-1a2b3c4d5e6f/tags", headers={"Authorization": f"Bearer {os.environ['RABBITBLAZE_API_KEY']}"}, json={ "tagId": "0199a8f3-5d6e-7f7a-8b8c-9d0e1f2a3b4c", },)res.raise_for_status()data = res.json() { "object": "contact", "id": "0199c512-6a7b-7c8d-9e0f-1a2b3c4d5e6f", "role": "user", "externalId": "usr_48213", "email": "[email protected]", "phone": "+49 30 1234567", "name": "Lena Fischer", "avatarUrl": null, "ownerId": "0199a8f2-2d3e-7f4a-9b5c-6d7e8f9a0b1c", "location": { "city": "Berlin", "region": "Berlin", "country": "Germany", "countryCode": "DE", "timezone": "Europe/Berlin" }, "language": "de", "browser": "Chrome", "os": "macOS", "lastSeenAt": "2026-10-02T13:58:20.000Z", "lastContactedAt": "2026-10-02T14:11:08.000Z", "lastRepliedAt": "2026-10-02T14:05:31.000Z", "signedUpAt": "2025-03-08T10:00:00.000Z", "sessionCount": 214, "unsubscribedFromEmails": false, "blocked": false, "customAttributes": { "plan": "business", "seats": 12, "mrr": 1490 }, "tags": [ { "id": "0199a8f3-5d6e-7f7a-8b8c-9d0e1f2a3b4c", "name": "VIP" } ], "companies": [ { "id": "0199c514-2b3c-7d4e-9f5a-6b7c8d9e0f1a", "name": "Northwind Analytics" } ], "createdAt": "2026-09-14T09:12:44.000Z", "updatedAt": "2026-10-02T16:40:03.000Z"} Remove a tag from a contact
/v1 /contacts/{id}/tags/{tagId} contacts:write Removes the tag from the person and returns the contact.
Path parameters
-
idstring required - The contact id.
-
tagIdstring required - The tag id.
curl -X DELETE https://api.rabbitblaze.com/v1/contacts/0199c512-6a7b-7c8d-9e0f-1a2b3c4d5e6f/tags/0199a8f3-5d6e-7f7a-8b8c-9d0e1f2a3b4c \ -H "Authorization: Bearer $RABBITBLAZE_API_KEY" const res = await fetch("https://api.rabbitblaze.com/v1/contacts/0199c512-6a7b-7c8d-9e0f-1a2b3c4d5e6f/tags/0199a8f3-5d6e-7f7a-8b8c-9d0e1f2a3b4c", { method: "DELETE", headers: { Authorization: `Bearer ${process.env.RABBITBLAZE_API_KEY}`, },})const data = await res.json() import osimport requests res = requests.delete( "https://api.rabbitblaze.com/v1/contacts/0199c512-6a7b-7c8d-9e0f-1a2b3c4d5e6f/tags/0199a8f3-5d6e-7f7a-8b8c-9d0e1f2a3b4c", headers={"Authorization": f"Bearer {os.environ['RABBITBLAZE_API_KEY']}"},)res.raise_for_status()data = res.json() { "object": "contact", "id": "0199c512-6a7b-7c8d-9e0f-1a2b3c4d5e6f", "role": "user", "externalId": "usr_48213", "email": "[email protected]", "phone": "+49 30 1234567", "name": "Lena Fischer", "avatarUrl": null, "ownerId": "0199a8f2-2d3e-7f4a-9b5c-6d7e8f9a0b1c", "location": { "city": "Berlin", "region": "Berlin", "country": "Germany", "countryCode": "DE", "timezone": "Europe/Berlin" }, "language": "de", "browser": "Chrome", "os": "macOS", "lastSeenAt": "2026-10-02T13:58:20.000Z", "lastContactedAt": "2026-10-02T14:11:08.000Z", "lastRepliedAt": "2026-10-02T14:05:31.000Z", "signedUpAt": "2025-03-08T10:00:00.000Z", "sessionCount": 214, "unsubscribedFromEmails": false, "blocked": false, "customAttributes": { "plan": "business", "seats": 12, "mrr": 1490 }, "tags": [], "companies": [ { "id": "0199c514-2b3c-7d4e-9f5a-6b7c8d9e0f1a", "name": "Northwind Analytics" } ], "createdAt": "2026-09-14T09:12:44.000Z", "updatedAt": "2026-10-02T16:40:03.000Z"} Attach a company
/v1 /contacts/{id}/companies contacts:write Links the person to a company (people can belong to several). Detach with DELETE /contacts/{id}/companies/{companyId}. Both return the contact.
Path parameters
-
idstring required - The contact id.
Body
-
companyIdstring required - A company id.
curl -X POST https://api.rabbitblaze.com/v1/contacts/0199c512-6a7b-7c8d-9e0f-1a2b3c4d5e6f/companies \ -H "Authorization: Bearer $RABBITBLAZE_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "companyId": "0199c514-2b3c-7d4e-9f5a-6b7c8d9e0f1a"}' const res = await fetch("https://api.rabbitblaze.com/v1/contacts/0199c512-6a7b-7c8d-9e0f-1a2b3c4d5e6f/companies", { method: "POST", headers: { Authorization: `Bearer ${process.env.RABBITBLAZE_API_KEY}`, "Content-Type": "application/json", }, body: JSON.stringify({ companyId: "0199c514-2b3c-7d4e-9f5a-6b7c8d9e0f1a", }),})const data = await res.json() import osimport requests res = requests.post( "https://api.rabbitblaze.com/v1/contacts/0199c512-6a7b-7c8d-9e0f-1a2b3c4d5e6f/companies", headers={"Authorization": f"Bearer {os.environ['RABBITBLAZE_API_KEY']}"}, json={ "companyId": "0199c514-2b3c-7d4e-9f5a-6b7c8d9e0f1a", },)res.raise_for_status()data = res.json() { "object": "contact", "id": "0199c512-6a7b-7c8d-9e0f-1a2b3c4d5e6f", "role": "user", "externalId": "usr_48213", "email": "[email protected]", "phone": "+49 30 1234567", "name": "Lena Fischer", "avatarUrl": null, "ownerId": "0199a8f2-2d3e-7f4a-9b5c-6d7e8f9a0b1c", "location": { "city": "Berlin", "region": "Berlin", "country": "Germany", "countryCode": "DE", "timezone": "Europe/Berlin" }, "language": "de", "browser": "Chrome", "os": "macOS", "lastSeenAt": "2026-10-02T13:58:20.000Z", "lastContactedAt": "2026-10-02T14:11:08.000Z", "lastRepliedAt": "2026-10-02T14:05:31.000Z", "signedUpAt": "2025-03-08T10:00:00.000Z", "sessionCount": 214, "unsubscribedFromEmails": false, "blocked": false, "customAttributes": { "plan": "business", "seats": 12, "mrr": 1490 }, "tags": [ { "id": "0199a8f3-5d6e-7f7a-8b8c-9d0e1f2a3b4c", "name": "VIP" } ], "companies": [ { "id": "0199c514-2b3c-7d4e-9f5a-6b7c8d9e0f1a", "name": "Northwind Analytics" } ], "createdAt": "2026-09-14T09:12:44.000Z", "updatedAt": "2026-10-02T16:40:03.000Z"} Detach a company
/v1 /contacts/{id}/companies/{companyId} contacts:write Removes the link between the person and the company. Both stay.
Path parameters
-
idstring required - The contact id.
-
companyIdstring required - The company id.
curl -X DELETE https://api.rabbitblaze.com/v1/contacts/0199c512-6a7b-7c8d-9e0f-1a2b3c4d5e6f/companies/0199c514-2b3c-7d4e-9f5a-6b7c8d9e0f1a \ -H "Authorization: Bearer $RABBITBLAZE_API_KEY" const res = await fetch("https://api.rabbitblaze.com/v1/contacts/0199c512-6a7b-7c8d-9e0f-1a2b3c4d5e6f/companies/0199c514-2b3c-7d4e-9f5a-6b7c8d9e0f1a", { method: "DELETE", headers: { Authorization: `Bearer ${process.env.RABBITBLAZE_API_KEY}`, },})const data = await res.json() import osimport requests res = requests.delete( "https://api.rabbitblaze.com/v1/contacts/0199c512-6a7b-7c8d-9e0f-1a2b3c4d5e6f/companies/0199c514-2b3c-7d4e-9f5a-6b7c8d9e0f1a", headers={"Authorization": f"Bearer {os.environ['RABBITBLAZE_API_KEY']}"},)res.raise_for_status()data = res.json() { "object": "contact", "id": "0199c512-6a7b-7c8d-9e0f-1a2b3c4d5e6f", "role": "user", "externalId": "usr_48213", "email": "[email protected]", "phone": "+49 30 1234567", "name": "Lena Fischer", "avatarUrl": null, "ownerId": "0199a8f2-2d3e-7f4a-9b5c-6d7e8f9a0b1c", "location": { "city": "Berlin", "region": "Berlin", "country": "Germany", "countryCode": "DE", "timezone": "Europe/Berlin" }, "language": "de", "browser": "Chrome", "os": "macOS", "lastSeenAt": "2026-10-02T13:58:20.000Z", "lastContactedAt": "2026-10-02T14:11:08.000Z", "lastRepliedAt": "2026-10-02T14:05:31.000Z", "signedUpAt": "2025-03-08T10:00:00.000Z", "sessionCount": 214, "unsubscribedFromEmails": false, "blocked": false, "customAttributes": { "plan": "business", "seats": 12, "mrr": 1490 }, "tags": [ { "id": "0199a8f3-5d6e-7f7a-8b8c-9d0e1f2a3b4c", "name": "VIP" } ], "companies": [], "createdAt": "2026-09-14T09:12:44.000Z", "updatedAt": "2026-10-02T16:40:03.000Z"} List a contact’s conversations
/v1 /contacts/{id}/conversations conversations:read Every conversation with this person, newest first.
Path parameters
-
idstring required - The contact id.
Query parameters
-
limitinteger - Items per page, 1–100. Default
25. -
cursorstring - The
nextCursorof the previous page.
curl https://api.rabbitblaze.com/v1/contacts/0199c512-6a7b-7c8d-9e0f-1a2b3c4d5e6f/conversations \ -H "Authorization: Bearer $RABBITBLAZE_API_KEY" const res = await fetch("https://api.rabbitblaze.com/v1/contacts/0199c512-6a7b-7c8d-9e0f-1a2b3c4d5e6f/conversations", { headers: { Authorization: `Bearer ${process.env.RABBITBLAZE_API_KEY}`, },})const data = await res.json() import osimport requests res = requests.get( "https://api.rabbitblaze.com/v1/contacts/0199c512-6a7b-7c8d-9e0f-1a2b3c4d5e6f/conversations", headers={"Authorization": f"Bearer {os.environ['RABBITBLAZE_API_KEY']}"},)res.raise_for_status()data = res.json() { "items": [ { "object": "conversation", "id": "0199c520-7e8f-7a9b-8c0d-1e2f3a4b5c6d", "number": 1042, "state": "open", "channel": "messenger", "subject": null, "title": "Invoice shows the wrong VAT number", "isPriority": false, "contact": { "id": "0199c512-6a7b-7c8d-9e0f-1a2b3c4d5e6f", "name": "Lena Fischer", "email": "[email protected]", "role": "user" }, "companyId": "0199c514-2b3c-7d4e-9f5a-6b7c8d9e0f1a", "assignee": { "id": "0199a8f2-3e4f-7a5b-8c6d-7e8f9a0b1c2d", "name": "Jonas Weber" }, "team": { "id": "0199a8f2-4f5a-7b6c-9d7e-8f9a0b1c2d3e", "name": "Billing" }, "tags": [ { "id": "0199a8f3-5d6e-7f7a-8b8c-9d0e1f2a3b4c", "name": "VIP" } ], "customAttributes": { "invoice_number": "INV-4412" }, "waitingSince": null, "snoozedUntil": null, "closedAt": null, "lastMessageAt": "2026-10-02T14:11:08.000Z", "firstContactMessageAt": "2026-10-02T14:05:31.000Z", "firstTeammateReplyAt": "2026-10-02T14:11:08.000Z", "aiAgentState": "handed_off", "rating": null, "sla": { "status": "met", "dueAt": null }, "ticket": null, "messageCount": 4, "createdAt": "2026-10-02T14:05:31.000Z", "updatedAt": "2026-10-02T14:11:08.000Z" } ], "nextCursor": null} List a contact’s events
/v1 /contacts/{id}/events events:read Events tracked for this person, newest first.
Path parameters
-
idstring required - The contact id.
Query parameters
-
limitinteger - Items per page, 1–100. Default
25. -
cursorstring - The
nextCursorof the previous page.
curl https://api.rabbitblaze.com/v1/contacts/0199c512-6a7b-7c8d-9e0f-1a2b3c4d5e6f/events?limit=10 \ -H "Authorization: Bearer $RABBITBLAZE_API_KEY" const res = await fetch("https://api.rabbitblaze.com/v1/contacts/0199c512-6a7b-7c8d-9e0f-1a2b3c4d5e6f/events?limit=10", { headers: { Authorization: `Bearer ${process.env.RABBITBLAZE_API_KEY}`, },})const data = await res.json() import osimport requests res = requests.get( "https://api.rabbitblaze.com/v1/contacts/0199c512-6a7b-7c8d-9e0f-1a2b3c4d5e6f/events", headers={"Authorization": f"Bearer {os.environ['RABBITBLAZE_API_KEY']}"}, params={ "limit": "10", },)res.raise_for_status()data = res.json() { "items": [ { "object": "event", "id": "0199c530-3a4b-7c5d-8e6f-7a8b9c0d1e2f", "name": "invoice-paid", "contactId": "0199c512-6a7b-7c8d-9e0f-1a2b3c4d5e6f", "metadata": { "invoice": "INV-4412", "amount": 149000, "currency": "eur" }, "occurredAt": "2026-10-02T15:20:00.000Z" } ], "nextCursor": "WyIyMDI2LTEwLTAyVDE0OjA1OjMxLjAwMFoiLCIwMTk5YzUyMC03ZThmIl0"}