1. Guides
Synci API
  • Overview
  • Guides
    • Authentication
    • Building OAuth apps
    • Webhooks
    • Pagination, filtering, and sorting
    • Errors
    • Rate limits
    • MCP: Connect AI assistants
  • API Reference
    • Finance
      • Connections
        • List all financial connections
        • Create a new financial connection
        • Get financial connection
        • Delete financial connection
        • Disable financial connection
        • Reconfirm the consent of a financial connection
      • Accounts
        • List all financial accounts
        • Get financial account
        • Update financial account
        • Delete financial account
        • Sync financial account data
        • Reset financial account config to defaults
        • List all account balance entries
        • Get account balance entry
        • List account holdings
        • Get account holding
      • Transactions
        • List all transactions
        • Create a new transaction
        • Get transaction
        • Update transaction
        • Delete transaction
        • Bulk delete transactions
      • Institutions
        • Get supported countries
        • List all supported institutions
        • Get supported institution
    • Destinations
      • YNAB Connections
        • YNAB Budgets
          • YNAB Budget Accounts
            • List all YNAB budget accounts
            • Get YNAB budget account
            • Delete YNAB budget account
          • List all YNAB budgets
          • Get YNAB budget
          • Delete YNAB budget
          • Update YNAB budget
        • List all YNAB connections
        • Create new YNAB connection
        • Get YNAB connection
        • Delete YNAB connection
        • Update YNAB connection
        • Refresh YNAB connection
      • Lunch Money Connections
        • Lunch Money Accounts
          • List all Lunch Money accounts
          • Get Lunch Money account
          • Delete Lunch Money account
        • List all Lunch Money connections
        • Create new Lunch Money connection
        • Get Lunch Money connection
        • Delete Lunch Money connection
        • Update Lunch Money connection
        • Refresh Lunch Money connection
      • Google Sheets Connections
        • Sheets
          • List destination spreadsheets for a connection
          • Register a destination spreadsheet
          • Get a destination spreadsheet
          • Update a destination spreadsheet
          • Delete a destination spreadsheet
          • List the worksheets (tabs) of a spreadsheet
          • Create a new worksheet (tab) in a spreadsheet
        • List all Google Sheets connections
        • Create new Google Sheets connection
        • Get Google Sheets connection
        • Delete Google Sheets connection
        • Update Google Sheets connection
        • Refresh Google Sheets connection
    • Transfer Links
      • List all transfer links
      • Create a new transfer link
      • Get transfer link
      • Update transfer link
      • Delete transfer link
      • Retry transfers for all transfer links
      • Retry transfers for a specific transfer link
    • Transfer Logs
      • List all transfer logs
      • Get transfer log
      • Undo a transfer
      • Undo multiple transfers
    • Rules
      • Create a new rule
      • List all rules
      • Get rule
      • Update rule
      • Delete rule
      • Attach rule to transfer link
      • Detach rule from transfer link
      • Reorder rules for a transfer link
      • Attach rule to a financial account
      • Detach rule from financial account
      • Reorder rules for a financial account
      • Preview a rule against transactions (dry-run)
    • Rule Logs
      • List all rule logs
      • Get rule log
      • Undo multiple rule actions
      • Undo a rule action
    • Webhooks
      • List all webhook events
      • List all webhook endpoints
      • Create new webhook endpoint
      • Get webhook endpoint
      • Update webhook endpoint
      • Delete webhook endpoint
      • Test webhook endpoint
      • Rotate webhook secret
  • ActualBudgetConnections
    • List all Actual Budget connections
      GET
    • Create new Actual Budget connection
      POST
    • Get Actual Budget connection
      GET
    • Update Actual Budget connection
      PUT
    • Delete Actual Budget connection
      DELETE
    • Regenerate setup token
      POST
    • Revoke access credentials
      POST
    • List accounts linked in Actual
      GET
  • Schemas
    • AccountHoldingResource
    • ActualBudgetAccountResource
    • ActualBudgetConnectionResource
    • BalanceTypeEnum
    • BulkDeleteTransactionsRequest
    • BulkUndoRuleLogsRequest
    • BulkUndoTransferLogsRequest
    • CreateFinancialConnectionRequest
    • CreateGoogleSheetTabRequest
    • CreateGoogleSheetsConnectionRequest
    • CreateLunchMoneyConnectionRequest
    • CreateRuleRequest
    • CreateTransactionRequest
    • CreateTransferLinkRequest
    • CreateWebhookEndpointRequest
    • CreateYnabConnectionRequest
    • DestinationTypeEnum
    • EnrichmentProviderEnum
    • FinancialAccount
    • FinancialAccountBalanceResource
    • FinancialAccountResource
    • FinancialConnectionResource
    • GoogleSheetResource
    • GoogleSheetsConnectionResource
    • HealthResource
    • HealthStatusEnum
    • InstitutionConfigMappedDateEnum
    • InstitutionConfigMappedTextEnum
    • InstitutionConfigResource
    • InstitutionResource
    • IntegratorEnum
    • LunchMoneyAccountResource
    • LunchMoneyConnectionResource
    • PreviewRuleRequest
    • ReauthorizeFinancialConnectionRequest
    • RetryTransfersAllLinksRequest
    • RetryTransfersRequest
    • RuleActionResource
    • RuleActionTypeEnum
    • RuleConditionResource
    • RuleLogResource
    • RuleOperatorEnum
    • RuleResource
    • RuleTypeEnum
    • StoreActualBudgetConnectionRequest
    • StoreGoogleSheetRequest
    • SyncFinancialAccountRequest
    • TestWebhookRequest
    • TransactionResource
    • TransactionTypeEnum
    • TransferLink
    • TransferLinkResource
    • TransferLinkSyncModeEnum
    • TransferLogResource
    • TransferLogStatusEnum
    • UpdateActualBudgetConnectionRequest
    • UpdateFinancialAccountRequest
    • UpdateGoogleSheetRequest
    • UpdateGoogleSheetsConnectionRequest
    • UpdateLunchMoneyConnectionRequest
    • UpdateRuleRequest
    • UpdateTransactionRequest
    • UpdateTransferLinkRequest
    • UpdateWebhookEndpointRequest
    • UpdateYnabBudgetRequest
    • UpdateYnabConnectionRequest
    • WebhookEndpointPayloadVersion
    • WebhookEndpointResource
    • WebhookEventResource
    • WebhookEventTypeEnum
    • WebhookTypeEnum
    • YnabBudgetAccountResource
    • YnabBudgetAccountTypeEnum
    • YnabBudgetResource
    • YnabConnectionResource
  1. Guides

