Build anything.
Your rules.

Build applications on top of the Staffify voice engine. Configure agents, control call logic from your server, and receive live transcripts and webhook events for every call.

15+API Endpoints
30+Webhook Events
12Languages
REST API
Webhooks live
12 Languages
Real-time control
api.staffifyai.com / v1
Live
Create Agent
server_url
Webhook Stream
Request
POST /v1/agents
Authorization: Bearer sk-live-••••
JSON
{
"name": "Support Agent",
"language": "en-US",
"voice": "luna",
"max_duration": 600,
"recording": true
}
Response
201 Created
JSON
"id": "agt_a8f3k2",
"name": "Support Agent",
"lang": "en-US",
"status": "active"
Staffify calls your server
POST your-server.com/calls
X-Staffify-Signature: sha256=••••
JSON
{
"event": "call.started",
"call_id": "call_7x2mb9",
"from": "+1 555 012 3456",
"to": "+1 555 987 6543"
}
Your server returns
200 OK
JSON
"system_prompt": "You are...",
"voice": "luna",
"tools": [{
"name": "lookup_account"
}]
Event Stream 4 events
14:23:05 call.ringing call_7x2mb9
14:23:07 call.started agt_a8f3k2
14:24:51 transcript.updated 6 turns
14:25:29 call.completed 142s
 Connected · <75ms · api.staffifyai.com
One API. Everything you need.

Agents, phone numbers, knowledge bases, webhooks, transcripts, and SMS. All from a single REST API.

Agents Configure voice agents
Phone Numbers Buy numbers in 50+ countries
Knowledge Bases Docs, PDFs, web crawl
Webhooks 28 signed event types
Transcripts Full call transcripts and recordings
SMS On demand and post call
api.staffifyai.com / v1
Live
Request
POST /v1/agents
Authorization: Bearer sk-live-••••
JSON
{ "name": "Support Agent", "language": "en-US", "voice": "luna", "server_url": "https://your.com/calls", "max_duration": 1800, "recording": true }
Response
✓ 201 Created
JSON
"id": "agt_a8f3k2", "name": "Support Agent", "status": "active", "voice": "luna"
Search available numbers
GET /v1/phone-numbers/search
?country=US&area_code=415
JSON
// Then purchase: "phone_number": "+14155550101" // Then assign to agent: "agent_id": "agt_a8f3k2"
Available numbers
✓ 200 OK
JSON
"+14155550101" "+14155550182" "+14155550247" "cost_eur": 5.00 "cycle_days": 28
Crawl a website
POST /v1/knowledge-bases/:id/entries/crawl
Authorization: Bearer sk-live-••••
JSON
{ "url": "https://your.com/docs", "max_pages": 50, "max_depth": 3 }
Job status
✓ Completed
JSON
"status": "completed" "pages_crawled": 42 "entries_created": 38
Event Stream 7 events
14:23:04 call.ringing call_7x2mb9
14:23:07 call.started agt_a8f3k2
14:23:09 speech.started caller
14:23:14 transcript.updated 2 turns
14:24:02 tool.invoked lookup_account
14:24:03 tool.completed 312ms
14:25:29 call.ended 142s
Get call with transcript
GET /v1/calls/call_7x2mb9
Authorization: Bearer sk-live-••••
JSON
// transcript array in response: [ { "role": "agent", "text": "Hi, how can I help?" }, { "role": "caller", "text": "I need to check my order" } ]
Call metadata
✓ 200 OK
JSON
"duration": 142 "recording": "https://s3..." "tools_called": ["lookup_account"]
Send a message
POST /v1/sms
Authorization: Bearer sk-live-••••
JSON
{ "to": "+14155552671", "message": "Your ticket #2847" "has been created.", "sender_name": "Acme" }
Response
✓ 200 OK
JSON
"success": true "message_id": "sms_x9k2m4" "cost_eur": 0.045
Agents
Create and configure AI voice agents with 25+ fields. Set voice, language, max duration, and recording. Bring your own LLM or use Staffify's built-in models.
server_url 25+ fields Custom LLM Clone agents
Your server.
Your logic.

