SENDO AI AGENTS API

Manage AI voice and chat agents — LLM/STT/TTS configurations, skills, conversations, calls, SIP telephony, outbound campaigns, and more.


This API manages AI agents that handle voice calls and chat conversations: their LLM/STT/TTS bindings, skills, conversation flows, SIP telephony, outbound campaigns, and call records. Built with FastAPI; every resource exchanges JSON.

Authentication is conditional: when the server has FEATURE_FLAG_JWT_AUTH=true, every route below requires a valid JWT (Authorization: Bearer <token>) except the documentation and login routes. When that flag is false, no token is required. Check with your environment’s administrator which mode applies.

Most list routes share the same query parameters: skip and limit for pagination, plus order_by / order_dir for sorting — shown per endpoint below. Many routes also silently accept a trailing-slash variant (e.g. /users/); this document lists the canonical route without the trailing slash.

Clients

A client is the organization that owns agents, SIP numbers, and configurations — every other resource in this API is ultimately scoped to a client.

Create a Client

POSThttps://api.sendo.cloud/clients

Creates a new client record.

Request body.


curl --location -X POST 'https://api.sendo.cloud/clients' --header 'Authorization: Bearer YOUR_TOKEN' --header 'Content-Type: application/json' --data-raw  '{
"name": "Acme Corp",
"contact_email": "ops@acme.com"
}'
Response
CodeDescription
201Created
{
  "id": 1,
  "name": "Acme Corp",
  "contact_email": "ops@acme.com",
  "created_at": "2026-07-29T10:35:00Z"
}

Server responses.


List Clients

GEThttps://api.sendo.cloud/clients

Lists clients, with optional filtering and pagination.

Parameters


FieldTypeDescriptionDefault ValueOptionalExample
skipintegerPagination offset.noneYes0
limitintegerPage size.noneYes20
contact_emailstringFilter by contact email.noneYes
order_bystringField to sort by.noneYesid
order_dirstringasc or desc.noneYesasc

Request.


curl --location 'https://api.sendo.cloud/clients?skip=0&limit=20&order_by=id&order_dir=asc' --header 'Authorization: Bearer YOUR_TOKEN'
Response
CodeDescription
200OK
[
  {
    "id": 1,
    "name": "Acme Corp",
    "contact_email": "ops@acme.com"
  }
]

Server responses.


Get a Client

GEThttps://api.sendo.cloud/clients/{client_id}

Retrieves a single client record by id.

Parameters


FieldTypeDescriptionDefault ValueOptionalExample
client_idintegerRecord id.noneNo1

Request.


curl --location 'https://api.sendo.cloud/clients/1' --header 'Authorization: Bearer YOUR_TOKEN'
Response
CodeDescription
200OK
{
  "id": 1,
  "name": "Acme Corp",
  "contact_email": "ops@acme.com",
  "created_at": "2026-07-29T10:35:00Z",
  "agents": [
    {
      "id": 44,
      "name": "Sales Assistant"
    }
  ],
  "sip_numbers": [
    {
      "id": 10,
      "sip_number": "+14155550100"
    }
  ]
}

Server responses.


Users

Operators, supervisors, and administrators who manage voice/chat agent deployments and monitor calls.

Create a User

POSThttps://api.sendo.cloud/users

Creates a new user record.

Request body.


curl --location -X POST 'https://api.sendo.cloud/users' --header 'Authorization: Bearer YOUR_TOKEN' --header 'Content-Type: application/json' --data-raw  '{
"name": "Jane Doe",
"email": "jane@acme.com",
"is_admin": true,
"is_super_user": false
}'
Response
CodeDescription
201Created
{
  "id": 25,
  "name": "Jane Doe",
  "email": "jane@acme.com",
  "is_admin": true,
  "is_super_user": false
}

Server responses.


List Users

GEThttps://api.sendo.cloud/users

Lists users, with optional filtering and pagination.

Parameters


FieldTypeDescriptionDefault ValueOptionalExample
skipintegerPagination offset.noneYes0
limitintegerPage size.noneYes20
namestringFilter by name.noneYes
emailstringFilter by email.noneYes
is_adminbooleanFilter by admin role.noneYestrue
is_super_userbooleanFilter by super user role.noneYesfalse
order_bystringField to sort by.noneYesid
order_dirstringasc or desc.noneYesasc

Request.


curl --location 'https://api.sendo.cloud/users?skip=0&limit=20&is_admin=true&is_super_user=false&order_by=id&order_dir=asc' --header 'Authorization: Bearer YOUR_TOKEN'
Response
CodeDescription
200OK
[
  {
    "id": 25,
    "name": "Jane Doe",
    "email": "jane@acme.com",
    "is_admin": true
  }
]

Server responses.


Get a User

GEThttps://api.sendo.cloud/users/{user_id}

Retrieves a single user record by id.

Parameters


FieldTypeDescriptionDefault ValueOptionalExample
user_idintegerRecord id.noneNo25

Request.


curl --location 'https://api.sendo.cloud/users/25' --header 'Authorization: Bearer YOUR_TOKEN'
Response
CodeDescription
200OK
{
  "id": 25,
  "name": "Jane Doe",
  "email": "jane@acme.com",
  "is_admin": true,
  "is_super_user": false,
  "clients": [
    {
      "id": 1,
      "name": "Acme Corp"
    }
  ]
}

Server responses.


Update a User

PUThttps://api.sendo.cloud/users/{user_id}

Updates an existing user record.

Parameters


FieldTypeDescriptionDefault ValueOptionalExample
user_idintegerRecord id.noneNo25

Request body.


curl --location -X PUT 'https://api.sendo.cloud/users/25' --header 'Authorization: Bearer YOUR_TOKEN' --header 'Content-Type: application/json' --data-raw  '{
"name": "Jane Doe",
"email": "jane@acme.com",
"is_admin": true,
"is_super_user": false
}'
Response
CodeDescription
200OK
{
  "id": 25,
  "name": "Jane Doe",
  "email": "jane@acme.com",
  "is_admin": true,
  "is_super_user": false
}

Server responses.


Delete a User

DELETEhttps://api.sendo.cloud/users/{user_id}

Deletes a user record. The deleted record is echoed back in the response.

Parameters


FieldTypeDescriptionDefault ValueOptionalExample
user_idintegerRecord id.noneNo25

Request.


curl --location -X DELETE 'https://api.sendo.cloud/users/25' --header 'Authorization: Bearer YOUR_TOKEN'
Response
CodeDescription
200OK
{
  "id": 25,
  "name": "Jane Doe",
  "email": "jane@acme.com"
}

Server responses.


Client-User Relationship

Links a user to a client, granting them operational access to that client’s agents and calls.

POSThttps://api.sendo.cloud/client_users

Creates a new client-user link record.

Request body.


curl --location -X POST 'https://api.sendo.cloud/client_users' --header 'Authorization: Bearer YOUR_TOKEN' --header 'Content-Type: application/json' --data-raw  '{
"client_id": 1,
"user_id": 25
}'
Response
CodeDescription
201Created
{
  "id": 9,
  "client_id": 1,
  "user_id": 25
}

Server responses.


List Client-User Relationship

GEThttps://api.sendo.cloud/client_users

Lists client-user relationship, with optional filtering and pagination.

Parameters


FieldTypeDescriptionDefault ValueOptionalExample
skipintegerPagination offset.noneYes0
limitintegerPage size.noneYes20
client_idintegerFilter by client.noneYes1
user_idintegerFilter by user.noneYes25
order_bystringField to sort by.noneYesid
order_dirstringasc or desc.noneYesasc

Request.


curl --location 'https://api.sendo.cloud/client_users?skip=0&limit=20&client_id=1&user_id=25&order_by=id&order_dir=asc' --header 'Authorization: Bearer YOUR_TOKEN'
Response
CodeDescription
200OK
[
  {
    "id": 9,
    "client_id": 1,
    "user_id": 25
  }
]

Server responses.


GEThttps://api.sendo.cloud/client_users/{client_user_id}

Retrieves a single client-user link record by id.

Parameters


FieldTypeDescriptionDefault ValueOptionalExample
client_user_idintegerRecord id.noneNo9

Request.


curl --location 'https://api.sendo.cloud/client_users/9' --header 'Authorization: Bearer YOUR_TOKEN'
Response
CodeDescription
200OK
{
  "id": 9,
  "client_id": 1,
  "user_id": 25,
  "role": "operator",
  "expires_at": null
}

Server responses.


PUThttps://api.sendo.cloud/client_users/{client_user_id}

Updates an existing client-user link record.

Parameters


FieldTypeDescriptionDefault ValueOptionalExample
client_user_idintegerRecord id.noneNo9

Request body.


curl --location -X PUT 'https://api.sendo.cloud/client_users/9' --header 'Authorization: Bearer YOUR_TOKEN' --header 'Content-Type: application/json' --data-raw  '{
"role": "supervisor",
"expires_at": "2027-01-01T00:00:00Z"
}'
Response
CodeDescription
200OK
{
  "id": 9,
  "client_id": 1,
  "user_id": 25,
  "role": "supervisor",
  "expires_at": "2027-01-01T00:00:00Z"
}

Server responses.


DELETEhttps://api.sendo.cloud/client_users/{client_user_id}

Deletes a client-user link record. The deleted record is echoed back in the response.

Parameters


FieldTypeDescriptionDefault ValueOptionalExample
client_user_idintegerRecord id.noneNo9

Request.


curl --location -X DELETE 'https://api.sendo.cloud/client_users/9' --header 'Authorization: Bearer YOUR_TOKEN'
Response
CodeDescription
200OK
{
  "id": 9,
  "client_id": 1,
  "user_id": 25
}

Server responses.


Agents

A voice/chat AI agent that answers calls, runs IVR flows, or holds automated conversations — bound to an LLM, STT, and TTS configuration, plus routing and skills.

Create Agent

POSThttps://api.sendo.cloud/agent

Defines and registers a new AI agent. Note the route is /agent (singular) — not /agents.

Request body.


curl --location -X POST 'https://api.sendo.cloud/agent' --header 'Authorization: Bearer YOUR_TOKEN' --header 'Content-Type: application/json' --data-raw  '{
"name": "Sales Assistant",
"language": "en",
"client_id": 1,
"llm_configuration_id": 3,
"tts_configuration_id": 2,
"stt_configuration_id": 4
}'
Response
CodeDescription
201Created
{
  "id": 44,
  "name": "Sales Assistant",
  "language": "en",
  "client_id": 1
}

Server responses.


List Agents

GEThttps://api.sendo.cloud/agents

Lists agents for management — filter by client, language, or bound configuration to control active call handlers.

Parameters


