Cheapest
1 leg- Cost
- £0.10
- ETA p50
- 2 min
- Likely
- 97%
- Custody
- none
01 A payment in nine scenes
Unirail is routing intelligence for apps that move money: one API over the PISPs, aggregators and KYC vendors you already have deals with, a priced and reasoned decision for every payment, and your credentials left in your own vault. Funds go bank to bank, never through Unirail.
Scroll to follow one payment
02 The ask
Maya owes Theo £50. Your app holds both accounts as payto:// addresses and sends Unirail masked metadata only, no names and no account numbers, with one question: which way should this go?
03 Route quotes
The decision comes back as route quotes: legs, cost, ETA and custody for each feasible path, priced from your own provider contracts, with the reason each one exists. Routes your policy doesn't admit never reach the list.
04 Approval
Your platform binds its user's approval, a passkey for instance, to the quote's id anddigest. If payer, payee, amount, legs or cost change afterwards, the intent fails withquote_changed instead of moving different money.
05 In transit
Your backend calls the provider Unirail picked, with your own credentials, through the SDK. The money goes from Maya's bank straight to Theo's and never passes through Unirail; custody stays none.
06 Arrival
Whichever provider ran it, the outcome reaches your app as one event type, signed per Standard Webhooks. Verify it once and the same code holds for every bank, PISP and country behind it.
07 Two modes
Your licences, your provider deals, your KYC. Unirail plugs into the secrets manager you already run (Infisical first), so adding a provider never means new env vars.
08 Deals and the marketplace
Contracts, fees and volume tiers sit beside live routing data, so every negotiation starts from what switching would save. The marketplace shows who else carries each capability, country by country: banking first, then KYC, account checks and compliance.
09 Your turn
The SDK takes your secret key and the two payto:// accounts, and your user's approval binds to what comes back. Everything around it lives in the dashboard.
import { createUnirail } from "@unirail/sdk";
const unirail = createUnirail({ apiKey: process.env.UNIRAIL_SECRET_KEY });
// Every feasible route, priced: cheapest, fastest, recommended.
const { quotes } = await unirail.routeQuotes.create({
from: payer, to: payee,
amount: { value: "5000", asset: "iso4217:GBP" },
});
// Bind your user's approval to id + digest, then run it.
const intent = await unirail.paymentIntents.create(
{ quote: quotes[0].id, digest: quotes[0].digest, returnUri },
{ context: { idempotencyKey: `pay:${id}` } },
);