Build anything. Your rules.

A full REST API for voice. Create agents, provision numbers, stream transcripts, receive webhooks. One key, one base URL, everything you need to ship.

Latency< 75ms
Languages12
Uptime SLA99.9%
POST/v1/agents
Live
Authorization: Bearer sk-live-••••
Request body
{ "name": "Support Agent", "language": "en-US", "voice": "luna", "tools": ["lookup", "transfer"], "recording": true }
Response✓ 201 Created
{ "id": "agt_a8f3k2", "status": "active" }
api.staffifyai.com ✓ Connected · < 75ms
02 / 05 Endpoints
01 / 04
Endpoint 01 · Agents

Spin up an agent. One POST call.

Define the persona, language, voice and tools. The agent is live and reachable the moment the response comes back.

Instant provisioning 12 voices Tool bindings
POST/v1/agents
Live
Authorization: Bearer sk-live-••••
Request body
{ "name": "Support Agent", "language": "en-US", "voice": "luna", "tools": ["lookup", "transfer"], "recording": true }
Response✓ 201 Created
{ "id": "agt_a8f3k2", "status": "active" }
Endpoint 02 · Calls

Every call, fully indexed.

Fetch any completed call by id. Duration, transcript, tools used, signed recording URL, all in one response.

Turn-by-turn transcript Signed URLs Tool metadata
GET/v1/calls/call_7x2mb9
Live
Authorization: Bearer sk-live-••••
Response✓ 200 OK
{ "id": "call_7x2mb9", "duration": 142, "recording": "https://cdn/../call.mp3", "tools_called": ["lookup"], "transcript": [ { "role": "agent", "text": "Hi, how can I help?" }, { "role": "caller", "text": "Order status please" } ] }
Endpoint 03 · Numbers

Provision a number. Route it in seconds.

Buy local or toll-free numbers in 50+ countries, bind them to an agent, done. Porting available, no long forms.

50+ countries Local · Toll-free Porting
POST/v1/numbers/provision
Live
Authorization: Bearer sk-live-••••
Request body
{ "country": "NL", "agent_id": "agt_a8f3k2", "type": "local" }
Response✓ 201 Created
{ "id": "num_29xkq4", "e164": "+31207009944", "routes_to": "agt_a8f3k2" }
Endpoint 04 · Webhooks

Every call fires a signed event.

Point us at your URL, we push each event with an HMAC-SHA256 signature. Retries with exponential backoff, dead-letter queue included.

HMAC signatures Auto-retry DLQ
EVENTcall.completed
Fired
X-Staffify-Signature: sha256=e3b0c4••••
Event payload
// verify HMAC before processing { "event": "call.completed", "call_id": "call_7x2mb9", "from": "+31612345678", "duration": 142, "outcome": "resolved", "extraction": { "intent": "order_status", "order_id": "48219" } }
Scroll to continue
03 / 05 Capabilities
01 / 04
Capability 01

Turn-by-turn transcripts, streamed live.

Every word from both sides, timestamped and speaker-tagged. Push updates over websocket, or fetch the finalised transcript once the call ends.

Latency< 300ms
Accuracy96%
Live transcript · call_7x2mb9Streaming
AgentHi, this is Luna from Support. How can I help?00:02
CallerI want to check the status of order 48219.00:08
AgentOne moment, looking that up now.00:11
AgentYour order shipped yesterday, arriving Thursday.00:18
CallerPerfect, thanks.00:23
Capability 02

Signed recording URLs, ready to play.

Every call auto-recorded to encrypted storage. Presigned links expire on your rules, stereo channels split by speaker, MP3 or WAV.

StorageS3 · encrypted
RetentionConfigurable
Recording · call_7x2mb9.mp3Signed
https://cdn.staffifyai.com/rec/call_7x2mb9.mp3?exp=1h
00:47 / 02:22
Stereo · 44.1kHzMP3 · 2.1 MB
Capability 03

Structured data from unstructured calls.

Define the schema, we return typed fields with confidence scores. Intents, entities, outcomes, booking details, whatever you need to route the next step.

FieldsAny schema
ConfidencePer field
Extraction · call_7x2mb9Complete
intentorder_status98%
order_id4821999%
customer_idcus_a83k297%
outcomeresolved96%
sentimentpositive94%
follow_upnone92%
Capability 04

Tools, called mid-conversation.

Bind functions your agent can invoke live. Database lookups, CRM writes, warm transfers, calendar bookings, they run during the call, not after.

Timeout3s max
RetriesAuto
Tool calls · this call3 fired
lookup_order1.2s
{ order_id: "48219" } → shipped
get_tracking0.6s
{ order_id: "48219" } → TRK-9284X
log_resolution0.3s
{ outcome: "resolved" } → ok
Scroll to continue
04 / 05 How it works
01 / 04
01
Step oneVerify signature

