Changelog
Merchant-visible changes to the API, webhooks, and dashboard. Breaking changes are called out explicitly.
Changes that affect how you build against the platform. Internal refactors are not listed.
2026-08-13#
Security hardening: webhook destinations and delivery responses#
- Webhook URLs are now validated. Destinations must be public
http(s)hosts: URLs with embedded credentials or hostnames resolving to private/internal ranges are rejected on save and re-checked at every delivery. Redirects are never followed. If your stored URL points at an internal host, deliveries to it will now fail — switch to a public endpoint or tunnel. - Breaking: the webhook event detail API and dashboard no longer expose your server's response body. The HTTP status code and error string remain available.
Payouts complete on chain confirmation#
A payout is now marked completed — and your balance debited — only after its transaction reaches the network's confirmation target, instead of at broadcast time. The completion email arrives roughly a minute later than before; the payout amount and flow are unchanged.
BTC withdrawals enabled#
Bitcoin joins the payout networks: withdrawals to your registered bitcoin address are now executed on-chain (native SegWit). Network fee is paid by the platform; confirmations target is 3 blocks.
New networks and currencies#
- Base: ETH, USDT, USDC, POD and xPOD deposits and payouts. xPOD (the ERC-4626 vault wrapper of POD) is priced at its live on-chain conversion ratio, so accrued yield is honoured.
- Monero: XMR deposits and payouts.
- USDC on Ethereum and Base.
See the full matrix in Payments & confirmations.
Automatic webhook retries#
Failed webhook deliveries are retried automatically with exponential backoff (~30 s up to ~24 h, 8 attempts total), then marked exhausted. Manual retry from the dashboard remains available at any point, including for exhausted events. See Delivery semantics.
Batch transactions credit every invoice they pay#
One on-chain transaction that pays several invoices (e.g. an exchange batch withdrawal) now credits each of them. Previously only the first matching invoice was credited.
2026-05-15#
Webhook signing secret is now visible and rotatable#
The HMAC secret used to sign outgoing webhooks (X-Webhook-Signature) is now exposed to merchants:
- On merchant creation, the secret is shown once next to the API key. Copy it to your secret store before closing the dialog.
- A new "Signing secret" tab on the merchant detail page lets you rotate the value. The new secret is shown once; the old one stops signing immediately.
- New endpoint:
POST /merchants/{id}/rotate-webhook-secret(JWT-authenticated, returns the new value). - Existing receivers that already verify
X-Webhook-Signaturekeep working unchanged — only the discoverability of the secret has improved. See Signature scheme and Dashboard → Merchants.
2026-04-17#
Webhook payloads now carry your merchant fields#
Every webhook delivery now includes external_id, description, metadata, and created_at in the JSON body. This lets you reconcile events against your own records without a second API call.
- Backward compatible — receivers that ignore unknown fields keep working unchanged.
- Events dispatched before this change still carry the original (thinner) payload — only new invoices get the full payload going forward.
- See Payload schema.
Webhook delivery: fire-and-forget, with dashboard retry#
The platform now dispatches each webhook once. If your endpoint rejects the delivery or is unreachable, the attempt is stored as failed — and you retry it from the dashboard when you're ready.
- Why: automatic retry loops were masking real configuration problems on the merchant side.
- What changed for you: you now see every failed delivery with its HTTP status and response body in the dashboard, and you click Retry explicitly.
- The full response body (first 4 KB) is captured verbatim — useful for debugging signature mismatches.
- See Delivery semantics and Retry failed webhooks.
New: Webhook events tab in the dashboard#
Each merchant detail page has a new Webhook events tab showing every delivery attempt: event type, invoice, status, HTTP code, attempts, first 4 KB of the response body, and a retry button.
New: Test payment page#
A new /test-payment route in the dashboard lets you create a real invoice via a form and scan the resulting QR from any wallet. Useful for end-to-end verification of your webhook handler without writing API client code.
Entries before this page existed aren't migrated. If you spot a change that isn't documented and you think it should be, contact support.