(00)
92 operations. Sandbox needs no approval.
One HTTPS API over verification, custody, accounts, payouts and standing conversion. Everything below is callable with a sandbox key, which moves no real money and is issued from the console without waiting for approval.
curl https://api.skerry.xyz/whoami \ -H "Authorization: Bearer sk_test_…"
That is the quickest way to prove a key works: it answers with the partner, project, mode and scopes behind it. The environment comes from the key rather than the URL, so the same code runs against sandbox and live by swapping one value.
(01)
True of every endpoint.
(02)
5 operations
The two calls worth making first. `/` needs no key and lists what exists; `/whoami` proves the key you were given works and says which environment it is in.
The index. Public, so a new developer can look before they have a key.
This same reference as an OpenAPI 3.1 document, for Postman, a generator or an agent. Public.
The partner, project, mode and scopes behind the key you sent.
What this project may do right now, and what is merely coming.
{ customer_id }
Accept the terms a customer must agree to before they can be verified.
(03)
9 operations
A customer is a business you bring to the platform. It is verified in its own right, and everything else — wallets, accounts, payees — hangs off one.
{ legal_name, address, external_id? }
Onboard a business.
The businesses this project has onboarded.
One business, with its verification state.
{ legal_name?, address?, external_id? }
Correct details on a business.
{ }
Start or re-run verification.
Where verification has got to.
{ return_url, refresh_url?, steps? }
A link the business owner opens to finish verification (and card-acceptance setup) on hosted pages. You send no people, birth dates or documents.
The page behind an onboarding link. Public: the token is the credential. Redirects to the next hosted step, then back to your return_url.
Whether a business like this can be served, from where, for what, with machine-readable reasons. `?country=&business_type=¤cy=&industry=`
(04)
9 operations
Where a customer's money sits. A wallet holds stablecoin; an account is fiat at a regulated institution; a card spends from one.
{ chain, currency }
Create a stablecoin wallet.
The customer's wallets and balances.
{ currency, country }
Open a fiat account.
The customer's fiat accounts.
{ account_number, routing, country }
Link an external bank account.
{ account_id }
Issue a card against an account.
The customer's cards.
{ chain, currency }
A deposit memo, for chains where one shared address serves everybody.
The customer's deposit memos. A payer who omits the memo cannot be attributed.
(05)
8 operations
A payee is somewhere money can go; a payout sends it there. Quote first when the amount matters — a quote fixes the rate for a short window.
{ name, rail, details }
Add a destination for money.
The customer's payees.
{ from, to, amount, payee_id }
What a payout would cost, at a rate held briefly.
{ payee_id, amount, currency, quote_id? }
Send money to a payee.
Payouts this project has made.
One payout and where it has got to.
Cancel a payout that has not left yet.
The rate between two currencies. `?from=&to=`
(06)
2 operations
A standing order converts on a schedule rather than on a call, so a business can hold one currency and settle in another without writing a cron job.
{ from, to, amount, cadence }
Convert on a schedule.
The customer's standing orders.
(07)
6 operations
Most state changes arrive here rather than in a response, because verification and settlement finish long after the call that started them. Replay is deliberate: a missed delivery is recoverable without asking us.
What has happened, newest first.
Deliver an event again, to every endpoint that wanted it.
{ url, event_types }
Register an endpoint.
The endpoints this project has registered.
{ url?, event_types?, status? }
Change an endpoint's URL, events or status.
Remove an endpoint.
(08)
22 operations
Take card and wallet payments for a customer. The payer pays on a hosted page, so card details never reach Skerry or you. Amounts are integer minor units next to a currency code. Build orders from `payment.succeeded`, never from the payer's browser returning to your site.
{ customer_id, amount | line_items, currency, success_url, cancel_url?, methods?, capture?, save_method?, payer_id? | payer?, expires_at?, reference?, metadata?, ui? }
Start a hosted checkout for a payer.
Checkout sessions, newest first. `?customer_id=&status=`
One session. While open, this also asks the processor so a missed webhook cannot mislead.
{ }
Close an open session so it can no longer be paid.
{ customer_id, amount, currency, description?, reusable?, max_uses?, expires_at?, reference?, success_url? }
A reusable or single-use link to a hosted checkout for a fixed amount.
Payment links, newest first.
One payment link, with how many times it has been used.
{ status }
Pause, resume or disable a link.
Payments, newest first. `?customer_id=&status=&reference=`
One payment: status, fee, amounts received and refunded.
{ customer_id, payer_id, payment_method_id, amount, currency, off_session: true, capture?, reference?, description?, metadata? }
Charge a saved method with the payer absent, under the mandate they gave. Needs an Idempotency-Key.
{ amount? }
Collect funds that were held. May capture less than the hold.
{ }
Release a hold, or abandon a payment that has not succeeded.
{ amount?, reason? }
Refund all or part of a payment. Needs an Idempotency-Key.
Refunds made against a payment.
Disputes against payments, newest first. `?customer_id=&status=`
One dispute, with the date evidence is due.
{ evidence: { ... }, submit? }
Send written evidence, and submit it when complete.
Card proceeds on their way to the business's bank, newest first. `?customer_id=`
One settlement.
{ customer_id, amount, currency }
Send proceeds to the business's bank now. Needs an Idempotency-Key.
What the customer holds per currency: card proceeds (available, pending) and stablecoin.
(09)
10 operations
A payer is someone who pays your customer. Save a method once, with their agreement, and charge it later or on a schedule. The agreement is the mandate. Card numbers are never returned.
{ customer_id, email?, name?, external_id? }
Record someone who pays a customer.
Payers, newest first. `?customer_id=`
One payer.
Methods the payer saved: brand, last four, expiry, and the mandate.
Forget a saved method and revoke its mandate.
{ payer_id | payer, success_url, cancel_url }
A hosted page where a payer saves a method for later, without paying now.
{ customer_id, payer_id, payment_method_id, currency, interval, interval_count?, items: [{ name, amount, quantity? }], trial_days?, reference? }
Charge a payer on a schedule from a saved method. Needs an Idempotency-Key.
Subscriptions, newest first. `?customer_id=&status=`
One subscription.
{ at_period_end? }
End a subscription now or at the end of the paid period.
(10)
10 operations
Constrain what a key, or an agent acting through it, can move. A policy names the business accountable and the person who approved it, caps amounts, restricts destinations and currencies, and can require a person to approve large operations. A key that has ever had a policy stays restricted.
{ customer_id, approved_by, key_id? | agent_id?, max_amount?, daily_max?, monthly_max?, approval_above?, currencies?, operations?, payee_allow_list?, expires_at? }
Limit a key or an agent.
Policies, newest first. `?customer_id=&key_id=&status=`
One policy.
{ max_amount?, daily_max?, monthly_max?, approval_above?, expires_at? }
Change a policy's amounts or expiry. Who it binds cannot change.
{ reason? }
Revoke a policy, immediately.
Operations held for a person to approve. `?status=pending`
One held operation, as it was asked.
{ note? }
Approve a held operation and run it once. The approving key must not be the one that asked.
{ note? }
Refuse a held operation.
What the calling key may still move, per window.
(11)
5 operations
Convert a customer's own balance between currencies with a priced, expiring quote, and export the double-entry books for an accountant.
{ customer_id, from: { currency, wallet_id }, to: { currency, wallet_id | payee_id }, amount }
A priced offer to convert, valid for a short time and usable once.
{ quote_id }
Execute a quote. Needs an Idempotency-Key.
Conversions, newest first. `?customer_id=`
One conversion and whether it has settled.
Double-entry entries for a period, as JSON or CSV. `?from=&to=&kind=&format=csv`
(12)
1 operations
Helpers that exist only with a test key, so an integration can be built and exercised without a browser or a bank.
{ outcome }
Act as the payer: succeed, decline, run short of funds, or open a dispute.
(13)
5 operations
What the platform pays on balances, and what this project has consumed against its plan.
The stablecoins this project can hold.
{ currency }
Enable a coin for this project.
What a balance in this coin earns.
Usage against the plan's limits — the same count a call is refused against.
Anything compliance has asked a customer for.
(14)
30 codes.
Failures carry a stable code. Branch on that, never on the message — messages are written for people and will change.
The body is wrong. `detail.field` names which part.
No key, or not a key we issued. Send it as `Authorization: Bearer sk_…`.
The key was revoked in the console. Issue another.
The plan does not include this. Usage on the project page says where you stand.
The key is narrower than the call. Each operation names its scope.
A live key was used before live was approved. Sandbox still works.
The account is suspended. Nothing will succeed until that is lifted.
No such object in this project — including one that belongs to somebody else.
The object is already there. Usually a retry without an Idempotency-Key.
The same Idempotency-Key is still running. Wait and read the first answer.
This call moves money; send an Idempotency-Key so a retry cannot act twice.
The payer's bank or card refused. `detail.reason` says why in plain terms.
A spend policy on this key refuses the amount. `detail.limit` is per_payment, daily or monthly.
The destination is not on this key's allow-list.
The spend policy on this key has expired.
Every spend policy on this key was revoked.
This key may only act under a spend policy and none is attached.
The key that asked for an operation cannot approve it.
The customer has not finished the hosted onboarding this needs. `detail.next_step` says which.
The payer has not agreed to be charged later.
The refund is more than what remains of the payment.
The conversion quote's time is up. Ask for a new one.
The market moved beyond the quote's tolerance. Ask for a new one.
That quote has already been used.
Not an error: the operation is held for a person. The body names the approval.
Too many requests on this key. `Retry-After` says when to try again.
Not available for this project. `/capabilities` says what is.
Built, not yet switched on for this project.
A provider failed. Safe to retry with the same Idempotency-Key.
Ours. Quote the `request_id` and we can find the call.