FieldTypeDescriptionDefault ValueOptionalExample
skipintegerPagination offset.noneYes0
limitintegerPage size.noneYes20
client_idintegerFilter by client.noneYes1
languagestringFilter by language.noneYesen
llm_configuration_idintegerFilter by bound LLM config.noneYes
tts_configuration_idintegerFilter by bound TTS config.noneYes
stt_configuration_idintegerFilter by bound STT config.noneYes
order_bystringField to sort by.noneYesid
order_dirstringasc or desc.noneYesasc

Request.


curl --location 'https://api.sendo.cloud/agents?client_id=1' --header 'Authorization: Bearer YOUR_TOKEN'
Response
CodeDescription
200OK
[
  {
    "id": 44,
    "name": "Sales Assistant",
    "language": "en",
    "client_id": 1
  }
]

Server responses.


Paginated Agents

GEThttps://api.sendo.cloud/paginated-agents

Same filters as List Agents, wrapped in a paginated envelope (items, total, skip, limit) for UI lists — includes status/health metadata.

Parameters


FieldTypeDescriptionDefault ValueOptionalExample
skipintegerPagination offset.noneYes0
limitintegerPage size.noneYes10
client_idintegerFilter by client.noneYes1

Request.


curl --location 'https://api.sendo.cloud/paginated-agents?skip=0&limit=10&client_id=1' --header 'Authorization: Bearer YOUR_TOKEN'
Response
CodeDescription
200OK
{
  "items": [
    {
      "id": 44,
      "name": "Sales Assistant"
    }
  ],
  "total": 1,
  "skip": 0,
  "limit": 10
}

Server responses.


Get Agent

GEThttps://api.sendo.cloud/agents/{agent_id}

Retrieves an agent’s full call configuration (skills, voice settings, routing, provider links) for diagnostics or editing.

Parameters


FieldTypeDescriptionDefault ValueOptionalExample
agent_idintegerAgent id.noneNo44

Request.


curl --location 'https://api.sendo.cloud/agents/44' --header 'Authorization: Bearer YOUR_TOKEN'
Response
CodeDescription
200OK
{
  "id": 44,
  "name": "Sales Assistant",
  "language": "en",
  "client_id": 1,
  "llm_configuration_id": 3,
  "tts_configuration_id": 2,
  "stt_configuration_id": 4,
  "skills": [
    {
      "id": 6,
      "name": "EmailTranscript"
    }
  ],
  "created_at": "2026-07-29T10:40:00Z"
}

Server responses.


Update Agent

PUThttps://api.sendo.cloud/agents/{agent_id}

Updates an agent’s configuration, swaps provider credentials (LLM/STT/TTS), or changes active skills.

Parameters


FieldTypeDescriptionDefault ValueOptionalExample
agent_idintegerAgent id.noneNo44

Request body.


curl --location -X PUT 'https://api.sendo.cloud/agents/44' --header 'Authorization: Bearer YOUR_TOKEN' --header 'Content-Type: application/json' --data-raw  '{
"name": "Sales Assistant",
"language": "en",
"tts_configuration_id": 5
}'
Response
CodeDescription
200OK
{
  "id": 44,
  "name": "Sales Assistant",
  "language": "en",
  "tts_configuration_id": 5
}

Server responses.


Delete Agent

DELETEhttps://api.sendo.cloud/agents/{agent_id}

Deactivates or removes an agent and its runtime assignments when decommissioning.

Parameters


FieldTypeDescriptionDefault ValueOptionalExample
agent_idintegerAgent id.noneNo44

Request.


curl --location -X DELETE 'https://api.sendo.cloud/agents/44' --header 'Authorization: Bearer YOUR_TOKEN'
Response
CodeDescription
200OK
{
  "id": 44,
  "name": "Sales Assistant"
}

Server responses.


Skills

A voice-call skill or integration (e.g., emailing the call transcript, logging call data into a Google Sheet) that agents execute during or after calls.

Create a Skill

POSThttps://api.sendo.cloud/skills

Creates a new skill record.

Request body.


curl --location -X POST 'https://api.sendo.cloud/skills' --header 'Authorization: Bearer YOUR_TOKEN' --header 'Content-Type: application/json' --data-raw  '{
"name": "EmailTranscript",
"description": "Emails the call transcript to a configured address",
"event": "on_call_end",
"webhook_url": "https://api.example.com/skills/email-transcript",
"parameters": [{"name":"recipient","type":"string"}]
}'
Response
CodeDescription
201Created
{
  "id": 6,
  "name": "EmailTranscript",
  "description": "Emails the call transcript to a configured address",
  "event": "on_call_end"
}

Server responses.


List Skills

GEThttps://api.sendo.cloud/skills

Lists skills, with optional filtering and pagination.

Parameters


FieldTypeDescriptionDefault ValueOptionalExample
skipintegerPagination offset.noneYes0
limitintegerPage size.noneYes20
namestringFilter by name.noneYes
descriptionstringFilter by description.noneYes
eventstringFilter by trigger event.noneYeson_call_end
order_bystringField to sort by.noneYesid
order_dirstringasc or desc.noneYesasc

Request.


curl --location 'https://api.sendo.cloud/skills?skip=0&limit=20&event=on_call_end&order_by=id&order_dir=asc' --header 'Authorization: Bearer YOUR_TOKEN'
Response
CodeDescription
200OK
[
  {
    "id": 6,
    "name": "EmailTranscript",
    "event": "on_call_end"
  }
]

Server responses.


Get a Skill

GEThttps://api.sendo.cloud/skills/{skill_id}

Retrieves a single skill record by id.

Parameters


FieldTypeDescriptionDefault ValueOptionalExample
skill_idintegerRecord id.noneNo6

Request.


curl --location 'https://api.sendo.cloud/skills/6' --header 'Authorization: Bearer YOUR_TOKEN'
Response
CodeDescription
200OK
{
  "id": 6,
  "name": "EmailTranscript",
  "description": "Emails the call transcript to a configured address",
  "event": "on_call_end",
  "webhook_url": "https://api.example.com/skills/email-transcript",
  "parameters": [
    {
      "name": "recipient",
      "type": "string"
    }
  ]
}

Server responses.


Update a Skill

PUThttps://api.sendo.cloud/skills/{skill_id}

Updates an existing skill record.

Parameters


FieldTypeDescriptionDefault ValueOptionalExample
skill_idintegerRecord id.noneNo6

Request body.


curl --location -X PUT 'https://api.sendo.cloud/skills/6' --header 'Authorization: Bearer YOUR_TOKEN' --header 'Content-Type: application/json' --data-raw  '{
"description": "Emails the call transcript to a configured address (v2)"
}'
Response
CodeDescription
200OK
{
  "id": 6,
  "name": "EmailTranscript",
  "description": "Emails the call transcript to a configured address (v2)"
}

Server responses.


Delete a Skill

DELETEhttps://api.sendo.cloud/skills/{skill_id}

Deletes a skill record. The deleted record is echoed back in the response.

Parameters


FieldTypeDescriptionDefault ValueOptionalExample
skill_idintegerRecord id.noneNo6

Request.


curl --location -X DELETE 'https://api.sendo.cloud/skills/6' --header 'Authorization: Bearer YOUR_TOKEN'
Response
CodeDescription
200OK
{
  "id": 6,
  "name": "EmailTranscript"
}

Server responses.


Client-Skill Relationship

Enables a skill for a client and applies client-specific configuration (e.g., greetings, limits).

POSThttps://api.sendo.cloud/client_skills

Creates a new client-skill link record.

Request body.


curl --location -X POST 'https://api.sendo.cloud/client_skills' --header 'Authorization: Bearer YOUR_TOKEN' --header 'Content-Type: application/json' --data-raw  '{
"client_id": 1,
"skill_id": 6,
"greeting": "Thanks for calling Acme!"
}'
Response
CodeDescription
201Created
{
  "id": 14,
  "client_id": 1,
  "skill_id": 6,
  "greeting": "Thanks for calling Acme!"
}

Server responses.


List Client-Skill Relationship

GEThttps://api.sendo.cloud/client_skills

Lists client-skill relationship, with optional filtering and pagination.

Parameters


FieldTypeDescriptionDefault ValueOptionalExample
skipintegerPagination offset.noneYes0
limitintegerPage size.noneYes20
client_idintegerFilter by client.noneYes1
skill_idintegerFilter by skill.noneYes6
order_bystringField to sort by.noneYesid
order_dirstringasc or desc.noneYesasc

Request.


curl --location 'https://api.sendo.cloud/client_skills?skip=0&limit=20&client_id=1&skill_id=6&order_by=id&order_dir=asc' --header 'Authorization: Bearer YOUR_TOKEN'
Response
CodeDescription
200OK
[
  {
    "id": 14,
    "client_id": 1,
    "skill_id": 6
  }
]

Server responses.


GEThttps://api.sendo.cloud/client_skills/{client_skill_id}

Retrieves a single client-skill link record by id.

Parameters


FieldTypeDescriptionDefault ValueOptionalExample
client_skill_idintegerRecord id.noneNo14

Request.


curl --location 'https://api.sendo.cloud/client_skills/14' --header 'Authorization: Bearer YOUR_TOKEN'
Response
CodeDescription
200OK
{
  "id": 14,
  "client_id": 1,
  "skill_id": 6,
  "greeting": "Thanks for calling Acme!",
  "limit": 100
}

Server responses.


PUThttps://api.sendo.cloud/client_skills/{client_skill_id}

Updates an existing client-skill link record.

Parameters


FieldTypeDescriptionDefault ValueOptionalExample
client_skill_idintegerRecord id.noneNo14

Request body.


curl --location -X PUT 'https://api.sendo.cloud/client_skills/14' --header 'Authorization: Bearer YOUR_TOKEN' --header 'Content-Type: application/json' --data-raw  '{
"limit": 250
}'
Response
CodeDescription
200OK
{
  "id": 14,
  "client_id": 1,
  "skill_id": 6,
  "limit": 250
}

Server responses.


DELETEhttps://api.sendo.cloud/client_skills/{client_skill_id}

Deletes a client-skill link record. The deleted record is echoed back in the response.

Parameters


FieldTypeDescriptionDefault ValueOptionalExample
client_skill_idintegerRecord id.noneNo14

Request.


curl --location -X DELETE 'https://api.sendo.cloud/client_skills/14' --header 'Authorization: Bearer YOUR_TOKEN'
Response
CodeDescription
200OK
{
  "id": 14,
  "client_id": 1,
  "skill_id": 6
}

Server responses.


Agent-Skill Relationship

Assigns a skill to an agent so it can execute that behavior during live calls or IVR flows.

POSThttps://api.sendo.cloud/agent_skills

Creates a new agent-skill link record.

Request body.


curl --location -X POST 'https://api.sendo.cloud/agent_skills' --header 'Authorization: Bearer YOUR_TOKEN' --header 'Content-Type: application/json' --data-raw  '{
"agent_id": 44,
"skill_id": 6,
"priority": 1
}'
Response
CodeDescription
201Created
{
  "id": 21,
  "agent_id": 44,
  "skill_id": 6,
  "priority": 1
}

