Upload Call with Audio
Before You Start
You will need:
- Your Creovai instance name — the subdomain of your Creovai environment (e.g.
alliedglobalinalliedglobal.audio.tethr.com) - API credentials — a client ID and secret issued by Creovai Support. Contact support@creovai.com if you don't have these
- A valid recording file — WAV (PCM or uLaw), MP3, Ogg Opus, or M4A
- A tool capable of making HTTP requests
Authorization
Note: To request a bearer token, reference the Authorization Token article.
Archived Call
Please refer to https://docs.tethr.com/reference/post_capture-v2-call for full developer documentation.
Archived calls are uploaded as multipart form data as specified in rfc2388.
Endpoint
POST https://<<INSTANCE>>.audio.tethr.com/capture/v2/callHow It Works
The request is sent as multipart/form-data with exactly two parts:
| Part name | Type | Description |
|---|---|---|
info | JSON (text) | Call metadata — who was on the call, when it happened, direction, etc. |
data | Binary file | The audio recording file |
The info part must be sent with Content-Type: application/json. Most tools require you to set this explicitly on the form field.
Working Example — curl
curl --location 'https://<<INSTANCE>>.audio.tethr.com/capture/v2/call' \
--header 'Authorization: Bearer <<YOUR_TOKEN>>' \
--form 'info="{
\"sessionId\": \"UNIQUE-SESSION-ID\",
\"utcStart\": \"2026-07-16T09:00:00Z\",
\"direction\": \"Outbound\",
\"participants\": [
{
\"type\": \"Agent\",
\"channel\": 0,
\"referenceId\": \"agent@yourcompany.com\",
\"firstName\": \"Jane\",
\"lastName\": \"Smith\"
},
{
\"type\": \"Customer\",
\"channel\": 1,
\"phoneNumber\": \"5555559876\",
\"firstName\": \"John\",
\"lastName\": \"Doe\"
}
],
\"metadata\": {
\"key\": \"value\"
}
}";type=application/json' \
--form 'data=@"/path/to/your/recording.wav"'The info Object — Full Field Reference
Required fields
| Field | Type | Description |
|---|---|---|
sessionId | string | A unique identifier for this recording. Must be unique per upload — re-using a session ID will result in a 409 Conflict error. |
utcStart | datetime | Start time of the call in UTC, ISO 8601 format. Example: 2026-07-16T09:00:00Z |
participants | array | List of participants on the call. See Participants below. |
Optional fields
| Field | Type | Description |
|---|---|---|
utcEnd | datetime | End time of the call in UTC. If omitted, Creovai calculates it from the audio length and start time. |
direction | string | Must be one of: Inbound, Outbound, Internal, Unknown |
numberDialed | string | For inbound calls: the number the customer dialled. For outbound: the number the agent dialled. |
masterId | string | A shared ID across multiple recordings that together form one complete interaction. See Composite Calls below. |
caseReferenceId | string | Groups calls into a case without treating them as a single correlated interaction. |
collectionId | string | Groups calls into a collection without treating them as a single correlated interaction. |
metadata | object | Any additional key-value data you want to store with the call (e.g. campaign name, language, CRM ID). Accessible in the Creovai UI, reports, and outbound webhooks. |
Participants
Each participant in the participants array represents one party on the call and maps to one audio channel in the recording.
Required per participant
| Field | Type | Description |
|---|---|---|
type | string | The participant role. Standard values are Agent and Customer. Custom types (e.g. IVR) can be configured — contact Creovai Support. |
channel | integer | The audio channel this participant's voice is on. Zero-based (first channel = 0, second = 1). Every channel in the audio file must be accounted for with no duplicates. |
Optional per participant
| Field | Type | Description |
|---|---|---|
referenceId | string | An identifier from your system — typically an agent email or employee ID. Used to match the participant to an agent profile in Creovai. |
firstName | string | Participant's first name |
lastName | string | Participant's last name |
phoneNumber | string | Participant's phone number |
email | string | Participant's email address |
For the agent participant, including a referenceId that matches the agent's identifier in Creovai is strongly recommended. This is how Creovai links the call to the correct agent profile for reporting and coaching.
Audio File Requirements
Supported formats
| Format | Codec | Content-Type |
|---|---|---|
| WAV | PCM or uLaw | audio/wav or audio/wave |
| MP3 | — | audio/mp3 |
| Ogg Opus | RFC 7845 | audio/ogg |
| M4A / MP4 Audio | — | audio/mp4 or audio/m4a |
File structure
The API expects a single audio file representing the entire call, including any hold periods or silence. The file should have one channel per participant.
| Scenario | Expected channel structure |
|---|---|
| Agent + external customer | Agent on channel 0, customer on channel 1 |
| Two internal lines | One line per channel |
| Conference call (2 internal + 1 external) | Ideally one channel per participant; if not possible, internal participants combined on one channel and external on the other |
The channel value in each participant object must match the actual channel in the audio file. A mismatch will result in successful ingestion but incorrect speaker attribution in the transcript.
Response
A successful upload returns 200 OK with the Creovai-assigned interaction ID:
{
"id": "bbsnbcbe3",
"masterId": null,
"sessionId": "UNIQUE-SESSION-ID",
"caseReferenceId": null,
"collectionId": null
}Store the id value. It is the primary identifier for this call in Creovai and is essential for troubleshooting. You can use it to link directly to the call in the UI:
https://<<INSTANCE>>.tethr.com/calls/<<id>>Rate limit headers are returned on every response:
| Header | Description |
|---|---|
X-Rate-Limit-Limit | The rate limit window (e.g. 1m, 1h) |
X-Rate-Limit-Remaining | Requests remaining in the current window |
X-Rate-Limit-Reset | UTC datetime when the limit resets |
Error responses
| Status | Meaning |
|---|---|
409 Conflict | A call with this sessionId has already been uploaded. Use a different, unique session ID. |
429 Too Many Requests | Rate limit exceeded. Check the X-Rate-Limit-Reset header and retry after that time. |
500 Internal Server Error | Typically indicates a backend configuration issue or malformed request. Check that info is sent with Content-Type: application/json and that all required fields are present. |
Check Processing Status
After upload, you can check whether Creovai has finished processing the call using the session ID.
Endpoint:
POST https://<<INSTANCE>>.audio.tethr.com/capture/v2/statusRequest:
{
"SessionIds": ["UNIQUE-SESSION-ID"]
}Response:
{ "sessions": [ { "status": "Complete", "id": "bbsnbcbe3", "sessionId": "UNIQUE-SESSION-ID","durationSec": 0 } ] }
Status values:
| Status | Meaning |
|---|---|
Concluded | Audio received and queued — processing in progress |
Complete | Fully processed and available in Creovai |
NotFound | No call found with this session ID — upload may have failed |
InProgress | Applicable to live capture only — call is still active |
You can query multiple session IDs in a single request by adding them to the array.
Composite Calls — masterId
If a single customer interaction is split across multiple recordings (e.g. due to a transfer or hold), you can link them in Creovai using a shared masterId.
Each recording must have its own unique sessionId, but they share the same masterId. Creovai will associate them as parts of the same interaction.
Example scenario:
- Customer calls in, agent picks up → recording starts (Session A)
- Agent puts call on hold → recording ends, audio file created
- Agent returns → new recording starts (Session B)
- Upload Session A and Session B both with the same
masterId
Splitting calls adds complexity to analysis. Only use masterId if your recording system already produces separate files per call leg. Do not split a single recording artificially. If you plan to use this feature, contact support@creovai.com before implementing.
Recording Settings (Optional)
If your integration needs to know which agents should have their calls sent to Creovai, you can retrieve the recording settings list:
GET https://<<INSTANCE>>.audio.tethr.com/sources/v1/recordingSettings
Authorization: Bearer <<YOUR_TOKEN>>The response is an array of agents with a lookupId (typically matching an employee or extension ID) and a recordingSetting value of either None (record) or Disabled (do not record). If an agent's ID is not in the list, treat them as recordable.
This endpoint is optional — if your system already determines which calls to send without Creovai's settings, you do not need to use it.
Status Heartbeats (Optional)
If you are running a persistent integration service, you can send periodic heartbeat messages to Creovai to confirm it is running. Heartbeats should be sent approximately every 5 minutes.
POST https://<<INSTANCE>>.audio.tethr.com/capture/v2/monitor
Authorization: Bearer <<YOUR_TOKEN>>
Content-Type: application/json
{
"status": "Healthy",
"timeStamp": "2026-07-16T09:00:00Z",
"name": "YOUR-SERVICE-NAME",
"softwareVersion": "1.0.0"
}Status values:
| Value | Meaning |
|---|---|
| Unknown | Status is not known or not specified |
| Healthy | Everything is working as expected |
| Warning | Online but something is outside normal parameters |
| Error | Online but errors require attention |
| Offline | System is in a non-working state |
A successful heartbeat returns 204 No Content. A 404 response means heartbeats are not enabled for your environment.
SDKs
If you are building a .NET integration, a pre-built SDK is available:
- .NET SDK via NuGet: Tethr.AudioBroker
- .NET sample application: GitHub — CollabIP/Tethr.AudioBroker.SDK
- C++ SDK: GitHub — CollabIP/Tethr.AudioBroker.CPP.SDK
