Payouts API
Pay your sellers straight into their UK bank accounts. You say how many pounds the seller gets, we handle the rest.
Overview
You keep taking payments the way you do now (any checkout — Whop, Stripe, your own) and decide when each recipient is paid. When you want to pay someone, call POST /v1/payouts with the recipient's bank details and the amount in pounds. The money goes out on Faster Payments, usually within minutes.
How money moves
POST /v1/payouts — "pay Sam £12".Topping up your wallet
| Option | How | Good for |
|---|---|---|
| Bank transfer in | Send pounds from your bank to your Kronos account details. They're converted to USDC when they arrive. | Most people — simple and predictable |
| USDC withdrawal | Withdraw USDC from your checkout provider or exchange straight to your wallet address (shown in the dashboard), on the network shown there. | Speed — check the provider's withdrawal fee first |
Top up in batches (e.g. once a day) rather than per sale. The wallet needs enough to cover the seller's amount plus the bank's share of the fee — the quote tells you exactly how much.
Getting your API keys
- We add you. Tell us the work emails that should have access — they can sign in to the dashboard straight away.
- Sign in at your own page,
partners.getkronos.io/<your-name>(we send you the link), with your work email. We email a 6-digit code — no password. - Open "API keys" → "New sandbox key". Give it a name, copy the key (it's shown once) and put it in your server's environment variables — never in an app or website.
- Build and test against the sandbox — it runs on our banking partner's sandbox, so the same code works live; no real money moves.
- Verify your business. We send a link; it takes about 10 minutes (company, directors, owners).
- Once approved, "New live key". Swap the sandbox key for the live key — nothing else changes.
You can have up to 5 keys per environment and switch any key off instantly from the dashboard (e.g. if one leaks, or when a developer leaves).
Dashboard
partners.getkronos.io shows your balance in £, every payout and its status, this month's fees, your invoices and your API keys — for both sandbox and live (switch at the top). Team admins can also send a one-off payout from the dashboard ("New payout") — live ones are confirmed with an emailed code. Viewers can only look. Every action is in the audit log under Compliance.
Sandbox & live
| Sandbox | Live | |
|---|---|---|
| Base URL | https://auth.getkronos.io/functions/v1/partner-api — the key decides which | |
| Key starts with | kp_sandbox_ | kp_live_ |
| Money | Test money on HiFi's sandbox (about £7,900 of test float). Nothing real moves. | Real money from your wallet |
| When | Straight away | After business verification |
| Bank details | Any valid-looking sort code and account number | The seller's real details |
| Payout status | Follows the sandbox bank's real status updates | Usually minutes (Faster Payments) |
| Charged? | Never | Completed payouts, on the monthly invoice |
Same base URL, same requests, same responses — the key decides which one you're in.
Authentication
curl https://auth.getkronos.io/functions/v1/partner-api/v1/account \ -H "Authorization: Bearer kp_sandbox_YOUR_KEY"
Everything is JSON. Money amounts are strings in pounds with up to two decimals, like "12.00".
GET/v1/account
{ "object": "account", "name": "Acme Marketplace", "status": "active", "environment": "live",
"funding_wallet": { "currency": "USDC", "chain": "SOLANA", "address": "7Xf…q3" },
"enabled_countries": ["GB"],
"prices": { "payout": "£0.99 + 1.00%", "monthly_account": "£15.00" } }
GET/v1/balance
{ "object": "balance", "usdc": "5330.00", "approx_gbp": "4210.70", "gbp_per_usd": 0.79 }
POST/v1/quotes
See what a payout will cost before sending it.
curl -X POST …/v1/quotes -H "Authorization: Bearer $KEY" -H "Content-Type: application/json" \
-d '{ "country": "GB", "amount_gbp": "12.00" }'
{ "object": "quote", "country": "GB",
"seller_receives_gbp": "12.00",
"fee_gbp": "1.11",
"wallet_sends_usdc": "16.37",
"exchange_rate": { "gbp_per_usd": 0.79 },
"fee_breakdown": { "taken_in_transfer_gbp": "0.90", "on_monthly_invoice_gbp": "0.21" } }
The fee is always £0.99 + 1% in total. Part of it (the bank's share) is taken inside the transfer — that's why the wallet sends a little more than the seller gets — and the rest is on your monthly invoice.
POST/v1/payouts
Send an Idempotency-Key header — use your own order or payout id. If you send the same request twice (a retry, a timeout), the seller is still only paid once.
curl -X POST …/v1/payouts \
-H "Authorization: Bearer $KEY" -H "Content-Type: application/json" \
-H "Idempotency-Key: order_8841" \
-d '{
"country": "GB",
"amount_gbp": "12.00",
"reference": "order_8841",
"recipient": {
"first_name": "Sam", "last_name": "Taylor", "email": "sam@example.com",
"address": { "line1": "12 Ecclesall Rd", "city": "Sheffield", "postal_code": "S11 8HW" },
"bank": { "bank_name": "Monzo", "sort_code": "040004", "account_number": "12345678" }
}
}'
201 Created
{ "id": "4b1c…", "object": "payout", "environment": "live", "status": "processing",
"reference": "order_8841", "country": "GB", "amount_gbp": "12.00", "fee_gbp": "1.11",
"wallet_sent_usdc": "16.37", "recipient": { "name": "Sam Taylor", "account_last4": "5678" }, … }
| Field | Rules |
|---|---|
amount_gbp | What the seller receives: "1.00" to "20000.00" |
recipient.bank | sort_code 6 digits, account_number 8 digits, bank_name |
recipient.address | line1, city, postal_code |
recipient.type | Optional: individual (default) or business |
GET/v1/payouts/{id} · /v1/payouts
| status | Meaning |
|---|---|
pending | Saved, waiting for the bank to confirm |
processing | On its way |
completed | In the seller's account. Only completed payouts are charged. |
failed / cancelled | Didn't go — nothing charged. See failure_reason. |
returned | The seller's bank sent it back |
GET/v1/usage · /v1/invoices · /v1/keys
/v1/usage shows this month so far (payouts, amount paid to sellers, fees and the invoice so far). /v1/invoices lists past invoices, /v1/keys your keys (only the start of each key).
Errors
{ "error": { "code": "invalid_recipient", "message": "Some seller details are missing.",
"details": { "missing": ["recipient.bank.sort_code (6 digits)"] } } }
| HTTP | code |
|---|---|
| 400 | idempotency_key_required, invalid_json |
| 401 | unauthorized |
| 402 | insufficient_funds — top up and retry |
| 403 | partner_not_active, api_key_required |
| 422 | invalid_amount, invalid_recipient, corridor_not_enabled, recipient_account_rejected |
| 502 | payout_not_created — nothing sent; retry with the same key |
Sandbox tests
| Try | You'll see |
|---|---|
| Any valid seller | processing, then completed when HiFi's sandbox settles it |
Account number ending 0000 | failed (bank rejected the details) |
Pricing
| What | Price |
|---|---|
| Each payout to a UK bank | £0.99 + 1% of the payout |
| Per seller | Nothing |
| Monthly account | £15 |
| Business verification | £39, once |
| Network fees | Cost + 10% (about 2p a payout) |
| Bank exceptions (returns, recalls, traces) | Cost + 20%, only if they happen |
Invoices arrive on the 1st for the month before, by email and in the dashboard.
Compliance
- Your business is verified once (company, directors, owners) through our banking partner.
- Sellers don't need accounts — just their name, address and bank details.
- Every payout is checked by the bank. If the details are rejected, nothing is sent.
- You stay in charge of your marketplace rules, refunds and when sellers are paid.
- KronosPay LLC is a financial technology company, not a bank. Payouts are made through regulated partners.
Questions or dashboard access: support@getkronos.io