Developer platform
The AI voice agent that answers, books and follows up on Indian phone lines — as a REST API. Create an agent, point it at a number, get the transcript, outcome and cost back as a webhook.
One API
Outbound calls in Hindi, English and Hinglish, on Twilio or Plivo numbers, with the same runtime that powers the console.
POST /v1/callsA conversation flow plus the language, voice and model it speaks with. Every flow you build in the console is already an agent.
GET /v1/agents · POST /v1/agentsPlace, list, read and hang up calls; each one carries status, transcript, disposition, extracted data and cost.
GET /v1/calls/{id} · /transcript · /hangupSigned events for every call lifecycle step and wallet change, with retries, redelivery and secret rotation.
POST /v1/webhook_endpointsText entries and PDFs your agent can answer from, per business, keyword-searchable the moment they are created.
POST /v1/knowledge · /knowledge/uploadTest keys run a realistic sandbox call — answered, completed, analysed, webhooked — at zero cost. Live keys ring real phones.
sk_test_… · sk_live_…Scoped keys per business with rate limits, IP allowlists, expiry, rotation and an audit trail. Managed in the console.
Console → DevelopersPer-minute rate frozen on every call, one prepaid wallet with the console, monthly usage in one request.
GET /v1/usageQuickstart
In Console → Developers, create a test key with calls:write. The secret is shown once.
GET /v1/agents lists the flows you have built as agents; take an id.
POST /v1/calls with the agent, the number and your metadata. Test keys never dial or charge.
Register an endpoint once; call.completed and call.analyzed arrive signed with the transcript, outcome and cost.
# 2. your agents
curl https://api.shravan-ai.tech/v1/agents \
-H "Authorization: Bearer sk_test_..."
# 3. place a call (sandbox with a test key)
curl https://api.shravan-ai.tech/v1/calls \
-H "Authorization: Bearer sk_test_..." \
-H "Idempotency-Key: lead-8891" \
-H "Content-Type: application/json" \
-d '{"agent_id": "agent_1a2b3c4d5e6f7a8b", "to": "+919876543210",
"contact_name": "Priya", "metadata": {"crm_id": "L-42"}}'
# 4. receive events (register once)
curl https://api.shravan-ai.tech/v1/webhook_endpoints \
-H "Authorization: Bearer sk_test_..." \
-H "Content-Type: application/json" \
-d '{"url": "https://example.com/webhooks/shravan",
"events": ["call.completed", "call.analyzed"]}'
import requests
BASE, H = "https://api.shravan-ai.tech/v1", {"Authorization": "Bearer sk_test_..."}
agent_id = requests.get(f"{BASE}/agents", headers=H).json()["data"][0]["id"]
call = requests.post(f"{BASE}/calls", headers={**H, "Idempotency-Key": "lead-8891"},
json={"agent_id": agent_id, "to": "+919876543210",
"contact_name": "Priya", "metadata": {"crm_id": "L-42"}}).json()
ep = requests.post(f"{BASE}/webhook_endpoints", headers=H,
json={"url": "https://example.com/webhooks/shravan",
"events": ["call.completed", "call.analyzed"]}).json()
signing_secret = ep["signing_secret"] # verify Shravan-Signature with it
const BASE = "https://api.shravan-ai.tech/v1";
const H = { Authorization: "Bearer sk_test_...", "Content-Type": "application/json" };
const agents = await fetch(`${BASE}/agents`, { headers: H }).then(r => r.json());
const agentId = agents.data[0].id;
const call = await fetch(`${BASE}/calls`, {
method: "POST", headers: { ...H, "Idempotency-Key": "lead-8891" },
body: JSON.stringify({ agent_id: agentId, to: "+919876543210",
contact_name: "Priya", metadata: { crm_id: "L-42" } }),
}).then(r => r.json());
const ep = await fetch(`${BASE}/webhook_endpoints`, {
method: "POST", headers: H,
body: JSON.stringify({ url: "https://example.com/webhooks/shravan",
events: ["call.completed", "call.analyzed"] }),
}).then(r => r.json()); // ep.signing_secret verifies Shravan-Signature
A sk_test_ key never dials and never touches your wallet. The sandbox runs a scripted lifecycle — initiated, answered, completed with a Hindi/English transcript, analysed — and fires the same signed webhooks a live call would, to your test endpoints only.
A sk_live_ key places real calls at your API rate, debited per minute from the same prepaid wallet as the console. Rate limits, IP allowlists and expiry are set per key; revoke or rotate any time from the console.
Everything below is available on a test key with zero cost. Flip to live when the flow sounds right.