Prefer Swagger UI? Click hereThe same API in the classic OpenAPI explorer.
// how-to · 9 min read

Provision accounts for your customers

Create full Ringside accounts for your own customers from code, with no human in the dashboard. Become a developer, mint one provisioning key, then POST /v1/accounts to birth an account that has its own login, per-user vault and ko_ API key (and can create its own Brain). Fund it four ways: self-funded, a grant from your wallet, a wallet-backed voucher, or linked billing where the account spends your wallet. List, fetch and close accounts with the same key. Every id, header, funding mode and error code here is the real one from the route code.

What this is, and when to use it

The developer platform lets you provision full Ringside accounts for your end customers programmatically. Each provisioned account is a real account: its own username and password for the web UI, its own per-user vault, and its own ko_ API key, and it can create its own Brain. This is the right tool when each of your customers needs genuine isolation and their own credentials, for example a per-tenant deploy that stores its own ko_ key and creates its own Brain.

Accounts vs customers

This is not the same as a customer (cus_). A customer is a billing sub-entity under your one account, attributed with the FC-Customer header, with no login of its own. A provisioned account is a full, isolated account with its own login, vault and key. Use customers for metered resale under your account; use provisioned accounts when each customer must stand alone.

Become a developer

Provisioning is gated behind developer enrollment, which is self-serve and auto-approved. From your Ringside dashboard at /app/developer, accept the Developer Addendum (it covers your responsibility for the accounts you create and the fact that money moves from your wallet to theirs). Enrolment flips is_developer on your account and creates your developer profile. Enrolment is orthogonal to your account type, so any account can become a developer.

Then mint your provisioning key. You get exactly one active key (rotate = revoke and reissue). It is an rsk_ key, distinct from a tenant ko_ key: an rsk_ key creates accounts, a ko_ key authenticates one. The full key is shown once on creation, hashed at rest thereafter.

The rsk_ key is a provisioning credential

Anyone holding it can create accounts under you and move your money via grants and vouchers. Store it like a secret, and revoke it from the dashboard if it leaks.

Create an account

Authenticate with your provisioning key (Authorization: Bearer rsk_...). The body needs an email, a username (3-20 chars, alphanumeric or underscore), a password (8-256 chars) and a funding mode. vault_password is optional and defaults to the login password.

curl https://api.fightclub.pro/v1/accounts \
  -H "Authorization: Bearer rsk_REDACTED" \
  -H "Content-Type: application/json" \
  -d '{
    "email": "dev@customer.com",
    "username": "customer_acme",
    "password": "a-strong-password",
    "funding": "grant",
    "amount_usd": 25.0
  }'
The api_key is shown once

The api_key in the response is the new account's own ko_ key, returned a single time. It is the account's credential, not yours: stash it in that customer's vault or secret store. The separate message field is end-user-facing onboarding text (sign-in URL, username, balance, how to add funds) that you can print directly to your customer; it never contains the key.

The account works immediately — but a Brain is not auto-created

A provisioned account is a full account, so its ko_ key can call the API the moment it is returned. Provisioning does **not** create a Brain for it; if the customer needs one, create it explicitly with POST /v1/brains using the new account's key. That call works right away: Brains is enabled platform-wide in production, with no per-account enable step (the 404 note in the Brains API reference refers to that platform flag, which is on). account.id is a UUID (the platform user id), not a prefixed id like cus_ or ko_.

The four funding modes

Money always moves from you to the customer. Every transfer is atomic and insufficient-funds checked. There is no platform-imposed spend cap on linked accounts, so bounding a linked customer's burn is yours to manage.

fundingExtra inputEffect
selfnoneA dry account at $0. The customer signs in and funds it themselves (Stripe or a voucher). Use when the customer pays their own way.
grantamount_usdAtomically debits your wallet by amount_usd and credits the new account. One call, immediately usable. 402 insufficient_funds if your wallet cannot cover it.
vouchervoucher_codeRedeems a voucher you minted (wallet-backed) into the new account. Mint vouchers from your dashboard; minting debits your wallet up front, revoking an unused one refunds you.
linkednoneSets the account to bill your wallet: it holds no balance of its own and every API charge resolves to your wallet. You carry the customer's usage and bill them however you like.
How linked billing reads on the customer side

