Setting up the webhook
INFI sends an HTTP POST notification to your server when a charge or withdrawal status changes. You can configure up to 6 URLs, each receiving specific event categories (or everything).
Diagram
Each URL only receives the events it matches. Multiple URLs can match the same event — all receive it in parallel.
Registration
In the INFI dashboard, under Webhooks → Configuration:
- Click Add webhook.
- Enter the HTTPS URL (HTTP is rejected — security).
- Choose what this URL receives:
- All events (catch-all).
- Select categories: check one or more of
cashin,cashout,refund,dispute,chargeback. See the full list in Events.
- Mark active and save.
Limit: 6 active webhooks per account. To change, remove one before adding another.
Accounts created before May/2026 may have a legacy URL that receives all events. It still works as a fallback if none of the new webhooks match the event. When configuring per-category URLs, consider removing the legacy one (the “remove” button in the dashboard).
Configuration example: 3 URLs by purpose
URL 1: https://api.yourcompany.com/webhooks/infi-cashin
→ category "cashin"
→ receives transaction.paid, transaction.failed, transaction.cancelled, transaction.expired
URL 2: https://api.yourcompany.com/webhooks/infi-cashout
→ category "cashout"
→ receives all transfer.* (10 events)
URL 3: https://api.yourcompany.com/webhooks/infi-refund
→ category "refund" + "chargeback"
→ receives transaction.refunded, transaction.partially_refunded, transaction.chargebackRequest headers
| Header | Description |
|---|---|
Content-Type | application/json |
X-Infi-Event | Canonical name of the event (e.g., transaction.paid). |
X-Infi-Timestamp | Unix timestamp in seconds, part of the signature. |
X-Infi-Signature | sha256=<hex> — HMAC-SHA256. See Signature. |
X-Infi-Event-Id | Unique event ID (e.g., evt_1715000000000_abcdef12). Same across fanout URLs and manual resends — use it for dedup. |
Body
{
"event": "transaction.paid",
"eventId": "evt_1715000000000_abcdef12",
"transactionId": "Q4t9aV...",
"status": "paid",
"amountCents": 1000,
"feeCents": 10,
"netCents": 990,
"paidAt": "2026-05-06T14:35:12.000Z",
"timestamp": "1715000000"
}| Field | Description |
|---|---|
event | Canonical event name. See Events. |
eventId | Unique event identifier. Shared across fanout URLs and manual resends — use it for dedup. |
transactionId | Identifies the transaction. |
status | New status. See Status. |
amountCents, feeCents, netCents | Amounts in cents. |
paidAt | ISO 8601 UTC when the final status is paid; null otherwise. |
timestamp | Echo of X-Infi-Timestamp for cross-validation. |
INFI delivers the webhook in a single automatic attempt, with an 8-second timeout. If your application does not respond, the event is not redelivered automatically. Recommended strategy:
- Polling via
GET /v1/transactions/:idas a fallback to recover status. - Manual resend in the dashboard — every delivery is stored for 60 days and can be re-fired. See Manual redelivery.
Expected response
- Return any
2xxwithin 8 seconds. - Do heavy processing in background (worker, queue). Acknowledge receipt and enqueue.
Next
- Events — full list.
- Signature — how to validate.
- Retry — fallback strategy.
- Redelivery — how to manually resend a delivery.