Developer API Overview
Authenticate, discover, and call Goliath developer API operations from your own code
About
The Goliath developer API lets your own code — servers, scripts, AI agents, or third-party tools — read and write the same data you work with in the app: contacts, properties, deals and pipelines, workflow automations, forms, and team settings.
There is one HTTP endpoint. You never send GraphQL or build queries —
instead you call a named operation from a fixed catalog (an operationId)
with its variables, and Goliath executes a pre-authored, pre-reviewed request
on your behalf. Every call runs as the key’s owning user, so your real
organization permissions and visibility apply — the API can never see or touch
anything you couldn’t see in the app yourself.
Generating an API key
-
Open API Keys. From the app, go to Settings → API Keys (also reachable from the API Keys card on the Integrations page). Independent-operator seats cannot create API keys.
-
Create a key. Keys are personal — each key belongs to your user and acts as you. Create one key per host or device so you can revoke them independently.
-
Pick scopes. Each key carries one or more scopes (see below).
ADMINcan only be granted to a key whose owner is a team admin. -
Store the secret. The key looks like
gsk_.... Pass it as a Bearer token on every request and keep it in your secrets manager — never ship it in a browser, mobile app, or any client-side code.
Scopes
| Scope | Grants |
|---|---|
READ |
Read operations — fetch and list data. |
WRITE |
Mutating operations — create and update records. |
ADMIN |
Team management, organization settings, nightly team/pipeline analytics, integration management, inbox dismissal, phone-number purchases, and billing/credit-spending operations. Implies READ + WRITE. Only grantable to a team admin’s key, and re-checked on every call — if the owner loses admin, the key’s ADMIN operations stop working immediately. |
Scopes decide what kind of operation a key may run. Which specific records it
may touch is a separate check — see Authorization
for how organization ownership and the two kinds of 403 work.
Making a request
POST https://server.goliathdata.com/api/v1/call
Authorization: Bearer gsk_...
Content-Type: application/json
{ "operationId": "getContact", "variables": { "contactId": "..." } }
curl -X POST https://server.goliathdata.com/api/v1/call \
-H "Authorization: Bearer gsk_YOUR_KEY" \
-H "Content-Type: application/json" \
-d '{ "operationId": "findContacts", "variables": { "searchTerm": "smith" } }'
(POST /api/v1/graphql is the same endpoint under its original name and stays
supported — despite that path, it does not accept GraphQL queries either.)
A handled request always returns 200 with a GraphQL-style body:
{ "data": { ... }, "errors": [ ... ] }
Transport, authorization, and subscription problems use HTTP status codes instead:
| Status | Code | Meaning |
|---|---|---|
| 401 | unauthorized |
Missing bearer header, or invalid/revoked key |
| 400 | raw_query_forbidden |
Body contained a query — raw GraphQL is never accepted |
| 400 | bad_request |
Body missing a string operationId, malformed variables, an invalid Idempotency-Key (empty or over 255 characters), or that header sent on a read |
| 400 | unknown_operation |
operationId is unknown or unavailable to your organization |
| 400 | unknown_variable |
variables contained a name the operation doesn’t declare. The message lists the accepted variables — undeclared names are rejected rather than silently ignored, so a typo’d filter can’t quietly return unfiltered results |
| 402 | subscription_inactive |
Your organization has no usable plan. Billing and profile recovery reads remain available; restore the subscription in the app |
| 403 | insufficient_scope |
Key lacks the scope the operation requires |
| 403 | forbidden |
A guarded resource is missing, deleted, or outside your organization’s access; the response does not distinguish these cases |
| 403 | send_consent_not_attested |
The operation messages a contact and an org admin has not made the send consent attestation |
| 403 | outbound_paused |
The operation messages a contact while the organization has “Pause everything” on; retry once an admin resumes sending |
| 409 | idempotency_conflict |
A request with the same Idempotency-Key is still running — retry with that key to receive its stored result |
| 429 | rate_limited |
Analytics rate limit or repeated subscription refusals exceeded the per-key budget (Retry-After specifies the wait), or the pre-authentication IP throttle was reached (no header; back off and retry) |
| 429 | concurrency_limit |
Too many in-flight requests on this key — retry shortly |
| 500 | internal_error |
Unexpected failure on our side |
| 503 | temporarily_disabled |
The developer API is temporarily switched off; honor Retry-After before retrying |
Result limits & truncation
Capped list/search operations declare a result cap — a maximum number of
rows requested per call. If you send a limit larger than the cap, the
gateway silently clamps it before execution: the operation runs with
the capped limit and returns up to that many rows, without a limit error.
The gateway does not trim the response after execution.
Most list operations are fully pageable — they take an offset (or a cursor)
and return a totalCount and/or hasMore, so you can walk the whole result set a
page at a time. Prefer these when you need everything:
# page through all matches
{ "operationId": "findContacts", "variables": { "searchTerm": "smith", "limit": 50, "offset": 0 } }
{ "operationId": "findContacts", "variables": { "searchTerm": "smith", "limit": 50, "offset": 50 } }
listAppointments and listMyTasks support forward cursor pagination
(default 25, cap 50). When canFetchNext is true, keep the same filters and
set cursor to the last returned row’s id. Repeat until false; restart
without a cursor to revisit earlier rows. Their total is the unpaged match
count.
Discovering operations
The full operation catalog is machine-readable — ideal for AI agents and for keeping your integration in sync:
GET https://server.goliathdata.com/api/v1/operations
Authorization: Bearer gsk_...
→ 200 { "operations": [{ "operationId", "operationType", "requiredScope", "summary", "authorized" }] }
GET https://server.goliathdata.com/api/v1/operations/:operationId
→ 200 { variables, responseShape, example, notes, ... }
- The list returns one-line summaries of every operation.
- The detail view returns the full variable schema, the exact response shape, and a copy-pasteable example for one operation.
authorizedreflects your key’s scopes, so a caller sees exactly what it is allowed to run.
Operations behind an organization feature gate are omitted when unavailable
to your key. Their detail endpoint returns 404 unknown_operation, and
calling their id returns 400 unknown_operation.
Operation reference by area
The catalog is documented alongside each feature’s user guides:
- Properties API — search properties, count signal events, author CONTACT/PROPERTY/DEAL filters, manage filter folders, and organize lists
- Contacts API — read, create, update, and enrich contacts, find duplicate groups, and manage contact filters
- Deals API — search and filter deals, read open-task counts, edit custom fields, and manage Scraper Health cards
- Pipelines API — manage pipeline structure and read pipeline analytics
- Workflows API — manage automations and runs across contact, deal, property, appointment, and event domains; set live sending schedules, bulk-enroll contacts, restore archived workflows, and apply task templates and sets
- Content Templates API — manage message, task, and task-set templates and folders
- Forms API — manage lead-capture forms and read form analytics
- Communications API — read and triage inbox threads, read recordings and transcripts, manage suppressions, and render templates
- Notifications API — read your notification feed and mark items read
- Appointments API — check live calendar conflicts, schedule appointments, manage SMS reminders, and configure availability
- Tasks API — create, reschedule, and complete CRM to-do tasks
- Skip Trace API — run skip traces from your own systems
- Bulk Tasks API — poll the status of long-running bulk jobs
- Team API — roster, role and permission changes, teams, goal plans, member suspension/restoration, invitations, live activity counts, and nightly analytics
- Account API — your profile, organization settings, intake assignment, permissions, integration status and disconnection, and setup links
- Billing API — subscription dates, plan allowances, AI usage warnings, credit balances and usage, and fixed credit packs
- AI Employees API — create, configure, and supervise AI employees
- Automation Map API — read and edit the Automations Map
- Scheduled Tasks API — recurring Ask Goliath tasks
- Contracts API — draft, send, and track contracts for signature
- Call Lists API — build and work call lists
- Contact Imports API — map, preview, and import a contact spreadsheet
- Files API — exports, skip-trace runs, and upload reports
- Library API — the Library’s spaces, files, and file runs
- Memory API — what Goliath remembers about your business
- Coverage API — data coverage for your markets
- Partnerships API — lead-sharing partnerships with other organizations
Capabilities managed in the app
Use the app for capabilities outside the public operation catalog:
- File uploads — a spreadsheet enters Goliath through the app or an Ask Goliath chat; from there the Contact Imports API and the Library API take over.
- Buying credits and changing the plan — a person does it in the app; see the Billing API.
Texts, emails, and contract sends are available to the API once an org admin makes the send consent attestation.