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.

Your server POST /v1/payments signed webhooks Finscale gateway api.finscale.dev/v1 risk screening routing engine auth-rate · health · cost · rules prov_eu_acq_01 prov_eu_acq_02 prov_us_psp_01 ranked candidates + failover cleared funds, normalized per provider stl_ report po_ payout 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:

  1. Create

    Your server creates a Payment: "amount": 4900, "currency": "EUR". Finscale validates the request, applies your Idempotency-Key, and assigns pay_8Q2mX4nT1cVb.

  2. Screen

    For card-family payments, the risk engine scores the transaction (0–99) and decides: approved, review, or blocked. Approved payments continue; blocked ones fail before any provider is touched.

  3. Authenticate

    If the customer must act — a bank redirect, a 3-D Secure challenge — the payment waits in requires_action and next_action.url tells you where to send them.

  4. 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.

  5. Capture

    On approval the payment reaches succeeded (or holds in requires_capture if you chose manual capture). A payment.succeeded webhook tells your server to fulfil.

  6. 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 buildFinscale runs
One POST /v1/payments call per orderProvider connections, formats, and retries across the whole set
A redirect to next_action.url when askedHosted payment pages, 3-D Secure, and method-specific UX
A webhook endpoint that fulfils ordersSigned, retried event delivery for 72 hours
Refunds by payment idFinding the original provider and its refund rail
A daily reconciliation job against one reportPer-provider settlement files, netting, and payout scheduling
Nothing when a provider degradesHealth scoring, re-ranking, and automatic failover

The five objects that matter

The API surface is small. Almost everything hangs off the Payment:

ObjectPrefixWhat it is
Paymentpay_One attempt to collect money. Carries status, risk, and the full provider_attempts routing history.
Refundrf_Money going back — full or partial, against any succeeded payment, whichever provider processed it.
Eventevt_Something happened — payment.succeeded, settlement.report.ready, … Delivered signed to your webhook endpoints.
Settlement reportstl_A per-provider, per-day statement of gross, refunds, fees, and net — with your reference on every CSV row.
Payoutpo_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:

POST /v1/payments
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"
  }'
Try it now The sandbox at 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