Skip to content

Get a Solution manifest

GET
/api/solutions/{slug}/
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.

slug
required
string
Media typeapplication/json

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
id
required

Stable manifest id.

string
slug
required

URL slug, e.g. running-gait.

string
version
required

Manifest version.

integer
name
required
string
description
required
string
summary

Short catalog-card blurb (#950) — the card renders this; description stays the Detail-page copy.

string
typology
required

performance / monitoring / screening / …

string
segment
required

sports / healthcare / wellness.

string
specializationTags
required
Array<string>
chipTags

Category-filter chips: recommended/sports/kinematics/mobility/rehab.

Array<string>
layersUsed
required
Array<string>
estimatedDurationMin
required
integer
activityKey

Drives the card gradient + glyph; optional.

string
focusKey

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).

string
movements
required

Ordered movement slots a coach binds sessions to.

Array<object>
object
key
additional properties
minSlots

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.

integer
>= 1
acceptedExercises

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.

Array<string>
scoringFormat
required
string
reportLayout
required

Block layout — presentation, layer1 (named slots), layer2 (category sections). Block shapes are FE-owned (@aikynetix/ui).

object
key
additional properties
status
required

coming_soon renders a disabled catalog card (no run).

  • draft - draft
  • published - published
  • coming_soon - coming_soon
  • deprecated - deprecated
string
Allowed values: draft published coming_soon deprecated
isFavorite

Whether the requesting coach starred this.

boolean
lastRunAt

ISO timestamp of the most recent run for this Solution in the team (drives the catalog’s Recent section). Absent if never run.

string format: date-time
nullable
Examples
ExampleRunningGaitManifest

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"
}
Media typeapplication/json
object
detail
required

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).

string
Examplegenerated
{
"detail": "example"
}