Docs

Fitly API
Reference

Programmatic access to exercises, AI-generated workouts, periodized programs, and a supplement database. Every trainer on Joiinflow gets their own rate-limited API key against this shared dataset.

Base URL
fitly.joiinflow.com/api/fitly
Version
v1
Format
JSON
Auth
API Key
Quick Start
# Fetch 5 exercises using your API key
curl 'https://fitly.joiinflow.com/api/fitly/v1/exercises?limit=5' \
  -H "X-Fitly-Key: wx_your_key_here"

Authentication

Every request requires a key from your API Keys page. Pass it one of two ways.

1

HTTP HEADER (Recommended)

Keeps the key out of server logs and browser history.

curl 'https://fitly.joiinflow.com/api/fitly/v1/exercises' \
  -H "X-Fitly-Key: wx_your_key_here"
2

QUERY PARAMETER

Convenient for quick tests or embedding a GIF URL directly in an <img> tag.

curl 'https://fitly.joiinflow.com/api/fitly/v1/exercises?api-key=wx_your_key_here'

Exercises

GET/v1/exercises

List all exercises with pagination and filters.

Parameters

NameInRequired
bodyPartqueryNo
targetqueryNo
equipmentqueryNo
limitqueryNo
offsetqueryNo

Example Request

curl 'https://fitly.joiinflow.com/api/fitly/v1/exercises?bodyPart=chest&target=pectorals' \
  -H "X-Fitly-Key: wx_your_key_here"

Example Response

[
  {
    "id": "0025",
    "name": "Barbell Bench Press",
    "bodyPart": "chest",
    "target": "pectorals",
    "equipment": "barbell",
    "difficulty": "intermediate",
    "mechanic": "compound",
    "force": "push",
    "caloriesPerMinute": 7.4,
    "popularityRank": 99,
    "gifUrl": "https://fitly.joiinflow.com/api/fitly/v1/media/videos/0025-EIeI8Vf.gif",
    "isUnilateral": false,
    "recommendedSets": "3-4",
    "recommendedReps": "5-8"
  }
]
GET/v1/exercises/exercise/:id

Get a single exercise by ID.

Parameters

NameInRequired
idpathYes

Example Request

curl 'https://fitly.joiinflow.com/api/fitly/v1/exercises/exercise/0001' \
  -H "X-Fitly-Key: wx_your_key_here"

Example Response

{
  "id": "0025",
  "name": "Barbell Bench Press",
  "bodyPart": "chest",
  "target": "pectorals",
  "equipment": "barbell",
  "secondaryMuscles": [
    "triceps",
    "shoulders"
  ],
  "instructions": [
    "Lie flat on a bench with your feet flat on the ground.",
    "Lower the barbell to your chest.",
    "Press back up to full extension."
  ],
  "gifUrl": "https://fitly.joiinflow.com/api/fitly/v1/media/videos/0025-EIeI8Vf.gif",
  "category": "strength",
  "difficulty": "intermediate",
  "mechanic": "compound",
  "force": "push",
  "met": 6,
  "caloriesPerMinute": 7.4
}
GET/v1/exercises/bodyPart/:bodyPart

Filter exercises by body part.

Parameters

NameInRequired
bodyPartpathYes
limitqueryNo

Example Request

curl 'https://fitly.joiinflow.com/api/fitly/v1/exercises/bodyPart/chest?limit=5' \
  -H "X-Fitly-Key: wx_your_key_here"
GET/v1/exercises/target/:target

Filter exercises by target muscle.

Parameters

NameInRequired
targetpathYes
limitqueryNo

Example Request

curl 'https://fitly.joiinflow.com/api/fitly/v1/exercises/target/biceps?limit=5' \
  -H "X-Fitly-Key: wx_your_key_here"
GET/v1/exercises/equipment/:equipment

Filter exercises by equipment.

Parameters

NameInRequired
equipmentpathYes
limitqueryNo

Example Request

curl 'https://fitly.joiinflow.com/api/fitly/v1/exercises/equipment/dumbbell?limit=5' \
  -H "X-Fitly-Key: wx_your_key_here"
GET/v1/exercises/name/:name

Partial name search.

Parameters

NameInRequired
namepathYes

Example Request

curl 'https://fitly.joiinflow.com/api/fitly/v1/exercises/name/squat' \
  -H "X-Fitly-Key: wx_your_key_here"
GET/v1/exercises/bodyPartList

All body part values.

Example Request

curl 'https://fitly.joiinflow.com/api/fitly/v1/exercises/bodyPartList' \
  -H "X-Fitly-Key: wx_your_key_here"
GET/v1/exercises/targetList

All target muscle values.

Example Request

curl 'https://fitly.joiinflow.com/api/fitly/v1/exercises/targetList' \
  -H "X-Fitly-Key: wx_your_key_here"
GET/v1/exercises/equipmentList

All equipment values.

Example Request

curl 'https://fitly.joiinflow.com/api/fitly/v1/exercises/equipmentList' \
  -H "X-Fitly-Key: wx_your_key_here"
GET/v1/exercises/:id/similar

Exercises similar to the given one.

Parameters

NameInRequired
idpathYes
limitqueryNo

Example Request

curl 'https://fitly.joiinflow.com/api/fitly/v1/exercises/0025/similar?limit=5' \
  -H "X-Fitly-Key: wx_your_key_here"
GET/v1/exercises/:id/alternatives

Same target, different equipment.

Parameters

NameInRequired
idpathYes
equipmentqueryNo

Example Request

curl 'https://fitly.joiinflow.com/api/fitly/v1/exercises/0025/alternatives?equipment=dumbbell' \
  -H "X-Fitly-Key: wx_your_key_here"
GET/v1/exercises/:id/calories

Estimate calories burned.

Parameters

