https://api.cloudtalk.io/v1 reads and changes the same contacts you see under Contacts in the Dashboard. Use it to keep CloudTalk in step with your CRM, add leads from a web form, or find the contact behind a phone number before a call.
It covers three resources: contacts (/contacts), the contact tag catalogue (/contact-tags) and the custom field catalogue (/contact-fields). The older /contacts/*.json and /tags/*.json endpoints on https://my.cloudtalk.io/api keep working unchanged. The reference lists them under Contacts (LEGACY) and Contact tags (LEGACY), marked LEGACY.
Requests authenticate with an API key, like the rest of the CloudTalk API. The key acts as a company admin: it sees and changes every contact in your account, and no header names a user.
Quick start
1
Read the custom fields and tags you can set
name is the key you use in customFields. A tag’s id is what tagIds takes. A create never makes a tag by accident: to use a new tag, create it first with Create a contact tag.2
Create a contact, or update the one that matches
201 with the new contact. With matchBy set, a contact that matches is updated instead and the answer is 200. When several contacts match, the most recently created one is updated and the others stay as they are.3
Find a contact by phone or email
search.4
Change only what you send
null clears a text field other than name, or removes one custom field key.Operations
Lists return
{ "data": [...], "pagination": { "limit": 20, "next": "..." }, "requestId": "..." }. Set ?limit= (default 20, at most 100) and pass pagination.next as ?cursor= with the same filters to get the next page. next is null on the last page. One contact, tag or field comes back as a bare object.
Keeping another system in step
- Changes as they happen. Subscribe to the
contact.created,contact.updatedandcontact.deletedwebhooks. Changes made through this API send them too. - Catching up. Call List and search contacts with
updatedSinceset to the time your previous run started. The list then comes most recently updated first. Some changes do not moveupdatedAt, for example Dashboard bulk edits and CRM list sync. The reference lists them. To pick those up too, list all contacts withoutupdatedSincefrom time to time, and again after you miss webhook events or run a bulk sync. - Read-only tags. Integration tags, and tags that contacts get through a CRM integration, show
readOnly: true. You can read them but not add, remove, rename or delete them here (422 CONTACTS.TAG_READ_ONLY). - Text is cleaned up. On create, bulk upsert, update, and when you create or rename a tag, emojis and other characters that take 4 bytes in UTF-8, and control characters such as line breaks and tabs, become a space. Repeated whitespace becomes one space, and spaces at the start and end are removed. This happens before lengths are checked, the same as in the CloudTalk Dashboard and the existing API. It applies to
name,title,company,industry,website,address,city,state,zip, custom field values and tag names, not to emails or phone numbers. Compare cleaned values, not the raw ones you sent, when you check what was stored.
API fields and webhook fields
The API uses camelCase. Thecontact.* webhook payloads use snake_case and keep their own names, so the same contact reads differently in each. Use this table to map one onto the other.
contact.deleted carries only id.
Safe retries
A network error onPOST /contacts leaves you not knowing whether the contact was created. Send an Idempotency-Key header (up to 255 characters) and retry with the same key and the same body:
- The contact was created: you get the original status with the contact as it is now.
- The first request is still running:
409 IDEMPOTENCY.REQUEST_IN_PROGRESS. Retry it shortly. - The same key with a different body:
422 IDEMPOTENCY.KEY_REUSED. A key names one create. - The contact was deleted since: the same key creates a new one.
matchBy updates the rows that were already written.
Errors
Errors share one shape:429 with X-CloudTalkAPI-Limit, X-CloudTalkAPI-Remaining and X-CloudTalkAPI-ResetTime, and no error body.
Branch on code. message is for people and can change, and it never repeats a value you sent. Quote requestId when you contact support. Each operation’s reference page lists the codes it can return, and Error codes covers the shape.