Prefer Swagger UI? Click hereThe same API in the classic OpenAPI explorer.
// reference · 5 min read

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.

One version, forever-ish

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 run status, 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 stream or moderation defaults).
  • ·Removing an endpoint or an ID prefix.
Write for forward compatibility

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.

SignalWhereWhat it tells you
X-Request-Idresponse header on every /v1/* callThe req_* id for this exact request. Quote it in support tickets. It is a header, never a body field.
X-Ringside-Model-Resolvedchat response headerThe concrete fc: model that a match: / slot: / dyn: ref resolved to on this call.
X-Ringside-Model-Newer-Availablechat response headerSet 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/compatibilitypublic endpoint, cached 5 minA machine-readable statement of which OpenAI-compatible surfaces Ringside currently mirrors.
GET /v1/modelsauthenticatedThe 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.

Notable additive milestones under /v1. Dates are from the repository record; do not read them as a deprecation calendar.
DateMilestoneWhat shipped
2026-04-20Ringside 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-19Webhooks and client tokensSigned 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-19Assistants shimOpenAI-compatible Assistants (asst_), Threads (thread_) and Runs (run_) with the requires_action / submit_tool_outputs tool loop.
2026-04-22V2.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-15Rerank, registries and cascade routerPOST /v1/rerank (Cohere / Voyage wire shape), MCP / prompt / eval registries (CRUD) and the cost-aware fallback router formalised on chat completions.
2026-05-25Strict customer attributionThe FC-Customer-Strict: true header disables lazy-create of unknown customers, per dev and per request.
2026-05-27Vector 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-28match: auto roll-forwardA match: selector resolves against the live catalog and rolls forward across model versions, with the resolution surfaced on X-Ringside-Model-Resolved.
2026-06-23Data-residency region routingThe @<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-24Sealed RAG and sealed GraphRAGVector 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-25Brains (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-24Brains recall observability + per-type decayA 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-24Brains reindex + introspectionA 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.
Reserved before live

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 send stream and moderation rather 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.type can land under /v1 between your deploys. Subscribe to webhook events by explicit name and keep the default arm on every status switch.
The OpenAI SDK migration is the one diff
Pointing the OpenAI SDK at https://api.fightclub.pro/v1 is a drop-in, except every model ref needs the fc: (or match: / slot: / dyn:) prefix. A bare gpt-4o returns 400 invalid_model_ref. That is a routing requirement, not a version change.

Limits and defaults referenced here

ThingValue
API basehttps://api.fightclub.pro/v1
Version axisthe /v1 path segment only (no version header)
Developer key formatko_ + 64 hex chars, sent as Authorization: Bearer ko_<key>
Client-token schemeAuthorization: Client <jwt> (jti prefix ctok_), ttl 60-3600s, default 900s
Idempotency headeridempotency-key (lowercase), 24 h replay window
Compatibility endpoint cacheGET /v1/compatibility, cached 5 min
Provider count behind /v119

See also