List Solution manifests
const url = 'http://localhost:8000/api/solutions/';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/ \ --header 'Authorization: Bearer <token>'Every catalog-visible SolutionDefinition manifest. The list is the same for all workspaces — the team’s market segment only drives the per-vertical filter-chip rail on the frontend (read from /api/me’s segment), not which Solutions are returned.
Authorizations
Section titled “Authorizations”Responses
Section titled “Responses”GET /api/solutions/ envelope — published manifests for the
workspace’s segment, each enriched with isFavorite + lastRunAt.
object
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
Published Solutions for a sports workspace
{ "results": [ { "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" } ]}