Skip to content

call-center ​

← All modules

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

NameInRequiredTypeDescription
campaign_idpathyesinteger

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

NameInRequiredTypeDescription
campaign_idpathyesinteger

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

NameInRequiredTypeDescription
campaign_idpathyesinteger

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

NameInRequiredTypeDescription
campaign_idpathyesinteger

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

NameInRequiredTypeDescription
campaign_idpathyesinteger

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

NameInRequiredTypeDescription
campaign_idpathyesinteger

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

NameInRequiredTypeDescription
campaign_idpathyesinteger
minutesquerynointeger

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

NameInRequiredTypeDescription
campaign_idpathyesinteger

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

NameInRequiredTypeDescription
campaign_idpathyesinteger

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:

  • live comes from the loop wherever it runs (the lease snapshot);
  • today is real calls since local midnight, with the simulated count reported separately so a dry run is visible without polluting the rates;
  • per campaign, today carries 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

NameInRequiredTypeDescription
user_idpathyesinteger

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

NameInRequiredTypeDescription
daysquerynointeger
prefix_digitsquerynointeger
campaign_idqueryno
include_simulatedquerynoboolean

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"
}

Lubb One Documentation