Skip to main content

Set up an endpoint

Tell us an https URL for each mode at support@flipeet.io. If you don’t give a sandbox URL, sandbox events go to your live URL, signed with the sandbox secret. You can also pass callbackUrl on a single deposit or withdrawal to send its events somewhere else. Reply with any 2xx status within 10 seconds. Do slow work, like sending emails, after you reply.

Events

The event name is in the body’s event field and in the x-flipeetpay-event header. Every event has reference and livemode. Ramp orders are described by their status instead.

Headers

Verify signatures

Each mode has its own signing secret, which we send with your key. The v2 signature is an HMAC-SHA256, keyed with that secret, of the timestamp, a full stop, and the raw body. Because the timestamp is signed, you can refuse old deliveries that someone replays.
  • Use the raw body. Parsing the JSON and encoding it again changes the bytes, and the check fails. In Express, use express.raw() on this route.
  • Compare in constant time, as above, not with ===.
  • Reject anything older than five minutes.
When we roll your webhook secret, the old one stops working at once. Ask us to roll it only when you’re ready to put the new one on your server.

Retries and duplicates

If your endpoint doesn’t answer with 2xx, we try again: deposit, withdrawal and ramp events after 5 and 30 seconds, and checkout events after 2 seconds. After that the delivery is marked failed. Find it with List webhook deliveries and send it again with Resend a webhook. You may get the same event more than once. Use reference and event to make handling it twice harmless, for example by marking an order paid only if it isn’t already.

Test your endpoint

webhook.test