Skip to content

Voice & Dialer

The Voice API exposes graph8’s parallel dialer — session management, real-time call records, transcripts, AI grading, agent rosters, and phone number pools. All endpoints sit on /api/v1/voice/dialer/* and require a server-side API key (Bearer + X-Org-Id).

30-second start

List the active dialer sessions for your org:

Terminal window
curl 'https://be.graph8.com/api/v1/voice/dialer/sessions?status=active&page_size=20' \
-H "Authorization: Bearer $G8_API_KEY"

Quick reference

EndpointMethodPurpose
/voice/dialer/sessionsGETList dialer sessions
/voice/dialer/sessionsPOSTCreate a new (paused) session
/voice/dialer/sessions/{id}PATCHUpdate session status (paused, running, stopped)
/voice/dialer/sessions/{id}/resumePOSTResume + dial next batch (real calls)
/voice/dialer/statsGETAggregated dialer analytics
/voice/dialer/numbersGETPhone numbers the org owns
/voice/dialer/agentsGETAvailable voice agents
/voice/dialer/missed-callbacksGETMissed inbound callbacks / voicemails
/voice/dialer/callsGETList calls, filterable by contact / SDR / campaign / date
/voice/dialer/calls/{room_name}/transcriptGETFull transcript of one call
/voice/dialer/calls/{room_name}/gradingGETAI grading + talk-track feedback

Sessions

List sessions

Terminal window
GET /api/v1/voice/dialer/sessions?status=active&user_email=[email protected]&page=1&page_size=50

Filterable params: status, user_email, name, campaign_id, list_id, list_name, date_from, date_to, sort_by.

Response shape:

{
"data": [
{
"session_id": "ses_abc123",
"status": "active",
"user_email": "[email protected]",
"campaign_id": "cmp_q3_outbound",
"from_phone": "+14155551234",
"total_calls": 42,
"created_at": "2026-05-25T14:30:00Z"
}
],
"pagination": { "page": 1, "page_size": 50, "total_items": 12 }
}

Create a session

Terminal window
POST /api/v1/voice/dialer/sessions
Content-Type: application/json
{
"list_id": 637,
"agent_id": "ag_default",
"from_number": "+14155551234",
"campaign_id": "cmp_q3_outbound"
}

Session is created in PAUSED state. The SDR opens the dialer UI and calls POST /resume to start dialing.

Resume / pause / stop

Terminal window
POST /api/v1/voice/dialer/sessions/{session_id}/resume
# Body: { "max_contacts": 4 }
PATCH /api/v1/voice/dialer/sessions/{session_id}
# Body: { "status": "paused" } // or "stopped"

Resume kicks off real outbound calls — credits accrue per minute of call audio.

Calls

List calls

Terminal window
GET /api/v1/voice/dialer/calls?contact_id=5028106&limit=25&page=1

Filterable: contact_id, user_email, campaign_id, date_from, date_to, limit, page.

Get call transcript

Terminal window
GET /api/v1/voice/dialer/calls/{room_name}/transcript

Returns status: "ready" with a transcript array of { speaker, text, timestamp } entries. Returns status: "empty" (with transcript: []) when the call ended but the transcript wasn’t flushed — rare, usually a sub-30-second hang-up.

Get AI grading

Terminal window
GET /api/v1/voice/dialer/calls/{room_name}/grading

Returns the AI-graded talk-track feedback for the call. Includes per-segment quality scores, talk/listen ratio, objections handled, next-best-action.

Stats, numbers, agents

Terminal window
GET /api/v1/voice/dialer/stats?aggregation=daily&date_from=2026-05-01
GET /api/v1/voice/dialer/numbers
GET /api/v1/voice/dialer/agents
GET /api/v1/voice/dialer/missed-callbacks?limit=50

stats supports aggregation=daily|total and the standard date filters. Returns dial count, connection rate, talk time, average call length, disposition breakdown.

Credit costs

OperationCredits
Read endpoints (sessions, calls, transcripts, grading, stats)Free
Outbound call audio20 per minute
Booked meeting20 per booking
Inbound callback (handled by AI receptionist)20 per minute

The 5 rps rate limit applies to every read endpoint. Outbound dialer placements are throttled separately by the agent pool — see Rate Limits.

Errors

StatusCauseFix
401Missing or invalid Authorization: Bearer headerGet a key
402Out of credits (waterfall enrichment, AI generation, voice minutes)Top up in Settings → Billing, or switch to Platform
404Resource ID doesn’t existList first to verify the ID
422Validation error in request bodyInspect error.message + error.field in the response
429Rate limit (5 rps per org)Backoff per Retry-After header. See Rate Limits
5xxgraph8 errorRetry with exponential backoff (5s → 30s → 120s)

The full error envelope shape: { "error": { "code": "...", "message": "...", "field": "...", "request_id": "..." } }. Include the request_id in any support ticket. See Errors for the canonical reference.

See also