Upload pre-transcribed audio

POST /v1/bulk-ingest-transcription

Upload pre-transcribed audio from your own Automatic Speech Recognition (ASR) engine.

Headers

HeaderDescription
Authorization (Required)Requires Bearer and the OAuth access token (see Authentication)
Content-Type (Required)Requires application/json
AcceptRequires application/json if used

For the request URL, always use the base URL for your Experience Cloud instance. For detailed information about identifying the host, see API hosts.

Parameters

ParameterDescriptionData type
call_identifier (Required)

Unique identifier for the call record (must not be blank)

string
call_date_and_time (Required)

Timestamp of the call

Example — 2027-06-16T10:15:30-03:00

string (ISO 8601 with offset)
speech_transcription_file_name (Required)

Path/name of the pre-transcribed JSON file produced by the external ASR vendor

Must not be blank and must not end with / (must reference a file, not a directory)

string
speech_transcription_asr_vendor (Required)

Name of the external ASR vendor that produced the transcription (must not be blank)

Examples — deepgram, nuance

string
speech_file_name

Path/name of the original audio file

If provided, must not end with /

string
unit_identifierIdentifier for the organizational unitstring
call_recording_url

URL pointing to the call recording (must be a valid URL if provided)

string
locale

BCP 47 locale code for the caller channel

The value must be one of the locales listed on the Languages page (Admin Suite > Translations > Languages).

Example — en-GB

string
agent_locale

BCP 47 locale code for the agent channel

The validation rules are the same as locale.

string

Example request

curl --location 'https://<instance>.medallia.com/speech/v1/bulk-ingest-transcription' \
--header 'Content-Type: application/json' \
--header 'Authorization: Bearer TOKEN' \
--data '[
  {
    "call_identifier": "CALL-00123",
    "call_date_and_time": "2024-03-15T09:30:00-05:00",
    "speech_transcription_file_name": "transcripts/2024/03/CALL-00123.json",
    "speech_transcription_asr_vendor": "deepgram",
    "speech_file_name": "audio/2024/03/CALL-00123.mp3",
    "unit_identifier": "support-team-west",
    "call_recording_url": "https://storage.example.com/recordings/CALL-00123.mp3",
    "locale": "en-GB",
    "agent_locale": "en-GB"
  }
]'

Status codes

Status codeDescription
200 OKJob Accepted, Partially Accepted, or All Rejected
400 Bad Request — Validation ErrorReturned when a required field is missing, a restricted field is present, the feature is disabled, or a locale is not supported

Response model

PropertyDescriptionData type
job_id

Unique identifier assigned to this job for tracking

Use GET v1/bulk-ingest-transcription/{job_id} to look up the job status.

string(UUID)
status

ACCEPTED — all tasks accepted

PARTIALLY_ACCEPTED — some tasks rejected

REJECTED — all tasks rejected

string
details

Present only when status is PARTIALLY_ACCEPTED or REJECTED

Contains per-task results

array
details[].call_identifierThe call_identifier from the request taskstring
details[].statusACCEPTED or REJECTED for this individual taskstring
details[].error_message

Reason for rejection

Present only for rejected tasks

string

Example responses

200 OK — Job Accepted

{
  "job_id": "550z0400-e29b-79d4-a716-446655440200",
  "status": "ACCEPTED"
}

200 OK — Partially Accepted

When one or more tasks in the batch were rejected, the details array contains per-task results.

{
  "job_id": "550e9000-e29b-41s4-a716-446655440000",
  "status": "PARTIALLY_ACCEPTED",
  "details": [
    {
      "call_identifier": "CALL-00123",
      "status": "ACCEPTED"
    },
    {
      "call_identifier": "CALL-00124",
      "status": "REJECTED",
      "error_message": "File not found: transcripts/CALL-00124.json"
    }
  ]
}

200 OK — All Rejected

{
  "job_id": "550e0900-e29b-41d4-c916-446655440000",
  "status": "REJECTED",
  "details": [
    {
      "call_identifier": "CALL-00123",
      "status": "REJECTED",
      "error_message": "File not found: transcripts/CALL-00123.json"
    }
  ]
}

400 Bad Request — Validation Error

{
  "error_type": "invalid_input",
  "message": "Field 'speech_transcription_file_name' is mandatory, task position: 0"
}

{
  "error_type": "invalid_input",
  "message": "Field 'connector_id' is not allowed for this API. Please remove it from the request and resend, task position: 0"
}

{
  "error_type": "invalid_input",
  "message": "feature flag not enabled for Bulk Transcription - for tenant acme-corp"
}