Server responses.


List Agent-Skill Relationship

GEThttps://api.sendo.cloud/agent_skills

Lists agent-skill relationship, with optional filtering and pagination.

Parameters


FieldTypeDescriptionDefault ValueOptionalExample
skipintegerPagination offset.noneYes0
limitintegerPage size.noneYes20
agent_idintegerFilter by agent.noneYes44
skill_idintegerFilter by skill.noneYes6
order_bystringField to sort by.noneYesid
order_dirstringasc or desc.noneYesasc

Request.


curl --location 'https://api.sendo.cloud/agent_skills?skip=0&limit=20&agent_id=44&skill_id=6&order_by=id&order_dir=asc' --header 'Authorization: Bearer YOUR_TOKEN'
Response
CodeDescription
200OK
[
  {
    "id": 21,
    "agent_id": 44,
    "skill_id": 6
  }
]

Server responses.


GEThttps://api.sendo.cloud/agent_skills/{agent_skill_id}

Retrieves a single agent-skill link record by id.

Parameters


FieldTypeDescriptionDefault ValueOptionalExample
agent_skill_idintegerRecord id.noneNo21

Request.


curl --location 'https://api.sendo.cloud/agent_skills/21' --header 'Authorization: Bearer YOUR_TOKEN'
Response
CodeDescription
200OK
{
  "id": 21,
  "agent_id": 44,
  "skill_id": 6,
  "priority": 1,
  "threshold": 0.7
}

Server responses.


PUThttps://api.sendo.cloud/agent_skills/{agent_skill_id}

Updates an existing agent-skill link record.

Parameters


FieldTypeDescriptionDefault ValueOptionalExample
agent_skill_idintegerRecord id.noneNo21

Request body.


curl --location -X PUT 'https://api.sendo.cloud/agent_skills/21' --header 'Authorization: Bearer YOUR_TOKEN' --header 'Content-Type: application/json' --data-raw  '{
"priority": 2,
"threshold": 0.8
}'
Response
CodeDescription
200OK
{
  "id": 21,
  "agent_id": 44,
  "skill_id": 6,
  "priority": 2,
  "threshold": 0.8
}

Server responses.


DELETEhttps://api.sendo.cloud/agent_skills/{agent_skill_id}

Deletes an agent-skill link record. The deleted record is echoed back in the response.

Parameters


FieldTypeDescriptionDefault ValueOptionalExample
agent_skill_idintegerRecord id.noneNo21

Request.


curl --location -X DELETE 'https://api.sendo.cloud/agent_skills/21' --header 'Authorization: Bearer YOUR_TOKEN'
Response
CodeDescription
200OK
{
  "id": 21,
  "agent_id": 44,
  "skill_id": 6
}

Server responses.


Calls

Call lifecycle events and metadata (start, end, participants) used by telephony integrations to persist call history and trigger post-call processing.

Create Call

POSThttps://api.sendo.cloud/calls

Records a call’s start metadata. Used by telephony integrations to persist call lifecycle and trigger post-call processing.

Request body.


curl --location -X POST 'https://api.sendo.cloud/calls' --header 'Authorization: Bearer YOUR_TOKEN' --header 'Content-Type: application/json' --data-raw  '{
"agent_id": 44,
"client_id": 1,
"sip_number_id": 10,
"incoming_number": "+15551230000"
}'
Response
CodeDescription
201Created
{
  "id": 510,
  "agent_id": 44,
  "client_id": 1,
  "status": "in_progress"
}

Server responses.


List Calls

GEThttps://api.sendo.cloud/calls

Retrieves call logs — filter by time, agent, or SIP number for QA, analytics, or billing.

Parameters


FieldTypeDescriptionDefault ValueOptionalExample
skipintegerPagination offset.noneYes0
limitintegerPage size.noneYes20
client_idintegerFilter by client.noneYes1
agent_idintegerFilter by agent.noneYes44
sip_number_idintegerFilter by SIP number.noneYes10
incoming_numberstringFilter by caller number.noneYes
start_timestringFilter by start time (ISO 8601).noneYes
end_timestringFilter by end time (ISO 8601).noneYes
statusstringFilter by call status.noneYescompleted
is_inbooleanFilter inbound calls.noneYestrue
is_outbooleanFilter outbound calls.noneYesfalse
order_bystringField to sort by.noneYesid
order_dirstringasc or desc.noneYesdesc

Request.


curl --location 'https://api.sendo.cloud/calls?client_id=1&agent_id=44&limit=20' --header 'Authorization: Bearer YOUR_TOKEN'
Response
CodeDescription
200OK
[
  {
    "id": 510,
    "agent_id": 44,
    "client_id": 1,
    "status": "completed"
  }
]

Server responses.


Get Call

GEThttps://api.sendo.cloud/calls/{call_id}

Retrieves call details — participants, duration, transcription links, recording references, and status. duration is converted to a string before being returned.

Parameters


FieldTypeDescriptionDefault ValueOptionalExample
call_idintegerCall id.noneNo510

Request.


curl --location 'https://api.sendo.cloud/calls/510' --header 'Authorization: Bearer YOUR_TOKEN'
Response
CodeDescription
200OK
{
  "id": 510,
  "agent_id": 44,
  "client_id": 1,
  "incoming_number": "+15551230000",
  "status": "completed",
  "duration": "184",
  "room_id": "room-abc-123",
  "audio": "call_510.wav",
  "transcription_url": "https://s3.amazonaws.com/.../call_510.json"
}

Server responses.


Update Call

PUThttps://api.sendo.cloud/calls/{room_id}

Updates call-level resources for a session — e.g. uploading audio, marking processing status, or attaching transcripts. Note: identified by room_id, not call_id.

Parameters


FieldTypeDescriptionDefault ValueOptionalExample
room_idstringRoom id assigned to the call session.noneNoroom-abc-123

Request body.


curl --location -X PUT 'https://api.sendo.cloud/calls/room-abc-123' --header 'Authorization: Bearer YOUR_TOKEN' --header 'Content-Type: application/json' --data-raw  '{
"audio": "call_510.wav"
}'
Response
CodeDescription
200OK
{
  "id": 510,
  "room_id": "room-abc-123",
  "audio": "call_510.wav"
}

Server responses.


Get Audio URL

GEThttps://api.sendo.cloud/audio-url/{audio}

Generates a temporary signed S3 URL to securely stream or download a call recording.

Parameters


FieldTypeDescriptionDefault ValueOptionalExample
audiostringAudio filename.noneNocall_510.wav

Request.


curl --location 'https://api.sendo.cloud/audio-url/call_510.wav' --header 'Authorization: Bearer YOUR_TOKEN'
Response
CodeDescription
200OK
{
  "url": "https://s3.amazonaws.com/...signed-url..."
}

Server responses.


TTS Configurations

Registers tts provider settings used by voice agents at runtime.

Create a TTS Configuration

POSThttps://api.sendo.cloud/tts_configurations

Creates a new TTS configuration record.

Request body.


curl --location -X POST 'https://api.sendo.cloud/tts_configurations' --header 'Authorization: Bearer YOUR_TOKEN' --header 'Content-Type: application/json' --data-raw  '{
"provider": "elevenlabs",
"details": [{"parameter":"model","value":"gpt-4o-mini","parameter_type":"string"},{"parameter":"temperature","value":"0.2","parameter_type":"float"}]
}'
Response
CodeDescription
201Created
{
  "id": 2,
  "provider": "elevenlabs",
  "details": [
    {
      "parameter": "model",
      "value": "gpt-4o-mini",
      "parameter_type": "string"
    },
    {
      "parameter": "temperature",
      "value": "0.2",
      "parameter_type": "float"
    }
  ]
}

Server responses.


List TTS Configurations

GEThttps://api.sendo.cloud/tts_configurations

Lists tts configurations, with optional filtering and pagination.

Parameters


FieldTypeDescriptionDefault ValueOptionalExample
skipintegerPagination offset.noneYes0
limitintegerPage size.noneYes20

Request.


curl --location 'https://api.sendo.cloud/tts_configurations?skip=0&limit=20' --header 'Authorization: Bearer YOUR_TOKEN'
Response
CodeDescription
200OK
[
  {
    "id": 2,
    "provider": "elevenlabs"
  }
]

Server responses.


Get a TTS Configuration

GEThttps://api.sendo.cloud/tts_configurations/{tts_config_id}

Retrieves a single TTS configuration record by id.

Parameters


FieldTypeDescriptionDefault ValueOptionalExample
tts_config_idintegerRecord id.noneNo2

Request.


curl --location 'https://api.sendo.cloud/tts_configurations/2' --header 'Authorization: Bearer YOUR_TOKEN'
Response
CodeDescription
200OK
{
  "id": 2,
  "provider": "elevenlabs",
  "details": [
    {
      "parameter": "model",
      "value": "gpt-4o-mini",
      "parameter_type": "string"
    },
    {
      "parameter": "temperature",
      "value": "0.2",
      "parameter_type": "float"
    }
  ]
}

Server responses.


Update a TTS Configuration

PUThttps://api.sendo.cloud/tts_configurations/{tts_config_id}

Updates an existing TTS configuration record.

Parameters


FieldTypeDescriptionDefault ValueOptionalExample
tts_config_idintegerRecord id.noneNo2

Request body.


curl --location -X PUT 'https://api.sendo.cloud/tts_configurations/2' --header 'Authorization: Bearer YOUR_TOKEN' --header 'Content-Type: application/json' --data-raw  '{
"details": [{"parameter":"temperature","value":"0.5","parameter_type":"float"}]
}'
Response
CodeDescription
200OK
{
  "id": 2,
  "provider": "elevenlabs",
  "details": [
    {
      "parameter": "temperature",
      "value": "0.5",
      "parameter_type": "float"
    }
  ]
}

Server responses.


Delete a TTS Configuration

DELETEhttps://api.sendo.cloud/tts_configurations/{tts_config_id}

Deletes a TTS configuration record. The deleted record is echoed back in the response.

Parameters


FieldTypeDescriptionDefault ValueOptionalExample
tts_config_idintegerRecord id.noneNo2

Request.


curl --location -X DELETE 'https://api.sendo.cloud/tts_configurations/2' --header 'Authorization: Bearer YOUR_TOKEN'
Response
CodeDescription
200OK
{
  "id": 2,
  "provider": "elevenlabs"
}

Server responses.


STT Configurations

Registers stt provider settings used by voice agents at runtime.

Create an STT Configuration

POSThttps://api.sendo.cloud/stt_configurations

Creates a new STT configuration record.

Request body.


