Contact center
This capability is granted by an API key scoped to the `` product (product face). See the product reference below.
Contact-center capability — the generic, carrier-agnostic transport engine (SIP · WebRTC · IVR · predictive-dialer · call-recording · AI-summary) fronting a durable, org-scoped registry (IVR flows, dialer campaigns, call sessions, recording metadata). Extracted from vagary-voice's dormant Python telephony suite so any product can build contact-center flows over one shared capability instead of re-implementing SIP/WebRTC/dialer plumbing. The transport engine is dormant until a provider is wired (extract-on-reactivation); the durable registry is always live. I4: own Postgres store, never a product store.
- Group: Comms & workflow
- Contract:
contracts/contact-center/v1/openapi.yaml - Public base:
https://api.vagarylabs.com(the consolidated API gateway — one host, per-brand siblingapi.<zone>) - Auth: a product API key (
vgk_…) issued from the console —Authorization: Bearer vgk_… - Product face (customer-keyed):
https://api.vagarylabs.com/product/v1/contact-center/ivr/flows
Endpoints
| Method | Path | Summary |
|---|---|---|
POST | /v1/contact-center/ivr/flows | Create or update an IVR flow definition (durable registry) |
GET | /v1/contact-center/ivr/flows/{flow_id} | Get an IVR flow definition (or 404) |
POST | /v1/contact-center/dialer/campaigns | Create or update an outbound dialer campaign definition (durable registry) |
GET | /v1/contact-center/dialer/campaigns/{campaign_id} | Get a dialer campaign (or 404) |
POST | /v1/contact-center/dialer/campaigns/{campaign_id}/start | Start an outbound dialer campaign (transport engine — 501 while dormant) |
POST | /v1/contact-center/calls | Register a call session lifecycle record (durable registry) |
GET | /v1/contact-center/calls/{call_id} | Get a call session record (or 404) |
POST | /v1/contact-center/calls/{call_id}/summary | Generate an AI summary of a recorded call (transport engine — 501 while dormant) |
POST | /v1/contact-center/sip/originate | Originate an outbound SIP call via a carrier trunk (transport engine — 501 while dormant) |
POST | /v1/contact-center/webrtc/sessions | Create a browser WebRTC session with ICE/TURN + PSTN fallback (transport engine — 501 while dormant) |
PUT | /v1/contact-center/recordings/{call_id} | Register recording metadata for a call (durable registry; bytes live in cloud storage) |
GET | /v1/contact-center/recordings/{call_id} | Get recording metadata for a call (or 404) |
POST | /v1/contact-center/calls/{call_id}/transfer | Transfer a live call (warm or blind) to another destination |
POST | /v1/contact-center/ivr/navigate | Plan/verify how an outbound call would traverse a callee's phone-tree. Body carries the rule plan; the live media emit (attaching to a real call's STT + RTP) is sequenced to the outbound-executor. |
GET | /v1/contact-center/whatsapp/webhook | Meta webhook verification handshake (GET hub.challenge). Gated — without the per-tenant Meta credentials the transport is dormant and this answers an honest 501 rather than pretending. |
POST | /v1/contact-center/whatsapp/webhook | Inbound WhatsApp Cloud API events (call connect/terminate, inbound audio, keypad replies). Dormant until the per-tenant Meta credentials are provisioned. |
PUT | /v1/contact-center/recordings/{call_id}/content | Upload the recording bytes to the shared object-storage rail and register the pointer |
GET | /v1/contact-center/recordings/{call_id}/content-url | Short-lived presigned URL for the recording bytes (client fetches the rail directly) |
GET | /health | liveness |
GET | /metrics | Prometheus |
Schemas
IvrFlowRequest
| Field | Type | Description |
|---|---|---|
organization_id | string | product-tier tenant (I6) |
flow_id | string | |
name | string | |
definition | object | visual-flow node graph (IVRFlow) |
IvrFlowRef
| Field | Type | Description |
|---|---|---|
flow_id | string | |
name | ['string', 'null'] |
IvrFlow
| Field | Type | Description |
|---|---|---|
flow_id | string | |
name | ['string', 'null'] | |
definition | object | |
created_at | ['number', 'null'] | |
updated_at | ['number', 'null'] |
CampaignRequest
| Field | Type | Description |
|---|---|---|
organization_id | string | product-tier tenant (I6) |
campaign_id | string | |
name | string | |
status | string | |
config | object | CampaignConfig (pacing/AMD/DNC/dialing-window) |
CampaignRef
| Field | Type | Description |
|---|---|---|
campaign_id | string | |
name | ['string', 'null'] | |
status | string |
Campaign
| Field | Type | Description |
|---|---|---|
campaign_id | string | |
name | ['string', 'null'] | |
status | string | |
config | object | |
created_at | ['number', 'null'] | |
updated_at | ['number', 'null'] |
CallRequest
| Field | Type | Description |
|---|---|---|
organization_id | string | product-tier tenant (I6) |
call_id | string | |
direction | string | |
status | string | |
from_number | string | |
to_number | string | |
metadata | object |
CallRef
| Field | Type | Description |
|---|---|---|
call_id | string |
Generated by scripts/gen-capability-docs.py from contracts/contact-center/v1/openapi.yaml — the contract IS the source of truth; edit the contract, not this page.