SENDO OUTBOUND VOICE API

Originate outbound phone calls and process their audio.


Originate an Outbound Call

POSThttps://api.sendo.cloud/api/v1/voice_outbound/call

This endpoint starts an outbound call to a destination number. Optionally, it can also start transcription, media forking, or call recording once the call is answered, by including mediaProcessing in the request.

Required Headers


FieldTypeDescriptionDefault ValueOptionalExample
x-tenant-idstringSelects which tenant configuration handles the call.noneNoyour-tenant-id

Required attributes


FieldTypeDescriptionDefault ValueOptionalExample
tostringThe destination phone number (B number).noneNo+50584533001
fromstringThe originating phone number (A number).noneNo+593967793436
statusCallbackstringURL that receives call status event notifications.noneYeshttps://yourdomain.com/api/call-events
statusCallbackEventarrayCall events to notify. Possible values: initiated, ringing, answered, completed.noneYes["initiated", "answered", "completed"]
statusCallbackMethodstringHTTP method used to call statusCallback. Possible values: get, post. Only applied when statusCallback is also set, otherwise defaults to post.postYespost
timeoutintegerSeconds to wait for the call to be answered.noneYes30
timeLimitintegerMaximum duration, in seconds, allowed for the call.noneYes3600
urlstringURL with call handling instructions.noneYeshttps://yourdomain.com/api/call-instructions
mediaProcessingobjectStarts transcription, media forking, or recording once the call answers. See Media Processing
noneYes

Request body.


curl --location 'https://api.sendo.cloud/api/v1/voice_outbound/call' 
--header 'x-tenant-id: your-tenant-id' 
--header 'Content-Type: application/json' 
--data-raw  '{
"to": "+50584533001",
"from": "+593967793436",
"statusCallback": "https://yourdomain.com/api/call-events",
"statusCallbackEvent": ["initiated","answered","completed"],
"statusCallbackMethod": "post",
"timeout": 30,
"timeLimit": 3600
}'
Response .
CodeDescription
200Call accepted, FSM started
{
  "account_sid": "your-tenant-id",
  "direction": "outbound-api",
  "sid": "c3b1e2a0-1234-4a5b-8c9d-0e1f2a3b4c5d"
}

Server responses.


Media Processing

mediaProcessing is optional and accepts exactly one of the following types, selected by the type field: transcription, media_fork, or recording. Sending an unrecognized type, or an invalid combination of fields for the chosen type, results in a 400 response with no body.

Transcription.
FieldTypeDescriptionDefault ValueOptionalExample
typestringMust be `transcription`.noneNotranscription
ws_uristringWebSocket URI that receives this call's live transcripts, instead of the default publisher.noneYeswss://your-host/transcripts

NOTE: The speech-to-text provider is selected by the backend and cannot be set by the caller. A request that includes a provider field is rejected with 400.

Request body.

curl --location 'https://api.sendo.cloud/api/v1/voice_outbound/call' 
--header 'x-tenant-id: your-tenant-id' 
--header 'Content-Type: application/json' 
--data-raw  '{
"to": "+50584533001",
"from": "+593967793436",
"mediaProcessing": {"type":"transcription","ws_uri":"wss://your-host/transcripts"}
}'
Response
CodeDescription
200Call accepted, FSM started
{
  "account_sid": "your-tenant-id",
  "direction": "outbound-api",
  "sid": "c3b1e2a0-1234-4a5b-8c9d-0e1f2a3b4c5d"
}

Media Fork.

The platform can send this call’s forked media using different protocols and formats. A profile is where you specify which one to use — either by name (profile_name), referencing one preconfigured on the platform, or inline (profile), defining it directly in the request.

FieldTypeDescriptionDefault ValueOptionalExample
typestringMust be `media_fork`.noneNomedia_fork
profile_namestringName of a preconfigured media fork profile to use.noneYesdefault-fork-profile
profileobjectInline media fork profile definition.noneYes
ws_uristringWebSocket URI to receive the forked audio.noneYeswss://your-host/media
legsarrayWhich call legs to fork. Possible values: caller, callee.noneYes["caller", "callee"]

Request body.

curl --location 'https://api.sendo.cloud/api/v1/voice_outbound/call' 
--header 'x-tenant-id: your-tenant-id' 
--header 'Content-Type: application/json' 
--data-raw  '{
"to": "+50584533001",
"from": "+593967793436",
"mediaProcessing": {"type":"media_fork","profile_name":"default-fork-profile","ws_uri":"wss://your-host/media","legs":["caller","callee"]}
}'
Response
CodeDescription
200Call accepted, FSM started
{
  "account_sid": "your-tenant-id",
  "direction": "outbound-api",
  "sid": "c3b1e2a0-1234-4a5b-8c9d-0e1f2a3b4c5d"
}

Recording.
FieldTypeDescriptionDefault ValueOptionalExample
typestringMust be `recording`.noneNorecording
recordingChannelsstringOnly `dual` (both legs mixed) is supported. Omit this field to use the supported default.dualYesdual
recordingTracksstringOnly `both` is supported. Omit this field to use the supported default.bothYesboth

NOTE: Any recordingChannels/recordingTracks combination other than dual+both is rejected with 400. Omit both fields to use the only supported combination.

Request body.

curl --location 'https://api.sendo.cloud/api/v1/voice_outbound/call' 
--header 'x-tenant-id: your-tenant-id' 
--header 'Content-Type: application/json' 
--data-raw  '{
"to": "+50584533001",
"from": "+593967793436",
"mediaProcessing": {"type":"recording"}
}'
Response
CodeDescription
200Call accepted, FSM started
{
  "account_sid": "your-tenant-id",
  "direction": "outbound-api",
  "sid": "c3b1e2a0-1234-4a5b-8c9d-0e1f2a3b4c5d"
}

Call Status

POSThttps://api.sendo.cloud/api/v1/voice_outbound/call_status

This endpoint is not available yet. Every request currently returns 400.

Required attributes


FieldTypeDescriptionDefault ValueOptionalExample
request_idstringIdentifier of the call to query.noneNoc3b1e2a0-1234-4a5b-8c9d-0e1f2a3b4c5d

Request body.


curl --location 'https://api.sendo.cloud/api/v1/voice_outbound/call_status' 
--header 'x-tenant-id: your-tenant-id' 
--header 'Content-Type: application/json' 
--data-raw  '{
"request_id": "c3b1e2a0-1234-4a5b-8c9d-0e1f2a3b4c5d"
}'
Response
CodeDescription
400Always — this endpoint is not implemented yet.
{}