A linked account's own GET /v1/balance reports "billing": "linked" and its own (zero) balance. It does not expose your wallet total, so one customer cannot read the treasury that funds your whole fleet. The charge itself resolves to your wallet on every metered call and preflight.

Bounding a linked account's spend

There is no per-account spend cap on a provisioned account today. The monthly_budget_usd, rpm_limit and tpm_limit levers in the customer model apply to cus_ sub-entities under one account, not to a full provisioned account, so they are not a cap on a linked account's wallet draw. For a customer you do not fully trust, prefer a bounded funding mode (grant or voucher, which cap exposure to the amount you put in) over linked. With linked, your controls are watching spend in your dashboard and closing the account; a hard per-linked-account cap is on the roadmap.

The account limit

Each developer may have up to 10 active provisioned accounts. Closing an account frees a slot, so you can churn customers without a ticket. Over the limit, POST /v1/accounts returns 403 cap_reached. To raise the ceiling, open a support ticket; an admin sets it per developer, up to 10,000 active accounts, so a high-volume integrator can be lifted well past the default. There is no self-serve bulk path, so build the raise into your onboarding plan.

You are a mini-admin over the accounts you create: from /app/developer you can list them with their balance and spend, mint vouchers, and close an account. Closing it blocks its login and immediately revokes its ko_ tokens.

Rotating a single account's key

There is no parent-side endpoint to rotate one account's ko_ key. A provisioned account is a full account, so to rotate after a leak the account signs in and manages its own keys from its API-keys dashboard. If it cannot sign in, close it (which revokes all its keys) and provision a replacement.

Errors

StatuscodeCause
401invalid_provisioning_keyMissing, malformed or revoked rsk_ key.
403cap_reachedYou are at your active-account limit. Close one or request a higher limit.
409account_existsThe email or username is already in use.
402insufficient_fundsfunding: "grant" but your wallet cannot cover amount_usd.
400invalid_requestA field failed validation (bad email, short username/password, unknown funding mode, missing amount_usd/voucher_code for the chosen mode).
429rate_limitedToo many provisioning calls on this key in the last minute.

Manage accounts from code

The full lifecycle is available with the same rsk_ provisioning key, so an integrator can onboard and offboard tenants entirely from code, no dashboard required.

Method + pathDoes
GET /v1/accountsList every account under your developer, each as the full account object (id, email, username, status, funding, balance_usd, spend_usd, created_at, closed_at). Returns { "object": "list", "data": [...] }.
GET /v1/accounts/{id}Fetch one account object. 404 account_not_found if it is not under your developer.
DELETE /v1/accounts/{id}Close (offboard) the account: frees a cap slot, blocks its login and revokes its ko_ tokens. 404 account_not_found if it is not an open account under you.
What is API vs dashboard

Account create, list, get and close are all API (rsk_ key), so per-tenant onboarding and offboarding are fully programmatic. Minting wallet-backed vouchers and rotating your one provisioning key are dashboard actions at /app/developer for now. The full account object also comes back from the list and get endpoints; the create response is intentionally lean (the account, its one-time ko_ key, the credit and the onboarding message).

Region and data residency

Provisioning an account does not make it EU-resident. Residency is chosen per call by pinning a fully-qualified model ref with an @eu, @eu-bedrock or @eu-vertex suffix; there is no account-wide region default. An account intended for EU-only processing must send the EU-suffixed ref on every call, including its Brain embedding and recall calls. See Regions and data residency for the exact suffixes and which providers back each.

A full per-customer onboarding flow

  1. 01Provision the account with funding: "grant" (or "linked" if you carry their usage). Capture the returned account.id and the one-time api_key.
  2. 02Store the ko_ api_key in that customer's vault or secret store. It is their credential, not yours.
  3. 03Create the customer's Brain with their key: POST /v1/brains using Authorization: Bearer <their ko_ key>.
  4. 04Hand the returned message to the customer so they can sign in and, if self-funded, top up.
  5. 05When the customer leaves, close the account from your dashboard to free a slot and revoke their key.