Setting up an endpoint
Create endpoints in the dashboard under Developers → Webhooks, or via the API (Create new webhook endpoint, scopewebhooks:write). Each endpoint has:
- URL: the HTTPS address Synci sends
POSTrequests to. - Events: the event types you want to receive (see below). You only receive events you subscribe to.
- Account filter: optionally limit the endpoint to specific bank accounts. Leave empty to receive events for all accounts.
- Omit sensitive identifiers: strips IBANs, BBANs, and similar identifiers from payloads. Required for Zapier endpoints.
- Signing secret: a
whsec_...secret generated when the endpoint is created, used to verify that deliveries really come from Synci. It is shown once on creation and on rotation.
Webhook delivery requires an active Synci subscription.
Event types
Payload versions. Endpoints created today use payload version v2, which uses the event names above. Older endpoints on v1 receive the legacy names
bank_account.created, bank_account.updated, and bank_account.deleted instead of account.*, and a bank_account key instead of financial_account in payloads. The version is pinned when the endpoint is created, so existing integrations keep working unchanged.Delivery format
Every delivery is aPOST with a JSON body in a common envelope:
string
One of the event types above.
string
Uniquely identifies the event and is stable across retries: if a delivery fails and is retried, the retry carries the same
event_id. Use it to deduplicate.integer
The endpoint the delivery was sent to.
string
When the event occurred, as an ISO 8601 timestamp.
object
The event-specific payload.
Synci-Webhooks/1.0.
Verifying signatures
Every delivery includes anX-Synci-Signature header: a hex-encoded HMAC-SHA256 of the raw request body, keyed with your endpoint’s signing secret. Always verify it before trusting the payload.
Compute the HMAC over the raw bytes of the body (before any JSON parsing), and compare using a constant-time comparison.
Rotating the secret
Rotate the signing secret from the endpoint’s settings in the dashboard, or via the Rotate webhook secret endpoint. The new secret is returned once; update your verification code immediately, as the old secret stops being used.Retries and failure handling
- Your endpoint should respond with a 2xx status within a few seconds.
- Failed deliveries (non-2xx or timeouts) are retried automatically with increasing delays: about 1 minute, then 10 minutes, then 1 hour.
- If your endpoint responds
410 Gone, Synci stops sending to it and disables the endpoint immediately. - Endpoints that keep failing are marked unhealthy and eventually disabled automatically, and you are notified. You can re-enable an endpoint from the dashboard once it is fixed.
Testing
Send a test event from the endpoint’s page in the dashboard, or via the Test webhook endpoint endpoint. You can choose real data from your account or dummy data. Test deliveries:- Are limited to 5 per minute.
- Are sent once, without retries.
- Are signed exactly like real deliveries, so you can verify your signature code end to end.
Best practices
Acknowledge fast, process async
Acknowledge fast, process async
Return
2xx immediately and hand the payload to a queue or background worker. Slow responses count as failures and trigger retries.Deduplicate on event_id
Deduplicate on event_id
Retries mean you can receive the same event more than once.
event_id is stable across retries, so skipping an event_id you have already processed makes repeat deliveries harmless.Verify every signature
Verify every signature
Anyone can POST to a public URL; the signature is your proof the event came from Synci.
Don't rely on ordering
Don't rely on ordering
Events are delivered independently and retries can arrive out of order. Use the
created_at timestamp and fetch current state from the API when ordering matters.