Everything in the console is in the API.
Build agents, flows and voices from code. Start an agent from your own system, place calls, and get a signed webhook when each conversation ends — transcript, outcome, the fields captured and every action taken.
Place a call in one request.
Dial now, or hand the call to the queue and let calling hours decide when. Whatever you put in context is what the agent knows before it speaks.
- Keys per workspace — created in the console, each limited to the scopes it needs.
- Agents, flows, voices, numbers, calls — the whole console, from code.
- OpenAPI spec — at
/v1/openapi.jsonwith your key, for generating a client. - Recordings — fetched per call, only by the workspace that owns it.
POST /v1/callscurl -X POST https://app.voice.scrini.ai/v1/calls \ -H "Authorization: Bearer $VOICE_OS_KEY" \ -H "Content-Type: application/json" \ -d '{ "agent_id": "3f2a…", "to_number": "+91 98765 43210", "mode": "queue", "context": { "name": "Priya", "reason": "confirm Friday 11:00" } }'
Start an agent from your own system.
Each webhook trigger has its own URL and secret. Post the context you want the agent to have, signed with the secret — an unsigned request, or one from a trigger with no secret, is refused.
pythonimport hashlib, hmac, json, time, requests body = json.dumps({"phone": "+919876543210", "name": "Priya", "plan": "team"}).encode() ts = str(int(time.time())) sig = hmac.new(SECRET.encode(), ts.encode() + b"." + body, hashlib.sha256).hexdigest() requests.post( f"https://app.voice.scrini.ai/api/hooks/trigger/{KEY}", data=body, headers={"Content-Type": "application/json", "X-CallOS-Timestamp": ts, "X-CallOS-Signature": "sha256=" + sig}, )
Know the moment a conversation ends.
Subscribe an endpoint to call.completed or conversation.completed. Every delivery is signed the same way triggers are, carries a timestamp so you can refuse replays, and is retried with backoff if your endpoint is down.
- One verification helper — the same HMAC-SHA256 scheme in both directions.
- Send a test — fire a sample delivery from the console to check your signature code.
- Nothing silently lost — a delivery that fails stays visible, and can be retried.
verify a deliverydef verify(secret, headers, raw_body): ts = headers["X-CallOS-Timestamp"] if abs(time.time() - int(ts)) > 300: return False # too old: a replay want = "sha256=" + hmac.new( secret.encode(), ts.encode() + b"." + raw_body, hashlib.sha256).hexdigest() return hmac.compare_digest( want, headers["X-CallOS-Signature"])
Run many workspaces from one integration.
Platform keys create workspaces, their owners and their API keys from a script, and act inside any workspace you name — so Voice OS can sit behind your own product.
Platform keys
One key to provision customers, with the workspace named on each request.
Your brand
Each workspace's console can carry the product name, logo and colours you choose.
Usage per workspace
Minutes and conversations per customer, for your own billing.