{"openapi":"3.0.3","info":{"title":"Cambent Index API","version":"1.0.0","description":"Public, read-only HTTP/JSON for the live Cambent Token Index (TKX). Use it to read the current published TKX, TKX-Open, and TKX-Frontier levels, daily history, listed model prices and per-task quality, membership events, and methodology. Source: Cambent TKX. Orient without tribal knowledge: (1) GET /openapi.json for the contract; (2) GET /v1/index for valid series ids and current-level paths; (3) GET /v1/tasks for valid task keys; (4) GET /v1/methodology for versions, baseline, coverage, and live taskBlend, tokenWorkload, and qaCost; (5) GET /v1/models and GET /v1/models/{id} for rows; (6) GET /v1/tasks/{task}/models and GET /v1/models/{id}/tasks/{task} for signal-only task slices; (7) cite source + asOf. Do not route. Current published levels (GET /v1/index/tkx and GET /v1/index/{id}) are public and need no API key. Discovery catalogs (GET /v1/index, GET /v1/tasks) and question-shaped slices are also public and need no key. History and dated archive fields need scope read-index for the full archive; without a key they cover the last 30 days before as-of. Scoring version, construction version, and baseline (100 = 2026-08-04) appear on GET /v1/methodology and on index / history response metadata. This API does not route traffic, recommend a model, convert, or trade. There is no Analysis API. Cite: Source: Cambent TKX (https://tkx.cambent.ai/). Human print: https://tkx.cambent.ai/ and https://cambent.ai/tkx. Series TKX / TKX-Open / TKX-Frontier live on that board and the /tkx print table. There are no separate sub-index sites."},"servers":[{"url":"/","description":"This Worker"}],"paths":{"/":{"get":{"summary":"Human HTML documentation","description":"When to use: read the Index API in a browser (same copy as GET /docs).\n\nVs siblings: GET /openapi.json is the machine-readable contract. GET /docs is this page at another path.\n\nFormat and auth: HTML. Public, no API key.\n\nEmpty / 404: Always 200 with the current docs page.\n\nDo not use for: treating this HTML as the live published level. Numbers belong on the JSON endpoints.","operationId":"getRootDocs","responses":{"200":{"description":"HTML documentation"}}}},"/docs":{"get":{"summary":"Human HTML documentation (alias)","description":"When to use: same HTML as GET /.\n\nVs siblings: GET /openapi.json is the machine-readable contract.\n\nFormat and auth: HTML. Public, no API key.\n\nEmpty / 404: Always 200.\n\nDo not use for: substituting this page for GET /v1/index/tkx.","operationId":"getDocs","responses":{"200":{"description":"HTML documentation"}}}},"/openapi.json":{"get":{"summary":"OpenAPI 3 specification","description":"When to use: discover paths, schemas, and field units for agents or codegen.\n\nVs siblings: GET / and GET /docs are human HTML. This document must match the live handlers.\n\nFormat and auth: JSON (OpenAPI 3.0.3). Public, no API key.\n\nEmpty / 404: Always 200 with the spec this Worker serves.\n\nDo not use for: inventing fields that are not in this document or in a live JSON response.","operationId":"getOpenApi","responses":{"200":{"description":"OpenAPI document","content":{"application/json":{"schema":{"type":"object"}}}}}}},"/widget":{"get":{"summary":"Live TKX widget iframe","description":"When to use: embed the current published TKX (and optional Open / Frontier) on a page, with attribution built in.\n\nVs siblings: GET /widget.js injects an iframe pointed at this path. GET /v1/index/tkx is the JSON this widget fetches.\n\nFormat and auth: HTML iframe. Public, no API key. Query series is a comma list of tkx, tkx-open, tkx-frontier (default tkx).\n\nEmpty / 404: Always 200 for allowed series tokens. Unknown series tokens are ignored.\n\nDo not use for: routing traffic or presenting the index as your own measurement. Attribution and links to cambent.ai / tkx.cambent.ai stay in the widget.","operationId":"getWidget","parameters":[{"name":"series","in":"query","required":false,"schema":{"type":"string","example":"tkx,tkx-open,tkx-frontier"},"description":"Comma-separated live series ids. Allowed: tkx, tkx-open, tkx-frontier. Default tkx. Unknown tokens are ignored."}],"responses":{"200":{"description":"HTML widget"},"429":{"$ref":"#/components/responses/RateLimited"}}}},"/widget.js":{"get":{"summary":"Live TKX widget embed script","description":"When to use: drop a script tag that creates an iframe pointed at GET /widget on this host.\n\nVs siblings: GET /widget is the iframe document. Optional data-series on the script matches the widget series query.\n\nFormat and auth: JavaScript. Public, no API key.\n\nEmpty / 404: Always 200.\n\nDo not use for: fetching a key or hiding Cambent attribution.","operationId":"getWidgetScript","responses":{"200":{"description":"JavaScript embed"}}}},"/health":{"get":{"summary":"Liveness","description":"When to use: check that this Worker is up (uptime probes, load balancers).\n\nVs siblings: GET /healthz is the same body. GET /v1/index/tkx is the published print, not liveness.\n\nFormat and auth: JSON. Public, unmetered, no API key. GET and HEAD.\n\nEmpty / 404: Always 200 when the Worker is serving. Body is ok, service, and env if ENVIRONMENT is set.\n\nDo not use for: reading the published TKX level or treating this as a print.","operationId":"getHealth","responses":{"200":{"description":"Worker is up. Same JSON as GET /healthz.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Health"}}}}}}},"/healthz":{"get":{"summary":"Liveness (alias of GET /health)","description":"When to use: same as GET /health.\n\nVs siblings: GET /health is the primary path. Same JSON body. Do not invent a third liveness path.\n\nFormat and auth: JSON. Public, unmetered, no API key. GET and HEAD.\n\nEmpty / 404: Always 200 when the Worker is serving. Same body as GET /health.\n\nDo not use for: reading the published TKX level or treating this as a print.","operationId":"getHealthz","responses":{"200":{"description":"Worker is up. Same JSON as GET /health.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Health"}}}}}}},"/v1/index":{"get":{"summary":"Catalog of live index series","description":"When to use: discover which series ids are published and where to read the current index level and history.\n\nVs siblings: GET /v1/index/tkx returns today's headline plus Open and Frontier values. GET /v1/index/{id} returns one current index level. GET /v1/index/{id}/history returns daily values. This path is the collection: ids and paths only. It is not a fourth index reading.\n\nFormat and auth: JSON. Public, no API key. Cache is a catalog read, not a current index reading.\n\nEmpty / 404: This path does not 404 while the Worker is up. Empty series[] would mean no published series, which is not a live state. Unknown ids on GET /v1/index/{id} still 404.\n\nDo not use for: reading the published level, choosing a model, or routing traffic. Values stay on getHeadlineIndex / getIndexById. Task, tier, and jurisdiction series are not published.","operationId":"listIndexSeries","x-cambent-status":"live","x-cambent-ticket":"API-4","x-cambent-neutrality":"signal-only","x-cambent-mcp":"ready","responses":{"200":{"description":"Live series ids with pointers to current-level and history paths. No index values.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/IndexSeriesCatalog"}}}}}}},"/v1/index/tkx":{"get":{"summary":"Current TKX, TKX-Open, and TKX-Frontier","description":"When to use: read today's published headline plus the Open and Frontier companion series in one response.\n\nVs siblings: GET /v1/index is the series catalog (ids and paths, no printed values). GET /v1/index/{id} returns one series. GET /v1/index/{id}/history returns daily values, not today's single reading. GET /v1/methodology explains how the levels are built.\n\nFormat and auth: JSON. Public, no API key. A missing or invalid key still returns the public body.\n\nEmpty / 404: This path always returns the latest published reading. It does not 404.\n\nDo not use for: choosing a model, routing traffic, or treating the number as your own measurement. Cite: Source: Cambent TKX (https://tkx.cambent.ai/), as-of the response asOf. Human print: https://tkx.cambent.ai/ and https://cambent.ai/tkx. Scoring and construction versions are fields on the response.","operationId":"getHeadlineIndex","responses":{"200":{"description":"Current published levels for TKX, TKX-Open, and TKX-Frontier","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Headline"}}}}}}},"/v1/index/{id}":{"get":{"summary":"One current series by id","description":"When to use: read today's published level for exactly one of tkx, tkx-open, or tkx-frontier.\n\nVs siblings: GET /v1/index is the series catalog. GET /v1/index/tkx returns all three printed levels. GET /v1/index/{id}/history returns the daily series.\n\nFormat and auth: JSON. Public, no API key. Path id must be a live series id.\n\nEmpty / 404: Unknown ids return 404. Live series always return the latest published reading.\n\nDo not use for: model recommendations or routing. Task, tier, and jurisdiction series are not published.","operationId":"getIndexById","parameters":[{"$ref":"#/components/parameters/IndexId"}],"responses":{"200":{"description":"Current published level for one live series","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Series"}}}},"404":{"$ref":"#/components/responses/NotFound"}}}},"/v1/index/{id}/history":{"get":{"summary":"Daily published history for one series","description":"When to use: pull day-by-day published levels for tkx, tkx-open, or tkx-frontier.\n\nVs siblings: GET /v1/index/tkx and GET /v1/index/{id} return only the current reading and never require a key. This path is the dated archive.\n\nFormat and auth: JSON. Query from and to are inclusive ISO dates (YYYY-MM-DD). interval must be day. Without a key, dated rows start 30 days before as-of (inclusive). A key with scope read-index unlocks the full archive. A missing, invalid, or wrong-scope key stays on the 30-day window. This window is not a delay on the current published level. Send Authorization: Bearer or X-Api-Key.\n\nEmpty / 404: Unknown series ids return 404. A valid window with no rows returns points: []. interval other than day, or bad dates, return 400.\n\nDo not use for: treating a 30-day window as the current published level, or rewriting an older published file as this series.","operationId":"getIndexHistory","security":[{"bearerAuth":[]},{"apiKeyHeader":[]},{}],"parameters":[{"$ref":"#/components/parameters/IndexId"},{"name":"from","in":"query","schema":{"type":"string","format":"date"},"description":"Inclusive ISO date (YYYY-MM-DD). Without a key, a date older than as-of minus 30 days is raised to that start date. Older published files are not rewritten as this series."},{"name":"to","in":"query","schema":{"type":"string","format":"date"},"description":"Inclusive ISO date (YYYY-MM-DD). Defaults to as-of when omitted."},{"name":"interval","in":"query","schema":{"type":"string","enum":["day"],"default":"day"},"description":"Must be day. Only daily history is published. Any other value is 400."}],"responses":{"200":{"description":"Daily points inside the caller window after the no-key 30-day start date is applied","content":{"application/json":{"schema":{"$ref":"#/components/schemas/History"}}}},"400":{"$ref":"#/components/responses/BadRequest"},"404":{"$ref":"#/components/responses/NotFound"}}}},"/v1/models":{"get":{"summary":"All listed models","description":"When to use: list every model on the current index listing with public price, quality, and provenance fields.\n\nVs siblings: GET /v1/models/{id} returns one row by slug. GET /v1/tasks/{task}/models is the signal-only task slice. GET /v1/methodology returns coverage counts, not the rows.\n\nFormat and auth: JSON. The list of models is public. Dated points[] on each row follow the same 30-day window as history unless you send a read-index key. List-level access, fromFloor, fromFloorDays, and note describe that window. A task query on this path is ignored; use GET /v1/tasks/{task}/models for a task slice.\n\nEmpty / 404: Returns the current listed set. An empty models array would mean the listing has no public rows.\n\nDo not use for: recommending a model or routing traffic. Quality is per-task on the priced variant, not a ranking.","operationId":"listModels","responses":{"200":{"description":"Public model rows plus list-level archive-window metadata","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ModelList"}}}}}}},"/v1/models/{id}":{"get":{"summary":"One listed model by slug","description":"When to use: fetch one model's public price, per-task quality, provenance, and (when present) dated value-score points.\n\nVs siblings: GET /v1/models returns the full list. Slug is the listed name, e.g. deepseek-v4-pro.\n\nFormat and auth: JSON. The model row is public. Live responses also include access, fromFloor, fromFloorDays, and note so you can see the same dated-window rule that applies to points[]. A read-index key unlocks older points.\n\nEmpty / 404: Unknown slugs return 404. Missing points[] means this model has no persisted value-score snapshot in the visible window. Illustrative and specialist rows never get a comparable series.\n\nDo not use for: recommending a substitute or auto-grading an illustrative score.","operationId":"getModel","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"Slug of the listed name, e.g. deepseek-v4-pro. Unknown slugs return 404."}],"responses":{"200":{"description":"Public model row plus archive-window metadata (access, fromFloor, fromFloorDays, note)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Model"}}}},"404":{"$ref":"#/components/responses/NotFound"}}}},"/v1/events":{"get":{"summary":"Membership and re-benchmark log","description":"When to use: see real basket membership changes and real re-benchmarks that were recorded on the index.\n\nVs siblings: History points are daily published levels. Events are the sparse log of what changed. An empty list is honest, not an error.\n\nFormat and auth: JSON. Without a key, dated rows start 30 days before as-of (inclusive). A key with scope read-index unlocks the full archive. A missing, invalid, or wrong-scope key stays on the 30-day window. This window is not a delay on the current published level. Same access / fromFloor fields as history.\n\nEmpty / 404: Empty events array means no recorded events in the visible window. This path does not 404 for a calm window.\n\nDo not use for: inventing activity or treating composition figures as a trading signal.","operationId":"listEvents","responses":{"200":{"description":"Event log. Empty array when none exist in the visible window. No invented events.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EventList"}}}}}}},"/v1/tasks":{"get":{"summary":"Catalog of live task keys","description":"When to use: discover the valid task keys used on model quality maps (reason, code, extract, classify).\n\nVs siblings: GET /v1/methodology holds versions, baseline, coverage, and live taskBlend, tokenWorkload, and qaCost. GET /v1/models rows use these keys on quality_by_task, quality_source, and is_graded. This path does not list models and does not carry blend or workload numbers. GET /v1/tasks/{task}/models is the signal-only listed-model slice for one task key.\n\nFormat and auth: JSON. Public, no API key.\n\nEmpty / 404: This path does not 404 while the Worker is up. Unknown task keys on GET /v1/tasks/{task}/models return 404 with the live key list.\n\nDo not use for: recommending a model, inventing a per-task index, or reading blend weights. Point at GET /v1/methodology for weights. Keep weights off model rows.","operationId":"listTasks","x-cambent-status":"live","x-cambent-ticket":"API-4","x-cambent-neutrality":"signal-only","x-cambent-mcp":"ready","responses":{"200":{"description":"Live task keys with pointers to model quality fields. Blend numbers stay on methodology.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TaskCatalog"}}}}}}},"/v1/tasks/{task}/models":{"get":{"summary":"Listed models for one task key","description":"When to use: read the listed models for one task key (reason, code, extract, classify) with that task's quality cell, provenance, and position vs the published composite TKX.\n\nVs siblings: GET /v1/tasks is the task catalog. GET /v1/models is the full list with quality maps. GET /v1/models/{id}/tasks/{task} is one model on one task. GET /v1/index/tkx is the composite print this slice cites.\n\nFormat and auth: JSON. Public, no API key. Default list is every listed row, including illustrative and null cells. Query graded=true is a tag filter (is_graded for that task is true), not a recommendation. Query domain filters listed domain (general or code). Default order is stable id ascending. composite_qa is the latest visible points[].qa in the same 30-day window as listModels; otherwise null. It is composite, not a per-task value score.\n\nEmpty / 404: Unknown task keys return 404 with the live task list. A valid task with no matching rows after optional filters returns count 0. Null or illustrative quality is 200 with honest tags.\n\nDo not use for: choosing a model or routing traffic. Signal only. Not a recommendation.","operationId":"listModelsByTask","x-cambent-status":"live","x-cambent-ticket":"API-5","x-cambent-neutrality":"signal-only","parameters":[{"$ref":"#/components/parameters/TaskId"},{"name":"graded","in":"query","required":false,"schema":{"type":"boolean"},"description":"If true, include only rows whose is_graded for this task is true. Tag filter only. Default omit: all listed rows, including illustrative and null."},{"name":"domain","in":"query","required":false,"schema":{"type":"string","enum":["general","code"]},"description":"If set, include only rows whose listed domain matches. Default omit."}],"responses":{"200":{"description":"Signal-only task slice. Default all listed rows, id ascending. Not a recommendation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ModelsByTask"}}}},"404":{"$ref":"#/components/responses/NotFound"}}}},"/v1/models/{id}/tasks/{task}":{"get":{"summary":"One listed model on one task key","description":"When to use: read one listed model's price, task quality cell, provenance, and position vs the published composite TKX.\n\nVs siblings: GET /v1/models/{id} is the full quality map. GET /v1/tasks/{task}/models is the listed-model slice for that task. GET /v1/index/tkx is the composite print this object cites.\n\nFormat and auth: JSON. Public, no API key. Dated composite_qa follows the same 30-day window as getModel points[]. Primary field names only (input_price, output_price, price_source, quality, quality_source, is_graded). quality / quality_source / is_graded are the task slice, not the full maps.\n\nEmpty / 404: Unknown model slugs return 404 (same as getModel). Unknown task keys return 404 with the live task list. Null or illustrative quality is 200 with honest tags. Do not 404 solely because a cell is null or illustrative.\n\nDo not use for: choosing a model or routing traffic. Signal only. Not a recommendation.","operationId":"getModelTaskPosition","x-cambent-status":"live","x-cambent-ticket":"API-5","x-cambent-neutrality":"signal-only","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"Slug of the listed name, e.g. deepseek-v4-pro. Unknown slugs return 404."},{"$ref":"#/components/parameters/TaskId"}],"responses":{"200":{"description":"Signal-only model-on-task body. Index context plus the model's own cell. Not a recommendation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ModelTaskPosition"}}}},"404":{"$ref":"#/components/responses/NotFound"}}}},"/v1/methodology":{"get":{"summary":"How the index is built, plus live coverage","description":"When to use: read scoring version, construction version, baseline (100 = 2026-08-04), the public methodology URL, live coverage counts, and the published task-blend and token-workload numbers used in the composite value score. Those numbers are on this JSON only. They are not on model rows.\n\nVs siblings: Current index and history endpoints return levels. GET /v1/models returns prices and per-task quality, not blend weights. This endpoint explains the construction and counts graded vs illustrative rows from the current listing.\n\nFormat and auth: JSON. Public, no API key.\n\nEmpty / 404: Always returns the current snapshot of versions, published weights, and counts.\n\nDo not use for: treating coverage as a frozen constant, inventing a per-task value score, or as a recommendation of which models to buy.","operationId":"getMethodology","responses":{"200":{"description":"Methodology snapshot: versions, baseline, URL, published blend and workload numbers, live coverage","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Methodology"}}}}}}}},"components":{"securitySchemes":{"bearerAuth":{"type":"http","scheme":"bearer","description":"Optional platform API key. Current published levels need no key. Scope read-index unlocks history and dated archive beyond the last 30 days before as-of. Headline prints stay public without a key. Send as Authorization: Bearer."},"apiKeyHeader":{"type":"apiKey","in":"header","name":"X-Api-Key","description":"Same key as Bearer, via X-Api-Key. Issued by the platform Worker. This Index Worker stores a hash only and does not create keys. Scope read-index unlocks the archive; prints stay public without a key."}},"parameters":{"IndexId":{"name":"id","in":"path","required":true,"schema":{"type":"string","enum":["tkx","tkx-open","tkx-frontier"]},"description":"Live series id only: tkx, tkx-open, or tkx-frontier. Unknown ids return 404."},"TaskId":{"name":"task","in":"path","required":true,"schema":{"type":"string","enum":["reason","code","extract","classify"]},"description":"Live task key only: reason, code, extract, or classify. Unknown keys return 404 with the live task list."}},"responses":{"NotFound":{"description":"Unknown index, model, or task id. Body is {source, error, message}.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"BadRequest":{"description":"Invalid query (bad date or interval). Body is {source, error, message}.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"RateLimited":{"description":"Anonymous or per-key rate limit. Retry-After and X-RateLimit-* headers are set. Body includes error rate_limited.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"schemas":{"IndexSeriesCatalog":{"type":"object","description":"Public catalog of live series ids and current-level / history paths. No index values. Not a recommendation.","properties":{"source":{"type":"string","example":"Cambent TKX","description":"Attribution. Always Cambent TKX."},"asOf":{"type":"string","format":"date","description":"ISO date of the latest published index. Cite this date."},"scoringVersion":{"type":"string","example":"v0.2","description":"Scoring version on this response. See GET /v1/methodology."},"constructionVersion":{"type":"string","example":"v0.3","description":"Construction version on this response. See GET /v1/methodology."},"methodology":{"type":"string","example":"https://cambent.ai/methodology","description":"Public methodology URL."},"series":{"type":"array","description":"Live published series only. Task, tier, and jurisdiction series are not listed.","items":{"$ref":"#/components/schemas/IndexSeriesCatalogItem"}},"unpublished":{"$ref":"#/components/schemas/UnpublishedSeriesNote"}}},"IndexSeriesCatalogItem":{"type":"object","description":"One published series id plus pointers. No index value.","properties":{"id":{"type":"string","enum":["tkx","tkx-open","tkx-frontier"],"description":"Live series id: tkx, tkx-open, or tkx-frontier."},"name":{"type":"string","description":"Display name (TKX, TKX-Open, TKX-Frontier)."},"kind":{"type":"string","enum":["headline","companion"],"description":"headline is the all-three current reading. companion is one series."},"published":{"type":"boolean","description":"Always true on this list. Unpublished kinds live on unpublished, not as stub rows."},"current":{"type":"string","description":"Path to the current index level for this id."},"history":{"type":"string","description":"Path to daily history for this id."},"note":{"type":"string","description":"Signal-only note. Not a recommendation."}}},"UnpublishedSeriesNote":{"type":"object","description":"Kinds that are not published. Agents should stop guessing those ids.","properties":{"kinds":{"type":"array","items":{"type":"string","enum":["task","tier","jurisdiction"]},"description":"Unpublished series kinds. Do not invent ids such as tkx-code."},"note":{"type":"string","description":"Those ids 404. No stub rows are listed."}}},"TaskCatalog":{"type":"object","description":"Public catalog of live task keys. Blend and workload numbers are not here. Point at GET /v1/methodology. Not a recommendation.","properties":{"source":{"type":"string","example":"Cambent TKX","description":"Attribution. Always Cambent TKX."},"asOf":{"type":"string","format":"date","description":"ISO date of the latest published index. Cite this date."},"scoringVersion":{"type":"string","example":"v0.2","description":"Scoring version on this response. See GET /v1/methodology."},"tasks":{"type":"array","description":"Live task keys used on quality_by_task, quality_source, and is_graded.","items":{"$ref":"#/components/schemas/TaskCatalogItem"}},"blend":{"$ref":"#/components/schemas/TaskBlendPointer"},"extensibility":{"$ref":"#/components/schemas/TaskExtensibility"}}},"TaskCatalogItem":{"type":"object","description":"One published task key. Wire id only. No display label. index_series is null until a per-task series is published.","properties":{"id":{"type":"string","enum":["reason","code","extract","classify"],"description":"Live task key. Wire id only. Clients map this id."},"published":{"type":"boolean","description":"True when quality maps on /v1/models use this key."},"quality_field":{"type":"string","description":"Dotted path on a model row, e.g. quality_by_task.reason."},"source_field":{"type":"string","description":"Dotted path on a model row, e.g. quality_source.reason."},"graded_field":{"type":"string","description":"Dotted path on a model row, e.g. is_graded.reason."},"index_series":{"type":"string","nullable":true,"description":"Live series id if a per-task series is published. Null today. Do not invent tkx-code."},"note":{"type":"string","description":"Per-task quality on the priced variant. Null = unranked. Not a recommendation."}}},"TaskBlendPointer":{"type":"object","description":"Pointer to methodology. No blend or workload numbers on this object.","properties":{"documented_at":{"type":"string","example":"/v1/methodology","description":"Path where blend, workload, and value-score (qaCost) numbers live. Not this catalog."},"methodology_url":{"type":"string","example":"https://cambent.ai/methodology","description":"Human methodology page."},"note":{"type":"string","description":"Point only. Keep blend numbers off this catalog and off model rows."}}},"TaskExtensibility":{"type":"object","description":"How new task keys appear. Do not invent unpublished families.","properties":{"note":{"type":"string","description":"New keys are additive and only after quality maps on /v1/models use them."}}},"ModelsByTask":{"type":"object","description":"Signal-only list of listed models for one task key. Default is every listed row, id ascending. Not a recommendation and not a routing instruction.","properties":{"source":{"type":"string","example":"Cambent TKX","description":"Attribution. Always Cambent TKX."},"asOf":{"type":"string","format":"date","description":"ISO date of the latest published index. Cite this date."},"task":{"type":"string","enum":["reason","code","extract","classify"],"description":"Task key this slice is for."},"neutrality":{"type":"string","description":"Required. Signal only. This is not a recommendation and not a routing instruction. Cite Cambent TKX as-of asOf."},"index_context":{"$ref":"#/components/schemas/QuestionIndexContext"},"count":{"type":"integer","description":"Number of rows in models[] after optional filters."},"models":{"type":"array","description":"Listed-model rows for this task, stable id ascending. First row is not a preference.","items":{"$ref":"#/components/schemas/ModelTaskSlice"}}}},"ModelTaskSlice":{"type":"object","description":"One listed model on one task. Primary names only. quality / quality_source / is_graded are the task slice. Not a recommendation.","properties":{"id":{"type":"string","description":"Stable slug of the listed name."},"name":{"type":"string","description":"Listed display name of the priced variant."},"host":{"type":"string","description":"Hosting class as listed, e.g. open or closed."},"domain":{"type":"string","description":"Task domain as listed, e.g. general or code."},"comparable_capability_series":{"type":"boolean","description":"True only for fully graded general-domain rows. Specialists and not-fully-scored rows are false."},"input_price":{"type":"number","nullable":true,"description":"Input token price, USD per million tokens. Same million-token (MTok) convention as the value score. See GET /v1/methodology for the workload blend used in the value score."},"output_price":{"type":"number","nullable":true,"description":"Output token price, USD per million tokens. Same million-token (MTok) convention as the value score. See GET /v1/methodology for the workload blend used in the value score."},"price_source":{"type":"string","nullable":true,"description":"Price source / provenance for input_price and output_price."},"quality":{"type":"number","nullable":true,"description":"Quality cell for this task on the priced variant. Null if unranked."},"quality_source":{"type":"string","nullable":true,"description":"Provenance for this task. benchmark:... is graded. illustrative is never auto-graded. Null if unranked."},"is_graded":{"type":"boolean","description":"True only when quality_source for this task starts with benchmark. Illustrative never auto-grades."},"composite_qa":{"type":"number","nullable":true,"description":"Latest visible points[].qa for this model in the dated window. Composite value score, not a per-task index. Null if none."},"note":{"type":"string","description":"Present on specialist / not-fully-scored rows. Not a recommendation."}}},"ModelTaskPosition":{"type":"object","description":"Signal-only model-on-task body. Index context plus the model's own cell. Not a recommendation and not a routing instruction.","properties":{"source":{"type":"string","example":"Cambent TKX","description":"Attribution. Always Cambent TKX."},"asOf":{"type":"string","format":"date","description":"ISO date of the latest published index. Cite this date."},"neutrality":{"type":"string","description":"Required. Signal only. This is not a recommendation and not a routing instruction. Cite Cambent TKX as-of asOf."},"model":{"$ref":"#/components/schemas/ModelTaskIdentity"},"task":{"type":"string","enum":["reason","code","extract","classify"],"description":"Task key this cell is for."},"input_price":{"type":"number","nullable":true,"description":"Input token price, USD per million tokens. Same million-token (MTok) convention as the value score. See GET /v1/methodology for the workload blend used in the value score."},"output_price":{"type":"number","nullable":true,"description":"Output token price, USD per million tokens. Same million-token (MTok) convention as the value score. See GET /v1/methodology for the workload blend used in the value score."},"price_source":{"type":"string","nullable":true,"description":"Price source / provenance for input_price and output_price."},"quality":{"type":"number","nullable":true,"description":"Quality cell for this task on the priced variant. Null if unranked."},"quality_source":{"type":"string","nullable":true,"description":"Provenance for this task. benchmark:... is graded. illustrative is never auto-graded. Null if unranked."},"is_graded":{"type":"boolean","description":"True only when quality_source for this task starts with benchmark. Illustrative never auto-grades."},"index_context":{"$ref":"#/components/schemas/QuestionIndexContext"}}},"ModelTaskIdentity":{"type":"object","description":"Listed-model identity on a question body. Not a recommendation.","properties":{"id":{"type":"string","description":"Stable slug of the listed name."},"name":{"type":"string","description":"Listed display name of the priced variant."},"host":{"type":"string","description":"Hosting class as listed."},"domain":{"type":"string","description":"Task domain as listed."},"comparable_capability_series":{"type":"boolean","description":"True only for fully graded general-domain rows. Specialists and not-fully-scored rows are false."}}},"QuestionIndexContext":{"type":"object","description":"Position vs the published composite TKX. Headline is composite, not a per-task series. Market high/low are composite QA-cost when a snapshot exists. Not a recommendation.","properties":{"series_id":{"type":"string","example":"tkx","description":"Live composite series id. Always tkx on these bodies."},"series_path":{"type":"string","example":"/v1/index/tkx","description":"Path to the published composite print."},"note":{"type":"string","description":"Position vs the published composite TKX. Not a recommendation."},"composite_qa":{"type":"number","nullable":true,"description":"On getModelTaskPosition: latest visible points[].qa for this model. Composite, not a per-task index. Null if none."},"composite_market_high":{"type":"number","description":"Highest composite value score among fully graded general-domain models on the snapshot day, when present. Value score = blended USD-per-MTok ÷ composite quality/100 for that graded blend. Lower values mean lower cost relative to that quality blend. Positioning data only, not a recommendation. Blend weights live on GET /v1/methodology."},"composite_market_low":{"type":"number","description":"Lowest composite value score among fully graded general-domain models on the snapshot day, when present. Value score = blended USD-per-MTok ÷ composite quality/100 for that graded blend. Lower values mean lower cost relative to that quality blend. Positioning data only, not a recommendation. Blend weights live on GET /v1/methodology."},"composite_market_note":{"type":"string","description":"Explains composite_market_high / composite_market_low. Present on listModelsByTask when those fields exist."}}},"Headline":{"type":"object","description":"Current published TKX, TKX-Open, and TKX-Frontier in one object. Public, no API key.","properties":{"source":{"type":"string","example":"Cambent TKX","description":"Attribution. Always Cambent TKX."},"asOf":{"type":"string","format":"date","description":"ISO date of the latest published reading. Cite this date."},"scoringVersion":{"type":"string","example":"v0.2","description":"Scoring version on this response. See GET /v1/methodology."},"constructionVersion":{"type":"string","example":"v0.3","description":"Construction version on this response. See GET /v1/methodology."},"methodology":{"type":"string","example":"https://cambent.ai/methodology","description":"Public methodology URL."},"marketHigh":{"type":"number","description":"Highest value score among fully graded general-domain models on that snapshot day. Present only when a value-score snapshot was persisted for asOf. Value score = blended USD-per-MTok ÷ composite quality/100 for that graded blend. Lower values mean lower cost relative to that quality blend. Positioning data only, not a recommendation. Blend weights live on GET /v1/methodology."},"marketLow":{"type":"number","description":"Lowest value score among fully graded general-domain models on that snapshot day. Present only when a value-score snapshot was persisted for asOf. Value score = blended USD-per-MTok ÷ composite quality/100 for that graded blend. Lower values mean lower cost relative to that quality blend. Positioning data only, not a recommendation. Blend weights live on GET /v1/methodology."},"series":{"type":"object","description":"The three live series. Task, tier, and jurisdiction series are not published.","properties":{"tkx":{"$ref":"#/components/schemas/SeriesRef"},"tkx-open":{"$ref":"#/components/schemas/SeriesRef"},"tkx-frontier":{"$ref":"#/components/schemas/SeriesRef"}}}}},"SeriesRef":{"type":"object","description":"One series id, display name, and published level inside a headline payload.","properties":{"id":{"type":"string","description":"Live series id: tkx, tkx-open, or tkx-frontier."},"name":{"type":"string","description":"Display name (TKX, TKX-Open, TKX-Frontier)."},"value":{"type":"number","description":"Current published level. 100 = baseline date on GET /v1/methodology. Not a model rank."}}},"Series":{"type":"object","description":"One current published series. Public, no API key.","properties":{"source":{"type":"string","description":"Attribution. Always Cambent TKX."},"id":{"type":"string","enum":["tkx","tkx-open","tkx-frontier"],"description":"Live series id."},"name":{"type":"string","description":"Display name for this series."},"value":{"type":"number","description":"Current published level. 100 = baseline date on GET /v1/methodology. Not a model rank."},"asOf":{"type":"string","format":"date","description":"ISO date of the latest published reading. Cite this date."},"scoringVersion":{"type":"string","description":"Scoring version on this response. See GET /v1/methodology."},"constructionVersion":{"type":"string","description":"Construction version on this response. See GET /v1/methodology."},"methodology":{"type":"string","description":"Public methodology URL."}}},"History":{"type":"object","description":"Daily published levels for one series. Without a key, points start 30 days before as-of.","properties":{"source":{"type":"string","description":"Attribution. Always Cambent TKX."},"id":{"type":"string","description":"Live series id this history belongs to."},"name":{"type":"string","description":"Display name for this series."},"interval":{"type":"string","enum":["day"],"description":"Always day. Only daily history is published."},"from":{"type":"string","format":"date","nullable":true,"description":"First point date after the caller window and the no-key start date are applied. Null if no points."},"to":{"type":"string","format":"date","nullable":true,"description":"Last point date in the returned window. Null if no points."},"asOf":{"type":"string","format":"date","nullable":true,"description":"Latest published board date. The current print endpoints use this date and are not limited to the 30-day window."},"access":{"type":"string","enum":["anonymous","read-index"],"description":"anonymous = no-key 30-day window. read-index = full archive unlocked."},"fromFloor":{"type":"string","format":"date","description":"Inclusive no-key start date (as-of minus fromFloorDays). Present on anonymous reads. Omitted when a read-index key unlocks the archive."},"fromFloorDays":{"type":"integer","example":30,"description":"Length of the no-key dated window in days. Default 30. Present on anonymous reads."},"note":{"type":"string","description":"Human explanation of the no-key 30-day window and that scope read-index unlocks the archive. Present on anonymous reads."},"scoringVersion":{"type":"string","description":"Scoring version on this response. See GET /v1/methodology."},"constructionVersion":{"type":"string","description":"Construction version on this response. See GET /v1/methodology."},"points":{"type":"array","description":"Daily published levels inside the visible window, oldest first. Empty if none match.","items":{"$ref":"#/components/schemas/HistoryPoint"}}}},"HistoryPoint":{"type":"object","description":"One published day for a series. marketHigh / marketLow appear only when a value-score snapshot exists for that date.","properties":{"date":{"type":"string","format":"date","description":"ISO date of this published reading."},"value":{"type":"number","description":"Published level on this date. Not a model rank."},"scoring":{"type":"string","description":"Scoring version recorded on this row, when present."},"construction":{"type":"string","description":"Construction version recorded on this row, when present."},"marketHigh":{"type":"number","description":"Highest value score among fully graded general-domain models on this date, when a snapshot exists. Value score = blended USD-per-MTok ÷ composite quality/100 for that graded blend. Lower values mean lower cost relative to that quality blend. Positioning data only, not a recommendation. Blend weights live on GET /v1/methodology."},"marketLow":{"type":"number","description":"Lowest value score among fully graded general-domain models on this date, when a snapshot exists. Value score = blended USD-per-MTok ÷ composite quality/100 for that graded blend. Lower values mean lower cost relative to that quality blend. Positioning data only, not a recommendation. Blend weights live on GET /v1/methodology."}}},"ModelList":{"type":"object","description":"All listed models plus list-level archive-window metadata. Individual list rows do not repeat access / fromFloor.","properties":{"source":{"type":"string","description":"Attribution. Always Cambent TKX."},"count":{"type":"integer","description":"Number of public model rows in models[]."},"access":{"type":"string","enum":["anonymous","read-index"],"description":"anonymous = no-key 30-day window on dated points[]. read-index = full archive unlocked."},"fromFloor":{"type":"string","format":"date","description":"Inclusive no-key start date for dated points[] on the rows. Present on anonymous reads. Omitted when a read-index key unlocks the archive."},"fromFloorDays":{"type":"integer","description":"Length of the no-key dated window in days. Default 30. Present on anonymous reads."},"note":{"type":"string","description":"Human explanation of the no-key 30-day window and that scope read-index unlocks the archive. Present on anonymous reads."},"models":{"type":"array","description":"Public model rows. points[] only where a real value-score snapshot exists in the visible window.","items":{"$ref":"#/components/schemas/Model"}}}},"Model":{"type":"object","description":"One listed model. Primary wire names are input_price, output_price, quality_by_task, quality_source, price_source, is_graded, grounding_tier, grounding_source, grounding_as_of, and grounding_basis. Short keys in, out, q, qsrc, src, and graded are deprecated exact-mirror aliases (same cell, same provenance) and remain at least 90 days after clean names ship. Path C grounding fields have no short alias. grounding_tier is the row rollup enum. GET /v1/models/{id} also returns access, fromFloor, fromFloorDays, and note. List rows omit those four; they sit on ModelList.","properties":{"source":{"type":"string","description":"Attribution. Present on GET /v1/models/{id}. List rows omit this; it sits on ModelList."},"id":{"type":"string","description":"Stable slug of the listed name, e.g. deepseek-v4-pro. Use this as GET /v1/models/{id}."},"name":{"type":"string","description":"Listed display name of the priced variant."},"host":{"type":"string","description":"Hosting class as listed, e.g. open or closed. Not a recommendation."},"domain":{"type":"string","description":"Task domain as listed, e.g. general. Specialist rows are not a comparable-capability series."},"input_price":{"type":"number","nullable":true,"description":"Input token price, USD per million tokens. Same million-token (MTok) convention as the value score. See GET /v1/methodology for the workload blend used in the value score. Index-used standard rate. Null if unpriced. Not a recommendation."},"output_price":{"type":"number","nullable":true,"description":"Output token price, USD per million tokens. Same million-token (MTok) convention as the value score. See GET /v1/methodology for the workload blend used in the value score. Index-used standard rate. Null if unpriced. Not a recommendation."},"price_source":{"type":"string","nullable":true,"description":"Price source / provenance for input_price and output_price (for example live:OpenAI direct or manual). Not a quality grade and not a recommendation."},"asOf":{"type":"string","description":"Date the listed price and quality row was current on the index."},"quality_by_task":{"$ref":"#/components/schemas/TaskMap"},"quality_source":{"$ref":"#/components/schemas/TaskStringMap"},"is_graded":{"$ref":"#/components/schemas/TaskBoolMap"},"grounding_tier":{"allOf":[{"$ref":"#/components/schemas/GroundingTier"}],"description":"Path C row rollup. grounded only when all four task axes are grounded and a named price source exists. Snake_case enum only. Distinct from is_graded and from provenance_tier. Not a recommendation."},"grounding_source":{"$ref":"#/components/schemas/TaskGroundingStringMap"},"grounding_as_of":{"$ref":"#/components/schemas/TaskGroundingStringMap"},"grounding_basis":{"$ref":"#/components/schemas/TaskGroundingStringMap"},"in":{"type":"number","nullable":true,"deprecated":true,"description":"Deprecated alias of input_price. Deprecated alias. Exact mirror of the clean name (same cell, same provenance). Short keys remain at least 90 days after clean names ship on this API. Not a cold drop. Input token price, USD per million tokens. Same million-token (MTok) convention as the value score. See GET /v1/methodology for the workload blend used in the value score. Not a recommendation."},"out":{"type":"number","nullable":true,"deprecated":true,"description":"Deprecated alias of output_price. Deprecated alias. Exact mirror of the clean name (same cell, same provenance). Short keys remain at least 90 days after clean names ship on this API. Not a cold drop. Output token price, USD per million tokens. Same million-token (MTok) convention as the value score. See GET /v1/methodology for the workload blend used in the value score. Not a recommendation."},"src":{"type":"string","nullable":true,"deprecated":true,"description":"Deprecated alias of price_source. Deprecated alias. Exact mirror of the clean name (same cell, same provenance). Short keys remain at least 90 days after clean names ship on this API. Not a cold drop. Price source / provenance for input_price and output_price (for example live:OpenAI direct or manual). Not a quality grade and not a recommendation."},"q":{"allOf":[{"$ref":"#/components/schemas/TaskMap"}],"deprecated":true,"description":"Deprecated alias of quality_by_task. Deprecated alias. Exact mirror of the clean name (same cell, same provenance). Short keys remain at least 90 days after clean names ship on this API. Not a cold drop."},"qsrc":{"allOf":[{"$ref":"#/components/schemas/TaskStringMap"}],"deprecated":true,"description":"Deprecated alias of quality_source. Deprecated alias. Exact mirror of the clean name (same cell, same provenance). Short keys remain at least 90 days after clean names ship on this API. Not a cold drop."},"graded":{"allOf":[{"$ref":"#/components/schemas/TaskBoolMap"}],"deprecated":true,"description":"Deprecated alias of is_graded (per-task boolean). Deprecated alias. Exact mirror of the clean name (same cell, same provenance). Short keys remain at least 90 days after clean names ship on this API. Not a cold drop. Not the same as coverage.graded, which is an integer row count."},"points":{"type":"array","description":"Daily value score for this model. Present only when a real snapshot exists for this model in the visible window. Illustrative and specialist rows never get a comparable series. Value score = blended USD-per-MTok ÷ composite quality/100 for that graded blend. Lower values mean lower cost relative to that quality blend. Positioning data only, not a recommendation. Blend weights live on GET /v1/methodology.","items":{"type":"object","properties":{"date":{"type":"string","format":"date","description":"ISO date of the persisted value-score snapshot."},"qa":{"type":"number","description":"Value score = blended USD-per-MTok ÷ composite quality/100 for that graded blend. Lower values mean lower cost relative to that quality blend. Positioning data only, not a recommendation. Blend weights live on GET /v1/methodology."}}}},"access":{"type":"string","enum":["anonymous","read-index"],"description":"anonymous or read-index. Present on GET /v1/models/{id}. List rows omit this; the same field sits on the ModelList wrapper. Describes the dated window on points[], not the price row itself."},"fromFloor":{"type":"string","format":"date","description":"Inclusive no-key start date for points[] (as-of minus fromFloorDays). Present on GET /v1/models/{id}. List rows omit this; the same field sits on the ModelList wrapper. Omitted when a read-index key unlocks the archive."},"fromFloorDays":{"type":"integer","description":"Length of the no-key dated window in days. Default 30. Present on GET /v1/models/{id}. List rows omit this; the same field sits on the ModelList wrapper."},"note":{"type":"string","description":"Human explanation of the no-key 30-day window and that scope read-index unlocks the archive. Present on GET /v1/models/{id}. List rows omit this; the same field sits on the ModelList wrapper."}}},"EventList":{"type":"object","description":"Sparse log of real membership changes and real re-benchmarks. Empty list is honest.","properties":{"source":{"type":"string","description":"Attribution. Always Cambent TKX."},"asOf":{"type":"string","format":"date","description":"Latest published index date."},"scoringVersion":{"type":"string","description":"Scoring version on this response. See GET /v1/methodology."},"constructionVersion":{"type":"string","description":"Construction version on this response. See GET /v1/methodology."},"count":{"type":"integer","description":"Number of events in the visible window."},"access":{"type":"string","enum":["anonymous","read-index"],"description":"anonymous = no-key 30-day window. read-index = full archive unlocked."},"fromFloor":{"type":"string","format":"date","description":"Inclusive no-key start date for events[]. Present on anonymous reads. Omitted when a read-index key unlocks the archive."},"fromFloorDays":{"type":"integer","description":"Length of the no-key dated window in days. Default 30. Present on anonymous reads."},"note":{"type":"string","description":"Human explanation of the no-key 30-day window and that scope read-index unlocks the archive. Present on anonymous reads."},"events":{"type":"array","description":"Recorded events in the visible window, oldest first. Empty if none.","items":{"$ref":"#/components/schemas/Event"}}}},"Event":{"type":"object","description":"One recorded membership change or re-benchmark. No invented events.","properties":{"date":{"type":"string","format":"date","description":"ISO date the event was recorded on the index."},"type":{"type":"string","enum":["membership","rebenchmark"],"description":"membership = basket add/drop. rebenchmark = quality provenance change. No other types."},"composition":{"type":"object","description":"On membership events, the recorded basket change for that date. May include added, dropped, naive, and chained figures as stored that day. Those figures are published composition metadata, not a recommendation."},"model":{"type":"string","description":"Listed model name when the event is about one model. Omitted otherwise."},"families":{"type":"array","items":{"type":"string"},"description":"Task families touched by a re-benchmark, when present."},"scoring":{"type":"string","description":"Scoring version recorded on this event, when present."},"construction":{"type":"string","description":"Construction version recorded on this event, when present."}}},"TaskMap":{"type":"object","description":"Per-task quality (quality_by_task; alias q) on the exact priced variant. Null means unranked for that task. Not a recommendation and not a ranking across models.","properties":{"reason":{"type":"number","nullable":true,"description":"Quality for reasoning on the priced variant. Null if unranked."},"code":{"type":"number","nullable":true,"description":"Quality for code on the priced variant. Null if unranked."},"extract":{"type":"number","nullable":true,"description":"Quality for extract on the priced variant. Null if unranked."},"classify":{"type":"number","nullable":true,"description":"Quality for classify on the priced variant. Null if unranked."}}},"TaskStringMap":{"type":"object","description":"Quality provenance per task (quality_source; alias qsrc). A value starting with benchmark is graded on the priced variant. illustrative is never auto-graded. Null if unranked.","properties":{"reason":{"type":"string","nullable":true,"description":"Provenance for reasoning quality. benchmark:... is graded. illustrative is never auto-graded."},"code":{"type":"string","nullable":true,"description":"Provenance for code quality. benchmark:... is graded. illustrative is never auto-graded."},"extract":{"type":"string","nullable":true,"description":"Provenance for extract quality. benchmark:... is graded. illustrative is never auto-graded."},"classify":{"type":"string","nullable":true,"description":"Provenance for classify quality. benchmark:... is graded. illustrative is never auto-graded."}}},"TaskBoolMap":{"type":"object","description":"Whether that task quality is graded vs illustrative (is_graded; alias graded). True only when quality_source for that task is benchmark-grounded on the priced variant. Illustrative never auto-graded.","properties":{"reason":{"type":"boolean","description":"True when reasoning quality is graded on the priced variant."},"code":{"type":"boolean","description":"True when code quality is graded on the priced variant."},"extract":{"type":"boolean","description":"True when extract quality is graded on the priced variant."},"classify":{"type":"boolean","description":"True when classify quality is graded on the priced variant."}}},"GroundingTier":{"type":"string","enum":["grounded","partially_grounded","provisional"],"description":"Path C row-rollup enum on grounding_tier. grounded = all four exact-variant published benches plus a named price source. partially_grounded = exact-variant coverage on some TKX-four families only. provisional = no exact-variant quality (listed, not scored yet). Snake_case only. Distinct from is_graded and from provenance_tier (first_party / named_third_party / unknown). Not a recommendation."},"TaskGroundingStringMap":{"type":"object","description":"Per-task Path C provenance string (grounding_source, grounding_as_of, or grounding_basis). Same keys as quality_by_task (reason, code, extract, classify). grounding_source and grounding_as_of are required when that axis is grounded or partially_grounded. grounding_basis for list-only or held is the exact string listed, not scored yet. Null source/date when that axis is provisional. Not a recommendation.","properties":{"reason":{"type":"string","nullable":true,"description":"Path C provenance for reasoning. Null when provisional."},"code":{"type":"string","nullable":true,"description":"Path C provenance for code. Null when provisional."},"extract":{"type":"string","nullable":true,"description":"Path C provenance for extract. Null when provisional."},"classify":{"type":"string","nullable":true,"description":"Path C provenance for classify. Null when provisional."}}},"Methodology":{"type":"object","description":"Scoring version, construction version, baseline, methodology URL, published blend and workload numbers, and live coverage. Blend and token-workload numbers live on this object only. They are not on model rows.","properties":{"source":{"type":"string","description":"Attribution. Always Cambent TKX."},"scoringVersion":{"type":"string","description":"Scoring version of the live index. Field on this response; not a URL prefix."},"constructionVersion":{"type":"string","description":"Construction version of the live index. Field on this response; not a URL prefix."},"baseline":{"type":"object","description":"Published baseline. 100 equals the baseline date. Do not re-baseline from API data.","properties":{"value":{"type":"number","example":100,"description":"Baseline level. Always 100."},"date":{"type":"string","example":"2026-08-04","description":"Baseline ISO date. 100 = this date."}}},"url":{"type":"string","example":"https://cambent.ai/methodology","description":"Human methodology page. Same published scoring recipe as taskBlend, tokenWorkload, and qaCost on this object."},"taskBlend":{"type":"object","description":"Published composite quality weights for the four task families. Same numbers as index scoring. Not a recommendation and not a per-task index.","properties":{"reason":{"type":"number","example":0.3,"description":"Reasoning share of composite quality."},"code":{"type":"number","example":0.3,"description":"Code share of composite quality."},"extract":{"type":"number","example":0.25,"description":"Extract share of composite quality."},"classify":{"type":"number","example":0.15,"description":"Classify share of composite quality."}}},"tokenWorkload":{"type":"object","description":"Published input and output token mix used to blend USD-per-MTok for the value score. Same numbers as index scoring. Not a recommendation.","properties":{"input":{"type":"number","example":0.25,"description":"Input-token share of blended USD-per-MTok."},"output":{"type":"number","example":0.75,"description":"Output-token share of blended USD-per-MTok."}}},"qaCost":{"type":"object","description":"Published composite value-score formula only. Not a per-task value score. Not a recommendation.","properties":{"formula":{"type":"string","example":"blended USD-per-MTok / (composite quality / 100)","description":"Published composite formula. Same wording as the human methodology page."},"note":{"type":"string","description":"Composite quality uses taskBlend. Blended USD-per-MTok uses tokenWorkload on input_price and output_price. Not a per-task value score and not a recommendation."}}},"coverage":{"$ref":"#/components/schemas/Coverage"}}},"Coverage":{"type":"object","description":"Counted from current model rows. Not a frozen constant. Not a recommendation.","properties":{"models":{"type":"integer","description":"Listed model count on the current index listing."},"livePrices":{"type":"integer","description":"Rows whose price_source (alias src) starts with live."},"manualPrices":{"type":"integer","description":"Rows whose price source is not live."},"graded":{"type":"integer","description":"Row count with at least one benchmark-grounded task. Keep-name integer count; not Model.is_graded. Illustrative never auto-graded."},"illustrative":{"type":"integer","description":"Rows with no benchmark-grounded task. Not a comparable-capability series."}}},"Health":{"type":"object","description":"Liveness body for this Worker. Confirms the process is up; it is not an index reading.","required":["ok","service"],"properties":{"source":{"type":"string","example":"Cambent TKX","description":"Attribution. Always Cambent TKX."},"ok":{"type":"boolean","example":true,"description":"True when this Worker is serving requests."},"service":{"type":"string","example":"cambent-index-api","description":"Service name for this Worker (cambent-index-api)."},"env":{"type":"string","description":"Present when ENVIRONMENT is set on the Worker."}}},"Error":{"type":"object","required":["source","error","message"],"description":"JSON error. Always includes source, error, and message. Unknown-path 404s add an optional hint. Extra fields appear on rate-limit bodies.","properties":{"source":{"type":"string","example":"Cambent TKX","description":"Attribution. Always Cambent TKX on this Worker."},"error":{"type":"string","enum":["not_found","method_not_allowed","bad_request","rate_limited"],"description":"Stable error code. Unknown ids are not_found. Bad interval or dates are bad_request."},"message":{"type":"string","description":"Human-readable explanation. Does not include published dollar bands."},"hint":{"type":"string","description":"Additive orientation on unknown-path 404s. Required fields stay source, error, and message. Example: See GET /openapi.json and GET /v1/index."},"scope":{"type":"string","enum":["anonymous","key","bootstrap"],"description":"Which limiter fired on a 429. Omitted on other errors."},"limit":{"type":"integer","description":"Reads-per-minute cap that was hit. Present on 429."},"retryAfter":{"type":"integer","description":"Seconds to wait before retrying. Present on 429. Also sent as Retry-After."}}}}}}