Introduction
The Funxtion REST API gives you access to the full fitness content engine — exercises, workouts, training plans, on-demand classes, and more.
Base URL: https://api.funxtion.com/v3
Contact: development@funxtion.com
Full OpenAPI specification: docs.funxtion.com
Looking for mobile integration? See our SDK documentation for Flutter, iOS, and Android.
Authentication
The API uses JWT (JSON Web Token) authentication. Call POST /auth/login with your credentials to receive an access token and refresh token.
Scopes
| Parameter | Type | Required | Description |
|---|---|---|---|
mobile | scope | Optional | Read-only access to fitness content, calendar, and booking data. Token valid for 4 hours. |
platform | scope | Optional | Management functionality access. Token valid for 4 hours. |
Provide your organisation code (e.g. "funxtion") in each login request. Refresh tokens are valid for 6 months and can be revoked at any time.
Required headers
| Parameter | Type | Required | Description |
|---|---|---|---|
Authorization | header | Required | Bearer {token} — required for all content endpoints |
Content-Type | header | Required | application/json — required for all requests |
Making requests
All requests must include the Content-Type: application/json header. Authenticated endpoints require the Authorization: Bearer {token} header.
Request and response bodies use JSON. All timestamps are ISO 8601 format in UTC.
Filtering & pagination
Default page size is 20 results. Maximum is 250.
| Parameter | Type | Required | Description |
|---|---|---|---|
filter[limit] | integer | Optional | Number of results per page (default 20, max 250) |
filter[offset] | integer | Optional | Number of results to skip for pagination |
filter[where][q][contains] | string | Optional | Text search — e.g. "push" |
filter[where][level][eq] | string | Optional | Exact match — e.g. "beginner" |
filter[where][equipment][in] | string | Optional | Comma-separated IDs — e.g. "1,2,3" |
contains, eq, in, and and.Ordering
Use the filter[order] parameter to sort results. Default ordering is desc on the updated field.
| Parameter | Type | Required | Description |
|---|---|---|---|
filter[order][name] | string | Optional | "asc" or "desc" |
filter[order][created] | string | Optional | "asc" or "desc" |
Response codes
| Code | Description |
|---|---|
| 200 | Success |
| 400 | Missing required attributes |
| 401 | Authentication error (invalid credentials, expired token) |
| 403 | Insufficient privileges |
| 404 | Resource not found |
| 409 | Conflict |
| 422 | Validation error |
| 429 | Rate limit exceeded |
Language & i18n
Default language is set by the Accept-Language header. For multi-language responses, use the ?lang= query parameter with comma-separated language codes.
Example: ?lang=en,nl,pl,ar-SA
Multi-language responses return MultiLangString objects with language code keys and a "default" key.
Thumbnails
Append style and size query parameters to image URLs returned by the API. Base CDN: https://cdn.funxtion.com
POST/auth/login
Get a JSON Web Token.
Request body
| Parameter | Type | Required | Description |
|---|---|---|---|
email | string | Required | Your account email |
password | string | Required | Your account password |
code | string | Required | Your organisation code |
scope | string | Required | "mobile" or "platform" |
Response
Returns access_token, refresh_token, and expires_in (seconds).
POST/auth/token/refresh
Exchange a refresh token for a new access token.
Request body
| Parameter | Type | Required | Description |
|---|---|---|---|
refresh_token | string | Required | A valid refresh token |
Response
Returns access_token and expires_in.
POST/auth/token/revoke
Revoke a refresh token.
Request body
| Parameter | Type | Required | Description |
|---|---|---|---|
refresh_token | string | Required | The refresh token to revoke |
POST/auth/integration
Create an Integration API Access Token.
Request body
| Parameter | Type | Required | Description |
|---|---|---|---|
name | string | Required | Name for the integration token |
scope | string | Required | "mobile" or "platform" |
DELETE/auth/integration
Delete an Integration API Access Token.
Request body
| Parameter | Type | Required | Description |
|---|---|---|---|
token_id | string | Required | ID of the token to delete |
POST/content/search
Search across all content types.
Request body
| Parameter | Type | Required | Description |
|---|---|---|---|
q | string | Required | Search query |
type | string | Optional | "exercises", "workouts", "training-plans", or "on-demand" |
filter[limit] | integer | Optional | Results per page |
filter[offset] | integer | Optional | Results to skip |
GET/content/exercises
List all exercises with filtering and pagination.
Query parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
filter[where][q][contains] | string | Optional | Text search |
filter[where][level][eq] | string | Optional | Filter by level |
filter[where][equipment][in] | string | Optional | Filter by equipment IDs |
filter[limit] | integer | Optional | Results per page |
filter[offset] | integer | Optional | Results to skip |
filter[order][name] | string | Optional | "asc" or "desc" |
GET/content/exercises/:id
Get a single exercise by ID.
Path parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
id | string | Required | The exercise ID |
GET/content/workouts
List workouts with filtering and pagination.
Query parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
filter[where][q][contains] | string | Optional | Text search |
filter[where][goals][in] | string | Optional | Filter by goal IDs |
filter[limit] | integer | Optional | Results per page |
filter[offset] | integer | Optional | Results to skip |
GET/content/workouts/:id
Get a single workout by ID.
Path parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
id | string | Required | The workout ID |
GET/content/training-plans
List training plans.
Query parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
filter[limit] | integer | Optional | Results per page |
filter[offset] | integer | Optional | Results to skip |
filter[order][created] | string | Optional | "asc" or "desc" |
GET/content/training-plans/:id
Get a single training plan by ID.
Path parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
id | string | Required | The training plan ID |
GET/content/on-demand
List on-demand virtual classes.
Query parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
filter[where][q][contains] | string | Optional | Text search |
filter[where][category][eq] | string | Optional | Filter by category |
filter[limit] | integer | Optional | Results per page |
filter[offset] | integer | Optional | Results to skip |
GET/content/on-demand/:id
Get a single on-demand class by ID.
Path parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
id | string | Required | The on-demand class ID |
GET/content/packages
List content packages.
Query parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
filter[limit] | integer | Optional | Results per page |
filter[offset] | integer | Optional | Results to skip |
GET/content/packages/:id
Get a single content package by ID.
Path parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
id | string | Required | The content package ID |
Equipment
GET/content/equipment List equipment
GET/content/equipment/:id Get equipment
GET/content/equipment/brands List equipment brands
GET/content/equipment/categories List equipment categories
Muscle Groups
GET/content/muscle-groups List muscle groups
Body Parts
GET/content/body-parts List body parts
Fitness Goals
GET/content/goals List fitness goals
GET/content/goals/:id Get a fitness goal
Instructors
GET/content/instructors List instructors
GET/content/instructors/:id Get an instructor
Categories
GET/content/categories List content categories
GET/content/activity-types List fitness activity types
GET/content/providers List content providers