Webhooks

Webhooks let your application (or a third-party service like Zapier) receive real-time notifications when something happens in a Synci account: new transactions arrive, a balance changes, an account is added or removed, or investment holdings update.

Setting up an endpoint#

Create endpoints in the dashboard under Developers → Webhooks, or via the API (Create new webhook endpoint, scope webhooks:write). Each endpoint has:
URL: the HTTPS address Synci sends POST requests 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#

EventFires when
transactions.createdNew transactions are fetched from the bank
transactions.updatedAn existing transaction changes (for example, a pending transaction books)
balance.updatedAn account balance changes
holdings.updatedInvestment or crypto holdings for an account change
account.createdA financial account is added
account.updatedA financial account's details or status change
account.deletedA financial account is removed
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 a POST with a JSON body in a common envelope:
{
  "event_type": "transactions.created",
  "event_id": "evt_0197f2a4c3de7a1b9f04d2e6b8c11a2f",
  "webhook_endpoint_id": 123,
  "created_at": "2026-07-11T10:00:00+00:00",
  "data": {
    "...": "event-specific payload"
  }
}
event_id 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.
Requests are sent with the User-Agent Synci-Webhooks/1.0.

Verifying signatures#

Every delivery includes an X-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.
PHP
Node.js (Express)
C# (.NET)

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. 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. 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. 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. Anyone can POST to a public URL; the signature is your proof the event came from Synci.
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.
Modified at 2026-07-11 12:18:00
Previous
Building OAuth apps
Next
Pagination, filtering, and sorting
Built with