Resource
Calls
Inbound and outbound voice. Reading is fully shipped today; the outbound dial trigger ships in Phase 1.5.
Two outbound paths
For one-off dials (post-form, post-event), use
POST /v1/calls with an outbound voice agent id. For volume dialing (lapsed-customer reactivation, lead lists), use SDR Campaigns — the dialer cron works the queue with concurrency, retries, and calling windows baked in.List calls#
List phone calls
GET
/v1/callsCursor-paginated. Filter by direction, status, contact phone, since timestamp.
Query parameters
limitintegerdefault: 50page_tokenstringdirection"inbound" | "outbound"statusstringe.g. completed, missed, voicemail.
phonestringSubstring on contact_phone.
sincedatetimeISO-8601. Only calls created at-or-after this timestamp.
Request
curl "https://agency.gary.club/api/public/v1/calls?direction=inbound&limit=20" \
-H "Authorization: Bearer gc_live_EXAMPLE_AbCdEfGhIj0123456789"Read one#
Full call detail
GET
/v1/calls/{id}Returns the full
phone_calls row plus hydrated transcript turns from phone_transcripts. Recording URLs are time-bound; cache the bytes if you need long-term storage.Path parameters
iduuidrequiredRequest
curl https://agency.gary.club/api/public/v1/calls/call_EXAMPLE_aaaa \
-H "Authorization: Bearer gc_live_EXAMPLE_AbCdEfGhIj0123456789"List agent templates#
List AI phone agent templates
GET
/v1/agentsEach row is a configured ElevenLabs / Telnyx agent — name, voice, phone number, status. Use the
id on POST /v1/calls when triggering a dial.Request
curl https://agency.gary.club/api/public/v1/agents \
-H "Authorization: Bearer gc_live_EXAMPLE_AbCdEfGhIj0123456789"Initiate an outbound call#
Trigger an outbound dial
POST
/v1/callsFires a single outbound call. The call is placed by the resolved agent itself: with a client-scoped key (
cl_live_ / agent_live_) it dials as that client's agent from the client agent's own number; with an agency key (gc_live_) it uses the agency's shared SDR agent. Requires the org's ai_sdr_outbound_enabled flag to be on and the supplied agent_id to resolve to a launched outbound voice agent in the same tenancy.Body parameters
tostringrequiredE.164 phone to dial.
agent_iduuidrequiredThe agent that will place the call (UUID or slug). Discover via
GET /v1/agents. With a client-scoped key this must be one of that client's agents, and it must be provisioned for outbound (have its own dedicated number).prompt_overridestringPer-call system-prompt override. Leave null to use the agent template's default.
contextobjectFree-form key/value context the agent can reference (e.g. customer name, last meeting summary).
callback_urlstringOptional one-shot webhook URL for events on this specific call (in addition to org-level subscriptions).
metadataobjectRound-tripped on every
call.* event for this call. Use it to correlate the trigger with downstream events.Request
curl -X POST https://agency.gary.club/api/public/v1/calls \
-H "Authorization: Bearer cl_live_EXAMPLE_AbCdEfGhIj0123456789" \
-H "Content-Type: application/json" \
-d '{
"to": "+15551234567",
"agent_id": "ag_EXAMPLE_clientOutbound",
"context": { "first_name": "Jane", "last_meeting_topic": "pricing" },
"metadata": { "n8n_run_id": "run_abc123" }
}'Client keys dial as their own agent — no fallback
A client-scoped key (
cl_live_ / agent_live_) places the call as that client's own agent, from that agent's own number, and the call is attributed to that client. If the agent isn't provisioned for outbound (no dedicated number) the request returns 422 rather than falling back to the agency's shared SDR agent — so a key can only ever dial as the agent it's scoped to. Provision the agent's outbound number in the portal before triggering calls with a client key.Webhooks for calls#
call.received— inbound ringing.call.answered— pickup confirmed.call.completed— full transcript + recording + outcome + cost.call.voicemail_left— outbound only.call.failed— couldn't connect.
See Webhooks for the payload shape and signature verification.

