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’sstate 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.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 matchref 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
Pass it to update the status or add a note.
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 alater 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.
callback.opened, with status: failed and redial.status of exhausted or skipped.
Callback statuses
You set
open or done with PATCH /campaigns/callbacks/{callbackId}.