Developers

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.

REST API

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.json with your key, for generating a client.
  • Recordings — fetched per call, only by the workspace that owns it.
POST /v1/calls
curl -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" } }'
Triggers

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.

Every kind of trigger

python
import 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}, )
Webhooks

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 delivery
def 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"])
For platforms and resellers

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.

Build on Voice OS.