curl --location -X POST 'https://api.sendo.cloud/stt_configurations' --header 'Authorization: Bearer YOUR_TOKEN' --header 'Content-Type: application/json' --data-raw  '{
"provider": "deepgram",
"details": [{"parameter":"model","value":"gpt-4o-mini","parameter_type":"string"},{"parameter":"temperature","value":"0.2","parameter_type":"float"}]
}'
Response
CodeDescription
201Created
{
  "id": 4,
  "provider": "deepgram",
  "details": [
    {
      "parameter": "model",
      "value": "gpt-4o-mini",
      "parameter_type": "string"
    },
    {
      "parameter": "temperature",
      "value": "0.2",
      "parameter_type": "float"
    }
  ]
}

Server responses.


List STT Configurations

GEThttps://api.sendo.cloud/stt_configurations

Lists stt configurations, with optional filtering and pagination.

Parameters


FieldTypeDescriptionDefault ValueOptionalExample
skipintegerPagination offset.noneYes0
limitintegerPage size.noneYes20

Request.


curl --location 'https://api.sendo.cloud/stt_configurations?skip=0&limit=20' --header 'Authorization: Bearer YOUR_TOKEN'
Response
CodeDescription
200OK
[
  {
    "id": 4,
    "provider": "deepgram"
  }
]

Server responses.


Get an STT Configuration

GEThttps://api.sendo.cloud/stt_configurations/{stt_config_id}

Retrieves a single STT configuration record by id.

Parameters


FieldTypeDescriptionDefault ValueOptionalExample
stt_config_idintegerRecord id.noneNo4

Request.


curl --location 'https://api.sendo.cloud/stt_configurations/4' --header 'Authorization: Bearer YOUR_TOKEN'
Response
CodeDescription
200OK
{
  "id": 4,
  "provider": "deepgram",
  "details": [
    {
      "parameter": "model",
      "value": "gpt-4o-mini",
      "parameter_type": "string"
    },
    {
      "parameter": "temperature",
      "value": "0.2",
      "parameter_type": "float"
    }
  ]
}

Server responses.


Update an STT Configuration

PUThttps://api.sendo.cloud/stt_configurations/{stt_config_id}

Updates an existing STT configuration record.

Parameters


FieldTypeDescriptionDefault ValueOptionalExample
stt_config_idintegerRecord id.noneNo4

Request body.


curl --location -X PUT 'https://api.sendo.cloud/stt_configurations/4' --header 'Authorization: Bearer YOUR_TOKEN' --header 'Content-Type: application/json' --data-raw  '{
"details": [{"parameter":"temperature","value":"0.5","parameter_type":"float"}]
}'
Response
CodeDescription
200OK
{
  "id": 4,
  "provider": "deepgram",
  "details": [
    {
      "parameter": "temperature",
      "value": "0.5",
      "parameter_type": "float"
    }
  ]
}

Server responses.


Delete an STT Configuration

DELETEhttps://api.sendo.cloud/stt_configurations/{stt_config_id}

Deletes an STT configuration record. The deleted record is echoed back in the response.

Parameters


FieldTypeDescriptionDefault ValueOptionalExample
stt_config_idintegerRecord id.noneNo4

Request.


curl --location -X DELETE 'https://api.sendo.cloud/stt_configurations/4' --header 'Authorization: Bearer YOUR_TOKEN'
Response
CodeDescription
200OK
{
  "id": 4,
  "provider": "deepgram"
}

Server responses.


LLM Configurations

Registers llm provider settings used by voice agents at runtime.

Create an LLM Configuration

POSThttps://api.sendo.cloud/llm_configurations

Creates a new LLM configuration record.

Request body.


curl --location -X POST 'https://api.sendo.cloud/llm_configurations' --header 'Authorization: Bearer YOUR_TOKEN' --header 'Content-Type: application/json' --data-raw  '{
"provider": "openai",
"details": [{"parameter":"model","value":"gpt-4o-mini","parameter_type":"string"},{"parameter":"temperature","value":"0.2","parameter_type":"float"}]
}'
Response
CodeDescription
201Created
{
  "id": 3,
  "provider": "openai",
  "details": [
    {
      "parameter": "model",
      "value": "gpt-4o-mini",
      "parameter_type": "string"
    },
    {
      "parameter": "temperature",
      "value": "0.2",
      "parameter_type": "float"
    }
  ]
}

Server responses.


List LLM Configurations

GEThttps://api.sendo.cloud/llm_configurations

Lists llm configurations, with optional filtering and pagination.

Parameters


FieldTypeDescriptionDefault ValueOptionalExample
skipintegerPagination offset.noneYes0
limitintegerPage size.noneYes20

Request.


curl --location 'https://api.sendo.cloud/llm_configurations?skip=0&limit=20' --header 'Authorization: Bearer YOUR_TOKEN'
Response
CodeDescription
200OK
[
  {
    "id": 3,
    "provider": "openai"
  }
]

Server responses.


Get an LLM Configuration

GEThttps://api.sendo.cloud/llm_configurations/{llm_config_id}

Retrieves a single LLM configuration record by id.

Parameters


FieldTypeDescriptionDefault ValueOptionalExample
llm_config_idintegerRecord id.noneNo3

Request.


curl --location 'https://api.sendo.cloud/llm_configurations/3' --header 'Authorization: Bearer YOUR_TOKEN'
Response
CodeDescription
200OK
{
  "id": 3,
  "provider": "openai",
  "details": [
    {
      "parameter": "model",
      "value": "gpt-4o-mini",
      "parameter_type": "string"
    },
    {
      "parameter": "temperature",
      "value": "0.2",
      "parameter_type": "float"
    }
  ]
}

Server responses.


Update an LLM Configuration

PUThttps://api.sendo.cloud/llm_configurations/{llm_config_id}

Updates an existing LLM configuration record.

Parameters


FieldTypeDescriptionDefault ValueOptionalExample
llm_config_idintegerRecord id.noneNo3

Request body.


curl --location -X PUT 'https://api.sendo.cloud/llm_configurations/3' --header 'Authorization: Bearer YOUR_TOKEN' --header 'Content-Type: application/json' --data-raw  '{
"details": [{"parameter":"temperature","value":"0.5","parameter_type":"float"}]
}'
Response
CodeDescription
200OK
{
  "id": 3,
  "provider": "openai",
  "details": [
    {
      "parameter": "temperature",
      "value": "0.5",
      "parameter_type": "float"
    }
  ]
}

Server responses.


Delete an LLM Configuration

DELETEhttps://api.sendo.cloud/llm_configurations/{llm_config_id}

Deletes an LLM configuration record. The deleted record is echoed back in the response.

Parameters


FieldTypeDescriptionDefault ValueOptionalExample
llm_config_idintegerRecord id.noneNo3

Request.


curl --location -X DELETE 'https://api.sendo.cloud/llm_configurations/3' --header 'Authorization: Bearer YOUR_TOKEN'
Response
CodeDescription
200OK
{
  "id": 3,
  "provider": "openai"
}

Server responses.


Provider Configuration Templates

A template schema used to validate provider-specific fields (LLM, TTS, STT), ensuring agent configurations meet each provider’s expectations.

Create a Provider Configuration Template

POSThttps://api.sendo.cloud/provider_configuration_templates

Creates a new provider configuration template record.

Request body.


curl --location -X POST 'https://api.sendo.cloud/provider_configuration_templates' --header 'Authorization: Bearer YOUR_TOKEN' --header 'Content-Type: application/json' --data-raw  '{
"provider": "openai",
"provider_type": "llm",
"details": [{"parameter":"model","parameter_type":"string","required":true},{"parameter":"temperature","parameter_type":"float","required":false}]
}'
Response
CodeDescription
201Created
{
  "id": 12,
  "provider": "openai",
  "provider_type": "llm",
  "details": [
    {
      "parameter": "model",
      "parameter_type": "string",
      "required": true
    },
    {
      "parameter": "temperature",
      "parameter_type": "float",
      "required": false
    }
  ]
}

Server responses.


List Provider Configuration Templates

GEThttps://api.sendo.cloud/provider_configuration_templates

Lists provider configuration templates, with optional filtering and pagination.

Parameters


FieldTypeDescriptionDefault ValueOptionalExample
skipintegerPagination offset.noneYes0
limitintegerPage size.noneYes20
filter_keystringField name to filter templates by.noneYesprovider
filter_valuestringValue to match filter_key against.noneYesopenai

Request.


curl --location 'https://api.sendo.cloud/provider_configuration_templates?skip=0&limit=20&filter_key=provider&filter_value=openai' --header 'Authorization: Bearer YOUR_TOKEN'
Response
CodeDescription
200OK
[
  {
    "id": 12,
    "provider": "openai",
    "provider_type": "llm"
  }
]

Server responses.


Get a Provider Configuration Template

GEThttps://api.sendo.cloud/provider_configuration_templates/{provider_configuration_template_id}

Retrieves a single provider configuration template record by id.

Parameters


FieldTypeDescriptionDefault ValueOptionalExample
provider_configuration_template_idintegerRecord id.noneNo12

Request.


curl --location 'https://api.sendo.cloud/provider_configuration_templates/12' --header 'Authorization: Bearer YOUR_TOKEN'
Response
CodeDescription
200OK
{
  "id": 12,
  "provider": "openai",
  "provider_type": "llm",
  "details": [
    {
      "parameter": "model",
      "parameter_type": "string",
      "required": true
    },
    {
      "parameter": "temperature",
      "parameter_type": "float",
      "required": false
    }
  ]
}

Server responses.


Update a Provider Configuration Template

PUThttps://api.sendo.cloud/provider_configuration_templates/{provider_configuration_template_id}

Updates an existing provider configuration template record.

Parameters


FieldTypeDescriptionDefault ValueOptionalExample
provider_configuration_template_idintegerRecord id.noneNo12

Request body.


curl --location -X PUT 'https://api.sendo.cloud/provider_configuration_templates/12' --header 'Authorization: Bearer YOUR_TOKEN' --header 'Content-Type: application/json' --data-raw  '{
"details": [{"parameter":"max_tokens","parameter_type":"integer","required":false}]
}'
Response
CodeDescription
200OK
{
  "id": 12,
  "provider": "openai",
  "provider_type": "llm",
  "details": [
    {
      "parameter": "max_tokens",
      "parameter_type": "integer",
      "required": false
    }
  ]
}

Server responses.


Delete a Provider Configuration Template

DELETEhttps://api.sendo.cloud/provider_configuration_templates/{provider_configuration_template_id}

Deletes a provider configuration template record. The deleted record is echoed back in the response.

Parameters


FieldTypeDescriptionDefault ValueOptionalExample
provider_configuration_template_idintegerRecord id.noneNo12

Request.


curl --location -X DELETE 'https://api.sendo.cloud/provider_configuration_templates/12' --header 'Authorization: Bearer YOUR_TOKEN'
Response
CodeDescription
200OK
{
  "id": 12,
  "provider": "openai",
  "provider_type": "llm"
}

Server responses.


SIP and Telephony

Provisioning and routing for SIP numbers used to receive and place voice calls, plus operational/diagnostic views.

All Agents (with SIP Numbers)

