Audit voice agents built with Bolna

Evidova reads the call Bolna reports when it is over, and scores the conversation inside it.

What it catches

Bolna tells you the call ran and how it finished. It does not tell you whether the agent did its job. Evidova reads the transcript Bolna sends with the completed call and scores it against the checks you approved: whether the agent answered the question asked, whether it said it was not a person when asked, whether it promised something nobody authorised, and where the caller gave up.

Connect Bolna

  1. In Evidova, open Setup, choose Bolna, and paste your API key. Leave the signing secret empty unless something sits in front of Bolna that can add an Authorization header, because Bolna publishes no way to sign a delivery.
  2. Copy the URL we generate.
  3. In Bolna, set it as the webhook on your agent.
https://app.evidova.com/ingest/webhooks/bolna/<your-token>
Bolna does not sign what it sends, so the token in the path is what protects this URL. Treat it like a password: anyone who has it can post to your workspace. Rotate it from Setup if it leaks.

What we read from Bolna

idThe call's identity. Required, and the delivery is refused without it
created_atWhen the call started. Required as well
updated_atWhen it finished. Falls back to created_at
statusWhat the delivery is worth. completed brings the transcript; no-answer, busy, failed, canceled, stopped, error and balance-low end the call with no turns; anything earlier records only that the call started
transcriptThe turns, as one block of text. Every line beginning assistant: or user: becomes a turn, in the order given
user_numberThe contact's number whichever way the call went, so repeat calls from one caller group
telephony_data.call_type, .from_number, .to_numberUsed when user_number is absent. An inbound call takes from_number, an outbound one takes to_number
telephony_data.recording_urlAudio, kept on the end of the call

What we ignore, and why

A transcript line beginning with neither assistant: nor user: is not a turn. Bolna gives us that block as plain text with no structure inside it, so a line in any other shape is left out rather than guessed at and attributed to somebody. A delivery that arrives before the call is over is not thrown away either: it records that the call started, and the completed delivery that follows carries the same identity, so the two collapse into one call instead of standing as two.

One trap worth knowing

One Bolna webhook carries one time for the whole call, to the second, so every turn in it would otherwise sit on that same second and no reply would appear to have taken any time at all. So we read the call back out of Bolna's own executions record and use the per-turn timings in it to place each agent turn. That read needs your API key. Without it, or when the read fails, the turns keep the single second the webhook gave them and the delivery is kept anyway rather than being lost over a missing extra. So paste the API key: it is what makes a reply time on this platform mean anything.

What Bolna gives us

Channelvoice
AudioYes
TimestampsSeconds, on Bolna's clock
DeliveryWebhook, push
RetriesBolna retries

Read next

This page as markdown