notify_url on a campaign to receive state changes and contact outcomes as JSON POST requests.
Verify signatures
Every request includes:HMAC-SHA256(raw_body_bytes, account_auth_token). Verify the signature against the unmodified request body before parsing JSON. Compare digests with a constant-time function.
Failed deliveries are retried up to three times, with attempts at approximately 0, 5, and 30 seconds. Return a 2xx response after durable processing. Make handlers idempotent because retries can deliver the same event more than once.
Campaign events
Every campaign event includes
event, campaign_id, account_id, and timestamp.
campaign.started
Pause and failure reasons
Pause reasons includemanual_pause, window_closed, caller_pool_exhausted, caller_pool_daily_limit_reached, account_inactive, stalled, and consecutive_failures.
Current dial-time failure reasons include consecutive_failures and balance_insufficient.
Contact events
Contact outcome payloads can include
contact_id, call_uuid, to_number, from_number, hangup_cause, and duration.
contact.answered
contact.retry_scheduled
contact.no_answer event can be followed by contact.retry_scheduled. Do not treat the first event as the final contact outcome.