GEThttps://api.sendo.cloud/all-agents

Returns all agents with their associated SIP numbers, for operational dashboards and routing views.

Request.


curl --location 'https://api.sendo.cloud/all-agents' --header 'Authorization: Bearer YOUR_TOKEN'
Response
CodeDescription
200OK
[
  {
    "id": 44,
    "name": "Sales Assistant",
    "sip_numbers": [
      {
        "id": 10,
        "sip_number": "+14155550100"
      }
    ]
  }
]

Server responses.


List SIP Numbers

GEThttps://api.sendo.cloud/sip-numbers

Lists provisioned SIP numbers used to receive and place voice calls for clients/agents.

Parameters


FieldTypeDescriptionDefault ValueOptionalExample
skipintegerPagination offset.noneYes0
limitintegerPage size.noneYes10
client_idintegerFilter by client.noneYes1
agent_idintegerFilter by agent.noneYes44
conversation_idintegerFilter by bound conversation.noneYes8
sip_numberstringFilter by number.noneYes+14155550100
is_inbooleanFilter inbound-enabled numbers.noneYestrue
is_outbooleanFilter outbound-enabled numbers.noneYestrue
descriptionstringFilter by description.noneYes
order_bystringField to sort by.noneYesid
order_dirstringasc or desc.noneYesasc

Request.


curl --location 'https://api.sendo.cloud/sip-numbers?client_id=1&skip=0&limit=10' --header 'Authorization: Bearer YOUR_TOKEN'
Response
CodeDescription
200OK
{
  "items": [
    {
      "id": 10,
      "sip_number": "+14155550100",
      "is_in": true,
      "is_out": true
    }
  ],
  "total": 1,
  "skip": 0,
  "limit": 10
}

Server responses.


Get SIP Number

GEThttps://api.sendo.cloud/sip-numbers/{sip_number_id}

Retrieves SIP number provisioning details — assigned trunks and dispatch rules required for call handling.

Parameters


FieldTypeDescriptionDefault ValueOptionalExample
sip_number_idintegerSIP number id.noneNo10

Request.


curl --location 'https://api.sendo.cloud/sip-numbers/10' --header 'Authorization: Bearer YOUR_TOKEN'
Response
CodeDescription
200OK
{
  "id": 10,
  "client_id": 1,
  "agent_id": 44,
  "sip_number": "+14155550100",
  "sip_trunk_in": "TRUNK_IN_123",
  "sip_trunk_out": "TRUNK_OUT_456",
  "sip_dispatch_rule": "RULE_789",
  "is_in": true,
  "is_out": true
}

Server responses.


Provision SIP Number

POSThttps://api.sendo.cloud/sip-numbers

Provisions a new SIP number, creates trunks and dispatch rules, and optionally assigns it to an agent for call handling.

Parameters


FieldTypeDescriptionDefault ValueOptionalExample
client_idintegerOwning client id.noneNo1
agent_idintegerAgent to assign the number to.noneYes44

Request body.


curl --location -X POST 'https://api.sendo.cloud/sip-numbers?client_id=1&agent_id=44' --header 'Authorization: Bearer YOUR_TOKEN' --header 'Content-Type: application/json' --data-raw  '{
"sip_number": "+14155550100",
"conversation_id": 8,
"is_in": true,
"is_out": true,
"description": "Main support line"
}'
Response
CodeDescription
201Created
{
  "id": 10,
  "client_id": 1,
  "agent_id": 44,
  "sip_number": "+14155550100",
  "sip_trunk_in": "TRUNK_IN_123",
  "sip_trunk_out": "TRUNK_OUT_456",
  "sip_dispatch_rule": "RULE_789",
  "is_in": true,
  "is_out": true
}

Server responses.


Process SIP Numbers

GEThttps://api.sendo.cloud/process-sip-numbers

Reprocesses and reconciles SIP records to recreate missing telephony resources and fix provisioning issues.

Request.


curl --location 'https://api.sendo.cloud/process-sip-numbers' --header 'Authorization: Bearer YOUR_TOKEN'
Response
CodeDescription
200OK
{
  "result": "Client SIP numbers were processed successfully"
}

Server responses.


Update SIP Number

PUThttps://api.sendo.cloud/sip-numbers/{sip_number_id}

Updates provisioning, routing, or assignment for a SIP number to change how calls are handled.

Parameters


FieldTypeDescriptionDefault ValueOptionalExample
sip_number_idintegerSIP number id.noneNo10

Request body.


curl --location -X PUT 'https://api.sendo.cloud/sip-numbers/10' --header 'Authorization: Bearer YOUR_TOKEN' --header 'Content-Type: application/json' --data-raw  '{
"agent_id": 45,
"is_out": false
}'
Response
CodeDescription
200OK
{
  "id": 10,
  "sip_number": "+14155550100",
  "agent_id": 45,
  "is_out": false
}

Server responses.


Delete SIP Number

DELETEhttps://api.sendo.cloud/sip-numbers/{sip_number_id}

Deprovisions a SIP number and cleans up associated telephony artifacts when retiring a number.

Parameters


FieldTypeDescriptionDefault ValueOptionalExample
sip_number_idintegerSIP number id.noneNo10

Request.


curl --location -X DELETE 'https://api.sendo.cloud/sip-numbers/10' --header 'Authorization: Bearer YOUR_TOKEN'
Response
CodeDescription
200OK
{
  "id": 10,
  "sip_number": "+14155550100"
}

Server responses.


SIP Numbers Detailed

GEThttps://api.sendo.cloud/sip-numbers-detailed

Returns a detailed view combining SIP numbers, agents, and voice configuration for diagnostics and reports.

Parameters


FieldTypeDescriptionDefault ValueOptionalExample
sip_numberstringFilter by number.noneYes+14155550100
agent_idintegerFilter by agent.noneYes44

Request.


curl --location 'https://api.sendo.cloud/sip-numbers-detailed?sip_number=%2B14155550100' --header 'Authorization: Bearer YOUR_TOKEN'
Response
CodeDescription
200OK
[
  {
    "id": 10,
    "sip_number": "+14155550100",
    "agent": {
      "id": 44,
      "name": "Sales Assistant",
      "language": "en"
    },
    "llm_configuration": {
      "id": 3,
      "provider": "openai"
    },
    "tts_configuration": {
      "id": 2,
      "provider": "elevenlabs"
    },
    "stt_configuration": {
      "id": 4,
      "provider": "deepgram"
    }
  }
]

Server responses.


Outbound Campaigns

Trigger outbound calls, either one at a time (for testing) or in bulk dialing lists.

Start Campaigns (Batch)

POSThttps://api.sendo.cloud/start-campaigns

Starts bulk outbound calling campaigns using configured voice agents and a dialing list. Runs asynchronously to scale.

Request body.


curl --location -X POST 'https://api.sendo.cloud/start-campaigns' --header 'Authorization: Bearer YOUR_TOKEN' --header 'Content-Type: application/json' --data-raw  '{
"0": {"target_number":"+15551230000","sip_number":"+14155550100","agent_id":44,"params":{"batch":"july"}},
"1": {"target_number":"+15551239999","sip_number":"+14155550100","agent_id":44}
}'
Response
CodeDescription
200OK
{
  "total": 2,
  "results": [
    {
      "status": "ok",
      "dispatch_id": "DISPATCH_003"
    },
    {
      "status": "ok",
      "dispatch_id": "DISPATCH_004"
    }
  ]
}

Server responses.


Start Campaign (Quick, GET)

GEThttps://api.sendo.cloud/start-campaign

Triggers a single outbound call or test call via query parameters — a quick invocation without a JSON body.

Parameters


FieldTypeDescriptionDefault ValueOptionalExample
target_numberstringNumber to call.noneNo+15551230000
sip_numberstringOriginating SIP number.noneNo+14155550100
agent_idintegerAgent to handle the call.noneNo44
paramsstringOptional JSON string with extra parameters.noneYes

Request.


curl --location 'https://api.sendo.cloud/start-campaign?target_number=%2B15551230000&sip_number=%2B14155550100&agent_id=44' --header 'Authorization: Bearer YOUR_TOKEN'
Response
CodeDescription
200OK
{
  "status": "ok",
  "dispatch_id": "DISPATCH_001"
}

Server responses.


Start Campaign (Detailed, POST)

POSThttps://api.sendo.cloud/start-campaign

Starts a detailed single outbound campaign with scheduling, templates, and retry logic via a JSON body.

Request body.


curl --location -X POST 'https://api.sendo.cloud/start-campaign' --header 'Authorization: Bearer YOUR_TOKEN' --header 'Content-Type: application/json' --data-raw  '{
"target_number": "+15551230000",
"sip_number": "+14155550100",
"agent_id": 44,
"params": {"source":"crm","priority":"high"}
}'
Response
CodeDescription
200OK
{
  "status": "ok",
  "dispatch_id": "DISPATCH_002"
}

Server responses.


Conversations

A conversation flow (IVR / dialogue tree) used by voice agents to handle calls, prompts, and decisions.

Create a Conversation

POSThttps://api.sendo.cloud/conversations

Creates a new conversation record.

Request body.


curl --location -X POST 'https://api.sendo.cloud/conversations' --header 'Authorization: Bearer YOUR_TOKEN' --header 'Content-Type: application/json' --data-raw  '{
"name": "Sales Flow",
"description": "Inbound sales routing"
}'
Response
CodeDescription
201Created
{
  "id": 8,
  "name": "Sales Flow",
  "description": "Inbound sales routing"
}

Server responses.


List Conversations

GEThttps://api.sendo.cloud/conversations

Lists conversations, with optional filtering and pagination.

Parameters


FieldTypeDescriptionDefault ValueOptionalExample
skipintegerPagination offset.noneYes0
limitintegerPage size.noneYes20
namestringFilter by name.noneYes
order_bystringField to sort by.noneYesid
order_dirstringasc or desc.noneYesasc

Request.


curl --location 'https://api.sendo.cloud/conversations?skip=0&limit=20&order_by=id&order_dir=asc' --header 'Authorization: Bearer YOUR_TOKEN'
Response
CodeDescription
200OK
[
  {
    "id": 8,
    "name": "Sales Flow"
  }
]

Server responses.


Get a Conversation

GEThttps://api.sendo.cloud/conversations/{conversation_id}

Retrieves a single conversation record by id.

Parameters


FieldTypeDescriptionDefault ValueOptionalExample
conversation_idintegerRecord id.noneNo8

Request.


curl --location 'https://api.sendo.cloud/conversations/8' --header 'Authorization: Bearer YOUR_TOKEN'
Response
CodeDescription
200OK
{
  "id": 8,
  "name": "Sales Flow",
  "description": "Inbound sales routing",
  "skills": [
    {
      "id": 6,
      "name": "EmailTranscript"
    }
  ]
}

Server responses.


Update a Conversation

PUThttps://api.sendo.cloud/conversations/{conversation_id}

