Graine AI

Call verdict corrected

Sent when a verdict about a call you were already sent changes.

Sent when a verdict about a call you were already sent changes. Today that is only a late voicemail verdict: the call is rewritten to status no_answer, sub_status voicemail_detected, and this event carries the corrected values with the call_id you already hold — update that row, do not add one. Sent only to a subscription that names call_corrected; a dashboard Custom Webhook receives it too.

Rate limit: none — this is an event Graine delivers to you.

POST
/call_corrected

Authorization

Authorization
Required
Bearer <token>

Your Graine API key. Create one in the dashboard under Developers, or via POST /v2/api-keys. Send it as Authorization: Bearer <key>.

In: header

Request Body

application/jsonRequired

event_type
Required
string

Which event this is. Branch on this.

Value in: "call_corrected"

event_id
Required
string | null

Stable per (call, event type): the same on every delivery attempt and if the event is ever sent twice. Your deduplication key.

versionstring | null

Payload version. "1.0" on every event today.

timestampstring | null

When this payload was built, ISO-8601 UTC.

call_id
Required
string | null

The execution_id you received when the call was placed.

call_sidstring | null

The carrier's own leg id. For support tickets only; null when no carrier accepted the call.

agent_idstring | null

The agent you dialled — the original id, never the A/B variant that served the call.

agent_namestring | null

That agent's name, best-effort; null when it could not be looked up.

organization_idstring | null

Your organization.

workspace_idstring | null

Always the same value as organization_id.

status
Required
string

The call's public status: queued, initiated, ringing and in_progress while it is under way, then completed, busy, no_answer, failed or canceled. Underscores, not the hyphens of GET /v2/calls. Never null.

Value in: "busy" | "canceled" | "completed" | "failed" | "in_progress" | "initiated" | "no_answer" | "queued" | "ringing"

sub_statusAny properties in string, string, string

Why the call reached that status. Null while it is under way; UPPERCASE when status is completed and lowercase otherwise, so the casing alone says whether the call connected; sip_ for a carrier response with no name of its own.

call_typestring | null

inbound or outbound.

calling_sourcestring | null

"custom" whenever a carrier carried the call; null when none was recorded. Which carrier is not part of this contract.

custom_args_valuesobject | null

The variables you sent with the call, metadata merged over them, minus platform keys and any key that reads like a sentence. Never null.

to_numberstring | null

The number dialled, E.164.

from_numberstring | null

The caller ID used, E.164.

bulk_list_idstring | null

The batch this call belonged to; null for a call placed directly.

called_onstring | null

When this attempt was dialled, for a call placed by a batch. For any other call it is created_at — for a scheduled call, when it was booked. ISO-8601 UTC.

created_atstring | null

When the call record was created, ISO-8601 UTC.

correction_reasonstring | null

"late_voicemail_verdict" — the only correction the platform makes today.

previous_statusstring | null

The status you were sent before: "completed" for a late voicemail verdict.

previous_sub_statusstring | null

The sub_status you were sent before, when it is known. Null today: the record has been rewritten by the time this is built.

call_costnumber | null

Always 0.0 in this event.

answered_by_voice_mailboolean | null

Always true.

Response Body