Your Move - Exercise API
Your Move - Exercise API — free-tier JSON endpoint
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.
We probe a documented GET and expect 2xx JSON — full uptime and health score. Open provider docs ↗
On our probe schedule. Uptime charts appear after the first check lands.
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"
}
]
}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())/api/v2/openapi.jsonPROBEDYour Move - Exercise API — free-tier JSON endpoint
/apiApi — documented GET route.
/api/1Api details by ID (example: 1).
/api?limit=10Api — documented GET route.
/api/search?q=testSearch by query parameters.
/exercisesList and search exercises
We probe a documented GET and expect 2xx JSON — full uptime and health score. Export includes every documented route below.
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.