Your Move - Exercise API

Your Move - Exercise API — free-tier JSON endpoint

AUTH APIKEYCORS AGENT ?HTTPS COMMERCIAL ?

Your Move - Exercise API offers a free API tier. We verified JSON on a sample GET (Sports & Fitness). Check provider docs for key requirements and limits.

HOW IT'S SCORED ⓘ
Status badge · for your READMEshipapis health badge: — · unmonitored
ON PROBE SCHEDULE

We probe a documented GET and expect 2xx JSON — full uptime and health score. Open provider docs ↗

Uptime historystarts after first probe

On our probe schedule. Uptime charts appear after the first check lands.

Example responsefrom provider docs — not verified by us
GET https://exercise-api.ymove.app/api/v2/openapi.json

{
  "openapi": "3.0.3",
  "info": {
    "title": "YMove Fitness API",
    "version": "2.3.0",
    "description": "Access 698+ professional exercise videos, a comprehensive food & nutrition database, recipe search, and AI-powered meal plan generation. Features include rate limiting, monthly exercise caps, and video access protection. Video URLs are pre-signed and expire after 48 hours. Always fetch fresh exercise data before displaying videos. Sign up at https://ymove.app/exercise-api/signup for a free trial.",
    "contact": {
      "email": "contact@ymove.app",
      "url": "https://ymove.app/exercise-api"
    }
  },
  "servers": [
    {
      "url": "https://exercise-api.ymove.app/api/v2",
      "description": "Production"
    }
  ],
  "security": [
    {
      "ApiKeyHeader": []
    },
    {
      "ApiKeyQuery": []
    }
  ],
  "components": {
    "securitySchemes": {
      "ApiKeyHeader": {
        "type": "apiKey",
        "in": "header",
        "name": "X-API-Key"
      },
      "ApiKeyQuery": {
        "type": "apiKey",
        "in": "query",
        "name": "api_key"
      }
    },
    "schemas": {
      "Video": {
        "type": "object",
        "required": [
          "tag",
          "isPrimary"
        ],
        "description": "Video URLs are pre-signed and expire after 48 hours. Do not cache these URLs. Always fetch fresh exercise data before displaying videos.",
        "properties": {
          "videoUrl": {
            "type": "string",
            "format": "uri",
            "description": "Pre-signed CDN URL for MP4 video. Expires after 48 hours."
          },
          "videoHlsUrl": {
            "type": "string",
            "format": "uri",
            "description": "Pre-signed CDN URL for HLS playlist. Expires after 48 hours."
          },
          "thumbnailUrl": {
            "type": "string",
            "format": "uri",
            "description": "Pre-signed CDN URL for thumbnail image. Expires after 48 hours."
          },
          "tag": {
            "type": "string",
            "enum": [
              "white-background",
              "gym-shot"
            ]
          },
          "orientation": {
            "type": "string",
            "enum": [
              "landscape",
              "portrait"
            ],
            "description": "Video aspect orientation. Most exercise clips are PORTRAIT (vertical, ~9:16), shot for mobile. Do not assume landscape. Read this field and size your player to a portrait container (e.g. aspect-ratio 9/16) with object-fit: cover so clips fill the frame instead of letterboxing."
          },
          "isPrimary": {
            "type": "boolean"
          }
        }
      },
      "Exercise": {
        "type": "object",
        "required": [
          "id",
          "title"
        ],
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid"
          },
          "title": {
            "type": "string"
          },
          "slug": {
            "type": "string"
          },
          "description": {
            "type": "string",
            "nullable": true
          },
          "instructions": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "nullable": true
          },
          "importantPoints": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "nullable": true
          },
          "muscleGroup": {
            "type": "string"
          },
          "secondaryMuscles": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "nullable": true
          }
        },
        "example": {
          "id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
          "title": "Barbell Bench Press",
          "slug": "barbell-bench-press",
          "description": "A compound chest exercise performed lying on a flat bench.",
          "instructions": [
            "Lie on a flat bench with feet flat on the floor",
            "Grip the barbell slightly wider than shoulder width"
          ],
          "importantPoints": [
            "Keep your back flat on the bench",
            "Do not bounce the bar off your chest"
          ],
          "muscleGroup": "chest",
          "secondaryMuscles": [
            "triceps",
            "shoulders"
          ]
        }
      },
      "Pagination": {
        "type": "object",
        "required": [
          "page",
          "pageSize"
        ],
        "properties": {
          "page": {
            "type": "integer"
          },
          "pageSize": {
            "type": "integer"
          },
          "total": {
            "type": "integer"
          },
          "totalPages": {
            "type": "integer"
          }
        }
      },
      "MuscleGroup": {
        "type": "object",
        "properties": {
          "slug": {
            "type": "string"
          },
          "name": {
            "type": "string"
          },
          "exerciseCount": {
            "type": "integer"
          }
        }
      },
      "WorkoutExercise": {
        "type": "object",
        "properties": {
          "exercise": {
            "$ref": "#/components/schemas/Exercise"
          },
          "sets": {
            "type": "integer"
          },
          "reps": {
            "type": "string"
          },
          "restSeconds": {
            "type": "integer"
          },
          "order": {
            "type": "integer"
          }
        }
      },
      "Workout": {
        "type": "object",
        "properties": {
          "name": {
            "type": "string"
          },
          "muscleGroups": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "description": "Muscle groups targeted (expanded from any aliases in the request)."
          },
          "muscleGroupsRequested": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "description": "The original muscleGroup values from the request, including any aliases (full_body, upper_body, lower_body)."
          },
          "difficulty": {
            "type": "string"
          },
          "estimatedMinutes": {
            "type": "integer",
            "description": "Estimated total workout duration, including warmup and cooldown when present."
          },
          "exerciseCount": {
            "type": "integer"
          },
          "exercises": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/WorkoutExercise"
            }
          },
          "warmup": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/WorkoutExercise"
            },
            "description": "Warmup exercises (bodyweight stretches, mobility, and light cardio) placed at the start of the session. Present unless includeWarmup=false."
          }
        }
      },
      "ProgramDay": {
        "type": "object",
        "properties": {
          "day": {
            "type": "integer"
          },
          "name": {
            "type": "string"
          },
          "muscleGroups": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "exercises": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/WorkoutExercise"
            }
          },
          "warmup": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/WorkoutExercise"
            },
            "description": "Warmup exercises (bodyweight stretches, mobility, and light cardio) placed at the start of this day. Present unless includeWarmup=false."
          },
          "cooldown": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/WorkoutExercise"
            },
            "description": "Cooldown exercises (bodyweight stretches and mobility) placed at the end of this day. Present unless includeCooldown=false."
          }
        }
      },
      "Program": {
        "type": "object",
        "properties": {
          "name": {
            "type": "string"
          },
          "goal": {
            "type": "string"
          },
          "difficulty": {
            "type": "string"
          },
          "daysPerWeek": {
            "type": "integer"
          },
          "weeks": {
            "type": "integer"
          },
          "split": {
            "type": "string"
          },
          "weeklySchedule": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/ProgramDay"
            }
          },
          "notes": {
            "type": "string"
          }
        }
      }
    }
  },
  "paths": {
    "/exercises": {
      "get": {
        "summary": "List and search exercises",
        "operationId": "listExercises",
        "tags": [
          "Exercises"
        ],
        "parameters": [
          {
            "name": "muscleGroup",
            "in": "query",
            "example": "chest",
            "schema": {
              "type": "string",
              "enum": [
                "chest",
                "back"
              ]
            },
            "description": "Filter by muscle group"
          },
          {
            "name": "exerciseType",
            "in": "query",
            "schema": {
              "type": "string",
              "enum": [
                "strength",
                "yoga"
              ]
            },
            "description": "Filter by exercise type"
          }
        ],
        "responses": {
          "200": {
            "description": "Paginated list of exercises. When the monthly exercise cap is exceeded, exercises not previously accessed will have video properties (videoUrl, videoHlsUrl, thumbnailUrl, videoDurationSecs, videos) removed entirely. A `_warning` object is included with details. Previously accessed exercises keep their video URLs.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "data": {
                      "type": "array",
                      "items": {
                        "$ref": "#/components/schemas/Exercise"
                      }
                    },
                    "pagination": {
                      "$ref": "#/components/schemas/Pagination"
                    },
                    "_warning": {
                      "$ref": "#/components/schemas/MonthlyCapWarning"
                    }
                  }
                }
              }
            }
          },
          "401": {
            "description": "Invalid or missing API key",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Rate limit exceeded",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/RateLimitError"
                }
              }
            }
          }
        }
      }
    },
    "/exercises/exercise-types": {
      "get": {
        "summary": "List all exercise types with counts",
        "operationId": "listExerciseTypes",
        "tags": [
          "Exercises"
        ],
        "responses": {
          "200": {
            "description": "List of exercise types",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "data": {
                      "type": "array",
                      "items": {
                        "$ref": "#/components/schemas/ExerciseType"
                      }
                    }
                  }
                }
              }
            }
          }
        }
      }
    },
    "/exercises/muscle-groups": {
      "get": {
        "summary": "List all muscle groups with exercise counts",
        "operationId": "listMuscleGroups",
        "tags": [
          "Exercises"
        ],
        "responses": {
          "200": {
            "description": "List of muscle groups",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "data": {
                      "type": "array",
                      "items": {
                        "$ref": "#/components/schemas/MuscleGroup"
                      }
                    }
                  }
                }
              }
            }
          }
        }
      }
    },
    "/exercises/{id}": {
      "get": {
        "summary": "Get a single exercise by ID or slug",
        "operationId": "getExercise",
        "tags": [
          "Exercises"
        ],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Exercise UUID or slug"
          }
        ],
        "responses": {
          "200": {
            "description": "Exercise details. When the monthly exercise cap is exceeded and this exercise was not previously accessed, video properties are removed entirely and a `_warning` is included.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/Exercise"
                    },
                    "_warning": {
                      "$ref": "#/components/schemas/MonthlyCapWarning"
                    }
                  }
                }
              }
            }
          },
          "401": {
            "description": "Invalid or missing API key",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "Exercise not found",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Rate limit exceeded",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/RateLimitError"
                }
              }
            }
          }
        }
      }
    },
    "/workouts/generate": {
      "get": {
        "summary": "Generate a structured workout",
        "operationId": "generateWorkout",
        "tags": [
          "Workouts"
        ],
        "parameters": [
          {
            "name": "muscleGroup",
            "in": "query",
            "required": true,
            "style": "form",
            "explode": false,
            "schema": {
              "type": "array",
              "items": {
                "type": "string",
                "enum": [
                  "chest",
                  "back"
                ]
              }
            },
            "description": "Target muscle group(s). Accepts a single value, a comma-separated list (e.g. \"chest,back\"), or repeated query keys. Aliases: \"full_body\" (all groups), \"upper_body\" (chest, back, shoulders, biceps, triceps, forearms, core), \"lower_body\" (quads, hamstrings, glutes, calves). Aliases can be combined with specific groups."
          },
          {
            "name": "equipment",
            "in": "query",
            "style": "form",
            "explode": false,
            "schema": {
              "type": "array",
              "items": {
                "type": "string",
                "enum": [
                  "machine",
                  "barbell"
                ]
              }
            },
            "description": "Limit to specific equipment. Accepts a single value, comma-separated list, or repeated keys."
          }
        ],
        "responses": {
          "200": {
            "description": "Generated workout. When the monthly exercise cap is exceeded, exercises not previously accessed will have video properties removed entirely. A `_warning` object is included with details.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/Workout"
                    },
                    "_warning": {
                      "$ref": "#/components/schemas/MonthlyCapWarning"
                    }
                  }
                }
              }
            }
          },
          "400": {
            "description": "Missing required parameter",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "Invalid or missing API key",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Rate limit exceeded",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/RateLimitError"
                }
              }
            }
          }
        }
      }
    },
    "/programs/generate": {
      "get": {
        "summary": "Generate a multi-week training program",
        "operationId": "generateProgram",
        "tags": [
          "Programs"
        ],
        "parameters": [
          {
            "name": "goal",
            "in": "query",
            "schema": {
              "type": "string",
              "enum": [
                "muscle_building",
                "weight_loss"
              ],
              "default": "muscle_building"
            },
            "description": "Training goal. Sets the set/rep/rest scheme and exercises-per-muscle."
          },
          {
            "name": "difficulty",
            "in": "query",
            "schema": {
              "type": "string",
              "enum": [
                "beginner",
                "intermediate"
              ],
              "default": "intermediate"
            },
            "description": "Difficulty level. Filters which exercises are selected per muscle: beginner returns beginner-level moves, intermediate returns beginner+intermediate, advanced prefers advanced moves (falling back to intermediate where advanced options are limited). Combine with goal, which controls volume."
          }
        ],
        "responses": {
          "200": {
            "description": "Generated training program. When the monthly exercise cap is exceeded, exercises not previously accessed will have video properties removed entirely. A `_warning` object is included with details.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/Program"
                    },
                    "_warning": {
                      "$ref": "#/components/schemas/MonthlyCapWarning"
                    }
                  }
                }
              }
            }
          },
          "401": {
            "description": "Invalid or missing API key",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Rate limit exceeded",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/RateLimitError"
                }
              }
            }
          }
        }
      }
    },
    "/posture/analyze": {
      "post": {
        "summary": "Analyze exercise form from video (max 100MB)",
        "operationId": "analyzePosture",
        "tags": [
          "Form Analysis"
        ],
        "description": "Upload an exercise video and get AI-powered form analysis. Returns a form score (0-100), detected issues with plain-language fixes, and corrective exercise recommendations.",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "required": [
                  "video",
                  "exercise_name"
                ],
                "properties": {
                  "video": {
                    "type": "object",
                    "required": [
                      "type",
                      "data"
                    ],
                    "description": "The exercise video to analyze.",
                    "properties": {
                      "type": {
                        "type": "string",
                        "enum": [
                          "base64",
                          "url"
                        ],
                        "description": "How the video is provided: base64-encoded data or a public URL."
                      },
                      "data": {
                        "type": "string",
                        "description": "Base64-encoded video data, or a public URL to the video file."
                      },
                      "media_type": {
                        "type": "string",
                        "enum": [
                          "video/mp4",
                          "video/webm"
                        ],
                        "default": "video/mp4"
                      }
                    }
                  },
                  "exercise_name": {
                    "type": "string",
                    "description": "Name of the exercise being performed (e.g. \"barbell squat\", \"deadlift\").",
                    "minLength": 1,
                    "maxLength": 200
                  },
                  "analysis_type": {
                    "type": "string",
                    "enum": [
                      "standing",
                      "seated"
                    ],
                    "default": "exercise",
                    "description": "Type of analysis to perform."
                  },
                  "custom_instructions": {
                    "type": "string",
                    "maxLength": 500,
                    "description": "Optional extra instructions for the analysis (e.g. \"focus on knee alignment\")."
                  },
                  "num_frames": {
                    "type": "integer",
                    "minimum": 4,
                    "maximum": 20,
                    "default": 16,
                    "description": "Number of frames to extract from the video for analysis."
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Form analysis result with score, issues, and corrective exercises",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PostureAnalysisResult"
                }
              }
            }
          },
          "400": {
            "description": "Validation error or analysis failed",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "Invalid or missing API key",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Rate limit exceeded",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/RateLimitError"
                }
              }
            }
          }
        }
      }
    },
    "/usage": {
      "get": {
        "summary": "Check API usage and limits (includes monthly exercise cap)",
        "operationId": "getUsage",
        "tags": [
          "Account"
        ],
        "responses": {
          "200": {
            "description": "Current usage data including monthly exercise cap",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/Usage"
                    }
                  }
                }
              }
            }
          }
        }
      }
    }
  },
  "tags": [
    {
      "name": "Exercises",
      "description": "Browse and search exercise videos. Video URLs are pre-signed and expire after 48 hours."
    },
    {
      "name": "Workouts",
      "description": "Generate structured workouts"
    }
  ]
}
Call itcurl · fetch · python
curl "https://exercise-api.ymove.app/api/v2/openapi.json"
const res = await fetch("https://exercise-api.ymove.app/api/v2/openapi.json");
const data = await res.json();
console.log(data);
import requests

