Skip to main content
Two-step model:
  1. Provider credentials — the API keys for your carrier (Twilio, Plivo, Vobiz). Stored encrypted via the Secret Encryptor service; never returned in plaintext.
  2. Phone numbers — individual E.164 numbers that reference one provider credential and (optionally) pin to one agent.

Providers

Today supported: twilio, plivo, vobiz.

Required credentials JSON

The handler validates the JSON shape before accepting it — pasting half a config gets a 400 immediately, not a runtime failure on the first call. A provider with phone numbers attached can’t be deleted (409); you have to remove the numbers first.

Phone numbers

e164 is sanity-checked locally (+ + 7–15 digits). The carrier rejects malformed numbers downstream regardless. Reassign a number to a different agent:
Or detach it (set agent_id=None).

Outbound origination

POST /api/v1/calls/originate — dispatches an outbound call. Pipeline:
  1. JWT auth (route middleware).
  2. Caller-ID ownershipfrom_number must be a tenant-owned, outbound_enabled number.
  3. Cost caps — concurrent / per-minute / daily / daily-minute counters in Redis. Exceeded cap → 429.
  4. Decrypt credentials via Secret Encryptor.
  5. POST to Call Processor /telephony/originate.
  6. On success, INCR Redis counters.
The session_id lets you deep-link to the conversation viewer while the call is still in progress.

Cost caps

Each tenant has a per-account row controlling the four cap dimensions:
Set any field to 0 to block all of that dimension — useful as a kill-switch during an incident.