NameInRequired
idpathYes
weightKgqueryNo
minutesqueryNo

Example Request

curl 'https://fitly.joiinflow.com/api/fitly/v1/exercises/0025/calories?weightKg=80&minutes=15' \
  -H "X-Fitly-Key: wx_your_key_here"
GET/v1/exercises/changesUltra+

Exercises changed since a date. Requires Ultra plan.

Parameters

NameInRequired
sincequeryYes

Example Request

curl 'https://fitly.joiinflow.com/api/fitly/v1/exercises/changes?since=2026-01-01' \
  -H "X-Fitly-Key: wx_your_key_here"

Workout

GET/v1/workout/generatePro+

Generate a single workout session. Requires Pro plan or higher.

Parameters

NameInRequired
goalqueryNo
durationqueryNo
levelqueryNo
splitqueryNo
equipmentqueryNo

Example Request

curl 'https://fitly.joiinflow.com/api/fitly/v1/workout/generate?goal=muscle_gain&duration=45' \
  -H "X-Fitly-Key: wx_your_key_here"

Example Response

{
  "goal": "muscle_gain",
  "level": "intermediate",
  "seed": "06vhrfi3",
  "split": "push",
  "bodyFocus": [
    "chest",
    "shoulders",
    "upper arms"
  ],
  "equipment": [
    "barbell",
    "dumbbell"
  ],
  "totalExercises": 5,
  "estimatedDurationMinutes": 47,
  "exercises": [
    {
      "order": 1,
      "sets": 4,
      "reps": "6-8",
      "restSeconds": 90,
      "exercise": {
        "id": "0025",
        "name": "Barbell Bench Press"
      }
    }
  ]
}
GET/v1/workout/programUltra+

Generate a periodized multi-week program. Requires Ultra plan.

Parameters

NameInRequired
goalqueryNo
weeksqueryNo
daysPerWeekqueryNo

Example Request

curl 'https://fitly.joiinflow.com/api/fitly/v1/workout/program?goal=muscle_gain&weeks=8' \
  -H "X-Fitly-Key: wx_your_key_here"

Supplements

GET/v1/supplementsPro+

List supplements. Requires Pro plan or higher.

Parameters

NameInRequired
goalqueryNo
evidencequeryNo

Example Request

curl 'https://fitly.joiinflow.com/api/fitly/v1/supplements?goal=muscle_gain&evidence=strong' \
  -H "X-Fitly-Key: wx_your_key_here"

Example Response

[
  {
    "id": "creatine-monohydrate",
    "name": "Creatine Monohydrate",
    "category": "performance",
    "goals": [
      "muscle_gain",
      "strength"
    ],
    "typical_dosage": "3-5 g daily",
    "evidence_level": "strong",
    "disclaimer": "Informational content only - not medical advice."
  }
]
GET/v1/supplements/:id

Single supplement by ID.

Parameters

NameInRequired
idpathYes

Example Request

curl 'https://fitly.joiinflow.com/api/fitly/v1/supplements/creatine-monohydrate' \
  -H "X-Fitly-Key: wx_your_key_here"
GET/v1/supplements/exercise/:exerciseId

Supplements relevant to a given exercise.

Parameters

NameInRequired
exerciseIdpathYes

Example Request

curl 'https://fitly.joiinflow.com/api/fitly/v1/supplements/exercise/0025' \
  -H "X-Fitly-Key: wx_your_key_here"
GET/v1/supplements/filters

All filter values with counts.

Example Request

curl 'https://fitly.joiinflow.com/api/fitly/v1/supplements/filters' \
  -H "X-Fitly-Key: wx_your_key_here"
GET/v1/supplements/stackUltra+

Goal-based stack builder. Requires Ultra plan.

Parameters

NameInRequired
goalqueryYes
levelqueryNo

Example Request

curl 'https://fitly.joiinflow.com/api/fitly/v1/supplements/stack?goal=fat_loss' \
  -H "X-Fitly-Key: wx_your_key_here"

Account

GET/v1/plans

Your own full plan ladder (not just the calling key's tier) - what your app renders its pricing page from.

Example Request

curl 'https://fitly.joiinflow.com/api/fitly/v1/plans' \
  -H "X-Fitly-Key: wx_your_key_here"

Rate Limits

Each key has a request quota tied to its plan. Free is a lifetime total that never resets; every paid plan resets monthly. Exceeding it returns 429.

// HTTP 429
{
  "error": "quota_exceeded",
  "limit": 500,
  "used": 501,
  "resetAt": null,
  "message": "You have exceeded your plan's request quota."
}

Error Codes

Every error returns JSON with an error field.

StatusErrorCause
401missing_api_key / invalid_api_keyNo key provided, or the key is invalid/revoked.
403plan_requiredYour plan doesn't include this endpoint. See requiredPlan in the response.
404not_foundThe requested ID doesn't exist.
429quota_exceededYou've used your plan's full request quota.

Plans

All plans include the full exercise catalog. Higher tiers unlock search, workout generation, and supplements.

Plans are per-trainer, not fixed platform tiers, the ones below are a starting template every trainer gets by default, editable from your own Plans page. Fetch your own live pricing programmatically via GET /v1/plans.

Free

$0/mo

  • 500 requests total
  • Core exercise endpoints
  • 10 results per page

Basic

$9.99/mo

  • 10,000 requests / month
  • Multi-filter search
  • 20 results per page

Pro

Popular

$29.99/mo

  • 100,000 requests / month
  • AI workout generator
  • Supplements database
  • 50 results per page

Ultra

$79.99/mo

  • 1,000,000 requests / month
  • Periodized programs
  • Joint & Rehab metadata
  • Supplement stack builder
  • 100 results per page

Need more volume? Enterprise plans are available, contact us from the Billing page.