Webhook Event Types
Araucaria emits three categories of events: connection events, account events, and transaction events.
Connection Events
Emitted when a connection's status changes. Each event corresponds to a state in the connection lifecycle.
| Event Type | Description |
|---|---|
| connection.created | Connection created, waiting for credentials |
| connection.credentials_submitted | User submitted credentials via widget |
| connection.verifying | Worker is verifying credentials with the bank |
| connection.connected | Successfully connected, accounts available |
| connection.mfa_required | Bank requires multi-factor authentication |
| connection.failed_auth | Invalid credentials provided |
| connection.error | Unexpected error during connection |
| connection.disconnected | Connection was disconnected |
Account Events
Emitted when account data changes. Fetch the latest data when receiving these events.
| Event Type | Description |
|---|---|
| accounts.updated | Account data has been updated, fetch latest transactions |
Transaction Events
Emitted when transaction data changes. Use these to keep your local transaction records in sync.
| Event Type | Description |
|---|---|
| transaction.deleted | A transaction was removed during deduplication or correction |
Refresh Intent Events
Emitted when an on-demand refresh completes. Use this instead of polling GET /v1/refresh-intents/{id}.
| Event Type | Description |
|---|---|
| refresh_intent.completed | All connections in the refresh intent have finished syncing (completed or failed) |
Connection Event Payload
json
{
"id": "evt_01HXYZ...",
"type": "connection.connected",
"created_at": "2026-01-20T14:30:00.000Z",
"data": {
"eventId": "evt_01HXYZ...",
"type": "connection.connected",
"occurredAt": "2026-01-20T14:30:00.000Z",
"clientId": "cli_01H8X9KQWERTY12345",
"connectionId": "conn_01H8X9ABCDEF67890",
"previousStatus": "verifying",
"error": null
}
}
Account Event Payload
json
{
"id": "evt_01HXYZ...",
"type": "accounts.updated",
"created_at": "2026-01-20T14:30:00.000Z",
"data": {
"eventId": "evt_01HXYZ...",
"type": "accounts.updated",
"occurredAt": "2026-01-20T14:30:00.000Z",
"clientId": "cli_01H8X9KQWERTY12345",
"connectionId": "conn_01H8X9ABCDEF67890",
"accountId": "acc_01H8X9KQWERTY12345"
}
}
Transaction Event Payload
json
{
"id": "evt_01HXYZ...",
"type": "transaction.deleted",
"created_at": "2026-01-20T14:30:00.000Z",
"data": {
"eventId": "evt_01HXYZ...",
"type": "transaction.deleted",
"occurredAt": "2026-01-20T14:30:00.000Z",
"clientId": "cli_01H8X9KQWERTY12345",
"connectionId": "conn_01H8X9ABCDEF67890",
"accountId": "acc_01H8X9KQWERTY12345",
"transactionId": "txn_01H8X9KQWERTY12345"
}
}
Refresh Intent Event Payload
Unlike other events, refresh_intent.completed is scoped to an intent rather than a single connection, so there is no top-level connectionId field. Per-connection status is nested in the connections array.
json
{
"id": "evt_01HXYZ...",
"type": "refresh_intent.completed",
"created_at": "2026-01-20T14:30:00.000Z",
"data": {
"eventId": "evt_01HXYZ...",
"type": "refresh_intent.completed",
"occurredAt": "2026-01-20T14:30:00.000Z",
"clientId": "cli_01H8X9KQWERTY12345",
"refreshIntentId": "01H8X9ABCDEF67890",
"connections": [
{
"connectionId": "conn_01H8X9ABCDEF67890",
"status": "completed",
"error": null
},
{
"connectionId": "conn_01H8X9ABCDEF67891",
"status": "failed",
"error": "transient_failure"
}
]
}
}
💡 Next Steps
When you receive
When you receive
When you receive
When you receive
connection.connected, call GET /v1/connections/{connectionId}/accounts to retrieve accounts.When you receive
accounts.updated, call GET /v1/accounts/{accountId} for the updated balance and GET /v1/accounts/{accountId}/transactions for new transactions.When you receive
transaction.deleted, remove the transaction from your local records if you store them.When you receive
refresh_intent.completed, check each connection's status in the connections array and fetch updated data for those with "status": "completed".