Skip to main content

About

Look up and search contacts, create and update them, add notes and tags, assign teammates, find duplicate groups, manage saved filters, and skip-trace (enrich) contacts 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)

Use getFilter to read a saved criteria tree before editing it, and saveFilter(type: CONTACT) to create one. Filter authoring and vocabulary discovery are documented in the Properties API. filterContacts and filtered countContacts calls check the resolved criteria against your organization’s plan. A field the plan excludes causes an operation error with code PLAN_ENTITLEMENT_REQUIRED, rather than an empty result. This applies to saved filters as well as inline trees; a saved filter does not preserve access to a feature your plan no longer includes. For filterContacts.sort, direction is ASC or DESC and field is SELLER_INTENT_SCORE, LAST_COMMUNICATION, LAST_ACTIVITY, DIAL_ATTEMPTS (organization-wide outbound dials), MY_LAST_CALL, MY_LAST_TEXT, LAST_UPDATED, CREATED_AT, TASK_HIGHLIGHT, or AUCTION_DATE (earliest upcoming auction or sale day, with contacts having none last). Unknown fields are silently ignored and use the default order; a successful response does not prove a guessed sort field worked.

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 guardContact operations declare which ids are pre-checked. These include the contact itself on by-id writes, and tag/list or teammate ids on bulk operations that declare those guards. An inaccessible guarded id returns 403 forbidden. Secondary ids nested in updateContact are validated by the operation as it executes and can return an operation error such as NOT_FOUND. 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.