Quickstart
Create an API key, find an agent and a phone number, place an outbound call, and track it to the result.
You need three things in your dashboard before you start: an active agent, a phone number assigned to that agent, and wallet funds. Agents and phone numbers are read-only through the API, so set them up in the dashboard first.
- Create an API key
Open Settings > API Keys, select Create New API Key, give it a name, and copy the key. Only workspace admins can create keys.
Keys from the dashboard can read and write, which covers every step on this page. See Authentication for the full permission model.
- List your agents
Find the agent that will make the call and copy its
id.curl "https://backend.synthesys.app/api/v1/agents?limit=10" \ -H "SYNTH_API_KEY: YOUR_API_KEY"The response below is trimmed to the fields you need here.
{ "success": true, "data": [ { "id": "8f14e45f-ceea-4e7a-9f3b-1a2b3c4d5e6f", "displayName": "Sales follow-up", "personaName": "Jane", "status": "active", "type": "outbound" } ], "pagination": { "total": 1, "limit": 10, "offset": 0 } }The agent's
statusmust beactive. - List your phone numbers
Find the number assigned to that agent. Its
assignedAgentIdmust match the agent'sid, and copy the phone number'sid, not the number itself.curl "https://backend.synthesys.app/api/v1/phone-numbers" \ -H "SYNTH_API_KEY: YOUR_API_KEY"This response is trimmed too.
{ "success": true, "data": [ { "id": "3c9d2b1a-7e6f-4a5b-8c9d-0e1f2a3b4c5d", "number": "+15555550100", "status": "active", "assignedAgentId": "8f14e45f-ceea-4e7a-9f3b-1a2b3c4d5e6f", "voiceOutboundEnabled": true } ], "pagination": { "total": 1, "limit": 50, "offset": 0 } } - Place a call
Send the agent's ID, the phone number's ID, and the number to dial. Every call needs an
Idempotency-Keyheader, which you choose. If a request times out, send it again with the same key, and you won't place a second call.curl -X POST "https://backend.synthesys.app/api/v1/calls" \ -H "SYNTH_API_KEY: YOUR_API_KEY" \ -H "Idempotency-Key: quickstart-call-1" \ -H "Content-Type: application/json" \ -d '{ "agentId": "8f14e45f-ceea-4e7a-9f3b-1a2b3c4d5e6f", "phoneNumberId": "3c9d2b1a-7e6f-4a5b-8c9d-0e1f2a3b4c5d", "phoneNumber": "+12025550123", "firstName": "Jane", "email": "jane@example.com" }'A successful request returns
201. Keep thecallId.{ "success": true, "data": { "callId": "9a8b7c6d-5e4f-4a3b-8c2d-1e0f9a8b7c6d", "jobId": "b7e23ec2-9c1d-4f3a-8e5b-6d7c8b9a0f1e", "status": "queued" } }queuedmeans the call was accepted, not that it connected. Calls only go out from 09:00 to 20:00 at the destination, so a call outside those hours staysqueueduntil then. - Track the call
Read the call with its
callId. Check every 30 seconds or so untilstatusiscompletedorfailed.curl "https://backend.synthesys.app/api/v1/calls/9a8b7c6d-5e4f-4a3b-8c2d-1e0f9a8b7c6d" \ -H "SYNTH_API_KEY: YOUR_API_KEY"This response is trimmed.
{ "success": true, "data": { "id": "9a8b7c6d-5e4f-4a3b-8c2d-1e0f9a8b7c6d", "status": "completed", "failure_code": null, "failure_message": null, "contact_phone": "+12025550123", "duration_seconds": 94, "cost_usd": 0.94, "completed_at": "2026-10-31T14:05:20.511Z" } }A failed call has a
failure_codethat says why, such asinsufficient_balance. See Failure codes. - Get the transcript
The transcript is on the call's log. List the agent's logs, and find the one whose
directCallIdmatches yourcallId.curl "https://backend.synthesys.app/api/v1/call-logs?agent_id=8f14e45f-ceea-4e7a-9f3b-1a2b3c4d5e6f&limit=100" \ -H "SYNTH_API_KEY: YOUR_API_KEY" \ | jq '.data[] | select(.directCallId == "9a8b7c6d-5e4f-4a3b-8c2d-1e0f9a8b7c6d") | .call_id'Then fetch the full record with that
call_id.curl "https://backend.synthesys.app/api/v1/call-logs/d4e5f6a7-b8c9-4d0e-a1f2-3b4c5d6e7f80" \ -H "SYNTH_API_KEY: YOUR_API_KEY"This response is trimmed as well.
{ "success": true, "data": { "callLog": { "call_id": "d4e5f6a7-b8c9-4d0e-a1f2-3b4c5d6e7f80", "directCallId": "9a8b7c6d-5e4f-4a3b-8c2d-1e0f9a8b7c6d", "contactPhoneNumber": "+12025550123", "agent_id": "8f14e45f-ceea-4e7a-9f3b-1a2b3c4d5e6f", "duration": 94, "status": "ended", "ended_reason": "customer-ended-call", "summary": "Jane asked for a follow-up next week.", "hasTranscript": true }, "transcriptText": [ { "role": "assistant", "message": "Hi Jane, thanks for taking my call." }, { "role": "user", "message": "Hi, how can I help?" } ], "messages": [] } }To get the audio, use Recordings.