Create a Payment
Create a payment and get a hosted pay URL.
Create a Payment
POST https://api.open-finance.ai/v2/payments
This creates a payment and returns its id plus a hosted payUrl. At minimum
you send paymentInformation (amount, currency, description) and identify the
payee — either a merchantId (see Merchants (Payees)) or the creditor's
account details. Requires a Bearer token (see Authentication); rejected
requests (validation, disallowed redirect URL, sandbox gate, …) return the
standard error shape — see Errors.
Payments require a connection. To make or receive a payment, the usermust have a linked bank (a Connection), and the payment must involve one of
their connected accounts — either as the debtor (paying from a connected
account) or the creditor (receiving into a connected account). If neither
side is a connected account, the payment can't proceed. Connections are created
only in the Financy UI — see Connections.
Financy payment fees
The request body is identical for app and API-key callers. For each new ILS
payment, Financy snapshots the organization's plan and fee when the payment is
created, then accrues that fee once — on the first successful completion.
| Plan | Fee on a successful payment |
|---|---|
| Starter | 0.4% of the amount, minimum ₪0.50 |
| Pro | 0.3% of the amount, minimum ₪0.50 and maximum ₪3.50 |
| Ultra | 0.2% of the amount, minimum ₪0.50 and maximum ₪2.70 |
For bulkPaymentInformation, the percentage and maximum are calculated for
each entry and then summed. The ₪0.50 minimum applies once to the complete bulk
payment, so a bulk request can exceed the single-entry maximum shown above.
Ultra examples: ₪1 → ₪0.50, ₪250 → ₪0.50, ₪1,000 → ₪2.00, and ₪1,350
or more → ₪2.70. A failed or canceled payment is not charged. Retries and
duplicate webhooks do not accrue the fee twice. Sandbox/fake providers, ATM
payments, non-ILS payments, and organizations outside Financy remain excluded.
paymentInformation
paymentInformationDescribes what to charge and (unless you pass a merchantId) who to pay:
| Field | Required | Description |
|---|---|---|
amount | ✅ | Amount to charge, greater than 0. E.g. 100. |
currency | ✅ | ISO-4217 code, e.g. ILS. |
description | ✅ | Description shown to the payer. |
creditorName | ✳️ | Payee name. Required unless a merchantId is set. |
creditorAccountType | ✳️ | Payee account type: iban or bban. Required unless a merchantId is set. |
creditorAccountNumber | ✳️ | Payee account number (e.g. IL730200040000000552717). Required unless a merchantId is set. |
debtorAccountType | – | Payer account type (iban / bban), when known up front. |
debtorAccountNumber | – | Payer account number, when known up front. |
Provide the payee either by settingmerchantIdat the top level orby giving
creditorName+creditorAccountType+creditorAccountNumber
here. Omitting both returnsMerchant Id or creditor info is required.
Top-level fields
| Field | Description |
|---|---|
merchantId | Pay a saved payee instead of inline creditor details (see Merchants (Payees)). |
redirectUrl | Where the user returns after the hosted journey completes. |
providerIds | Restrict bank selection to specific providers (see Providers & Branches). |
language | Journey language: he or en. |
paymentService | Force a rail: masav, fp, or zahav (see below). |
psuId | The payer's national ID / passport, when the provider requires it. |
psuCorporateId | The payer's business ID, for corporate payments. |
version | PSD2 API version. Required for every bulk payment; send exactly v1.8 (including the leading v). |
allowBusiness | Allow the payer to pay from a business account. |
isBusiness | Require the payer to pay from a business account. |
iframe | Render the hosted journey inside an iframe. |
externalId | Your own reference id, echoed back on the payment. |
includeFakeProviders | Allow sandbox providers (testing) — see Errors (sandbox gate). |
directPayOnly | Complete the payment without the open-banking consent journey. |
callbackInformation | Webhook configuration — see Payment Webhooks. |
This covers the common fields.POST /v2/paymentsalso accepts
bulkPaymentInformationandperiodicPaymentInformation(for bulk and
recurring payments) and request-to-pay options — see the API Reference for
the full, field-by-field list.
Bulk payments (bulkPaymentInformation)
bulkPaymentInformation)Every bulk payment must include the top-level version field with the exact
value v1.8. The leading v is part of the value; "version": "1.8" is
invalid.
When creating bulk payments, different banks have different requirements for the
paymentInformationId field:
| Bank | paymentInformationId behavior |
|---|---|
| Discount, Mercantile | Must be one of salaries or suppliers. Use the bulkType field instead (defaults to suppliers). Any freeform value is ignored. |
| Beinleumi group (Beinleumi, Otsar Hahayal, Pagi, Masad, U-Bank) | Accepts freeform Max35Text. Falls back to externalId or paymentId if not set. |
| Other banks | Accepts freeform Max35Text (up to 35 characters). |
For Discount and Mercantile bulk payments, set the bulkType field:
{
"version": "v1.8",
"bulkPaymentInformation": {
"bulkType": "salaries",
"debtorAccountNumber": "IL620111111111111111111",
"debtorAccountType": "iban",
"payments": [...]
}
}If you previously sent paymentInformationId as "salaries" or "suppliers",
that still works — but for new integrations, use bulkType. When both are sent
and disagree, bulkType wins.
Once a bank has been selected, GET /payments/{id} returns the bulkType that
was actually sent, and for Discount and Mercantile paymentInformationId
returns that same value.
Payment rails (paymentService)
paymentService)If you don't set paymentService, Financy picks the appropriate rail. The three
rails are:
| Rail | When it's used |
|---|---|
masav | Default. Transfers under 1,000,000 ILS. |
zahav | Fast/high-value transfers over 1,000,000 ILS (fees may apply). |
fp | Transfers within the same bank (creditor and debtor share a provider). |
Request
curl -X POST https://api.open-finance.ai/v2/payments \
-H "Authorization: Bearer <accessToken>" \
-H "Content-Type: application/json" \
-d '{
"redirectUrl": "https://your-app.com/payment/done",
"language": "he",
"paymentInformation": {
"amount": 149.90,
"currency": "ILS",
"description": "Order #4471"
}
}'Response
{
"id": "01J8X...",
"payUrl": "https://api.open-finance.ai/journey/01J8X..."
}id— thepaymentIdyou use for status polling and for the direct-init step.payUrl— the hosted journey. Hosted flow: redirect the user here and skip
to Payment Status. Direct flow: ignorepayUrland continue to
Initiate a Payment (Direct).
SetcallbackInformationto be pushed the outcome instead of polling — seePayment Webhooks. For what each status means, see Payment Statuses & FAQ.
Updated 1 day ago

