---
title: "Ingest a production call (webhook)"
method: POST
path: "/observability/v1/observe/"
tags: ["Observability"]
---

# Ingest a production call (webhook)

`POST /observability/v1/observe/`

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.

**Identifying the agent (pick one):**
- `agent` — Cekura agent ID (preferred when you've already registered via `POST /aiagents/`)
- `assistant_id` — external assistant identifier (VAPI/Retell/OpenAI-style `asst_...`). Cekura resolves it to your agent.

**Transcript formats** (via `transcript_type`):
- `vapi`, `retell`, `elevenlabs`, `bland`, `livekit`, `pipecat`, `koreai` — provider-native shapes; pass `transcript_json` exactly as the provider emits it.
- `cekura` (default) — `[{role, content, start_time, end_time}, ...]`. Valid roles: `"Testing Agent"` (the caller) and `"Main Agent"` (the agent under test). Note: `"agent"` and `"user"` are **not** valid for this format.

**Provider-specific alternatives:**
- LiveKit webhooks: `POST /observability/v1/livekit/observe/` (raw LiveKit webhook shape)
- Pipecat webhooks: `POST /observability/v1/pipecat/observe/` (raw Pipecat webhook shape)

**Fields to know:**
- `voice_recording_url` — link to the call audio; enables audio-based metrics.
- `metadata` — freeform tags for filtering in Observability (`customer_id`, `campaign_id`, etc.).
- `dynamic_variables` — values injected into the agent at runtime; shown alongside the transcript.
- `customer_number` — caller's number in E.164 format, e.g. `+14155551234`.
- `call_ended_reason` — reason for call termination (`completed`, `user-hangup`, `agent-hangup`, etc.).
- `metric_ids` — comma-separated metric IDs to evaluate immediately (e.g. `"1,2,3"`).

**Async processing:** metrics are evaluated in the background. The initial response shows `status: "evaluating"` with an empty `metrics` list. Retrieve the call log again after 30–60 seconds to see completed metric results.

**Billing:** each ingested call consumes observability credits. Calls with audio cost more than text-only calls. Check your balance via `GET /test_framework/v1/billing_info`.

## Request body

- CreateCallLog
  - `id` integer
  - `call_id` string — Unique identifier for the call. Example: - `"call_abc123xyz"` - `"stereo_audio_session_456"`
  - `trace_id` string — OpenTelemetry trace ID (32-char hex string). Example: "4bf92f3577b34da6a3ce929d0e0e4736"
  - `agent` integer — Agent ID, required if assistant_id not provided Example: `2421`
  - `assistant_id` string, nullable — Provider's Assistant ID, required if agent not provided Example: - `"asst_abc123xyz"` - `"agent_xyz789"`
  - `voice_recording` string, uri, nullable — Audio recording file of the call. Example: Binary data `"recordings/call_123_20240315.mp3"`
  - `voice_recording_url` string, uri, nullable — URL to call recording audio file Example: `"https://storage.example.com/recordings/call_123.mp3"`
  - `transcript_type` 'cekura' | 'vocera' | 'vapi' | 'retell' | 'deepgram' | 'pipecat' | 'livekit' | 'elevenlabs' | 'none-mono' — 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 format - `elevenlabs` — ElevenLabs format - `livekit` — LiveKit format - `pipecat` — Pipecat format - `deepgram` — Deepgram format - `cekura` (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` - cekura * `vocera` - vocera * `vapi` - vapi * `retell` - retell * `deepgram` - deepgram * `pipecat` - pipecat * `livekit` - livekit * `elevenlabs` - elevenlabs * `none-mono` - none-mono
  - `transcript_json` unknown

## Response `201`

- unknown

## Other responses

- `400`

---

[API](https://skmtc.net/cekura/apis/cekura-api.md) · [All operations](https://skmtc.net/cekura/apis/cekura-api/llms.txt) · [OpenAPI document](https://skmtc-service-staging.skmtc.workers.dev/v1/apis/cekura/cekura-api/revisions/d08e85615b58/schema)
