FurlPay Docs
Open App
  • Services & Availability
  • Quickstart
  • For AI Agents
  • Monorepo
  • API Routes
  • Authenticationupdated
  • Webhook Eventsupdated
  • Error Codesupdated
  • Rate Limitsnew
  • Configuration & Setupnew
  • Merchant Paymentsnew
  • Payroll & Payoutsnew
  • Agentic Payments (x402)updated
  • Agent Trust & Mandates (TAP)updated
  • CCTP Cross-Chainupdated
  • LI.FI Swapsupdated
  • FurlPay Travels (Travel MCP)updated
  • Solana Actions & Blinks
  • Settlement Workspacenew
  • FURL Tokennew
  • Claude Connectorupdated
  • AI Assistants
  • Circlenew
  • Ramp Providersnew
  • Telegram Mini Appnew
  • Stripe Crypto
  • Persona KYC
  • Regulatory status
  • Screening & Casesnew
  • Security Postureupdated
  • Signing & WebAuthnupdated
  • Help Center
  • Getting Started
  • KYC Verification
  • Passkeys & Biometrics
  • Privacy & Data Protection
  • Transaction Statuses
  • Gasless Transfers
  • Deposits & Withdrawals
  • Managing Virtual Cards
  • Freezing & Unfreezing Cards
  • Declined Transactions
  • SDK & API Support
  • x402 Monetization Basics
  • Booking Travel
  • Travel Refunds & Cancellations

Resources

  • Changelog
  • System Status
  • OpenAPI Spec
  • Community
  • GitHub
Docs/Architecture/Webhook Events

Architecture

Webhook events

FurlPay receives provider webhooks and can deliver merchant payment events to a configured HTTPS endpoint. The signature header and freshness rules depend on which direction and provider you are integrating.

Events FurlPay sends to merchants

A merchant can register an HTTPS endpoint through the authenticated /api/merchant/webhook API. The current outbox event types are payment.succeeded and invoice.paid.

MethodPathDescription
GET/api/merchant/webhookRead the signed-in merchant's endpoint; secret is never returned
PUT/api/merchant/webhookSet an HTTPS endpoint and rotate its secret; plaintext secret is returned once
DELETE/api/merchant/webhookRemove the signed-in merchant's endpoint

Delivery is at-least-once. Deduplicate on X-FurlPay-Event-Id; retries use the same event ID. The endpoint must return a 2xx response. Delivery retries are bounded, and the payment ledger remains the source of truth.

  • X-FurlPay-Event-Id identifies the outbox event.
  • X-FurlPay-Attempt is the delivery attempt number.
  • X-FurlPay-Signature uses t=<unix>,v1=<hex>.

The signature is HMAC-SHA256 over timestamp + "." + rawBody using the endpoint secret. Reject timestamps outside the five-minute tolerance, compare signatures in constant time, and parse the JSON only after verification. The Node SDK verification helper accepts the signature value; pass it the value of the X-FurlPay-Signature header.

Merchant webhook delivery can be unavailable

Durable webhook storage requires the merchant payment database migrations andFURLPAY_PARTNER_WEBHOOK_KEY. If endpoint configuration returns 503, do not assume events are being delivered.

Provider webhooks FurlPay receives

MethodPathDescription
POST/api/webhooks/stripeStripe events; Stripe SDK signature verification over the raw body
POST/api/webhooks/sumsubSumsub verification outcomes; HMAC digest headers
POST/api/webhooks/personaPersona inquiry outcomes; timestamped signature validation and user-binding check
POST/api/webhooks/deposit-detectConfigured chain-provider deposit notifications; provider HMAC validation
POST/api/webhooks/complyadvantageConfigured screening-provider events
POST/api/webhooks/card-authCard-auth events; signed, timestamped payload verification

Configure each provider's credentials and endpoint secret separately. Handlers verify provider-specific headers before trusting payloads, and some may fail closed with 503 when production configuration is absent. Do not reuse a secret or verification snippet across providers without confirming their exact scheme.

Local development

The @furlpay/cli package includes webhook-forwarding commands for development. Use test events and a test endpoint secret locally. A forwarded or simulated event is not evidence of a production payment.

Never credit a balance from an unverified event

Treat webhook input as untrusted until signature, freshness, event identity and idempotency checks pass. Reconcile against the provider or settlement record before crediting funds.
Did this page help?
Edit this page on GitHub

← Previous

Authentication

Next →

Error Codes