Skip to main content
Every event shares one envelope. data is the only part that changes. For delivery, signing, and retry behavior, read the webhooks overview.

The envelope

string
required
Always upliftai.call.v1 today.
enum<string>
required
One of call.completed, call.graded, conversion.created, callback.opened, callback.failed. New types can be added, so answer 2xx to a type you don’t handle.
string
required
Your idempotency key. A retry can deliver the same event twice, so process once per eventId. Treat it as opaque.
string
required
The assistant that took or made the call.
integer
The version number the call ran. Present when known. Absent on calls from before versions and on callback.failed.
enum<string>
prod or draft, when the call was launched by alias. Absent when you launched an exact version number.
string
Campaign calls only. On inbound, web, and direct API calls the key is absent, not null.
string<date-time>
required
ISO-8601, stamped when the post-call analysis ran — not when the call ended. For call timings, read the session’s timestamps.
object
required
Per event, below. callId, sessionId, ref, callbackOf and lastCallId are session ids that every session endpoint takes.

call.completed

Every call fires it once its post-call analysis runs — including dials that never connected. Check the session’s state and failureReason before treating it as a conversation.
string
required
The session id.
string
required
Same string as callId.
string
required
Same string as callId.
string
Campaign calls only. The contact this dial was for: the phone number as you supplied it, or evt#{externalRef} for appended contacts.
string
Campaign calls only, when you gave the contact one.
integer
Campaign calls only. The contact’s dial count over the whole campaign, this one included. It keeps counting across cycles.
integer
Campaign calls only. 1 for the first run. A callback redial or a recall starts the next cycle, with a fresh retry budget.
string
Campaign calls in a callback cycle only. The call where the contact asked to be called again.
object
Present when the call opened a callback. The same fields as callback.opened, without callId.
The same event on a campaign call where the contact asked to be called tomorrow at 3 pm:

call.graded

Fires when a connected call is graded against a scorecard. No scorecard, no event.
string
required
The session id.
integer | null
required
The score, 0 to 100, out of the points that applied to this call. null when every criterion was N/A. The event still fires, so handle null before you compare. The per-criterion breakdown is not in the event — read it on the session detail.

conversion.created

Fires the first time a conversion is recorded for the call. Reprocessing never fires it twice. The conversion body itself is not in the event — fetch it from the session detail, or match ref to the ref on the campaign’s conversions.
string
required
The session id.
string
required
Same string as callId.

callback.opened

Fires once for each call where the contact asked to be called again. Every connected call is checked, on any channel, with or without a scorecard.
string
required
The call that asked.
string
required
enum<string>
required
human or later.
enum<string>
required
open, scheduled, done or failed. See callback statuses.
string
required
One line on why.
string
The contact’s words that asked for the callback.
string<date-time>
When to call, as ISO-8601 with the offset of timezone, for example 2026-10-29T15:00:00+05:00. Both kinds get the time the contact named. When no time was said, a later callback gets two hours after the call, and a human callback has none, so call when you can. Absent when the time is tied to an event or more than 30 days away (“after Eid”, “next month”).
string
The IANA zone callbackAfter was resolved in: the campaign’s calling-window zone, otherwise Asia/Karachi.
object
later callbacks on campaign calls only. What became of the assistant’s redial: { status, at? }, with at set when status is scheduled.

callback.failed

Campaign calls only. Fires when the assistant’s redial for a later callback ended without reaching the contact: no dial in that cycle connected, or the contact was skipped. The callback is now failed, and nobody calls this contact again unless you act.
string
required
The call that asked for the callback, not the last dial.
string
The last dial of the failed cycle.
The other fields are the same as on callback.opened, with status: failed and redial.status of exhausted or skipped.

Callback statuses

You set open or done with PATCH /campaigns/callbacks/{callbackId}.