Which one a sub-account is comes from its
crm field, in
GET /api/v2/projects/{id}. native means it keeps contacts here. Every
endpoint on this page answers 400 for a sub-account with a CRM connected.What a contact holds
Deliberately the minimum a call needs, plus whatever you define on top.Getting contacts in
Four doors, one import. They all end up at the same place, so a number that arrives twice updates one contact rather than making two.One at a time, from code
POST /api/contacts/add/{locationId} with an API key. See
Add a contact.From a form, Zapier or Make
The sub-account’s lead link, below. No header to set.
A file
Import contacts from CSV,
or the same button on the Contacts page.
By hand
Create a native contact,
or Add contact on the Contacts page.
Phone numbers are normalised, not guessed
A ten-digit number is read as North American. Anything else must carry+ or
00. A number that cannot be made into E.164 is refused, with the reason,
rather than being stored as somebody else’s number:
skipped; from the API it costs you the request.
The lead link
GET /api/native-contacts/lead-webhook returns a token. Post the same body you
would send to Add a contact to:
Finding them again
List native contacts pages newest first.search matches a first name, a last name, an email or any
part of the number, so a caller id in any spelling finds the row.
outcome narrows to one of two: transferred for the people a call handed to
somebody, who are still callable, and not_qualified for the people who asked
not to be called, by either door. total counts the whole filtered set rather
than the page you were given.
Custom fields
A sub-account defines its own fields, and their values live on each contact. The key is derived from the label once and never changes, so renaming “Budget” to “Monthly budget” cannot break a prompt that reads{{budget}}.
Types are text, number, date and select, and a value is checked against
the type: a date must be YYYY-MM-DD, a select must be one of its options,
case-insensitively.
customFields on a create or an update. An empty string clears
one, which is also the only way to let a “field is set” trigger fire again.
A label whose key would collide with a standard call variable, such as
name, phone, timezone or caller_pref, is refused. Custom fields are
applied to a call’s variables after the engine’s own, so such a field would
silently replace the lead’s real name, or their memory, in the prompt.Do not call
POST /api/native-contacts/{contactId}/do-not-call with doNotCall: true
stops every campaign, cadence and test dialling that contact. Send false to
clear it. The reason you send is kept, and an opt-out the contact made on a
call keeps its own words rather than taking yours.
The decision outlives the contact. Delete a suppressed contact and the
number keeps its marker. If that number is added again later, the new contact
comes back already suppressed, carrying the original date, reason and source,
and the response says so:
Deleting a contact
Deleting is not just removing a row.1
Ask what it would take with it
Preview the delete.
It names the live bookings, says whether the contact is on a call right
now, and returns the appointment ids.
2
Pass those ids back
Send them as
expectedAppointmentIds. If the contact has been booked again
since you looked, the delete is refused with 409 rather than quietly
cancelling something nobody saw.3
Bookings are cancelled first
A delete that cannot cancel one of them is refused whole, and the error
names which. Removing the row without cancelling would leave the
appointment live, the seat held and the attendee expecting it.
deleted, failed and remaining:
one contact who is on a call must not keep the other forty-nine, and the run
stops at a time budget rather than running past the point where you stopped
waiting. Send remaining again to carry on.
Starting a campaign for contacts you already have
A new contact starts any campaign whose trigger is “New contact”. For contacts that were already here when the campaign was made, use Put contacts into a campaign. It answers202 with what was accepted and a count of what was skipped, by
reason. A contact on do-not-call is always skipped, and nothing you send
overrides that.
Contact memory
caller_pref is one block of text the next call reads. The post-call step
writes what the agent learned; you can add what only a person knows:
Where to go next
Native Contacts API
Every operation, with schemas and examples.
Calendars
Booking without a CRM: the diary these contacts are booked into.
