Get a Solution manifest
const url = 'http://localhost:8000/api/solutions/example/';const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
try { const response = await fetch(url, options); const data = await response.json(); console.log(data);} catch (error) { console.error(error);}curl --request GET \ --url http://localhost:8000/api/solutions/example/ \ --header 'Authorization: Bearer <token>'The full SolutionDefinition for one Solution. The renderer consumes reportLayout directly; report data is produced separately per run.
Authorizations
Section titled “Authorizations”Parameters
Section titled “Parameters”Path Parameters
Section titled “Path Parameters”Responses
Section titled “Responses”A Solution SolutionDefinition manifest. Top-level fields are typed
for the docs; movements and the deep reportLayout (layer1 named
slots + layer2 sections + per-block config) are left as open objects —
the frontend @aikynetix/ui renderer owns those shapes, and typing
them here would duplicate ~23 block contracts in DRF for no gain.
object
Stable manifest id.
URL slug, e.g. running-gait.
Manifest version.
Short catalog-card blurb (#950) — the card renders this; description stays the Detail-page copy.
performance / monitoring / screening / …
sports / healthcare / wellness.
Category-filter chips: recommended/sports/kinematics/mobility/rehab.
Drives the card gradient + glyph; optional.
Catalog sport-filter bucket; decoupled from activityKey (the glyph). Optional — the catalog falls back to activityKey when absent. Set only when a sport borrows another sport’s glyph but must filter on its own (e.g. Padel reuses the tennis glyph).
Ordered movement slots a coach binds sessions to.
object
Modular floor (#1620): the number of DISTINCT movement slots that must be bound to create a run, for a Solution that marks no single slot required (a battery where three of five tests still produce a report). Absent = the per-slot required flags are the whole rule. The FE enables Produce at this floor; the report says which tests are missing and withholds any composite it cannot justify.
Session exercises this Solution accepts (e.g. CMJ → [‘Countermovement Jump’]). Lets the catalog narrow to the right Solution when entered from a specific-exercise session — a Drop Jump capture shouldn’t offer the CMJ Solution. Empty = no exercise filter.
Block layout — presentation, layer1 (named slots), layer2 (category sections). Block shapes are FE-owned (@aikynetix/ui).
object
coming_soon renders a disabled catalog card (no run).
draft- draftpublished- publishedcoming_soon- coming_soondeprecated- deprecated
Whether the requesting coach starred this.
ISO timestamp of the most recent run for this Solution in the team (drives the catalog’s Recent section). Absent if never run.
Examples
Running Gait manifest
{ "id": "running-gait", "slug": "running-gait", "version": 1, "name": "Running Gait Analysis", "description": "Phase-resolved gait analysis covering cadence, contact time, vertical oscillation, asymmetry, and posture markers.", "typology": "performance", "segment": "sports", "specializationTags": [ "running" ], "layersUsed": [ "L2", "L3" ], "estimatedDurationMin": 5, "activityKey": "running", "movements": [ { "id": "running-side", "order": 1, "layer": "L2", "movementType": "running", "viewRequirements": [ "side" ], "required": true } ], "scoringFormat": "composite", "reportLayout": { "presentation": "fullpage", "layer1": { "metricsOverview": { "id": "metrics-overview-1", "type": "metrics_overview" } }, "layer2": [ { "id": "section-metrics-breakdown", "category": "metrics_breakdown", "heading": "Metrics breakdown", "fullWidth": true, "blocks": [ { "id": "metrics-breakdown-1", "type": "metrics_breakdown" } ] } ] }, "status": "published"}object
Human-readable message, or a stable machine code for the cases a client branches on. The standard envelope for 400 (validation — a field-keyed object may appear instead), 401 (missing / invalid credentials), 403 (authenticated but not permitted), and 404 (absent — cross-team records are collapsed to 404 so the API never leaks the existence of another team’s data).
Examplegenerated
{ "detail": "example"}