res = requests.get("https://exercise-api.ymove.app/api/v2/openapi.json")
print(res.json())
Endpoints · 6On scheduleFULL DOCS ↗
On schedule — GET /api/v2/openapi.json awaits first probe
GET/api/v2/openapi.jsonPROBED

Your Move - Exercise API — free-tier JSON endpoint

GET/api

Api — documented GET route.

GET/api/1

Api details by ID (example: 1).

GET/api?limit=10

Api — documented GET route.

GET/api/search?q=test

Search by query parameters.

GET/exercises

List and search exercises

Machine-readable spec

We probe a documented GET and expect 2xx JSON — full uptime and health score. Export includes every documented route below.

Response-shape history

Not tracked yet. Shape-change history starts once this API joins our probe schedule.

Your Move - Exercise API: common questions

Is Your Move - Exercise API free to use?

Yes — Your Move - Exercise API is a free health & food API. Free tier: Free tier — API key may be required for production. Whether the free tier allows commercial use is unclear — check the provider docs.

Does Your Move - Exercise API need an API key?

Yes — Your Move - Exercise API needs a free API key, which you pass on each request. Rate limits: Unpublished.

Can I call Your Move - Exercise API from the browser?

Yes — Your Move - Exercise API returns CORS headers over HTTPS, so front-end code can fetch it directly with no backend proxy. Use the fetch snippet on this page, or hit "Run live" to try it now.

Is Your Move - Exercise API up right now?

Your Move - Exercise API is catalogued but not yet on our probe schedule, so we don't publish a live status for it. Check the provider's own status page or docs for its current state.