Updates an existing conversation record.

Parameters


FieldTypeDescriptionDefault ValueOptionalExample
conversation_idintegerRecord id.noneNo8

Request body.


curl --location -X PUT 'https://api.sendo.cloud/conversations/8' --header 'Authorization: Bearer YOUR_TOKEN' --header 'Content-Type: application/json' --data-raw  '{
"description": "Inbound sales routing (updated)"
}'
Response
CodeDescription
200OK
{
  "id": 8,
  "name": "Sales Flow",
  "description": "Inbound sales routing (updated)"
}

Server responses.


Delete a Conversation

DELETEhttps://api.sendo.cloud/conversations/{conversation_id}

Deletes a conversation record. The deleted record is echoed back in the response.

Parameters


FieldTypeDescriptionDefault ValueOptionalExample
conversation_idintegerRecord id.noneNo8

Request.


curl --location -X DELETE 'https://api.sendo.cloud/conversations/8' --header 'Authorization: Bearer YOUR_TOKEN'
Response
CodeDescription
200OK
{
  "id": 8,
  "name": "Sales Flow"
}

Server responses.


Conversation Detail (with Transitions)

GEThttps://api.sendo.cloud/conversation_detail/{conversation_id}

Retrieves the conversation with ordered transitions and detailed step metadata, for debugging or documentation.

Parameters


FieldTypeDescriptionDefault ValueOptionalExample
conversation_idintegerConversation id.noneNo8

Request.


curl --location 'https://api.sendo.cloud/conversation_detail/8' --header 'Authorization: Bearer YOUR_TOKEN'
Response
CodeDescription
200OK
{
  "id": 8,
  "name": "Sales Flow",
  "transitions": [
    {
      "id": 101,
      "source_agent_id": 44,
      "destination_agent_id": 45,
      "trigger_condition": "intent=handoff"
    }
  ]
}

Server responses.


Transitions

Routing rules and trigger-based transitions used to move callers between agents or conversation states.

Create a Transition

POSThttps://api.sendo.cloud/transitions

Creates a new transition record.

Request body.


curl --location -X POST 'https://api.sendo.cloud/transitions' --header 'Authorization: Bearer YOUR_TOKEN' --header 'Content-Type: application/json' --data-raw  '{
"conversation_id": 8,
"source_agent_id": 44,
"destination_agent_id": 45,
"trigger_condition": "intent=handoff",
"propagate_context": true
}'
Response
CodeDescription
201Created
{
  "id": 101,
  "conversation_id": 8,
  "source_agent_id": 44,
  "destination_agent_id": 45,
  "trigger_condition": "intent=handoff",
  "propagate_context": true
}

Server responses.


List Transitions

GEThttps://api.sendo.cloud/transitions

Lists transitions, with optional filtering and pagination.

Parameters


FieldTypeDescriptionDefault ValueOptionalExample
skipintegerPagination offset.noneYes0
limitintegerPage size.noneYes20
conversation_idintegerFilter by conversation.noneYes8
source_agent_idintegerFilter by source agent.noneYes44
destination_agent_idintegerFilter by destination agent.noneYes45
trigger_conditionstringFilter by trigger condition.noneYes
propagate_contextbooleanFilter by context-propagation flag.noneYestrue
order_bystringField to sort by.noneYesid
order_dirstringasc or desc.noneYesasc

Request.


curl --location 'https://api.sendo.cloud/transitions?skip=0&limit=20&conversation_id=8&source_agent_id=44&destination_agent_id=45&propagate_context=true&order_by=id&order_dir=asc' --header 'Authorization: Bearer YOUR_TOKEN'
Response
CodeDescription
200OK
[
  {
    "id": 101,
    "source_agent_id": 44,
    "destination_agent_id": 45,
    "trigger_condition": "intent=handoff"
  }
]

Server responses.


Get a Transition

GEThttps://api.sendo.cloud/transitions/{transition_id}

Retrieves a single transition record by id.

Parameters


FieldTypeDescriptionDefault ValueOptionalExample
transition_idintegerRecord id.noneNo101

Request.


curl --location 'https://api.sendo.cloud/transitions/101' --header 'Authorization: Bearer YOUR_TOKEN'
Response
CodeDescription
200OK
{
  "id": 101,
  "conversation_id": 8,
  "source_agent_id": 44,
  "destination_agent_id": 45,
  "trigger_condition": "intent=handoff",
  "propagate_context": true
}

Server responses.


Update a Transition

PUThttps://api.sendo.cloud/transitions/{transition_id}

Updates an existing transition record.

Parameters


FieldTypeDescriptionDefault ValueOptionalExample
transition_idintegerRecord id.noneNo101

Request body.


curl --location -X PUT 'https://api.sendo.cloud/transitions/101' --header 'Authorization: Bearer YOUR_TOKEN' --header 'Content-Type: application/json' --data-raw  '{
"trigger_condition": "intent=billing_handoff"
}'
Response
CodeDescription
200OK
{
  "id": 101,
  "conversation_id": 8,
  "source_agent_id": 44,
  "destination_agent_id": 45,
  "trigger_condition": "intent=billing_handoff"
}

Server responses.


Delete a Transition

DELETEhttps://api.sendo.cloud/transitions/{transition_id}

Deletes a transition record. The deleted record is echoed back in the response.

Parameters


FieldTypeDescriptionDefault ValueOptionalExample
transition_idintegerRecord id.noneNo101

Request.


curl --location -X DELETE 'https://api.sendo.cloud/transitions/101' --header 'Authorization: Bearer YOUR_TOKEN'
Response
CodeDescription
200OK
{
  "id": 101,
  "conversation_id": 8
}

Server responses.


Client-Conversation Relationship

Assigns a conversation flow to a client, enabling call routing and agent behavior customization for that client.

POSThttps://api.sendo.cloud/client_conversations

Creates a new client-conversation link record.

Request body.


curl --location -X POST 'https://api.sendo.cloud/client_conversations' --header 'Authorization: Bearer YOUR_TOKEN' --header 'Content-Type: application/json' --data-raw  '{
"client_id": 1,
"conversation_id": 8,
"active": true
}'
Response
CodeDescription
201Created
{
  "id": 17,
  "client_id": 1,
  "conversation_id": 8,
  "active": true
}

Server responses.


List Client-Conversation Relationship

GEThttps://api.sendo.cloud/client_conversations

Lists client-conversation relationship, with optional filtering and pagination.

Parameters


FieldTypeDescriptionDefault ValueOptionalExample
skipintegerPagination offset.noneYes0
limitintegerPage size.noneYes20
client_idintegerFilter by client.noneYes1
conversation_idintegerFilter by conversation.noneYes8
order_bystringField to sort by.noneYesid
order_dirstringasc or desc.noneYesasc

Request.


curl --location 'https://api.sendo.cloud/client_conversations?skip=0&limit=20&client_id=1&conversation_id=8&order_by=id&order_dir=asc' --header 'Authorization: Bearer YOUR_TOKEN'
Response
CodeDescription
200OK
[
  {
    "id": 17,
    "client_id": 1,
    "conversation_id": 8
  }
]

Server responses.


GEThttps://api.sendo.cloud/client_conversations/{client_conversation_id}

Retrieves a single client-conversation link record by id.

Parameters


FieldTypeDescriptionDefault ValueOptionalExample
client_conversation_idintegerRecord id.noneNo17

Request.


curl --location 'https://api.sendo.cloud/client_conversations/17' --header 'Authorization: Bearer YOUR_TOKEN'
Response
CodeDescription
200OK
{
  "id": 17,
  "client_id": 1,
  "conversation_id": 8,
  "active": true,
  "activation_start": null,
  "activation_end": null
}

Server responses.


PUThttps://api.sendo.cloud/client_conversations/{client_conversation_id}

Updates an existing client-conversation link record.

Parameters


FieldTypeDescriptionDefault ValueOptionalExample
client_conversation_idintegerRecord id.noneNo17

Request body.


curl --location -X PUT 'https://api.sendo.cloud/client_conversations/17' --header 'Authorization: Bearer YOUR_TOKEN' --header 'Content-Type: application/json' --data-raw  '{
"active": false
}'
Response
CodeDescription
200OK
{
  "id": 17,
  "client_id": 1,
  "conversation_id": 8,
  "active": false
}

Server responses.


DELETEhttps://api.sendo.cloud/client_conversations/{client_conversation_id}

Deletes a client-conversation link record. The deleted record is echoed back in the response.

Parameters


FieldTypeDescriptionDefault ValueOptionalExample
client_conversation_idintegerRecord id.noneNo17

Request.


curl --location -X DELETE 'https://api.sendo.cloud/client_conversations/17' --header 'Authorization: Bearer YOUR_TOKEN'
Response
CodeDescription
200OK
{
  "id": 17,
  "client_id": 1,
  "conversation_id": 8
}

Server responses.


Call Transfers

Transfer and escalation rules used to route calls from voice agents to human operators or other handlers.

Create a Transfer Rule

POSThttps://api.sendo.cloud/transfer_calls

Creates a new transfer rule record.

Request body.


curl --location -X POST 'https://api.sendo.cloud/transfer_calls' --header 'Authorization: Bearer YOUR_TOKEN' --header 'Content-Type: application/json' --data-raw  '{
"agent_id": 44,
"operator_number": "+15550999999",
"take_over_message": "Connecting you to an operator",
"call_transfer_context": "billing"
}'
Response
CodeDescription
201Created
{
  "id": 15,
  "agent_id": 44,
  "operator_number": "+15550999999"
}

Server responses.


List Call Transfers

GEThttps://api.sendo.cloud/transfer_calls

Lists call transfers, with optional filtering and pagination.

Parameters


FieldTypeDescriptionDefault ValueOptionalExample
skipintegerPagination offset.noneYes0
limitintegerPage size.noneYes20
agent_idintegerFilter by agent.noneYes44
operator_numberstringFilter by operator number.noneYes
take_over_messagestringFilter by takeover message.noneYes
call_transfer_contextstringFilter by transfer context.noneYesbilling
order_bystringField to sort by.noneYesid
order_dirstringasc or desc.noneYesasc

Request.


curl --location 'https://api.sendo.cloud/transfer_calls?skip=0&limit=20&agent_id=44&call_transfer_context=billing&order_by=id&order_dir=asc' --header 'Authorization: Bearer YOUR_TOKEN'
Response
CodeDescription
200OK
[
  {
    "id": 15,
    "agent_id": 44,
    "operator_number": "+15550999999"
  }
]

Server responses.


Get a Transfer Rule

GEThttps://api.sendo.cloud/transfer_calls/{transfer_call_id}

Retrieves a single transfer rule record by id.

Parameters


FieldTypeDescriptionDefault ValueOptionalExample
transfer_call_idintegerRecord id.noneNo15

Request.


