Skip to content

List Solution manifests

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

Media typeapplication/json

GET /api/solutions/ envelope — published manifests for the workspace’s segment, each enriched with isFavorite + lastRunAt.

object
results
required
Array<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
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
ExampleSportsCatalog

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"
}
]
}