Skip to main content
Subscribe an HTTPS endpoint to the events you care about and stop polling. Every delivery is a thin event: what happened and to which object, never the object itself. Fetch the current state from related_object.url, or the full event (with data and changes) from GET /v2/events/{id}.

Event destinations

POST /v2/event_destinations (scope events:write):
The signing secret is returned on create and on rotate only; store it then (it is null on every other read). event_payload is thin today; snapshot is reserved and currently rejected with 400 parameter_invalid (full transaction payloads stay on webhook destinations). enabled_events accepts exact types, families (sync_run.*) or *. Up to 10 destinations per account.

The delivered payload

Headers: Redbark-Signature, Redbark-Delivery-Id, Redbark-Event-Id, User-Agent: Redbark-Events/1.0. Payloads are unversioned. Respond with any 2xx within 30 seconds.

Verifying signatures

Redbark-Signature: t=1755741609,v1=5257a869e7… where each v1 is HMAC-SHA256 of "{t}.{raw_body}" with a signing secret. During the 24 hours after a rotate there are two v1 values; accept the delivery if any matches. Reject deliveries whose t is more than 5 minutes old.

Delivery and retries

Deliveries are at-least-once and unordered; deduplicate on id. A non-2xx or a timeout is retried with exponential backoff (1 minute, 5, 30, 2 hours, 6, 12, then daily) for up to 3 days, after which the delivery is abandoned. A destination that has failed continuously for 3 days is disabled (status_details.reason = "delivery_failures") and event_destination.disabled is emitted; fix the endpoint and POST …/enable.

The event log

GET /v2/events?type[]=sync_run.* (scope events:read) lists the last 30 days of events for resources your key can read. GET /v2/events/{id} returns the full event with data, changes and every delivery attempt. POST /v2/events/{id}/redeliver (events:write) queues a fresh delivery to every subscribed destination, or one with { "event_destination": "ed_…" }. The list is bounded to the newest 1,000 unexpired events matching the type and read-scope filters, not an unlimited archive. Filters are applied before the ceiling. Pagination cannot retrieve events outside the bounded set.

Event types

A sync run that stops early emits sync.attention with an actionable data.code: destination_auth_expired, ynab_subscription_inactive, bank_connection_invalid, config_error, consent_expired, consent_withdrawn, data_error, resource_not_found, destination_layout_changed, or destination_quota_exceeded. Other early-stop failures use last_run_failed. Fetch the related sync for its current state; the event does not contain transaction data.