curl --location 'https://api.sendo.cloud/transfer_calls/15' --header 'Authorization: Bearer YOUR_TOKEN'
Response
CodeDescription
200OK
{
  "id": 15,
  "agent_id": 44,
  "operator_number": "+15550999999",
  "take_over_message": "Connecting you to an operator",
  "call_transfer_context": "billing"
}

Server responses.


Update a Transfer Rule

PUThttps://api.sendo.cloud/transfer_calls/{transfer_call_id}

Updates an existing transfer rule record.

Parameters


FieldTypeDescriptionDefault ValueOptionalExample
transfer_call_idintegerRecord id.noneNo15

Request body.


curl --location -X PUT 'https://api.sendo.cloud/transfer_calls/15' --header 'Authorization: Bearer YOUR_TOKEN' --header 'Content-Type: application/json' --data-raw  '{
"take_over_message": "One moment, transferring your call"
}'
Response
CodeDescription
200OK
{
  "id": 15,
  "agent_id": 44,
  "operator_number": "+15550999999",
  "take_over_message": "One moment, transferring your call"
}

Server responses.


Delete a Transfer Rule

DELETEhttps://api.sendo.cloud/transfer_calls/{transfer_call_id}

Deletes a transfer rule record. The deleted record is echoed back in the response.

Parameters


FieldTypeDescriptionDefault ValueOptionalExample
transfer_call_idintegerRecord id.noneNo15

Request.


curl --location -X DELETE 'https://api.sendo.cloud/transfer_calls/15' --header 'Authorization: Bearer YOUR_TOKEN'
Response
CodeDescription
200OK
{
  "id": 15,
  "agent_id": 44
}

Server responses.


Session Summaries

Automated or manual summaries of voice calls (key points, actions, follow-ups) for agents and supervisors.

Create a Session Summary

POSThttps://api.sendo.cloud/session_summaries

Creates a new session summary record.

Request body.


curl --location -X POST 'https://api.sendo.cloud/session_summaries' --header 'Authorization: Bearer YOUR_TOKEN' --header 'Content-Type: application/json' --data-raw  '{
"agent_id": 44,
"participant_number": "+15551230000",
"summary_text": "Customer requested pricing details"
}'
Response
CodeDescription
201Created
{
  "id": 88,
  "agent_id": 44,
  "participant_number": "+15551230000",
  "summary_text": "Customer requested pricing details"
}

Server responses.


List Session Summaries

GEThttps://api.sendo.cloud/session_summaries

Lists session summaries, with optional filtering and pagination.

Parameters


FieldTypeDescriptionDefault ValueOptionalExample
skipintegerPagination offset.noneYes0
limitintegerPage size.noneYes20
agent_idintegerFilter by agent.noneYes44
participant_numberstringFilter by caller number.noneYes
summary_textstringFilter by summary content.noneYes
order_bystringField to sort by.noneYesid
order_dirstringasc or desc.noneYesasc

Request.


curl --location 'https://api.sendo.cloud/session_summaries?skip=0&limit=20&agent_id=44&order_by=id&order_dir=asc' --header 'Authorization: Bearer YOUR_TOKEN'
Response
CodeDescription
200OK
[
  {
    "id": 88,
    "agent_id": 44,
    "summary_text": "Customer requested pricing details"
  }
]

Server responses.


Get a Session Summary

GEThttps://api.sendo.cloud/session_summaries/{session_summary_id}

Retrieves a single session summary record by id.

Parameters


FieldTypeDescriptionDefault ValueOptionalExample
session_summary_idintegerRecord id.noneNo88

Request.


curl --location 'https://api.sendo.cloud/session_summaries/88' --header 'Authorization: Bearer YOUR_TOKEN'
Response
CodeDescription
200OK
{
  "id": 88,
  "agent_id": 44,
  "participant_number": "+15551230000",
  "summary_text": "Customer requested pricing details"
}

Server responses.


Update a Session Summary

PUThttps://api.sendo.cloud/session_summaries/{session_summary_id}

Updates an existing session summary record.

Parameters


FieldTypeDescriptionDefault ValueOptionalExample
session_summary_idintegerRecord id.noneNo88

Request body.


curl --location -X PUT 'https://api.sendo.cloud/session_summaries/88' --header 'Authorization: Bearer YOUR_TOKEN' --header 'Content-Type: application/json' --data-raw  '{
"summary_text": "Customer requested pricing details; follow-up scheduled"
}'
Response
CodeDescription
200OK
{
  "id": 88,
  "agent_id": 44,
  "summary_text": "Customer requested pricing details; follow-up scheduled"
}

Server responses.


Delete a Session Summary

DELETEhttps://api.sendo.cloud/session_summaries/{session_summary_id}

Deletes a session summary record. The deleted record is echoed back in the response.

Parameters


FieldTypeDescriptionDefault ValueOptionalExample
session_summary_idintegerRecord id.noneNo88

Request.


curl --location -X DELETE 'https://api.sendo.cloud/session_summaries/88' --header 'Authorization: Bearer YOUR_TOKEN'
Response
CodeDescription
200OK
{
  "id": 88,
  "agent_id": 44
}

Server responses.


Collections

Collections of prompts, templates, or voice assets used by agents (e.g., greeting scripts or fallback prompts).

Create a Collection

POSThttps://api.sendo.cloud/collections

Creates a new collection record.

Request body.


curl --location -X POST 'https://api.sendo.cloud/collections' --header 'Authorization: Bearer YOUR_TOKEN' --header 'Content-Type: application/json' --data-raw  '{
"description": "Product Catalog",
"code": "CAT-001",
"items": [{"description":"Basic Plan"},{"description":"Premium Plan"}]
}'
Response
CodeDescription
201Created
{
  "id": 31,
  "description": "Product Catalog",
  "code": "CAT-001",
  "items": [
    {
      "description": "Basic Plan"
    },
    {
      "description": "Premium Plan"
    }
  ]
}

Server responses.


List Collections

GEThttps://api.sendo.cloud/collections

Lists collections, with optional filtering and pagination.

Parameters


FieldTypeDescriptionDefault ValueOptionalExample
skipintegerPagination offset.noneYes0
limitintegerPage size.noneYes20
descriptionstringFilter by description.noneYes
codestringFilter by code.noneYesCAT-001
order_bystringField to sort by.noneYesid
order_dirstringasc or desc.noneYesasc

Request.


curl --location 'https://api.sendo.cloud/collections?skip=0&limit=20&code=CAT-001&order_by=id&order_dir=asc' --header 'Authorization: Bearer YOUR_TOKEN'
Response
CodeDescription
200OK
[
  {
    "id": 31,
    "description": "Product Catalog",
    "code": "CAT-001"
  }
]

Server responses.


Get a Collection

GEThttps://api.sendo.cloud/collections/{collection_id}

Retrieves a single collection record by id.

Parameters


FieldTypeDescriptionDefault ValueOptionalExample
collection_idintegerRecord id.noneNo31

Request.


curl --location 'https://api.sendo.cloud/collections/31' --header 'Authorization: Bearer YOUR_TOKEN'
Response
CodeDescription
200OK
{
  "id": 31,
  "description": "Product Catalog",
  "code": "CAT-001",
  "items": [
    {
      "description": "Basic Plan"
    },
    {
      "description": "Premium Plan"
    }
  ]
}

Server responses.


Update a Collection

PUThttps://api.sendo.cloud/collections/{collection_id}

Updates an existing collection record.

Parameters


FieldTypeDescriptionDefault ValueOptionalExample
collection_idintegerRecord id.noneNo31

Request body.


curl --location -X PUT 'https://api.sendo.cloud/collections/31' --header 'Authorization: Bearer YOUR_TOKEN' --header 'Content-Type: application/json' --data-raw  '{
"items": [{"description":"Basic Plan"},{"description":"Premium Plan"},{"description":"Enterprise Plan"}]
}'
Response
CodeDescription
200OK
{
  "id": 31,
  "description": "Product Catalog",
  "code": "CAT-001",
  "items": [
    {
      "description": "Basic Plan"
    },
    {
      "description": "Premium Plan"
    },
    {
      "description": "Enterprise Plan"
    }
  ]
}

Server responses.


Delete a Collection

DELETEhttps://api.sendo.cloud/collections/{collection_id}

Deletes a collection record. The deleted record is echoed back in the response.

Parameters


FieldTypeDescriptionDefault ValueOptionalExample
collection_idintegerRecord id.noneNo31

Request.


curl --location -X DELETE 'https://api.sendo.cloud/collections/31' --header 'Authorization: Bearer YOUR_TOKEN'
Response
CodeDescription
200OK
{
  "id": 31,
  "description": "Product Catalog",
  "code": "CAT-001"
}

Server responses.


Report Subscriptions

Scheduled reports (call metrics, agent performance) delivered to emails or operators.

The list endpoint is GET /report_subcriptions — missing the second “s” in “subscriptions”. This is a real quirk of the API, not a typo in this document; the other four routes use the correctly spelled report_subscriptions.

Create a Report Subscription

POSThttps://api.sendo.cloud/report_subscriptions

Creates a new report subscription record.

Request body.


curl --location -X POST 'https://api.sendo.cloud/report_subscriptions' --header 'Authorization: Bearer YOUR_TOKEN' --header 'Content-Type: application/json' --data-raw  '{
"agent_id": 44,
"email": "analytics@acme.com",
"active": true,
"report_type": "daily_calls"
}'
Response
CodeDescription
201Created
{
  "id": 19,
  "agent_id": 44,
  "email": "analytics@acme.com",
  "active": true,
  "report_type": "daily_calls"
}

Server responses.


List Report Subscriptions

GEThttps://api.sendo.cloud/report_subcriptions

Lists report subscriptions, with optional filtering and pagination.

Parameters


FieldTypeDescriptionDefault ValueOptionalExample
skipintegerPagination offset.noneYes0
limitintegerPage size.noneYes20
agent_idintegerFilter by agent.noneYes44
emailstringFilter by recipient email.noneYes
activebooleanFilter by active status.noneYestrue
report_typestringFilter by report type.noneYesdaily_calls
order_bystringField to sort by.noneYesid
order_dirstringasc or desc.noneYesasc

Request.


curl --location 'https://api.sendo.cloud/report_subcriptions?skip=0&limit=20&agent_id=44&active=true&report_type=daily_calls&order_by=id&order_dir=asc' --header 'Authorization: Bearer YOUR_TOKEN'
Response
CodeDescription
200OK
[
  {
    "id": 19,
    "agent_id": 44,
    "email": "analytics@acme.com",
    "active": true
  }
]

Server responses.


Get a Report Subscription

GEThttps://api.sendo.cloud/report_subscriptions/{report_subscription_id}

Retrieves a single report subscription record by id.

Parameters


FieldTypeDescriptionDefault ValueOptionalExample
report_subscription_idintegerRecord id.noneNo19

Request.


