Upload Call with Audio

Before You Start

You will need:

  • Your Creovai instance name — the subdomain of your Creovai environment (e.g. alliedglobal in alliedglobal.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/call

How It Works

The request is sent as multipart/form-data with exactly two parts:

Part nameTypeDescription
infoJSON (text)Call metadata — who was on the call, when it happened, direction, etc.
dataBinary fileThe audio recording file

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

FieldTypeDescription
sessionIdstringA unique identifier for this recording. Must be unique per upload — re-using a session ID will result in a 409 Conflict error.
utcStartdatetimeStart time of the call in UTC, ISO 8601 format. Example: 2026-07-16T09:00:00Z
participantsarrayList of participants on the call. See Participants below.

Optional fields

FieldTypeDescription
utcEnddatetimeEnd time of the call in UTC. If omitted, Creovai calculates it from the audio length and start time.
directionstringMust be one of: Inbound, Outbound, Internal, Unknown
numberDialedstringFor inbound calls: the number the customer dialled. For outbound: the number the agent dialled.
masterIdstringA shared ID across multiple recordings that together form one complete interaction. See Composite Calls below.
caseReferenceIdstringGroups calls into a case without treating them as a single correlated interaction.
collectionIdstringGroups calls into a collection without treating them as a single correlated interaction.
metadataobjectAny 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

FieldTypeDescription
typestringThe participant role. Standard values are Agent and Customer. Custom types (e.g. IVR) can be configured — contact Creovai Support.
channelintegerThe 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

FieldTypeDescription
referenceIdstringAn identifier from your system — typically an agent email or employee ID. Used to match the participant to an agent profile in Creovai.
firstNamestringParticipant's first name
lastNamestringParticipant's last name
phoneNumberstringParticipant's phone number
emailstringParticipant's email address

Audio File Requirements

Supported formats

FormatCodecContent-Type
WAVPCM or uLawaudio/wav or audio/wave
MP3audio/mp3
Ogg OpusRFC 7845audio/ogg
M4A / MP4 Audioaudio/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.

ScenarioExpected channel structure
Agent + external customerAgent on channel 0, customer on channel 1
Two internal linesOne 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

Response

A successful upload returns 200 OK with the Creovai-assigned interaction ID:

json
{
    "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:

HeaderDescription
X-Rate-Limit-LimitThe rate limit window (e.g. 1m, 1h)
X-Rate-Limit-RemainingRequests remaining in the current window
X-Rate-Limit-ResetUTC datetime when the limit resets

Error responses

StatusMeaning
409 ConflictA call with this sessionId has already been uploaded. Use a different, unique session ID.
429 Too Many RequestsRate limit exceeded. Check the X-Rate-Limit-Reset header and retry after that time.
500 Internal Server ErrorTypically 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/status

Request:

json
{
    "SessionIds": ["UNIQUE-SESSION-ID"]
}

Response:

json
{
  "sessions": [
            {
                    "status": "Complete",
        "id": "bbsnbcbe3",
        "sessionId": "UNIQUE-SESSION-ID",         "durationSec": 0
            }
      ]
}

Status values:

StatusMeaning
ConcludedAudio received and queued — processing in progress
CompleteFully processed and available in Creovai
NotFoundNo call found with this session ID — upload may have failed
InProgressApplicable 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

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:

ValueMeaning
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:


Articles in this section


Was this article helpful?