A call comes in. We POST to your server.

Every inbound call fires a request to your server_url with an HMAC-SHA256 signature. Verify it, discard anything that doesn't match.

MethodPOST
Signed withHMAC-SHA256
Nodehandler.js
Live
import crypto from 'crypto' app.post('/staffify', (req, res) => { const sig = req.headers['x-staffify-signature'] const mac = crypto.createHmac('sha256', SECRET) .update(req.rawBody).digest('hex') if (!crypto.timingSafeEqual( Buffer.from(sig), Buffer.from(`sha256=${mac}`) )) return res.status(401).end() })
x-staffify-signature✓ verified
02
Step twoReturn config

Your server responds with the agent config.

Send back system_prompt, voice, tools, and any per-caller variables. Different config per number, per caller, per time of day, all your call.

Response200 OK
BodyJSON
Nodehandler.js
Live
res.json({ system_prompt: `You are ${agent.name}, help the caller with...`, voice: 'luna', language: 'en-US', tools: ['lookup_order', 'transfer'], recording: true, variables: { customer_name: user.name, tier: user.tier } })
Content-Type: application/json200 OK
03
Step threeCustom logic

Look up the caller. Personalise on the fly.

Query your database, check your CRM, hit a feature flag. Whatever your business needs, it happens in your code, in your infrastructure, before the agent even says hello.

RuntimeYours
Data staysOn your side
Nodehandler.js
Live
const { from, agent_id } = req.body // look up caller in your DB const user = await db.users.findByPhone(from) const agent = await db.agents.findById(agent_id) // choose prompt by tier + time of day const prompt = user.tier === 'vip' ? prompts.vip(user) : prompts.standard(user)
your database · your CRM0 vendor lock-in
04
Step fourRespond within 5s

Ship it back. The agent picks up.

You have < 5s to respond. Return 200 OK with the config, and the call connects. End to end, sub-second from the caller's first word.

Deadline5s
Time to speech< 900ms
HTTPPOST → your_webhook
Live
// timing budget for one call Staffify POSTs your server 0.02s HMAC verify 0.01s DB lookup + CRM check 0.35s Build prompt + config 0.05s Respond 200 OK 0.01s Agent connects, first word 0.42s ───── total 0.86s
POST /calls → 200 OK< 900ms end to end
Scroll to continue
05 / 05 Use cases
01 / 04
Use case 01Customer support

Every call answered. Every time.

Zero hold time, zero missed calls. Tier-1 resolution on invoice, order, and account questions. Escalate to a human only when the caller actually needs one.

24/7 coverage without adding headcount
CRM lookup mid-call, personalised replies
Warm transfer with full context handoff
Live queue · Support line4 active
+31 6 12 34 56 78Order status · agt_a8f3k2
00:47Live
+44 20 7946 0001Invoice query · agt_a8f3k2
01:12Live
+1 415 555 0192Password reset · agt_a8f3k2
00:22Live
+49 30 12345678Shipping · resolved
02:04Done
+33 1 42 68 53 00Refund · transferred
03:41Human
Use case 02Appointment booking

Books itself. Straight into your calendar.

The agent reads your live availability, offers real slots, confirms, and writes the booking back. Google, Outlook, or your own scheduler, whichever you're on.

Live free/busy from your calendar API
SMS + email confirmation, calendar invite attached
Auto reschedule and cancellation flow
Availability · Thu, 8 AugBooking
Thursday, 8 August
09:00taken
09:3030 min
10:00taken
10:3030 min
11:0030 min
11:30booking
14:0030 min
14:3030 min
Confirmed · 11:30SMS + invite sent
Use case 03Lead qualification

Sort the maybes from the yeses.

The agent runs your BANT or MEDDIC framework in a real conversation. Scores the lead, routes hot ones to sales in real time. Cold ones get nurtured, not ignored.

Custom scoring rubric per campaign
Hot leads transferred to AE within seconds
CRM enriched, no manual data entry
Lead scorecard · just qualifiedHot
Sophie Verhagen · Meridian BV+31 6 51 22 90 04 · 02:34 call
87HOT
Budget€ 40k confirmed
AuthorityDecision maker
NeedReplace legacy vendor
TimelineThis quarter
Routing to AE · Marcus de Wit
Use case 04IVR replacement

No more press 1 for anything.

Callers say what they need, in their own words. The agent routes, resolves, or transfers. Skip the tree, skip the frustration, average handle time drops 40%.

Natural language routing, no menus
Barge-in supported, callers can interrupt
Fallback to human, hours or 24/7
Router · caller intentMatched
Hi, thanks for calling Meridian. What can I help you with today?
01
Check order or shipment
→ orders
02
Billing or invoice question
→ billing
03
Talk to sales team
→ sales
04
Something else
→ triage
Scroll to continue

Ready to Transform
Your Customer Journey

See how Staffify handles your customer journey