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 · 34 event payload schemas.

bill_import

bill_import.updated

data.object fields

FieldTypeDescription
id*string
object*"bill_import"
bill_import_id*string
client_id*string
client_user_id*string
status*"NEEDS_REVIEW" | "READY_TO_COMMIT" | "POSSIBLE_DUPLICATE" | "REJECTED" | "COMMITTED" | "EXPIRED"
lifecycle_version*integer
committed_bill_idstring
updated_at*string

biller

biller.unsupported

data.object fields

FieldTypeDescription
id*string
object*"biller"

Bills

bill.created

data.object fields

FieldTypeDescription
id*string
object*"bill"
link_idstring
client_user_idstring
biller_idstring
status"PENDING" | "PAID" | "OVERDUE" | "CANCELLED" | "DISPUTED" | "PARTIALLY_PAID"
amountstring
currencystring
total_amountobject
due_datestring
due_date_isostring

bill.deleted

data.object fields

FieldTypeDescription
id*string
object*"bill"

bill.updated

Source event bill.due_date_changed delivered as bill.updated.

bill.due_date_changed — data.object fields

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

Source event bill.paid delivered as bill.updated.

bill.paid — data.object fields

FieldTypeDescription
id*string
object*"bill"
bill_id*string
link_idstring
client_user_idstring
account_idstring | null
biller_idstring
paid_reason"ATTEMPT" | "STATEMENT_CREDIT" | "OBSERVED_PAYMENT" | "ROLLED_FORWARD" | "EXTRACTION_SETTLED" | "EXTERNAL_ATTESTATION"
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
cumulative_amount_applied*number

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" | "PARTIALLY_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"
link_idstring
client_user_idstring
biller_idstring
amountstring
currencystring
total_amountobject
due_datestring
due_date_isostring

Customer messages

customer.message.complaint

data.object fields

FieldTypeDescription
message_id*string
customer_user_aid*string
client_id*string
biller_idstring
reasonstring
notestring
complained_atstring
id*string
object*"customer_message"

customer.message.created

data.object fields

FieldTypeDescription
message_id*string
customer_user_aid*string
client_id*string
biller_idstring
biller_namestring
account_link_idstring
account_idstring
category*string
subjectstring
bodystring
created_at*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" | "credit_balance" | "price_increase"
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_countinteger
first_sync_completed_at*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.failure_reason_corrected

data.object fields

FieldTypeDescription
idstring
object"link_token"
link_token_id*string
link_request_idstring
user_idstring
correction_version*integer
corrected_at*string
original_credentials_rejected_reason*string | null
original_reaped_reason*string | null
target_family*"credentials_rejected_reason" | "reaped_reason"
target_original_reason*string | null
corrected_reason*"incorrect_credentials" | "timeout" | "mfa_expired" | "account_discovery_failed" | "automation_blocked" | "session_expired" | "expired" | "stuck_timeout"

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
total_amountobject
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
total_amountobject
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
created_atstring
updated_atstring
versioninteger

sandbox

sandbox.claimed

data.object fields

FieldTypeDescription
id*string
object*"sandbox"

sandbox.expiring

data.object fields

FieldTypeDescription
id*string
object*"sandbox"

Internal

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

data.object fields

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