Payment Webhooks
Get notified when a payment's status changes, instead of polling.
Payment Webhooks
Instead of polling Payment Status, register a webhook and Financy will
push you an update whenever the payment's status changes (e.g. it settles or
is rejected).
Configure per payment
Set callbackInformation.webhooks on the body of Create a Payment:
{
"paymentInformation": {
"amount": 149.90,
"currency": "ILS",
"description": "Order #4471"
},
"callbackInformation": {
"webhooks": {
"enabled": true,
"successUrl": "https://your-app.com/webhooks/payment/success",
"failUrl": "https://your-app.com/webhooks/payment/fail",
"customHeaders": { "X-My-Token": "…" },
"oauth": {
"enabled": false
}
}
}
}| Field | Description |
|---|---|
enabled | Turns webhooks on for this payment. |
successUrl | Where Financy POSTs when the payment reaches a successful state. |
failUrl | Where Financy POSTs when the payment fails (RJCT / ERROR). |
customHeaders | Extra headers to include on the webhook request (e.g. a shared secret). |
oauth | Optional — secure your endpoint with an OAuth token (see below). |
Securing the callback with OAuth
If your webhook endpoint requires a bearer token, set oauth:
| Field | Required | Description |
|---|---|---|
enabled | – | Turn OAuth on for the callback. |
clientId | if enabled | OAuth client id Financy uses to get a token. |
clientSecret | if enabled | OAuth client secret. |
tokenUrl | – | Token endpoint Financy calls. |
audience | – | Token audience. |
scope | – | Token scope (e.g. read:accounts). |
Financy fetches a token from tokenUrl and sends it as a Bearer token on the
webhook request.
You can also enable webhooks globally in the Financy Dashboard (update mode)with a success and failure URL, instead of per payment.
What Financy sends
Webhooks are always an HTTPS POST with the event data in the request body.
For a payment, the event is Payment Status Change:
{
"paymentId": "01J8X...",
"paymentStatus": "ACSC",
"userId": "user-1234",
"orgId": "org_...",
"bankName": "Bank Hapoalim",
"paymentError": { "message": "", "type": "" }
}| Field | Description |
|---|---|
paymentId | The payment whose status changed. |
paymentStatus | The new status (see Payment Statuses & FAQ). |
userId / orgId | The user and organization the payment belongs to. |
bankName | The payer's bank. |
paymentError | { message, type }, populated when the payment failed. |
These fields are sent for every payment product. One extra field,
requestStatus, is sent for request-to-pay payments and only for those — see
below.
Request-to-pay payments
Request-to-pay (product: "request-to-pay") payments carry a second status: the
request status, which tracks the debtor's decision on the request, while
paymentStatus tracks the transfer itself. For these payments only, the webhook
body carries an extra requestStatus field, and Financy also POSTs when the
request status changes on its own — even if paymentStatus stayed the same:
{
"paymentId": "01J8X...",
"paymentStatus": "RCVD",
"requestStatus": "ACCP",
"userId": "user-1234",
"orgId": "org_...",
"bankName": "Bank Hapoalim"
}| Field | Description |
|---|---|
requestStatus | The debtor's decision on the request — PENDING, RCVD, ACCP, ACWC or RJCT. |
A rejected request (requestStatus: "RJCT") is POSTed to your failUrl, even
while paymentStatus is still in flight — the debtor turned the request down, so
there is nothing left to wait for.
requestStatusis sent only for request-to-pay payments. Webhook bodiesfor regular payments, bulk payments and standing orders are unchanged and
never include this field, so a handler that reads it can safely treat its
absence as "this was not a request to pay".
Handling webhooks
- Respond quickly with a
2xx; do heavy work asynchronously. - Treat the payload like a status poll: the rail's success code (or
ACSC/
ACCC) means done-OK;RJCT/CANC/ERRORmeans done-failed. - Verify the request is really from Financy — check your
customHeaderssecret
or the OAuth token.
A separate Connection Status Change webhook fires when a linked bank'sconnection changes state (e.g. reaches
ACTIVE/COMPLETED, orEXPIRED) —
handy for knowing when a user's data is ready. See Connections.
Updated 10 days ago

