Changelog and versioning
Ringside has exactly one version axis, the /v1 path segment in the URL. There is no version header, no per-account pin and no dated release you opt into. New capabilities ship continuously and backward-compatibly, so code you wrote against /v1 last quarter keeps working. This page explains that policy in full, tells you what counts as a breaking change versus an additive one and gives you a dated record of the capability milestones the platform has shipped.
The versioning model
The API has exactly one version axis. It is the path. Every endpoint lives under https://api.fightclub.pro/v1/..., and that /v1 is the whole contract. There is no Ringside-Version request header, no Stripe-style dated pin, no ?version= query parameter and no per-key version setting in the dashboard. If you have seen other API providers ask you to send a version date on every request, Ringside deliberately does not do that.
The trade is simple. You get continuous delivery of new fields, headers, endpoints and model refs with no migration step, and in return additive changes can appear under /v1 at any time. So you write tolerant clients. Ignore response fields you do not recognise, branch on documented enum values rather than asserting the full set is closed and never parse the human-readable message string in an error body. Branch on the machine code instead.
A /v2 would only appear if a genuinely incompatible redesign were unavoidable, and it would run alongside /v1 rather than replacing it. Nothing on the current roadmap requires that. Treat /v1 as stable.
What is additive vs breaking
The line between the two is what makes the no-header model safe. Additive changes ship under /v1 whenever they are ready. Breaking changes do not ship under /v1 at all.
Additive (can appear under /v1 at any time)
- ·New endpoints (a new resource appears, existing ones are untouched).
- ·New optional request parameters and new request headers, all defaulting to the prior behaviour when omitted.
- ·New fields in a response body or new
X-Ringside-*/FC-*response headers. - ·New enum members: an extra
error.type, a new webhook event type, a new runstatus, a new model in the catalog. - ·New model-ref prefixes or
@<region>residency suffixes. - ·New providers behind the existing 19-provider routing layer.
Breaking (would never ship silently under /v1)
- ·Removing or renaming a request parameter, response field, header or error
code. - ·Changing the type or meaning of an existing field.
- ·Tightening validation so a request that used to succeed now 400s.
- ·Changing a default (for example, flipping
streamormoderationdefaults). - ·Removing an endpoint or an ID prefix.
Because new enum members are additive, your switch on error.type or on a run status must have a default arm. A response that carries an X-Ringside-Model-Newer-Available header you have never seen should be logged, not rejected.
How to tell what changed at runtime
You do not poll a version endpoint to discover capabilities. The API tells you inline. A handful of signals are worth wiring into your client so you notice additive changes without reading release notes.
| Signal | Where | What it tells you |
|---|---|---|
X-Request-Id | response header on every /v1/* call | The req_* id for this exact request. Quote it in support tickets. It is a header, never a body field. |
X-Ringside-Model-Resolved | chat response header | The concrete fc: model that a match: / slot: / dyn: ref resolved to on this call. |
X-Ringside-Model-Newer-Available | chat response header | Set when a newer model exists in the same family than the one you pinned. A nudge to re-pin, never an automatic switch. |
GET /v1/compatibility | public endpoint, cached 5 min | A machine-readable statement of which OpenAI-compatible surfaces Ringside currently mirrors. |
GET /v1/models | authenticated | The live catalog with markup-adjusted estimated_input_per_1m / estimated_output_per_1m for your account. |
Capability milestones
Dates below are drawn from the repository record. Each row is a backward-compatible addition under /v1. Nothing here required a client change beyond opting into the new surface, with the single noted exception of the OpenAI-SDK migration, where the only change to existing code is the fc: model prefix.
| Date | Milestone | What shipped |
|---|---|---|
| 2026-04-20 | Ringside v1 (Phase C closed) | The /v1 API went live: POST /v1/chat/completions (sync + SSE, OpenAI-compatible), /v1/embeddings, /v1/moderations, first-class Customers (cus_) with budgets and prepaid wallets, match: / slot: model refs and the cost-aware model: [] cascade. |
| 2026-04-19 | Webhooks and client tokens | Signed webhook endpoints (wh_, whsec_ secret shown once, X-FC-Signature HMAC) and browser-safe client tokens minted via POST /v1/customers/{id}/client_tokens, sent as Authorization: Client <jwt>. |
| 2026-04-19 | Assistants shim | OpenAI-compatible Assistants (asst_), Threads (thread_) and Runs (run_) with the requires_action / submit_tool_outputs tool loop. |
| 2026-04-22 | V2.1 AI surface (v2.1.0) | Image generation (/v1/images/generations), audio STT/TTS (/v1/audio/transcriptions, /v1/audio/speech), file uploads (file_), async batches (batch_), multimodal chat attachments and exact-match response caching via the FC-Cache headers. |
| 2026-05-15 | Rerank, registries and cascade router | POST /v1/rerank (Cohere / Voyage wire shape), MCP / prompt / eval registries (CRUD) and the cost-aware fallback router formalised on chat completions. |
| 2026-05-25 | Strict customer attribution | The FC-Customer-Strict: true header disables lazy-create of unknown customers, per dev and per request. |
| 2026-05-27 | Vector stores (managed RAG) | The /v1/vector_stores OpenAI-compatible surface (vs_): async ingest, per-customer tenant isolation and file_search from inside an Assistants run. |
| 2026-05-28 | match: auto roll-forward | A match: selector resolves against the live catalog and rolls forward across model versions, with the resolution surfaced on X-Ringside-Model-Resolved. |
| 2026-06-23 | Data-residency region routing | The @<region> suffix on fc: refs: @eu / @us (OpenAI in-region), @eu-bedrock / @us-bedrock (Claude via AWS Bedrock) and @eu-vertex / @us-vertex (Claude via Google Vertex). |
| 2026-06-24 | Sealed RAG and sealed GraphRAG | Vector stores gained encryption (none / managed / byok), vector_sealing (none / source / full), customer-presented BYOK passphrases that are never persisted, sealed vector_index: ivf and graphrag_enabled (file_search returns a facts[] array of subject/predicate/object relationships beside chunk citations). |
| 2026-06-25 | Brains (managed memory) | The /v1/brains surface (brn_): scope-isolated entries, ambient recall + learn via the Brain / Brain-Scope headers on chat completions, a per-brain memory_policy (type taxonomy, tiers, decay curves) and the brain.learning.proposed / brain.conflict / brain.autotune.frozen webhook events. |
| 2026-07-24 | Brains recall observability + per-type decay | A Brain-Status response header on ambient completions (attached / attached:empty_recall / ignored:unknown_brain) so a mistyped or deleted brain id no longer fails silently; per-type decay_anchor via type_taxonomy[].anchor (tier C keeps spaced repetition on last_used while tier D expires on created); the brain.policy.changed and brain.learning.skipped webhook events; and file_search retrieval now runs on streaming Assistants runs. New brains adopt the corrected tier-D-clock preset only when RINGSIDE_BRAINS_TIER_D_CLOCK is enabled — existing brains keep their stored policy and opt in per brain. |
| 2026-07-24 | Brains reindex + introspection | A brain's embedding_model is **no longer immutable**: POST /v1/brains/{id}/reindex re-embeds the whole brain under a new model (cost-estimated, confirm:true to run, atomic swap, 7-day rollback via .../reindex/{jobId}/rollback, status via GET .../reindex/{jobId}, brain.reindex.completed/.failed events). Plus recall explain_misses + types, GET /scopes and GET /entities, dry_run on forget, Idempotency-Key on entry writes, and the on_unfunded policy. |
Some surfaces register names before they emit. The run.completed / run.failed / run.cancelled webhook event types are reserved and start delivering as the Runs surface rolls out. Subscribing to a reserved type is accepted, not rejected, which is the additive model working as intended.
Worked example: a forward-compatible error handler
The single most important rule for surviving additive change is to branch on error.code rather than error.message and to keep a default arm. The error envelope is stable in shape. Its enum members are not closed.
{
"error": {
"type": "rate_limit_error",
"code": "customer_rate_limit_exceeded",
"message": "Customer cus_42 exceeded its rpm limit",
"retry_after_seconds": 12
}
}Edge cases and gotchas
- No version header means no version pin
- You cannot freeze behaviour to a past date. If a default ever changed it would be a breaking change and would not ship under
/v1, so set the parameters you care about explicitly (for example sendstreamandmoderationrather than relying on their defaults) to make your client self-documenting. - Cross-tenant access is a 404, not a 403
- Reaching for an id you do not own returns
not_found_error/ 404 so ids are not enumerable. This has always been the behaviour and is not a versioned change, but it surprises people expecting a 403. - New enum members can appear mid-integration
- A new webhook event type, a new run status or a new
error.typecan land under/v1between your deploys. Subscribe to webhook events by explicit name and keep the default arm on every statusswitch. - The OpenAI SDK migration is the one diff
- Pointing the OpenAI SDK at
https://api.fightclub.pro/v1is a drop-in, except every model ref needs thefc:(ormatch:/slot:/dyn:) prefix. A baregpt-4oreturns 400invalid_model_ref. That is a routing requirement, not a version change.
Limits and defaults referenced here
| Thing | Value |
|---|---|
| API base | https://api.fightclub.pro/v1 |
| Version axis | the /v1 path segment only (no version header) |
| Developer key format | ko_ + 64 hex chars, sent as Authorization: Bearer ko_<key> |
| Client-token scheme | Authorization: Client <jwt> (jti prefix ctok_), ttl 60-3600s, default 900s |
| Idempotency header | idempotency-key (lowercase), 24 h replay window |
| Compatibility endpoint cache | GET /v1/compatibility, cached 5 min |
| Provider count behind /v1 | 19 |
See also
The full error envelope, every `type` and the codes to branch on (including the forward-compatible default arm).
Developer keys (`ko_`), client tokens (`Client <jwt>`) and the header parser.
Every request param, header and error code on `/v1/chat/completions`.