---
title: "Artifact render capability"
method: GET
path: "/artifacts/capability"
tags: ["Discovery"]
---

# Artifact render capability

`GET /artifacts/capability`

## Request

- Base URL: `https://riskmodels.app/api`
- URL: `https://riskmodels.app/api/artifacts/capability`
- Auth: none required

The verified (slug, subject_kind) pairs render-svc can serve, each slug's applicable render params, and the pairs that were measured and refused.
Derived from the audited capability table on every request, so a pair that was never verified cannot be advertised. Answers "what renders for this subject?" before a client mounts anything — previously the only way to learn the answer was to request something that failed, because the reconciled table appeared solely inside error payloads.
**Authentication:** None. Discovery only: it names renderers and subject kinds and returns no subject content, no holdings and no numbers.
**Billing:** Free.

## Query parameters

- `subject_kind` 'fund' | 'etf' | 'filer_13f' | 'cohort' | 'stock' | 'client_portfolio'
- `slug` string

## Response `200`

Capability document. A narrowing query that matches nothing returns 200 with an empty `pairs` list, not 404.

- ArtifactCapabilityResponse
  - `derived_from` string, required: The source constant the response is computed from.
  - `discovery` object: Routes to call before forming a render request.
    - `capability` string
    - `as_of` string
  - `subject_kinds` string[], required: Every kind render-svc resolves from a subject_id prefix.
  - `prerendered_subject_kinds` string[]: Kinds render-svc can only read from the store. See each pair's `as_of_latest` for what `latest` does; `GET /api/artifacts/as-of` lists the dates that exist.
  - `store_resolved_latest_kinds` string[]: Pre-rendered kinds whose `as_of=latest` resolves to the newest stored vintage (cohorts).
  - `unimplemented_subject_kinds` object: Kinds resolvable from an id prefix that no loader serves, keyed to the reason. Present so a zero-capability kind reads as measured rather than unaudited.
  - `params` object, required
    - `vocabulary` string[]: Every key the render request schema accepts.
    - `by_slug` object: Applicability per slug. A slug absent from this map accepts no params. Applicability is not the accepted value set — the artifact module narrows further and answers 422 on a value it does not take.
  - `pairs` object[], required: Verified pairs only. Nothing else may appear here.
    - `slug` string, required
    - `version` string, required
    - `subject_kind` string, required
    - `params` string[], required
    - `prerendered` boolean, required
    - `as_of_latest` 'loader' | 'newest_prerendered' | 'unsupported': How `as_of=latest` resolves for this pair. `newest_prerendered` reads the newest date from `GET /api/artifacts/as-of`; `unsupported` means pass one of those dates explicitly.
    - `notes` string
  - `unavailable` object[], required: Pairs measured against prod and refused, with the reason. Recorded rather than deleted so a later audit does not re-add them hopefully.
    - `slug` string, required
    - `subject_kind` string, required
    - `status` 'degraded' | 'unavailable', required
    - `reason` string, required
  - `counts` object, required
    - `verified` integer
    - `unavailable` integer
    - `slugs` integer

## Other responses

- `400`: Unknown subject_kind.

---

[API](https://skmtc.dev/riskmodels/apis/riskmodels-api.md) · [All operations](https://skmtc.dev/riskmodels/apis/riskmodels-api/llms.txt) · [OpenAPI document](https://skmtc.dev/riskmodels/apis/riskmodels-api/revisions/1a034cad408a?raw)
