How Finscale works
You integrate one REST API. Behind it, Finscale screens each payment for risk, routes it to the provider most likely to approve it, fails over when one doesn't, and settles the money back to your bank — with one report to reconcile. This page is the whole system on one screen.
The architecture
Five parts, one direction of flow. Your server talks to the gateway; the gateway talks to providers; providers clear funds into settlement; settlement pays out to your bank.
Providers are always opaque ids (prov_eu_acq_01, …). You never integrate, contract, or hold credentials for one — Smart routing explains why that abstraction holds.
What happens to one payment
Take the recurring example — order ord_9f21_0716, €49.00. From your POST /v1/payments to money in your bank:
-
Create
Your server creates a Payment:
"amount": 4900, "currency": "EUR". Finscale validates the request, applies your Idempotency-Key, and assignspay_8Q2mX4nT1cVb. -
Screen
For card-family payments, the risk engine scores the transaction (0–99) and decides:
approved,review, orblocked. Approved payments continue; blocked ones fail before any provider is touched. -
Authenticate
If the customer must act — a bank redirect, a 3-D Secure challenge — the payment waits in
requires_actionandnext_action.urltells you where to send them. -
Route
The routing engine ranks eligible providers by auth-rate, health, cost, and your rules, then submits the transaction. If the first provider times out or errors, failover retries the next — inside the same API call.
-
Capture
On approval the payment reaches
succeeded(or holds inrequires_captureif you chose manual capture). Apayment.succeededwebhook tells your server to fulfil. -
Settle
The provider clears the funds. Finscale normalizes every provider's files into one settlement report (
stl_…) and pays the net out (po_…) to your bank — one payout per currency.
What you build vs. what Finscale runs
| You build | Finscale runs |
|---|---|
One POST /v1/payments call per order | Provider connections, formats, and retries across the whole set |
A redirect to next_action.url when asked | Hosted payment pages, 3-D Secure, and method-specific UX |
| A webhook endpoint that fulfils orders | Signed, retried event delivery for 72 hours |
| Refunds by payment id | Finding the original provider and its refund rail |
| A daily reconciliation job against one report | Per-provider settlement files, netting, and payout scheduling |
| Nothing when a provider degrades | Health scoring, re-ranking, and automatic failover |
The five objects that matter
The API surface is small. Almost everything hangs off the Payment:
| Object | Prefix | What it is |
|---|---|---|
| Payment | pay_ | One attempt to collect money. Carries status, risk, and the full provider_attempts routing history. |
| Refund | rf_ | Money going back — full or partial, against any succeeded payment, whichever provider processed it. |
| Event | evt_ | Something happened — payment.succeeded, settlement.report.ready, … Delivered signed to your webhook endpoints. |
| Settlement report | stl_ | A per-provider, per-day statement of gross, refunds, fees, and net — with your reference on every CSV row. |
| Payout | po_ | The bank transfer that pays a report's net to your account. |
One request, end to end
The canonical create call. In test mode the whole chain — routing, webhooks, settlement reports — runs against simulated providers:
curl https://api.finscale.dev/v1/payments \
-H "Authorization: Bearer sk_test_51FinscaleDemo…" \
-H "Idempotency-Key: idem_ord_9f21_0716" \
-H "Content-Type: application/json" \
-d '{
"amount": 4900,
"currency": "EUR",
"payment_method": "ideal",
"reference": "ord_9f21_0716",
"customer": { "email": "anna@example.com" },
"return_url": "https://shop.example.com/checkout/return"
}'
{
"id": "pay_8Q2mX4nT1cVb",
"object": "payment",
"amount": 4900,
"currency": "EUR",
"status": "requires_action",
"payment_method": "ideal",
"reference": "ord_9f21_0716",
"provider": "prov_eu_acq_01",
"next_action": {
"type": "redirect",
"url": "https://pay.finscale.dev/r/8Q2mX4nT"
},
"created_at": "2026-07-16T09:24:31Z",
"livemode": false
}
api.finscale.dev accepts any sk_test_ key. Run the request above as-is, or use the API playground to explore the surface without leaving the docs.
Where to go next
- Quickstart — first payment in five minutes.
- Hosted checkout vs. API integration — pick your integration surface.
- Payment lifecycle — every status, and the full acquiring chain from created to reconciled.
- Smart routing — the decision engine, failover, and
provider_attempts. - Settlement & payouts — how money reaches your bank.