Webhook payload schemas
The exact data.object shape you receive for every webhook event, generated directly from the event catalog. Field names are the snake_case wire names. A machine-readable JSON Schema for each event is published alongside these tables for SDK and codegen consumers.
See also: Webhooks reference · Webhooks integration guide
Catalog API version 2026-04-29 · 30 event payload schemas.
Biller onboarding
onboarding.completed
data.object fields
| Field | Type | Description |
|---|---|---|
| id* | string | |
| object* | "onboarding_request" | |
| biller_id* | string |
onboarding.failed
data.object fields
| Field | Type | Description |
|---|---|---|
| id* | string | |
| object* | "biller_onboarding_request" |
onboarding.submitted
data.object fields
| Field | Type | Description |
|---|---|---|
| id* | string | |
| object* | "biller_onboarding_request" |
Bills
bill.created
data.object fields
| Field | Type | Description |
|---|---|---|
| id* | string | |
| object* | "bill" | |
| user_id* | string | |
| biller_id* | string |
bill.deleted
data.object fields
| Field | Type | Description |
|---|---|---|
| id* | string | |
| object* | "bill" |
bill.updated
Source event bill.paid delivered as bill.updated.
bill.paid — data.object fields
| Field | Type | Description |
|---|---|---|
| id* | string | |
| object* | "bill" | |
| bill_id* | string | |
| link_id* | string | |
| account_id | string | null | |
| biller_id* | string | |
| paid_reason | "ATTEMPT" | "STATEMENT_CREDIT" | "OBSERVED_PAYMENT" | "ROLLED_FORWARD" | |
| paid_at | string |
Source event bill.partially_paid delivered as bill.updated.
bill.partially_paid — data.object fields
| Field | Type | Description |
|---|---|---|
| id* | string | |
| object* | "bill" | |
| bill_id* | string | |
| link_id* | string | |
| account_id | string | null | |
| biller_id* | string |
Source event bill.statement.refreshed delivered as bill.updated.
bill.statement.refreshed — data.object fields
| Field | Type | Description |
|---|---|---|
| id* | string | |
| object* | "bill" |
Source event bill.status_reverted delivered as bill.updated.
bill.status_reverted — data.object fields
| Field | Type | Description |
|---|---|---|
| id* | string | |
| object* | "bill" | |
| bill_id* | string | |
| link_id* | string | |
| account_id | string | null | |
| biller_id* | string | |
| previous_status* | "PAID" | |
| revert_reason* | "NEXT_STATEMENT_SHOWS_BALANCE" | "MANUAL_ADMIN" | "OBSERVED_PAYMENT_REVERSED" | |
| reverted_at* | string |
bill.updated — data.object fields
| Field | Type | Description |
|---|---|---|
| id* | string | |
| object* | "bill" |
Customer messages
customer.message.complaint
data.object fields
| Field | Type | Description |
|---|---|---|
| messageId* | string | |
| customerUserAid* | string | |
| clientId* | string | |
| billerId | string | |
| category* | string | |
| body | string | |
| receivedAt* | string | |
| complaintCategory | string | |
| id* | string | |
| object* | "customer_message" |
customer.message.created
data.object fields
| Field | Type | Description |
|---|---|---|
| messageId* | string | |
| customerUserAid* | string | |
| clientId* | string | |
| billerId | string | |
| category* | string | |
| body | string | |
| receivedAt* | string | |
| id* | string | |
| object* | "customer_message" |
Insights
insight.created
data.object fields
| Field | Type | Description |
|---|---|---|
| id* | string | |
| object* | "insight" | |
| user_id* | string | |
| account_link_id | string | null | |
| biller_id | string | null | |
| bill_id | string | null | |
| type* | "bill_anomaly" | "duplicate_charge" | "new_biller" | "overdue_risk" | "savings_opportunity" | "new_fee" | "line_item_spike" | "usage_anomaly" | |
| severity* | "info" | "warn" | "urgent" |
insight.updated
data.object fields
| Field | Type | Description |
|---|---|---|
| id* | string | |
| object* | "insight" | |
| user_id* | string | |
| account_link_id | string | null | |
| status* | "OPEN" | "SNOOZED" | "DISMISSED" | "RESOLVED" |
Link requests
link_request.cancelled
data.object fields
| Field | Type | Description |
|---|---|---|
| id* | string | |
| object* | "request_to_link" | |
| user_id* | string | |
| biller_id | string |
link_request.created
data.object fields
| Field | Type | Description |
|---|---|---|
| id* | string | |
| object* | "request_to_link" | |
| user_id* | string | |
| biller_id | string |
Links
connection.ready
data.object fields
| Field | Type | Description |
|---|---|---|
| id* | string | |
| object* | "link" | |
| link_id* | string | |
| user_id | string | |
| biller_id | string | |
| bill_count | number | |
| first_sync_completed_at* | string | string |
link.completed
data.object fields
| Field | Type | Description |
|---|---|---|
| id* | string | |
| object* | "link" | |
| user_id* | string |
link.disconnected
Source event link.credentials_rejected delivered as link.disconnected.
link.credentials_rejected — data.object fields
| Field | Type | Description |
|---|---|---|
| id* | string | |
| object* | "link" | |
| user_id* | string | |
| biller_id | string | |
| link_request_id | string |
link.disconnected — data.object fields
| Field | Type | Description |
|---|---|---|
| id* | string | |
| object* | "link" | |
| user_id* | string | |
| biller_id | string |
Source event link.expired delivered as link.disconnected.
link.expired — data.object fields
| Field | Type | Description |
|---|---|---|
| id* | string | |
| object* | "link" | |
| user_id* | string | |
| biller_id | string |
link.session_finished
data.object fields
| Field | Type | Description |
|---|---|---|
| id* | string | |
| object* | "link_token" | |
| link_token_id* | string | |
| status* | "completed" | "exited" | |
| link_id | string | |
| biller_id | string | |
| user_id | string | |
| exit_reason | string |
link_token.completed
data.object fields
| Field | Type | Description |
|---|---|---|
| id* | string | |
| object* | "link_token" | |
| link_token_id* | string | |
| link_id* | string | |
| user_id | string | |
| biller_id | string | |
| completion_mode* | "auto_all_accounts" |
Payments
pay.escalated
Source event payment_attempt.escalated delivered as pay.escalated.
data.object fields
| Field | Type | Description |
|---|---|---|
| id* | string | |
| object* | "payment_attempt" | |
| payment_attempt_id* | string | |
| bill_id* | string | |
| reason | string |
pay.failed
Source event payment_attempt.failed delivered as pay.failed.
data.object fields
| Field | Type | Description |
|---|---|---|
| id* | string | |
| object* | "payment_attempt" | |
| payment_attempt_id* | string | |
| bill_id* | string | |
| code | string | |
| reason | string |
pay.scheduled
Source event payment_attempt.started delivered as pay.scheduled.
payment_attempt.started — data.object fields
| Field | Type | Description |
|---|---|---|
| id* | string | |
| object* | "payment_attempt" | |
| payment_attempt_id* | string | |
| user_id* | string | |
| bill_id* | string |
Source event payment_attempt.submitted delivered as pay.scheduled.
payment_attempt.submitted — data.object fields
| Field | Type | Description |
|---|---|---|
| id* | string | |
| object* | "payment_attempt" | |
| payment_attempt_id* | string |
pay.succeeded
Source event payment_attempt.succeeded delivered as pay.succeeded.
data.object fields
| Field | Type | Description |
|---|---|---|
| id* | string | |
| object* | "payment_attempt" | |
| payment_attempt_id* | string | |
| bill_id* | string | |
| amount | string | |
| currency | string | |
| confirmation_number | string |
payment.observed
data.object fields
| Field | Type | Description |
|---|---|---|
| id* | string | |
| object* | "observed_payment" | |
| account_link_id* | string | |
| account_id | string | null | |
| biller_id* | string | |
| user_id* | string | |
| amount* | string | |
| currency* | string | |
| payment_date* | string | |
| confirmation_number | string | null | |
| payment_method_label | string | null | |
| status* | "POSTED" | "PENDING" | "FAILED" | "UNKNOWN" | |
| source* | "SCRAPED" | "MANUAL_ENTRY" | "API_REPORTED" | |
| bill_id | string | null | |
| scraped_at* | string |
Internal
webhook.replay-requested(internal-only — not delivered to subscribers)
data.object fields
| Field | Type | Description |
|---|---|---|
| id* | string | |
| object* | "webhook_dead_letter" |