Chat, embeddings, RAG, files, batches, image and audio. OpenAI-compatible across 19 providers, with per-customer billing sitting in the request path.
The provider invoice turns up at the end of the month as one number. Inside it is the trial user who ran an agent loop for six hours, the account you priced by guessing and a few hundred people who cost you almost nothing. A raw provider API can't separate them, because all it ever saw was your key. So you build the separation yourself, and it takes longer than the feature did.
Ringside puts your customer inside the request. One header, and that call has an owner with its own budget, wallet, rate limit and line in the margin report. Come month end you already know the number and who inside it spent what.
Everything else stays the same wire format you already call. Swap the base URL, prefix the model with fc:, add FC-Customer to anything that should bill to an end user. Your SDK never finds out.
No subscription · 19 providers behind one API · Managed RAG in v1 · Swap the base URL back whenever you like. Agent memory available now.
curl https://api.fightclub.pro/v1/chat/completions \
-H "Authorization: Bearer $FC_API_KEY" \
-H "FC-Customer: cus_42" \
-H "Content-Type: application/json" \
-d '{"model":"fc:openai/gpt-4o-mini","messages":[{"role":"user","content":"Hello"}]}'// where we actually differ
Picking a model behind one URL is a solved problem, and several products solve it well. Try to answer "what did customer 1183 cost us in March, and did we charge enough" on top of one, though, and you are back to writing a metering service, a wallet, a per-tenant rate limiter, a webhook fan-out and an isolation model you had better get right the first time. Ringside is that second half, shipped, with the routing included.
One key, one org, one bill. Every request looks identical from the provider side, so attribution has to be reconstructed afterwards from your own logs, and a runaway loop is something you learn about later.
With Ringside the attribution happens at call time. Budgets are checked server-side and refused with a 402 before the upstream is touched, so the stop is a control, not a report.
You get model choice and failover, which is real value. What a router has no reason to model is your end customer, so wallets, spend caps, rate limits per tenant, browser-safe tokens and margin per account remain yours to build and operate.
Those exist here as API objects with their own endpoints. Cross-tenant reads answer 404 rather than 403, so an id you don't own is indistinguishable from an id that was never real, and there is nothing to enumerate.
// the build list
Six pieces an AI product team ends up building by hand, usually twice, usually while customers wait for features.
Attach an FC-Customer header and that call has an owner. Monthly budget, wallet balance, rpm and tpm limits, lifetime spend, audit trail. A customer over budget gets a 402 before a single provider token is spent. You add no tables.
Chat and embeddings across every provider we support, selected by a model string. Pass an array instead and the platform walks it on a 502, 503, 504 or an unavailable upstream. That cascade runs on non-streaming calls; pick a single model when you stream.
Vector stores behind the OpenAI file_search API. 20+ file types in v1 including PDF, Office, images and audio. Parsing bills in tokens, isolation is per-customer by default, and swapping embedding models re-embeds in the background from cached parses.
Mint an Ed25519-signed JWT pinned to one customer, one origin and one IP, 15 minutes by default and an hour at most. Lifted off a page it is worthless anywhere else. No proxy tier, no provider key in front-end reach.
Raw provider cost and your billable amount land side by side on every request, groupable by day, model or customer. 34 webhook event types are HMAC-signed and retried with backoff, so budget breaches and failed runs reach your systems.
Stateful conversations with auto-truncation, the Assistants API drop-in, files, batches, image and audio. One wallet underneath all of it.
// your first 5 minutes
No SDK rewrite and no migration branch. The OpenAI client already in your codebase keeps working.
Sign up, take an API key from the dashboard, top the wallet up through Stripe. Minimum top-up is $10 and credits don't expire.
Point your existing client at https://api.fightclub.pro/v1 and prefix the model id with fc:. That is the whole integration.
Send one chat call carrying FC-Customer: cus_42. Within seconds the dashboard has the request, what it cost us, what it bills you and which customer wears it.
There is no seat price, no monthly minimum and no per-call surcharge. Our margin is a markup already inside the published token rate, so the number you plan against is the number your wallet is charged.
Rates come live from the catalog and refresh every 60 seconds, which means a provider price change reaches this page before it reaches your invoice.
See every model and the storage ratesPost a crooked scan, a slide deck that is mostly text-on-image, a spreadsheet or an audio file, and it comes back queryable. 20+ formats in v1, isolation per customer without asking for it, two storage lines for the whole pipeline. Change embedding model later and the re-embed runs in the background from cached parses, so you never re-upload.
Each one starts with a buyer and a bill, then walks the code.
Charge per AI feature usage with first-class FC-Customer billing.
Read the storyEach of your customers gets their own agent fleet, isolated and billed.
Read the storyPer-tenant agent memory that learns and forgets. Available now.
Read the storyShip AI from the frontend, no proxy server, no leaked keys.
Read the storyOrg-wide assistants with per-team budgets and audit logs.
Read the storyLegal, fintech, healthcare. Moderation pre-check, tagged audit trail, signed webhooks.
Read the storyAdd budgets, retries, fallback models, margin reporting on top.
Read the storyManaged vector stores behind file_search. 20+ file types, per-customer isolation, two-line billing.
Read the storyEvery guide below is a diff, not a rewrite. Pick your starting point.
// honest answers
So how do you make money?
A markup on tokens, and nothing else. The rate you see in the pricing table is provider cost plus that markup, and it is exactly what your wallet is charged. We would rather you knew that than discover it comparing a raw provider list price. No seat fee, no monthly minimum, no surcharge per call.
Is this OpenAI proxying with extra steps?
It speaks the OpenAI wire format, then routes to 19 providers including Anthropic, Google, Mistral, Groq, Together, Fireworks and Cohere. Changing provider is a string change. Attribution, budgets, rate limits and webhooks run on top of whichever one you land on, so the operational layer survives the model churn underneath it.
What happens when a provider falls over?
Put an array in the model field, like ['fc:openai/gpt-4o', 'fc:openai/gpt-4o-mini']. The platform walks it on a 502, 503 or 504, or when the upstream reports itself unavailable, and the caller sees one successful response. The cascade runs on non-streaming calls; use a single model when you stream.
What does the hop cost me in latency?
Single-digit to low-double-digit milliseconds at the edge, spent on tenant isolation, idempotency and customer attribution. Streaming passes through unbuffered. The model itself remains, by a wide margin, the slowest thing in the call.
How bad is the lock-in?
You are using the OpenAI SDK. Point the base URL back at the provider and your application code is unchanged. What you would give up is per-customer billing, browser-safe tokens, signed webhooks and the margin view, which is the point of being here, but the exit is a config line.
Can one customer bankrupt me overnight?
Set monthly_budget_usd on the customer and calls past it return 402 with no provider spend behind them. Add rpm and tpm limits for the shape of runaway that burns fast rather than large. A customer.budget_exceeded webhook fires so you hear about it from your own systems.
One base URL change and one header. After that the budgets, the wallets, the margin per account and the audit trail are already there, and the next thing you write is a feature.