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.
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.
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 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.
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.
| funding | Extra input | Effect |
|---|---|---|
self | none | A dry account at $0. The customer signs in and funds it themselves (Stripe or a voucher). Use when the customer pays their own way. |
grant | amount_usd | Atomically debits your wallet by amount_usd and credits the new account. One call, immediately usable. 402 insufficient_funds if your wallet cannot cover it. |
voucher | voucher_code | Redeems 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. |
linked | none | Sets 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. |
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.
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.
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
| Status | code | Cause |
|---|---|---|
401 | invalid_provisioning_key | Missing, malformed or revoked rsk_ key. |
403 | cap_reached | You are at your active-account limit. Close one or request a higher limit. |
409 | account_exists | The email or username is already in use. |
402 | insufficient_funds | funding: "grant" but your wallet cannot cover amount_usd. |
400 | invalid_request | A field failed validation (bad email, short username/password, unknown funding mode, missing amount_usd/voucher_code for the chosen mode). |
429 | rate_limited | Too 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 + path | Does |
|---|---|
GET /v1/accounts | List 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. |
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
- 01Provision the account with
funding: "grant"(or"linked"if you carry their usage). Capture the returnedaccount.idand the one-timeapi_key. - 02Store the
ko_api_key in that customer's vault or secret store. It is their credential, not yours. - 03Create the customer's Brain with their key:
POST /v1/brainsusingAuthorization: Bearer <their ko_ key>. - 04Hand the returned
messageto the customer so they can sign in and, if self-funded, top up. - 05When the customer leaves, close the account from your dashboard to free a slot and revoke their key.