Appearance
call-center
28 endpoints.
GET /api/v1/call-center/campaigns
List Campaigns
200 — Successful Response
json
{
"additionalProperties": true,
"type": "object",
"title": "Response List Campaigns Api V1 Call Center Campaigns Get"
}POST /api/v1/call-center/campaigns
Create Campaign
Request body
json
{
"properties": {
"name": {
"type": "string",
"title": "Name"
},
"description": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Description"
},
"dial_mode": {
"type": "string",
"title": "Dial Mode",
"default": "predictive"
},
"target_abandon_pct": {
"type": "number",
"title": "Target Abandon Pct",
"default": 3
},
"power_ratio": {
"type": "number",
"title": "Power Ratio",
"default": 2
},
"max_ratio": {
"type": "number",
"title": "Max Ratio",
"default": 4
},
"max_lines": {
"type": "integer",
"title": "Max Lines",
"default": 10
},
"customer_ring_seconds": {
"type": "integer",
"title": "Customer Ring Seconds",
"default": 40
},
"agent_ring_seconds": {
"type": "integer",
"title": "Agent Ring Seconds",
"default": 20
},
"wrap_up_seconds": {
"type": "integer",
"title": "Wrap Up Seconds",
"default": 15
},
"max_wait_seconds": {
"type": "integer",
"title": "Max Wait Seconds",
"default": 2
},
"max_attempts": {
"type": "integer",
"title": "Max Attempts",
"default": 4
},
"retry_minutes": {
"type": "integer",
"title": "Retry Minutes",
"default": 120
},
"call_window_start": {
"type": "string",
"title": "Call Window Start",
"default": "08:00"
},
"call_window_end": {
"type": "string",
"title": "Call Window End",
"default": "17:00"
},
"call_days": {
"items": {
"type": "integer"
},
"type": "array",
"title": "Call Days"
},
"timezone": {
"type": "string",
"title": "Timezone",
"default": "Africa/Johannesburg"
},
"sip_domain": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Sip Domain"
},
"caller_id_name": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Caller Id Name"
},
"caller_id_number": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Caller Id Number"
},
"amd_enabled": {
"type": "boolean",
"title": "Amd Enabled",
"default": false
},
"dry_run": {
"type": "boolean",
"title": "Dry Run",
"default": true
},
"sim_answer_rate": {
"type": "number",
"title": "Sim Answer Rate",
"default": 0.28
},
"sim_machine_rate": {
"type": "number",
"title": "Sim Machine Rate",
"default": 0.35
},
"script": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Script"
},
"abandon_sound": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Abandon Sound"
}
},
"type": "object",
"required": [
"name"
],
"title": "CampaignIn"
}200 — Successful Response
json
{
"additionalProperties": true,
"type": "object",
"title": "Response Create Campaign Api V1 Call Center Campaigns Post"
}422 — Validation Error
json
{
"properties": {
"detail": {
"items": {
"properties": {
"loc": {
"items": {
"anyOf": [
{
"type": "string"
},
{
"type": "integer"
}
]
},
"type": "array",
"title": "Location"
},
"msg": {
"type": "string",
"title": "Message"
},
"type": {
"type": "string",
"title": "Error Type"
}
},
"type": "object",
"required": [
"loc",
"msg",
"type"
],
"title": "ValidationError"
},
"type": "array",
"title": "Detail"
}
},
"type": "object",
"title": "HTTPValidationError"
}GET /api/v1/call-center/campaigns/{campaign_id}
Get Campaign
Parameters
| Name | In | Required | Type | Description |
|---|---|---|---|---|
campaign_id | path | yes | integer |
200 — Successful Response
json
{
"type": "object",
"additionalProperties": true,
"title": "Response Get Campaign Api V1 Call Center Campaigns Campaign Id Get"
}422 — Validation Error
json
{
"properties": {
"detail": {
"items": {
"properties": {
"loc": {
"items": {
"anyOf": [
{
"type": "string"
},
{
"type": "integer"
}
]
},
"type": "array",
"title": "Location"
},
"msg": {
"type": "string",
"title": "Message"
},
"type": {
"type": "string",
"title": "Error Type"
}
},
"type": "object",
"required": [
"loc",
"msg",
"type"
],
"title": "ValidationError"
},
"type": "array",
"title": "Detail"
}
},
"type": "object",
"title": "HTTPValidationError"
}PATCH /api/v1/call-center/campaigns/{campaign_id}
Update Campaign
Parameters
| Name | In | Required | Type | Description |
|---|---|---|---|---|
campaign_id | path | yes | integer |
Request body
json
{
"properties": {
"name": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Name"
},
"description": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Description"
},
"dial_mode": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Dial Mode"
},
"target_abandon_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"title": "Target Abandon Pct"
},
"power_ratio": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"title": "Power Ratio"
},
"max_ratio": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"title": "Max Ratio"
},
"max_lines": {
"anyOf": [
{
"type": "integer"
},
{
"type": "null"
}
],
"title": "Max Lines"
},
"customer_ring_seconds": {
"anyOf": [
{
"type": "integer"
},
{
"type": "null"
}
],
"title": "Customer Ring Seconds"
},
"agent_ring_seconds": {
"anyOf": [
{
"type": "integer"
},
{
"type": "null"
}
],
"title": "Agent Ring Seconds"
},
"wrap_up_seconds": {
"anyOf": [
{
"type": "integer"
},
{
"type": "null"
}
],
"title": "Wrap Up Seconds"
},
"max_wait_seconds": {
"anyOf": [
{
"type": "integer"
},
{
"type": "null"
}
],
"title": "Max Wait Seconds"
},
"max_attempts": {
"anyOf": [
{
"type": "integer"
},
{
"type": "null"
}
],
"title": "Max Attempts"
},
"retry_minutes": {
"anyOf": [
{
"type": "integer"
},
{
"type": "null"
}
],
"title": "Retry Minutes"
},
"call_window_start": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Call Window Start"
},
"call_window_end": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Call Window End"
},
"call_days": {
"anyOf": [
{
"items": {
"type": "integer"
},
"type": "array"
},
{
"type": "null"
}
],
"title": "Call Days"
},
"timezone": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Timezone"
},
"sip_domain": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Sip Domain"
},
"caller_id_name": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Caller Id Name"
},
"caller_id_number": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Caller Id Number"
},
"amd_enabled": {
"anyOf": [
{
"type": "boolean"
},
{
"type": "null"
}
],
"title": "Amd Enabled"
},
"dry_run": {
"anyOf": [
{
"type": "boolean"
},
{
"type": "null"
}
],
"title": "Dry Run"
},
"sim_answer_rate": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"title": "Sim Answer Rate"
},
"sim_machine_rate": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"title": "Sim Machine Rate"
},
"script": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Script"
},
"abandon_sound": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Abandon Sound"
}
},
"type": "object",
"title": "CampaignPatch",
"description": "Every field optional — the console saves one panel at a time."
}200 — Successful Response
json
{
"type": "object",
"additionalProperties": true,
"title": "Response Update Campaign Api V1 Call Center Campaigns Campaign Id Patch"
}422 — Validation Error
json
{
"properties": {
"detail": {
"items": {
"properties": {
"loc": {
"items": {
"anyOf": [
{
"type": "string"
},
{
"type": "integer"
}
]
},
"type": "array",
"title": "Location"
},
"msg": {
"type": "string",
"title": "Message"
},
"type": {
"type": "string",
"title": "Error Type"
}
},
"type": "object",
"required": [
"loc",
"msg",
"type"
],
"title": "ValidationError"
},
"type": "array",
"title": "Detail"
}
},
"type": "object",
"title": "HTTPValidationError"
}DELETE /api/v1/call-center/campaigns/{campaign_id}
Delete Campaign
Parameters
| Name | In | Required | Type | Description |
|---|---|---|---|---|
campaign_id | path | yes | integer |
200 — Successful Response
json
{
"type": "object",
"additionalProperties": true,
"title": "Response Delete Campaign Api V1 Call Center Campaigns Campaign Id Delete"
}422 — Validation Error
json
{
"properties": {
"detail": {
"items": {
"properties": {
"loc": {
"items": {
"anyOf": [
{
"type": "string"
},
{
"type": "integer"
}
]
},
"type": "array",
"title": "Location"
},
"msg": {
"type": "string",
"title": "Message"
},
"type": {
"type": "string",
"title": "Error Type"
}
},
"type": "object",
"required": [
"loc",
"msg",
"type"
],
"title": "ValidationError"
},
"type": "array",
"title": "Detail"
}
},
"type": "object",
"title": "HTTPValidationError"
}POST /api/v1/call-center/campaigns/{campaign_id}/start
Start Campaign
Parameters
| Name | In | Required | Type | Description |
|---|---|---|---|---|
campaign_id | path | yes | integer |
Request body
json
{
"anyOf": [
{
"properties": {
"virtual_agents": {
"type": "integer",
"title": "Virtual Agents",
"default": 0
}
},
"type": "object",
"title": "StartIn"
},
{
"type": "null"
}
],
"title": "Body"
}200 — Successful Response
json
{
"type": "object",
"additionalProperties": true,
"title": "Response Start Campaign Api V1 Call Center Campaigns Campaign Id Start Post"
}422 — Validation Error
json
{
"properties": {
"detail": {
"items": {
"properties": {
"loc": {
"items": {
"anyOf": [
{
"type": "string"
},
{
"type": "integer"
}
]
},
"type": "array",
"title": "Location"
},
"msg": {
"type": "string",
"title": "Message"
},
"type": {
"type": "string",
"title": "Error Type"
}
},
"type": "object",
"required": [
"loc",
"msg",
"type"
],
"title": "ValidationError"
},
"type": "array",
"title": "Detail"
}
},
"type": "object",
"title": "HTTPValidationError"
}POST /api/v1/call-center/campaigns/{campaign_id}/pause
Pause Campaign
Parameters
| Name | In | Required | Type | Description |
|---|---|---|---|---|
campaign_id | path | yes | integer |
200 — Successful Response
json
{
"type": "object",
"additionalProperties": true,
"title": "Response Pause Campaign Api V1 Call Center Campaigns Campaign Id Pause Post"
}422 — Validation Error
json
{
"properties": {
"detail": {
"items": {
"properties": {
"loc": {
"items": {
"anyOf": [
{
"type": "string"
},
{
"type": "integer"
}
]
},
"type": "array",
"title": "Location"
},
"msg": {
"type": "string",
"title": "Message"
},
"type": {
"type": "string",
"title": "Error Type"
}
},
"type": "object",
"required": [
"loc",
"msg",
"type"
],
"title": "ValidationError"
},
"type": "array",
"title": "Detail"
}
},
"type": "object",
"title": "HTTPValidationError"
}POST /api/v1/call-center/campaigns/{campaign_id}/stop
Stop Campaign
Parameters
| Name | In | Required | Type | Description |
|---|---|---|---|---|
campaign_id | path | yes | integer |
200 — Successful Response
json
{
"type": "object",
"additionalProperties": true,
"title": "Response Stop Campaign Api V1 Call Center Campaigns Campaign Id Stop Post"
}422 — Validation Error
json
{
"properties": {
"detail": {
"items": {
"properties": {
"loc": {
"items": {
"anyOf": [
{
"type": "string"
},
{
"type": "integer"
}
]
},
"type": "array",
"title": "Location"
},
"msg": {
"type": "string",
"title": "Message"
},
"type": {
"type": "string",
"title": "Error Type"
}
},
"type": "object",
"required": [
"loc",
"msg",
"type"
],
"title": "ValidationError"
},
"type": "array",
"title": "Detail"
}
},
"type": "object",
"title": "HTTPValidationError"
}GET /api/v1/call-center/campaigns/{campaign_id}/pacing
Pacing Series
The controller's own decisions, as a series. This is what makes the pacing auditable — every point is one tick's inputs AND its output.
Parameters
| Name | In | Required | Type | Description |
|---|---|---|---|---|
campaign_id | path | yes | integer | |
minutes | query | no | integer |
200 — Successful Response
json
{
"type": "object",
"additionalProperties": true,
"title": "Response Pacing Series Api V1 Call Center Campaigns Campaign Id Pacing Get"
}422 — Validation Error
json
{
"properties": {
"detail": {
"items": {
"properties": {
"loc": {
"items": {
"anyOf": [
{
"type": "string"
},
{
"type": "integer"
}
]
},
"type": "array",
"title": "Location"
},
"msg": {
"type": "string",
"title": "Message"
},
"type": {
"type": "string",
"title": "Error Type"
}
},
"type": "object",
"required": [
"loc",
"msg",
"type"
],
"title": "ValidationError"
},
"type": "array",
"title": "Detail"
}
},
"type": "object",
"title": "HTTPValidationError"
}POST /api/v1/call-center/campaigns/{campaign_id}/contacts
Add Contacts
Add rows to a dialling list, from structured input or a pasted block.
Deduplicates within the campaign by normalised number and drops anything already on the DNC list, so a re-paste of an overlapping list is safe.
Parameters
| Name | In | Required | Type | Description |
|---|---|---|---|---|
campaign_id | path | yes | integer |
Request body
json
{
"properties": {
"contacts": {
"items": {
"properties": {
"full_name": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Full Name"
},
"company": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Company"
},
"phone": {
"type": "string",
"title": "Phone"
},
"email": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Email"
},
"notes": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Notes"
},
"priority": {
"type": "integer",
"title": "Priority",
"default": 0
},
"extra": {
"anyOf": [
{
"additionalProperties": true,
"type": "object"
},
{
"type": "null"
}
],
"title": "Extra"
}
},
"type": "object",
"required": [
"phone"
],
"title": "ContactIn"
},
"type": "array",
"title": "Contacts"
},
"paste": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Paste"
}
},
"type": "object",
"title": "ContactsIn"
}200 — Successful Response
json
{
"type": "object",
"additionalProperties": true,
"title": "Response Add Contacts Api V1 Call Center Campaigns Campaign Id Contacts Post"
}422 — Validation Error
json
{
"properties": {
"detail": {
"items": {
"properties": {
"loc": {
"items": {
"anyOf": [
{
"type": "string"
},
{
"type": "integer"
}
]
},
"type": "array",
"title": "Location"
},
"msg": {
"type": "string",
"title": "Message"
},
"type": {
"type": "string",
"title": "Error Type"
}
},
"type": "object",
"required": [
"loc",
"msg",
"type"
],
"title": "ValidationError"
},
"type": "array",
"title": "Detail"
}
},
"type": "object",
"title": "HTTPValidationError"
}POST /api/v1/call-center/campaigns/{campaign_id}/import-leads
Import Leads
Seed a dialling list from the CRM's own leads.
Only leads with a usable phone become contacts — a lead with no number is invisible to a dialer, and counting it as imported is how a campaign ends up reporting 400 targets and dialling 300.
Parameters
| Name | In | Required | Type | Description |
|---|---|---|---|---|
campaign_id | path | yes | integer |
Request body
json
{
"properties": {
"statuses": {
"items": {
"type": "string"
},
"type": "array",
"title": "Statuses"
},
"limit": {
"type": "integer",
"title": "Limit",
"default": 500
},
"only_untargeted": {
"type": "boolean",
"title": "Only Untargeted",
"default": true
}
},
"type": "object",
"title": "ImportLeadsIn"
}200 — Successful Response
json
{
"type": "object",
"additionalProperties": true,
"title": "Response Import Leads Api V1 Call Center Campaigns Campaign Id Import Leads Post"
}422 — Validation Error
json
{
"properties": {
"detail": {
"items": {
"properties": {
"loc": {
"items": {
"anyOf": [
{
"type": "string"
},
{
"type": "integer"
}
]
},
"type": "array",
"title": "Location"
},
"msg": {
"type": "string",
"title": "Message"
},
"type": {
"type": "string",
"title": "Error Type"
}
},
"type": "object",
"required": [
"loc",
"msg",
"type"
],
"title": "ValidationError"
},
"type": "array",
"title": "Detail"
}
},
"type": "object",
"title": "HTTPValidationError"
}GET /api/v1/call-center/agent
Agent State
The desk's whole world in one poll: my state, my current call, the record in front of me, and the dispositions I can close it with.
200 — Successful Response
json
{
"additionalProperties": true,
"type": "object",
"title": "Response Agent State Api V1 Call Center Agent Get"
}POST /api/v1/call-center/agent/status
Set Agent Status
Ready / break / offline. Going ready is what puts the agent's extension on a nailed-up leg, which is why it can fail with a telephony error.
Request body
json
{
"properties": {
"campaign_id": {
"anyOf": [
{
"type": "integer"
},
{
"type": "null"
}
],
"title": "Campaign Id"
},
"status": {
"type": "string",
"title": "Status"
},
"reason": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Reason"
},
"answer_token": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Answer Token"
}
},
"type": "object",
"required": [
"status"
],
"title": "AgentStatusIn"
}200 — Successful Response
json
{
"additionalProperties": true,
"type": "object",
"title": "Response Set Agent Status Api V1 Call Center Agent Status Post"
}422 — Validation Error
json
{
"properties": {
"detail": {
"items": {
"properties": {
"loc": {
"items": {
"anyOf": [
{
"type": "string"
},
{
"type": "integer"
}
]
},
"type": "array",
"title": "Location"
},
"msg": {
"type": "string",
"title": "Message"
},
"type": {
"type": "string",
"title": "Error Type"
}
},
"type": "object",
"required": [
"loc",
"msg",
"type"
],
"title": "ValidationError"
},
"type": "array",
"title": "Detail"
}
},
"type": "object",
"title": "HTTPValidationError"
}POST /api/v1/call-center/agent/heartbeat
Agent Heartbeat
Cheap liveness ping. Separate from GET /agent so a desk can beat faster than it re-reads its whole state — and so the engine's staleness check has something to key on that costs one UPDATE.
200 — Successful Response
json
{
"additionalProperties": true,
"type": "object",
"title": "Response Agent Heartbeat Api V1 Call Center Agent Heartbeat Post"
}POST /api/v1/call-center/agent/disposition
Set Disposition
Close the call in front of the agent, and let the code decide what happens to the contact — retry, callback, suppress or done.
Request body
json
{
"properties": {
"call_id": {
"type": "integer",
"title": "Call Id"
},
"code": {
"type": "string",
"title": "Code"
},
"notes": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Notes"
}
},
"type": "object",
"required": [
"call_id",
"code"
],
"title": "DispositionIn"
}200 — Successful Response
json
{
"additionalProperties": true,
"type": "object",
"title": "Response Set Disposition Api V1 Call Center Agent Disposition Post"
}422 — Validation Error
json
{
"properties": {
"detail": {
"items": {
"properties": {
"loc": {
"items": {
"anyOf": [
{
"type": "string"
},
{
"type": "integer"
}
]
},
"type": "array",
"title": "Location"
},
"msg": {
"type": "string",
"title": "Message"
},
"type": {
"type": "string",
"title": "Error Type"
}
},
"type": "object",
"required": [
"loc",
"msg",
"type"
],
"title": "ValidationError"
},
"type": "array",
"title": "Detail"
}
},
"type": "object",
"title": "HTTPValidationError"
}GET /api/v1/call-center/wallboard
Wallboard
One tenant-wide read for the floor screen.
Every number here is REAL traffic unless it says otherwise (2026-09-12). Until then today counted simulated calls alongside real ones — on tc all 317 rows in cc_calls were a dry run — and live was only populated when the console happened to hit the process running the loop. Now:
livecomes from the loop wherever it runs (the lease snapshot);todayis real calls since local midnight, with the simulated count reported separately so a dry run is visible without polluting the rates;- per campaign,
todaycarries the regulated numbers — abandon rate over answered calls, mean wait from answer to agent, mean talk time.
200 — Successful Response
json
{
"additionalProperties": true,
"type": "object",
"title": "Response Wallboard Api V1 Call Center Wallboard Get"
}GET /api/v1/call-center/supervisors
List Supervisors
200 — Successful Response
json
{
"additionalProperties": true,
"type": "object",
"title": "Response List Supervisors Api V1 Call Center Supervisors Get"
}POST /api/v1/call-center/supervisors
Grant Supervisor
Request body
json
{
"properties": {
"user_id": {
"type": "integer",
"title": "User Id"
}
},
"type": "object",
"required": [
"user_id"
],
"title": "SupervisorIn"
}200 — Successful Response
json
{
"additionalProperties": true,
"type": "object",
"title": "Response Grant Supervisor Api V1 Call Center Supervisors Post"
}422 — Validation Error
json
{
"properties": {
"detail": {
"items": {
"properties": {
"loc": {
"items": {
"anyOf": [
{
"type": "string"
},
{
"type": "integer"
}
]
},
"type": "array",
"title": "Location"
},
"msg": {
"type": "string",
"title": "Message"
},
"type": {
"type": "string",
"title": "Error Type"
}
},
"type": "object",
"required": [
"loc",
"msg",
"type"
],
"title": "ValidationError"
},
"type": "array",
"title": "Detail"
}
},
"type": "object",
"title": "HTTPValidationError"
}DELETE /api/v1/call-center/supervisors/{user_id}
Revoke Supervisor
Parameters
| Name | In | Required | Type | Description |
|---|---|---|---|---|
user_id | path | yes | integer |
200 — Successful Response
json
{
"type": "object",
"additionalProperties": true,
"title": "Response Revoke Supervisor Api V1 Call Center Supervisors User Id Delete"
}422 — Validation Error
json
{
"properties": {
"detail": {
"items": {
"properties": {
"loc": {
"items": {
"anyOf": [
{
"type": "string"
},
{
"type": "integer"
}
]
},
"type": "array",
"title": "Location"
},
"msg": {
"type": "string",
"title": "Message"
},
"type": {
"type": "string",
"title": "Error Type"
}
},
"type": "object",
"required": [
"loc",
"msg",
"type"
],
"title": "ValidationError"
},
"type": "array",
"title": "Detail"
}
},
"type": "object",
"title": "HTTPValidationError"
}POST /api/v1/call-center/supervisor/monitor
Monitor Agent
Ring the supervisor's own extension into an agent's live call.
Gated on an explicit supervisor grant (not the role tier), refused unless the agent is genuinely on a real bridged call, and audited every time — whoever listened, to whom, in which mode.
Request body
json
{
"properties": {
"agent_id": {
"type": "integer",
"title": "Agent Id"
},
"mode": {
"type": "string",
"title": "Mode",
"default": "listen"
}
},
"type": "object",
"required": [
"agent_id"
],
"title": "MonitorIn"
}200 — Successful Response
json
{
"additionalProperties": true,
"type": "object",
"title": "Response Monitor Agent Api V1 Call Center Supervisor Monitor Post"
}422 — Validation Error
json
{
"properties": {
"detail": {
"items": {
"properties": {
"loc": {
"items": {
"anyOf": [
{
"type": "string"
},
{
"type": "integer"
}
]
},
"type": "array",
"title": "Location"
},
"msg": {
"type": "string",
"title": "Message"
},
"type": {
"type": "string",
"title": "Error Type"
}
},
"type": "object",
"required": [
"loc",
"msg",
"type"
],
"title": "ValidationError"
},
"type": "array",
"title": "Detail"
}
},
"type": "object",
"title": "HTTPValidationError"
}POST /api/v1/call-center/agent/softphone
Agent Softphone
SIP credentials for the caller's OWN extension, for the desk softphone.
Unlike POST /pbx/softphone (an admin testing any extension in scope), this takes no extension from the caller at all: it is always users.extension of the signed-in login, in the domain the campaign dials through, and only for a live campaign — a simulation never rings a phone. POST so nothing lands in an access log; no-store so the password is not cached; audited without the secret.
Request body
json
{
"properties": {
"campaign_id": {
"type": "integer",
"title": "Campaign Id"
}
},
"type": "object",
"required": [
"campaign_id"
],
"title": "SoftphoneIn"
}200 — Successful Response
json
{
"additionalProperties": true,
"type": "object",
"title": "Response Agent Softphone Api V1 Call Center Agent Softphone Post"
}422 — Validation Error
json
{
"properties": {
"detail": {
"items": {
"properties": {
"loc": {
"items": {
"anyOf": [
{
"type": "string"
},
{
"type": "integer"
}
]
},
"type": "array",
"title": "Location"
},
"msg": {
"type": "string",
"title": "Message"
},
"type": {
"type": "string",
"title": "Error Type"
}
},
"type": "object",
"required": [
"loc",
"msg",
"type"
],
"title": "ValidationError"
},
"type": "array",
"title": "Detail"
}
},
"type": "object",
"title": "HTTPValidationError"
}POST /api/v1/call-center/agent/call/hangup
Agent Hangup
End the CUSTOMER's side. The agent's nailed-up leg returns to park, so the next call still bridges instantly; the agent then picks a disposition.
Request body
json
{
"properties": {
"call_id": {
"type": "integer",
"title": "Call Id"
}
},
"type": "object",
"required": [
"call_id"
],
"title": "CallActionIn"
}200 — Successful Response
json
{
"additionalProperties": true,
"type": "object",
"title": "Response Agent Hangup Api V1 Call Center Agent Call Hangup Post"
}422 — Validation Error
json
{
"properties": {
"detail": {
"items": {
"properties": {
"loc": {
"items": {
"anyOf": [
{
"type": "string"
},
{
"type": "integer"
}
]
},
"type": "array",
"title": "Location"
},
"msg": {
"type": "string",
"title": "Message"
},
"type": {
"type": "string",
"title": "Error Type"
}
},
"type": "object",
"required": [
"loc",
"msg",
"type"
],
"title": "ValidationError"
},
"type": "array",
"title": "Detail"
}
},
"type": "object",
"title": "HTTPValidationError"
}POST /api/v1/call-center/agent/call/transfer
Agent Transfer
Blind-transfer the customer to an extension or number on the org's own dialplan. The agent stays on their line (parked) and dispositions the call.
Request body
json
{
"properties": {
"call_id": {
"type": "integer",
"title": "Call Id"
},
"destination": {
"type": "string",
"title": "Destination"
}
},
"type": "object",
"required": [
"call_id",
"destination"
],
"title": "TransferIn"
}200 — Successful Response
json
{
"additionalProperties": true,
"type": "object",
"title": "Response Agent Transfer Api V1 Call Center Agent Call Transfer Post"
}422 — Validation Error
json
{
"properties": {
"detail": {
"items": {
"properties": {
"loc": {
"items": {
"anyOf": [
{
"type": "string"
},
{
"type": "integer"
}
]
},
"type": "array",
"title": "Location"
},
"msg": {
"type": "string",
"title": "Message"
},
"type": {
"type": "string",
"title": "Error Type"
}
},
"type": "object",
"required": [
"loc",
"msg",
"type"
],
"title": "ValidationError"
},
"type": "array",
"title": "Detail"
}
},
"type": "object",
"title": "HTTPValidationError"
}POST /api/v1/call-center/numbers/check
Check Numbers
Validate and normalise up to 500 numbers. Pure — nothing is stored.
Request body
json
{
"properties": {
"numbers": {
"items": {
"type": "string"
},
"type": "array",
"maxItems": 500,
"title": "Numbers"
},
"default_region": {
"type": "string",
"title": "Default Region",
"default": "ZA"
}
},
"type": "object",
"title": "NumbersIn"
}200 — Successful Response
json
{
"additionalProperties": true,
"type": "object",
"title": "Response Check Numbers Api V1 Call Center Numbers Check Post"
}422 — Validation Error
json
{
"properties": {
"detail": {
"items": {
"properties": {
"loc": {
"items": {
"anyOf": [
{
"type": "string"
},
{
"type": "integer"
}
]
},
"type": "array",
"title": "Location"
},
"msg": {
"type": "string",
"title": "Message"
},
"type": {
"type": "string",
"title": "Error Type"
}
},
"type": "object",
"required": [
"loc",
"msg",
"type"
],
"title": "ValidationError"
},
"type": "array",
"title": "Detail"
}
},
"type": "object",
"title": "HTTPValidationError"
}GET /api/v1/call-center/reports/asr
Asr Report
Parameters
| Name | In | Required | Type | Description |
|---|---|---|---|---|
days | query | no | integer | |
prefix_digits | query | no | integer | |
campaign_id | query | no | ||
include_simulated | query | no | boolean |
200 — Successful Response
json
{
"type": "object",
"additionalProperties": true,
"title": "Response Asr Report Api V1 Call Center Reports Asr Get"
}422 — Validation Error
json
{
"properties": {
"detail": {
"items": {
"properties": {
"loc": {
"items": {
"anyOf": [
{
"type": "string"
},
{
"type": "integer"
}
]
},
"type": "array",
"title": "Location"
},
"msg": {
"type": "string",
"title": "Message"
},
"type": {
"type": "string",
"title": "Error Type"
}
},
"type": "object",
"required": [
"loc",
"msg",
"type"
],
"title": "ValidationError"
},
"type": "array",
"title": "Detail"
}
},
"type": "object",
"title": "HTTPValidationError"
}GET /api/v1/call-center/numbers/hlr
Hlr Status
200 — Successful Response
json
{
"additionalProperties": true,
"type": "object",
"title": "Response Hlr Status Api V1 Call Center Numbers Hlr Get"
}POST /api/v1/call-center/numbers/hlr
Hlr Lookup
One HLR lookup. 501 until a vendor adapter is wired and selected — the expected state today.
Request body
json
{
"properties": {
"number": {
"type": "string",
"title": "Number"
}
},
"type": "object",
"required": [
"number"
],
"title": "HlrIn"
}200 — Successful Response
json
{
"additionalProperties": true,
"type": "object",
"title": "Response Hlr Lookup Api V1 Call Center Numbers Hlr Post"
}422 — Validation Error
json
{
"properties": {
"detail": {
"items": {
"properties": {
"loc": {
"items": {
"anyOf": [
{
"type": "string"
},
{
"type": "integer"
}
]
},
"type": "array",
"title": "Location"
},
"msg": {
"type": "string",
"title": "Message"
},
"type": {
"type": "string",
"title": "Error Type"
}
},
"type": "object",
"required": [
"loc",
"msg",
"type"
],
"title": "ValidationError"
},
"type": "array",
"title": "Detail"
}
},
"type": "object",
"title": "HTTPValidationError"
}POST /api/v1/call-center/dnc
Add Dnc
Suppress a number, and pull it out of every campaign that still holds it.
Adding the DNC row alone would only stop FUTURE dials; the contacts already queued would sit there as new and be skipped one at a time, forever.
Request body
json
{
"properties": {
"phone": {
"type": "string",
"title": "Phone"
},
"reason": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Reason"
}
},
"type": "object",
"required": [
"phone"
],
"title": "DncIn"
}200 — Successful Response
json
{
"additionalProperties": true,
"type": "object",
"title": "Response Add Dnc Api V1 Call Center Dnc Post"
}422 — Validation Error
json
{
"properties": {
"detail": {
"items": {
"properties": {
"loc": {
"items": {
"anyOf": [
{
"type": "string"
},
{
"type": "integer"
}
]
},
"type": "array",
"title": "Location"
},
"msg": {
"type": "string",
"title": "Message"
},
"type": {
"type": "string",
"title": "Error Type"
}
},
"type": "object",
"required": [
"loc",
"msg",
"type"
],
"title": "ValidationError"
},
"type": "array",
"title": "Detail"
}
},
"type": "object",
"title": "HTTPValidationError"
}