Webhook Payloads

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

FieldTypeDescription
id*string
object*"onboarding_request"
biller_id*string

onboarding.failed

data.object fields

FieldTypeDescription
id*string
object*"biller_onboarding_request"

onboarding.submitted

data.object fields

FieldTypeDescription
id*string
object*"biller_onboarding_request"

Bills

bill.created

data.object fields

FieldTypeDescription
id*string
object*"bill"
user_id*string
biller_id*string

bill.deleted

data.object fields

FieldTypeDescription
id*string
object*"bill"

bill.updated

Source event bill.paid delivered as bill.updated.

bill.paid — data.object fields

FieldTypeDescription
id*string
object*"bill"
bill_id*string
link_id*string
account_idstring | null
biller_id*string
paid_reason"ATTEMPT" | "STATEMENT_CREDIT" | "OBSERVED_PAYMENT" | "ROLLED_FORWARD"
paid_atstring

Source event bill.partially_paid delivered as bill.updated.

bill.partially_paid — data.object fields

FieldTypeDescription
id*string
object*"bill"
bill_id*string
link_id*string
account_idstring | null
biller_id*string

Source event bill.statement.refreshed delivered as bill.updated.

bill.statement.refreshed — data.object fields

FieldTypeDescription
id*string
object*"bill"

Source event bill.status_reverted delivered as bill.updated.

bill.status_reverted — data.object fields

FieldTypeDescription
id*string
object*"bill"
bill_id*string
link_id*string
account_idstring | 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

FieldTypeDescription
id*string
object*"bill"

Customer messages

customer.message.complaint

data.object fields

FieldTypeDescription
messageId*string
customerUserAid*string
clientId*string
billerIdstring
category*string
bodystring
receivedAt*string
complaintCategorystring
id*string
object*"customer_message"

customer.message.created

data.object fields

FieldTypeDescription
messageId*string
customerUserAid*string
clientId*string
billerIdstring
category*string
bodystring
receivedAt*string
id*string
object*"customer_message"

Insights

insight.created

data.object fields

FieldTypeDescription
id*string
object*"insight"
user_id*string
account_link_idstring | null
biller_idstring | null
bill_idstring | 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

FieldTypeDescription
id*string
object*"insight"
user_id*string
account_link_idstring | null
status*"OPEN" | "SNOOZED" | "DISMISSED" | "RESOLVED"

Link requests

Links

connection.ready

data.object fields

FieldTypeDescription
id*string
object*"link"
link_id*string
user_idstring
biller_idstring
bill_countnumber
first_sync_completed_at*string | string

link.completed

data.object fields

FieldTypeDescription
id*string
object*"link"
user_id*string

link.disconnected

Source event link.credentials_rejected delivered as link.disconnected.

link.credentials_rejected — data.object fields

FieldTypeDescription
id*string
object*"link"
user_id*string
biller_idstring
link_request_idstring

link.disconnected — data.object fields

FieldTypeDescription
id*string
object*"link"
user_id*string
biller_idstring

Source event link.expired delivered as link.disconnected.

link.expired — data.object fields

FieldTypeDescription
id*string
object*"link"
user_id*string
biller_idstring

link.session_finished

data.object fields

FieldTypeDescription
id*string
object*"link_token"
link_token_id*string
status*"completed" | "exited"
link_idstring
biller_idstring
user_idstring
exit_reasonstring

Payments

pay.escalated

Source event payment_attempt.escalated delivered as pay.escalated.

data.object fields

FieldTypeDescription
id*string
object*"payment_attempt"
payment_attempt_id*string
bill_id*string
reasonstring

pay.failed

Source event payment_attempt.failed delivered as pay.failed.

data.object fields

FieldTypeDescription
id*string
object*"payment_attempt"
payment_attempt_id*string
bill_id*string
codestring
reasonstring

pay.scheduled

Source event payment_attempt.started delivered as pay.scheduled.

payment_attempt.started — data.object fields

FieldTypeDescription
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

FieldTypeDescription
id*string
object*"payment_attempt"
payment_attempt_id*string

pay.succeeded

Source event payment_attempt.succeeded delivered as pay.succeeded.

data.object fields

FieldTypeDescription
id*string
object*"payment_attempt"
payment_attempt_id*string
bill_id*string
amountstring
currencystring
confirmation_numberstring

payment.observed

data.object fields

FieldTypeDescription
id*string
object*"observed_payment"
account_link_id*string
account_idstring | null
biller_id*string
user_id*string
amount*string
currency*string
payment_date*string
confirmation_numberstring | null
payment_method_labelstring | null
status*"POSTED" | "PENDING" | "FAILED" | "UNKNOWN"
source*"SCRAPED" | "MANUAL_ENTRY" | "API_REPORTED"
bill_idstring | null
scraped_at*string

Internal

webhook.replay-requested(internal-only — not delivered to subscribers)

data.object fields

FieldTypeDescription
id*string
object*"webhook_dead_letter"
Was this page helpful?