Skip to main content

About

Everything the CRM does with contacts is available programmatically: look up and search contacts, create and update them, add notes and tags, assign teammates, and skip-trace (enrich) them for phone numbers and emails. All operations go through the developer API gateway — one endpoint, called by operationId. If you haven’t set up a key yet, start with the Developer API Overview.

Operations

Reading contacts (READ scope)

Writing contacts (WRITE scope)

Bulk contact writes can start workflowsAdding or removing tags/lists and setting a custom field publish the same contact-change events as the app. A matching CONTACT workflow can therefore start and send. Check the org’s workflows before changing a large selection, and poll every returned bulkTaskId before reporting success.
Who may edit or delete a noteA non-admin key may only edit or delete notes the key owner authored; anyone else’s are refused. A note whose author.kind is AI counts as someone else’s, so a non-admin key is refused on one — check the author before offering to correct a note. A team-admin key can edit or delete any note.

Custom fields (READ + WRITE scopes)

Custom fields are organization-wide definitions. These operations manage the definitions themselves; you write per-contact values through the addCustomFieldValues input on createContact and updateCustomFieldValues on updateContact, using the customFieldId from here.
Check the blast radius before deleting a fieldCall getDeletionImpact with targetKind: CONTACT_CUSTOM_FIELD and the field id first. It reports how many contacts hold a value and which filters and workflows reference the field, and returns the impactVersion you must hand back as dependencyResolution.impactVersion — pass an empty replacements array when it reports no replacement requirements.

Enrichment (ADMIN scope)

Credit-spending operationsEnrichment operations spend your organization’s skip-trace credits, so they require the ADMIN scope and the key owner must currently be a team admin. Check balances first with getBillingSummary — see the Billing API.
Organization guardOperations that take a contactId are org-guarded on it: a contact outside your organization returns 403 forbidden before the operation runs. Other ids you pass — a tag or teammate — aren’t pre-checked at the gateway; the operation validates them as it executes and surfaces its own error (e.g. NOT_FOUND for an unknown tag). See Authorization for the model.

Example

Find a contact, then add a note to it:
Full variable schemas, response shapes, and worked examples for every operation are available from the discovery endpoint.
Contacts also flow out of Goliath — workflow webhook steps POST a contact payload to your URLs. See the Contact Webhook Payload reference.