Quickstart

Your first call in 60 seconds.

5-line drop-in from the OpenAI Realtime SDK. Auth, dial, talk. No Twilio. No SBC. We bundle the phone number.

1

Get an API key

Apply for the founding-customer beta at /voice/start. Approved customers receive a key by email within 24 hours.

env
TOOLKIT_API_KEY=tk_live_xxxxxxxxxxxxxxxx

Test keys begin tk_test_ · live keys tk_live_. Webhooks signed with whsec_.

2

Dial yourself with cURL

One POST. Your phone rings in ~8 seconds. Tony picks up.

cURL
curl -X POST https://api.toolkit-llm.com/v1/voice/calls \
  -H "Authorization: Bearer $TOOLKIT_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "to": "+14155551234",
    "persona": "tony",
    "max_seconds": 60
  }'

Response includes call_id for webhooks and eta_seconds.

3

Or use the SDK

The 5-line drop-in from OpenAI Realtime. Same shape. Same events. Different price.

JavaScript / TypeScript
import { Toolkit } from "@toolkit-llm/voice";

const client = new Toolkit();

const session = await client.realtime.sessions.create({
  model: "toolkit-voice",
});

session.on("response.audio.delta", (event) => {
  // pipe to speakers
});

session.appendAudio(micChunk);
Python
from toolkit import Toolkit

client = Toolkit()

session = client.realtime.sessions.create(
    model="toolkit-voice",
)

@session.on("response.audio.delta")
def on_audio(event):
    # pipe to speakers
    pass

session.append_audio(mic_chunk)
4

Receive incoming calls (provision a phone number)

Phone numbers are bundled — $1/mo for a local DID, $5/mo for vanity. Provision via API or via the dashboard at /voice/start.

cURL
# Buy a number near area code 415
curl -X POST https://api.toolkit-llm.com/v1/numbers \
  -H "Authorization: Bearer $TOOLKIT_API_KEY" \
  -d '{"area_code": "415", "type": "local"}'

# Bind it to a persona
curl -X POST https://api.toolkit-llm.com/v1/numbers/{id}/bind \
  -H "Authorization: Bearer $TOOLKIT_API_KEY" \
  -d '{"persona": "tony", "webhook_url": "https://yourapp.com/voice/event"}'
5

Listen for events (webhooks)

Every call lifecycle event hits your webhook URL with HMAC-SHA256 signature in X-Toolkit-Signature.

JavaScript
// Verify webhook in your Express handler
import { verifyWebhook } from "@toolkit-llm/voice/webhooks";

app.post("/voice/event", express.raw({ type: "*/*" }), (req, res) => {
  const event = verifyWebhook({
    body: req.body,                                  // raw bytes, not parsed JSON
    signature: req.header("X-Toolkit-Signature"),
    secret: process.env.TOOLKIT_WEBHOOK_SECRET,
  });

  if (event.type === "call.ended") {
    console.log(`Call ${event.call_id} ended after ${event.duration_s}s`);
  }

  res.status(200).end();
});

Next steps