Reconciliation
Learn how to use Avvio's sequence-based Event Log to guarantee reliable, replayable ledger synchronization and automated reconciliation.
The Event Log is the authoritative reconciliation primitive for syncing your internal ledger with Avvio.
While webhooks provide real-time push notifications, the Events API provides guaranteed, replayable, sequence-ordered reconciliation.
Webhook Event Received
↓ (Trigger)
Read Latest Events Feed (GET /events?since=)
↓
Deduplicate by Event ID
↓
Update Internal LedgerThe Events Feed
Fetch events since your last processed sequence number:
GET /payments/organizations/{orgId}/events?since=40Response:
{
"data": [
{
"id": "evt_01J9812A",
"sequence": "41",
"type": "payout.processing",
"payoutId": "payout_98124b89",
"status": "processing",
"createdAt": "2026-08-17T09:12:00.000Z"
},
{
"id": "evt_01J9813B",
"sequence": "42",
"type": "payout.completed",
"payoutId": "payout_98124b89",
"status": "completed",
"createdAt": "2026-08-17T09:12:35.000Z"
},
{
"id": "evt_01J9819Z",
"sequence": "43",
"type": "payout.returned",
"payoutId": "payout_98124b89",
"status": "failed",
"failureCode": "returned_by_bank",
"fundsReturned": true,
"createdAt": "2026-08-19T14:02:11.000Z"
}
],
"hasMore": false,
"nextSince": "43"
}Key Reconciliation Properties
- Sequence-Based Cursor: The cursor is an integer
sequence, not a timestamp. Timestamps can produce ties across concurrent transactions, causing dropped events. StorenextSinceafter each sync batch. - At-Least-Once Delivery: The feed guarantees at-least-once delivery. Always deduplicate incoming events against the unique
id(evt_...). - Dedicated
payout.returnedEvent: Reversals produce a distinctpayout.returnedevent rather than a genericpayout.failed, allowing your accounting workers to immediately route ledger reversals. - Immutable History: Once written, an event record is immutable and never updated in place.
Events Feed vs Orders List
| Feature | GET /events | GET /orders |
|---|---|---|
| Ordering | Monotonic sequence | createdAt descending |
| Old Payout Updates | Appended as new events at the end of the feed | Updates existing record without reordering |
| Primary Use Case | Automated ledger synchronization | Admin dashboard history & UI search |
| Pagination | since={sequence} | Opaque cursor |
| Rate Limit | 600 requests / minute | 600 requests / minute |
Updated about 2 hours ago
Did this page help you?
