Skip to main content
When a checkout reaches a terminal state, Float POSTs a JSON callback to the notify_url you supplied when creating the checkout. This callback is your source of truth for order state.

The payload

Headers:

Verifying the signature

Float signs the raw JSON body with your signing key (the same one you use for request signing). Verify every callback before trusting it:
Verify against the raw request body bytes, not a re-serialised parse of them, and use a constant-time comparison. Reject anything that doesn’t verify.

Responding

  • Return any 2xx status to acknowledge. Anything else counts as a failed delivery and triggers retries.
  • Respond fast (well under 10 seconds). Do heavy work — emails, ERP syncs — asynchronously after acknowledging.

Dynamic redirect (optional)

If your 2xx response body is JSON containing a redirect_url, Float sends the shopper’s browser there instead of your static success_url/cancel_url:
This lets you land the shopper on an order-specific, authenticated confirmation page. Notes:
  • Only honoured on the initial synchronous delivery (the one made while the shopper is waiting on Float’s page). Retried deliveries can’t affect a redirect that already happened.
  • Omit the field (or return an empty body) to use your static URLs — that’s perfectly fine.

Delivery and retries

  • The first delivery happens synchronously while the shopper is still on Float’s payment page.
  • If it fails (timeout, non-2xx, network error), Float retries in the background — up to 18 attempts at ~10-minute intervals (~3 hours).
  • The shopper is still redirected using your static URLs even when the callback fails, so your success_url page must tolerate the order not being marked paid yet.
  • After retries are exhausted, Float’s team is alerted and can re-trigger the notification manually. Your safety net is reconciliation via GET /api/checkouts/:id.

Idempotency

Duplicate deliveries are possible (retry races, manual re-triggers). Key your handler on client_reference_id + status: if the order is already in the target state, return 2xx without side effects.

Endpoint requirements

  • Public HTTPS with a valid certificate — SSL errors are a common cause of failed deliveries and will page Float’s support team.
  • No authentication challenge (signature verification replaces it).
  • If your infrastructure requires IP allowlisting, ask Float support about static egress IPs.

Testing your handler locally

Simulate a callback with curl (signature computed with your sandbox signing key):
For end-to-end sandbox tests, expose your local server with a tunnel (ngrok, Cloudflare Tunnel) and use the tunnel URL as notify_url.