When a call starts, Staffify hits your server_url. You inspect the caller, query your database, and return the agent config. Every call is dynamic. No static prompts.

Verify the payload with HMAC-SHA256
Return system_prompt, voice, tools, and recording config
Full custom logic: query your DB, call your own APIs, personalize every call
Responds within 5 seconds — fast handlers required
server_url handler
Node.js
Python
cURL
const express = require('express');
const crypto = require('crypto');
const app = express();
app.use(express.raw({ type: 'application/json' }));
// Staffify POSTs here when a call starts
app.post('/calls', async (req, res) => {
// Verify signature
const sig = req.headers['x-staffify-signature'];
const expected = 'sha256=' + crypto
.createHmac('sha256', process.env.STAFFIFY_SECRET)
.update(req.body)
.digest('hex');
if (sig !== expected) return res.sendStatus(401);
const { from, call_id } = JSON.parse(req.body);
res.json({
system_prompt: `You are Acme's support agent.
Caller phone: ${from}. Keep answers brief.`,
first_message: 'Hi, thanks for calling. How can I help?',
voice: 'luna',
language: 'en-US',
recording_enabled: true
});
});
app.listen(3000);
import os, hmac, hashlib
from flask import Flask, request, jsonify
app = Flask(__name__)
# Staffify POSTs here when a call starts
@app.route('/calls', methods=['POST'])
def handle_call():
# Verify signature
sig = request.headers.get('X-Staffify-Signature', '')
secret = os.environ['STAFFIFY_SECRET'].encode()
digest = hmac.new(secret, request.data, hashlib.sha256).hexdigest()
if not hmac.compare_digest(sig, f'sha256={digest}'):
return '', 401
data = request.get_json(force=True)
caller = data.get('from')
return jsonify({
'system_prompt': f"You are Acme's support agent. Caller: {caller}.",
'first_message': 'Hi, thanks for calling. How can I help?',
'voice': 'luna',
'language': 'en-US',
'recording_enabled': True
})
# 1. Create a voice agent
curl -X POST https://api.staffifyai.com/v1/agents \
-H "Authorization: Bearer $API_KEY" \
-H "Content-Type: application/json" \
-d '{
"name": "Support Agent",
"language": "en-US",
"voice": "luna",
"server_url": "https://your-server.com/calls",
"recording": true
}'
# 2. Assign a phone number to the agent
curl -X PUT https://api.staffifyai.com/v1/phone-numbers/{numberId}/assign \
-H "Authorization: Bearer $API_KEY" \
-H "Content-Type: application/json" \
-d '{ "agent_id": "agent_a8f3k2" }'
# 3. Get all calls with transcripts
curl https://api.staffifyai.com/v1/calls \
-H "Authorization: Bearer $API_KEY"
api.staffifyai.com  ·  HTTPS  ·  Bearer auth POST /calls → 200 OK in <5s

Built for any
voice workflow.

From customer support to sales automation. The Staffify API adapts to your use case, not the other way around.

01

Customer support

Handle inbound support calls 24/7 without queues. When a call comes in, your server_url identifies the caller, pulls their account history, and returns a personalized agent. Escalate seamlessly to a human agent using transfer_destinations.

server_url tools transfer_destinations webhooks
02

Appointment booking

Let callers book, reschedule, or cancel in natural conversation. The agent uses tool calls to check your calendar API and confirm availability in real-time during the call. Send a confirmation SMS automatically via post_call.sms.

server_url tools post_call.sms transcript
03

Lead qualification

Qualify inbound leads from ad campaigns before they reach sales. The agent gathers intent, budget, and timeline naturally during the call. Use extraction_schema to capture structured lead data automatically, then deliver results via webhook to your CRM.

extraction_schema webhooks post_call.sms transcript
04

IVR replacement

Retire your touch-tone menus. Callers speak naturally instead of pressing buttons. Use transfer_destinations to route to the right department or extension. Full call recordings and transcripts available for QA without any extra setup.

server_url transfer_destinations recordings webhooks

Ready to Transform
Your Customer Journey

See how Staffify handles your customer journey