curl --request POST \
--url https://api.cekura.ai/observability/v1/observe/ \
--header 'Content-Type: application/json' \
--header 'X-CEKURA-API-KEY: <api-key>' \
--data '
{
"call_id": "call_12345678",
"agent": 1,
"voice_recording_url": "https://example.com/recordings/call_12345678.mp3",
"transcript_type": "vapi",
"transcript_json": [
{
"role": "agent",
"message": "Hello, how can I help you today?",
"time": 0
},
{
"role": "user",
"message": "I need help with my account",
"time": 2.5
}
],
"call_ended_reason": "completed",
"customer_number": "+1234567890",
"metadata": {
"customer_id": "cust_123",
"campaign_id": "camp_456"
},
"timestamp": "2025-10-03T10:30:00Z",
"dynamic_variables": {
"customer_name": "John Doe",
"order_id": "ORD-12345"
}
}
'{
"call_id": "<string>",
"id": 123,
"duration": "<string>",
"success": true,
"is_reviewed": true,
"status": "success",
"feedback": "<string>",
"metrics": [
{
"id": 123,
"name": "<string>",
"type": "<string>",
"score": 123,
"enum": "<string>",
"value": "<string>"
}
],
"call_ended_reason": "<string>",
"customer_number": "<string>",
"agent": 123,
"agent_name": "<string>",
"trace_id": "<string>",
"is_log_present": true,
"timestamp": "2023-11-07T05:31:56Z",
"error_message": "<string>",
"dropoff_point": "<string>",
"topic": "<string>",
"created_at": "2023-11-07T05:31:56Z",
"updated_at": "2023-11-07T05:31:56Z",
"transcript": "<string>",
"transcript_object": "<string>",
"evaluation": "<string>"
}{
"field_name": [
"<string>"
]
}Send Calls
Primary ingestion endpoint for production call logs. Your agent (or its provider’s post-call webhook) POSTs here with the transcript, recording URL, and metadata; Cekura stores it as a CallLog, schedules metric evaluation, and surfaces it in Observability.
curl --request POST \
--url https://api.cekura.ai/observability/v1/observe/ \
--header 'Content-Type: application/json' \
--header 'X-CEKURA-API-KEY: <api-key>' \
--data '
{
"call_id": "call_12345678",
"agent": 1,
"voice_recording_url": "https://example.com/recordings/call_12345678.mp3",
"transcript_type": "vapi",
"transcript_json": [
{
"role": "agent",
"message": "Hello, how can I help you today?",
"time": 0
},
{
"role": "user",
"message": "I need help with my account",
"time": 2.5
}
],
"call_ended_reason": "completed",
"customer_number": "+1234567890",
"metadata": {
"customer_id": "cust_123",
"campaign_id": "camp_456"
},
"timestamp": "2025-10-03T10:30:00Z",
"dynamic_variables": {
"customer_name": "John Doe",
"order_id": "ORD-12345"
}
}
'{
"call_id": "<string>",
"id": 123,
"duration": "<string>",
"success": true,
"is_reviewed": true,
"status": "success",
"feedback": "<string>",
"metrics": [
{
"id": 123,
"name": "<string>",
"type": "<string>",
"score": 123,
"enum": "<string>",
"value": "<string>"
}
],
"call_ended_reason": "<string>",
"customer_number": "<string>",
"agent": 123,
"agent_name": "<string>",
"trace_id": "<string>",
"is_log_present": true,
"timestamp": "2023-11-07T05:31:56Z",
"error_message": "<string>",
"dropoff_point": "<string>",
"topic": "<string>",
"created_at": "2023-11-07T05:31:56Z",
"updated_at": "2023-11-07T05:31:56Z",
"transcript": "<string>",
"transcript_object": "<string>",
"evaluation": "<string>"
}{
"field_name": [
"<string>"
]
}Authorizations
API Key Authentication. It should be included in the header of each request.
Body
Unique identifier for the call. Example:
"call_abc123xyz""stereo_audio_session_456"
100OpenTelemetry trace ID (32-char hex string). Example: "4bf92f3577b34da6a3ce929d0e0e4736"
32Execution logs for this call: a list of entries, oldest first. Stored outside the call record and read back from the call log's logs endpoint.
Each entry is an object with:
message(required) — what happened, as a single line.ts(optional) — when it happened. ISO 8601, a unix timestamp, or seconds into the call (0,4.5). Shown as a time column.logger(optional) — the component that emitted the line, e.g.pipeline,transcriber,my.app.tools. Shown as its own column, and only when at least one entry has it.level(optional) —info,warn,error,debug, or your own label.raw(optional) — an object holding any extra detail for that entry. It is hidden by default and shown when the entry is expanded in the dashboard, so put payloads, IDs and diagnostics here rather than inmessage.
Any other keys you send on an entry are folded into raw.
Example:
[
{
"ts": "2026-09-02T10:00:01.120Z",
"logger": "session",
"level": "info",
"message": "Session started"
},
{
"ts": 4.5,
"logger": "transcriber",
"level": "info",
"message": "Final transcript | provider=deepgram confidence=0.98"
},
{
"ts": "00:07",
"logger": "tools",
"level": "error",
"message": "Tool call failed: get_order timed out after 5s",
"raw": {
"tool": "get_order",
"timeout_ms": 5000,
"request": {"order_id": "ORD-12345"},
"error": "ETIMEDOUT"
}
},
{
"ts": "00:09",
"logger": "session",
"level": "info",
"message": "Session ended"
}
]
Agent ID, required if assistant_id not provided
Example: 2421
Provider's Assistant ID, required if agent not provided Example:
"asst_abc123xyz""agent_xyz789"
Audio recording file of the call.
Example: Binary data "recordings/call_123_20240315.mp3"
URL to call recording audio file
Example: "https://storage.example.com/recordings/call_123.mp3"
Format of the transcript_json payload. Tells Cekura how to parse roles and timestamps.
vapi— Vapi webhook format:[{"role": "bot"|"user", "message": "...", "time": 0.0}]retell— Retell webhook formatelevenlabs— ElevenLabs formatbland— Bland call-detail format, or itstranscriptsarraylivekit— LiveKit formatpipecat— Pipecat formatdeepgram— Deepgram formatcekura(default) —[{"role": "Testing Agent"|"Main Agent", "content": "...", "start_time": 0.0, "end_time": 2.5}]. Valid roles are"Testing Agent"and"Main Agent"only — using"agent"or"user"will return a validation error.none-mono— mono audio with no transcript; Cekura generates the transcript automatically.
Omit this field to use the default Cekura format.
cekura- cekuravocera- voceravapi- vapiretell- retelldeepgram- deepgrampipecat- pipecatlivekit- livekitelevenlabs- elevenlabsbland- blandnone-mono- none-mono
cekura, vocera, vapi, retell, deepgram, pipecat, livekit, elevenlabs, bland, none-mono Call transcript in supported format (Vapi, Retell, Deepgram, ElevenLabs, Cekura)
Check the Transcript Format documentation for more details.
Cekura Transcript Format Example:
[
{
"role": "Testing Agent",
"content": "Hello.",
"end_time": 1.9399999,
"start_time": 1.4399999
},
{
"role": "Main Agent",
"content": "Hello. I want to book appointment today. My name is John.",
"end_time": 7.539999511718751,
"start_time": 3.1
},
{
"role": "Testing Agent",
"content": "Well, I mean, sure. What time exactly are we talking about here",
"end_time": 15.71,
"start_time": 12.01
},
{
"role": "Main Agent",
"content": "6 PM.",
"end_time": 18.269999,
"start_time": 17.609999
}
]
Per-request override of the project's reconcile_transcripts_with_cekura setting. Omit (or send null) to use the project setting. true requires both a recording and a provider transcript: for dual-channel audio Cekura transcribes the recording and publishes its speaker-exact transcript (keeping the provider's tool and system events) before metrics run; mono audio and transcription failures keep the provider transcript. false keeps the provider transcript even when the project setting is on. Billed per minute of audio at the reconciliation rate whenever a Cekura transcript is published.
Reason why the call ended Example:
"customer-ended-call""agent-ended-call"
Customer's phone number or identifier Example:
"+1234567890""customer_abc123"
Additional call metadata Example:
{
"customer_id": "123",
"order_id": "ORD-12345",
"name": "John Doe"
}
When the call occurred.
Example: 2024-03-15T10:15:45Z
Dynamic variables used to replace {{variables}} in agent description. Example:
{
"subscription_id": "SUB-12345",
"product_type": "premium"
}
Feedback about the call
Example: "Great call"
Optional list of sensitive fields to redact from the transcript and audio. Overrides the agent's configured redaction fields for this call; when omitted, the agent's configuration applies.
Available fields include: phone_number, email_address, credit_card, ssn, dob, healthcare_number, etc.
Note: Redacting any fields incurs a cost of 0.1 credits per minute by default, regardless of how many fields are selected.
Example: ["phone_number", "email_address", "credit_card"]
person_name- person_nameage- agephone_number- phone_numberemail_address- email_addressdate- datetime- timelocation- locationorigin- origingender_sexuality- gender_sexualityphysical_attribute- physical_attributeoccupation- occupationusername- usernamepassword- passwordip_address- ip_addressurl- urlfilename- filenameevent- eventvehicle_id- vehicle_iddob- dobhealthcare_number- healthcare_numbermedical_professional- medical_professionalcredit_card- credit_cardaccount_number- account_numberbank_account- bank_accountmoney- moneyssn- ssnpassport_number- passport_numberdriver_license- driver_licensenumerical_pii- numerical_pii
person_name, age, phone_number, email_address, date, time, location, origin, gender_sexuality, physical_attribute, occupation, username, password, ip_address, url, filename, event, vehicle_id, dob, healthcare_number, medical_professional, credit_card, account_number, bank_account, money, ssn, passport_number, driver_license, numerical_pii Comma-separated metric IDs to evaluate for this call. Example: "118,119". To run metrics after the call is created, use the evaluate_metrics endpoint instead.
Channel index (0 or 1) of the main agent in stereo recordings. When provided, skips automatic channel detection. Example: 0 means channel 0 is the main agent, channel 1 is the customer/testing agent.
Response
Unique identifier for the call. Example:
"call_abc123xyz""stereo_audio_session_456"
100Call duration in minutes in MM:SS format.
Example: 01:10
Whether the call was successful.
Example: true or false
Whether the call has been reviewed.
Example: true or false
Status of the call or conversation.
Example: "completed" or "failed"
success- Successfailure- Failurereviewed_success- Reviewed Successreviewed_failure- Reviewed Failure
success, failure, reviewed_success, reviewed_failure Feedback about the call.
Example: "Great Call"
Metrics of the call
Show child attributes
Show child attributes
Reason why the call ended. Example:
"customer-ended-call""agent-ended-call"
100Customer's phone number or identifier. Example:
"+1234567890""customer_abc123"
100Agent ID
Agent name
OpenTelemetry trace ID (32-char hex). Set when OTel tracing is enabled.
32Whether provider execution logs are stored for this call.
When the call occurred.
Example: 2024-03-15T10:15:45Z
Point in conversation where user disengaged.
Example: "end of conversation as no queries remaining"
1000Topic of the call. Example:
"product_inquiry""technical_support"
1000When this record was created.
Example: 2024-03-15T10:30:45Z
When this record was last updated.
Example: 2024-03-15T10:35:11Z
Full text transcript of the call. Example:
[00:01] Testing Agent: Hello.
[00:02] Main Agent: Hello, how can I help you today?
[00:03] Testing Agent: Well, I mean, sure. What time exactly are we talking about here
[00:04] Main Agent: 6 PM.
[00:05] Testing Agent: Great. I'll book that for you. Just a sec.
[00:06] Main Agent: Okay.
Structured transcript data with timestamps. Example:
[
{
"role": "Testing Agent",
"content": "Hello",
"start_time": 1.2,
"end_time": 1.8
},
{
"role": "Main Agent",
"content": "Hello, how can I help you today?",
"start_time": 1.8,
"end_time": 2.5
}
]`
Evaluation of the call