curl --location 'https://api.sendo.cloud/report_subscriptions/19' --header 'Authorization: Bearer YOUR_TOKEN'
Response
CodeDescription
200OK
{
  "id": 19,
  "agent_id": 44,
  "email": "analytics@acme.com",
  "active": true,
  "report_type": "daily_calls"
}

Server responses.


Update a Report Subscription

PUThttps://api.sendo.cloud/report_subscriptions/{report_subscription_id}

Updates an existing report subscription record.

Parameters


FieldTypeDescriptionDefault ValueOptionalExample
report_subscription_idintegerRecord id.noneNo19

Request body.


curl --location -X PUT 'https://api.sendo.cloud/report_subscriptions/19' --header 'Authorization: Bearer YOUR_TOKEN' --header 'Content-Type: application/json' --data-raw  '{
"active": false
}'
Response
CodeDescription
200OK
{
  "id": 19,
  "agent_id": 44,
  "email": "analytics@acme.com",
  "active": false
}

Server responses.


Delete a Report Subscription

DELETEhttps://api.sendo.cloud/report_subscriptions/{report_subscription_id}

Deletes a report subscription record. The deleted record is echoed back in the response.

Parameters


FieldTypeDescriptionDefault ValueOptionalExample
report_subscription_idintegerRecord id.noneNo19

Request.


curl --location -X DELETE 'https://api.sendo.cloud/report_subscriptions/19' --header 'Authorization: Bearer YOUR_TOKEN'
Response
CodeDescription
200OK
{
  "id": 19,
  "agent_id": 44,
  "email": "analytics@acme.com"
}

Server responses.


Firewall Clients

Allowed/blocked caller entries used by routing and security to protect voice services from unwanted calls.

Create a Firewall Entry

POSThttps://api.sendo.cloud/firewall_client

Creates a new firewall entry record.

Request body.


curl --location -X POST 'https://api.sendo.cloud/firewall_client' --header 'Authorization: Bearer YOUR_TOKEN' --header 'Content-Type: application/json' --data-raw  '{
"name": "Trusted Dialer",
"telephone": "+15554440000"
}'
Response
CodeDescription
201Created
{
  "id": 5,
  "name": "Trusted Dialer",
  "telephone": "+15554440000"
}

Server responses.


List Firewall Clients

GEThttps://api.sendo.cloud/firewall_client

Lists firewall clients, with optional filtering and pagination.

Parameters


FieldTypeDescriptionDefault ValueOptionalExample
skipintegerPagination offset.noneYes0
limitintegerPage size.noneYes20
namestringFilter by entry name.noneYes
telephonestringFilter by phone number.noneYes
order_bystringField to sort by.noneYesid
order_dirstringasc or desc.noneYesasc

Request.


curl --location 'https://api.sendo.cloud/firewall_client?skip=0&limit=20&order_by=id&order_dir=asc' --header 'Authorization: Bearer YOUR_TOKEN'
Response
CodeDescription
200OK
[
  {
    "id": 5,
    "name": "Trusted Dialer",
    "telephone": "+15554440000"
  }
]

Server responses.


Get a Firewall Entry

GEThttps://api.sendo.cloud/firewall_client/{firewall_client_id}

Retrieves a single firewall entry record by id.

Parameters


FieldTypeDescriptionDefault ValueOptionalExample
firewall_client_idintegerRecord id.noneNo5

Request.


curl --location 'https://api.sendo.cloud/firewall_client/5' --header 'Authorization: Bearer YOUR_TOKEN'
Response
CodeDescription
200OK
{
  "id": 5,
  "name": "Trusted Dialer",
  "telephone": "+15554440000"
}

Server responses.


Update a Firewall Entry

PUThttps://api.sendo.cloud/firewall_client/{firewall_client_id}

Updates an existing firewall entry record.

Parameters


FieldTypeDescriptionDefault ValueOptionalExample
firewall_client_idintegerRecord id.noneNo5

Request body.


curl --location -X PUT 'https://api.sendo.cloud/firewall_client/5' --header 'Authorization: Bearer YOUR_TOKEN' --header 'Content-Type: application/json' --data-raw  '{
"name": "Trusted Dialer (verified)"
}'
Response
CodeDescription
200OK
{
  "id": 5,
  "name": "Trusted Dialer (verified)",
  "telephone": "+15554440000"
}

Server responses.


Delete a Firewall Entry

DELETEhttps://api.sendo.cloud/firewall_client/{firewall_client_id}

Deletes a firewall entry record. The deleted record is echoed back in the response.

Parameters


FieldTypeDescriptionDefault ValueOptionalExample
firewall_client_idintegerRecord id.noneNo5

Request.


curl --location -X DELETE 'https://api.sendo.cloud/firewall_client/5' --header 'Authorization: Bearer YOUR_TOKEN'
Response
CodeDescription
200OK
{
  "id": 5,
  "name": "Trusted Dialer",
  "telephone": "+15554440000"
}

Server responses.


Skill Templates

Reusable skill templates (IVR menus, verification flows) that can be instantiated for new agents.

Create a Skill Template

POSThttps://api.sendo.cloud/skill_templates

Creates a new skill template record.

Request body.


curl --location -X POST 'https://api.sendo.cloud/skill_templates' --header 'Authorization: Bearer YOUR_TOKEN' --header 'Content-Type: application/json' --data-raw  '{
"name": "LookupCRM",
"webhook_url": "https://api.example.com/crm/lookup",
"description": "Fetch contact data",
"event": "on_intent",
"parameters": [{"name":"phone","type":"string"}],
"static_parameters": {"source":"voice"}
}'
Response
CodeDescription
201Created
{
  "id": 7,
  "name": "LookupCRM",
  "webhook_url": "https://api.example.com/crm/lookup"
}

Server responses.


List Skill Templates

GEThttps://api.sendo.cloud/skill_templates

Lists skill templates, with optional filtering and pagination.

Parameters


FieldTypeDescriptionDefault ValueOptionalExample
skipintegerPagination offset.noneYes0
limitintegerPage size.noneYes20
filter_keystringField name to filter templates by.noneYesevent
filter_valuestringValue to match filter_key against.noneYeson_intent

Request.


curl --location 'https://api.sendo.cloud/skill_templates?skip=0&limit=20&filter_key=event&filter_value=on_intent' --header 'Authorization: Bearer YOUR_TOKEN'
Response
CodeDescription
200OK
[
  {
    "id": 7,
    "name": "LookupCRM"
  }
]

Server responses.


Get a Skill Template

GEThttps://api.sendo.cloud/skill_templates/{skill_template_id}

Retrieves a single skill template record by id.

Parameters


FieldTypeDescriptionDefault ValueOptionalExample
skill_template_idintegerRecord id.noneNo7

Request.


curl --location 'https://api.sendo.cloud/skill_templates/7' --header 'Authorization: Bearer YOUR_TOKEN'
Response
CodeDescription
200OK
{
  "id": 7,
  "name": "LookupCRM",
  "webhook_url": "https://api.example.com/crm/lookup",
  "description": "Fetch contact data",
  "event": "on_intent",
  "parameters": [
    {
      "name": "phone",
      "type": "string"
    }
  ],
  "static_parameters": {
    "source": "voice"
  }
}

Server responses.


Update a Skill Template

PUThttps://api.sendo.cloud/skill_templates/{skill_template_id}

Updates an existing skill template record.

Parameters


FieldTypeDescriptionDefault ValueOptionalExample
skill_template_idintegerRecord id.noneNo7

Request body.


curl --location -X PUT 'https://api.sendo.cloud/skill_templates/7' --header 'Authorization: Bearer YOUR_TOKEN' --header 'Content-Type: application/json' --data-raw  '{
"description": "Fetch contact data from CRM"
}'
Response
CodeDescription
200OK
{
  "id": 7,
  "name": "LookupCRM",
  "description": "Fetch contact data from CRM"
}

Server responses.


Delete a Skill Template

DELETEhttps://api.sendo.cloud/skill_templates/{skill_template_id}

Deletes a skill template record. The deleted record is echoed back in the response.

Parameters


FieldTypeDescriptionDefault ValueOptionalExample
skill_template_idintegerRecord id.noneNo7

Request.


curl --location -X DELETE 'https://api.sendo.cloud/skill_templates/7' --header 'Authorization: Bearer YOUR_TOKEN'
Response
CodeDescription
200OK
{
  "id": 7,
  "name": "LookupCRM"
}

Server responses.


Test Webhook (Reverse Words)

POSThttps://api.sendo.cloud/webhooks/reverse_words

Demo webhook used for integration tests — simulates an incoming event to voice-processing pipelines.

Request body.


curl --location -X POST 'https://api.sendo.cloud/webhooks/reverse_words' --header 'Authorization: Bearer YOUR_TOKEN' --header 'Content-Type: application/json' --data-raw  '{
"word": "hello"
}'
Response
CodeDescription
200OK
{
  "message": "The reversed word is: olleh"
}

Server responses.


WhatsApp Bridge

Receives WhatsApp events for agents that also handle chat, bridging them into the same processing pipeline as voice.

WhatsApp Bridge Webhook

POSThttps://api.sendo.cloud/whatsapp/webhook

Receives WhatsApp events and forwards text/media to bridge services — less commonly used for voice, but useful for multichannel integrations.

Request body.


curl --location -X POST 'https://api.sendo.cloud/whatsapp/webhook' --header 'Authorization: Bearer YOUR_TOKEN' --header 'Content-Type: application/json' --data-raw  '{
"agent_id": 44,
"value": {"metadata":{"display_phone_number":"+14155550100"},"messages":[{"from_number":"+15551230000","timestamp":"1722250000","text":{"body":"Hi, I need support"}}]}
}'
Response
CodeDescription
200OK
{
  "status": "forwarded",
  "message_id": "wamid.HBg..."
}

Server responses.


SIP Concurrency Monitoring

Operational endpoints to monitor how many calls are active against your configured capacity.

Concurrent Call Count

GEThttps://api.sendo.cloud/concurrent-count

Returns the current concurrent call total and the configured limit, to monitor capacity for voice agents.

Request.


curl --location 'https://api.sendo.cloud/concurrent-count' --header 'Authorization: Bearer YOUR_TOKEN'
Response
CodeDescription
200OK
{
  "concurrent_calls": 4,
  "max_concurrent_calls": 15
}

Server responses.


Concurrent Calls with Call IDs

GEThttps://api.sendo.cloud/concurrent-calls-with-call-id

Returns detailed concurrent call data with active call IDs, useful for troubleshooting and live operations.

Request.


curl --location 'https://api.sendo.cloud/concurrent-calls-with-call-id' --header 'Authorization: Bearer YOUR_TOKEN'
Response
CodeDescription
200OK
{
  "concurrent_calls": 4,
  "max_concurrent_calls": 15,
  "call_ids": [
    "CA_001",
    "CA_002",
    "CA_003",
    "CA_004"
  ]
}

Server responses.