Skip to main content
A contact is one person, keyed by phone number, that a campaign has called or that has called you. The contact record is where you answer “how many times did we try, what happened, and when do we try again?” It is also where you say “never call this person”. Contacts come from GoHighLevel. The platform does not keep its own address book. It keeps the calling history against each GoHighLevel contact.

What one contact holds

GET /api/contacts returns one row per unique contact. GET /api/contacts/{phoneNumber}/calls returns everything the platform has done with one person: their calls and a dispositionSummary counting how the calls ended.

Outcome types on a contact

A contact’s disposition.type and the disposition filter use these values: These are the contact-level names. The per-call outcome constants that workflows route on, such as SUCCESS and KILL_SWITCH, are listed in What your agent records.

Four ways to stop calling someone

They look similar and they are not. Pick the one that matches who decided and how wide it reaches.
Clearing a do-not-call flag can produce a call that should not be placed. Treat DELETE /api/contacts/{contactId}/do-not-call as a deliberate act, and scope API keys that hold contacts:write accordingly.

Your own test leads

You will dial yourself and your team while building. Mark those contacts as internal with POST /api/contacts/internal, identifying the contact by contactId, by phoneNumber, or by both, with the project’s locationId.
  • Their calls are left out of every performance figure: lead counts, booking and transfer rates, pickup, trends and the heatmap.
  • Their cost is kept. The minutes were really spent and really billed, so the dashboard stays in step with your wallet.
  • They still get called. The mark changes reporting only.
GET /api/contacts lists them by default with isInternal set on each row. Send internal=only to see just them, or internal=exclude to hide them. Clear the mark with DELETE /api/contacts/internal.

Finding contacts

Sort with sortBy (leadName, phoneNumber, projectName, dateAdded, callCount) and sortOrder (asc, desc). Page with page and limit. GET /api/contacts/filters returns the projects and dispositions present in your data.

Boundaries

  • A contact is unique per phone number within a project.
  • projectName on a write is a display label only. locationId is the tenant identity.
  • Marking a contact internal never suppresses a call. Use the do-not-call flag for that.

In the API