Skip to main content

Quickstart

Five minutes from nothing to a rendered list of plans.

1. Get a key

There is no self-serve signup. Email PLACEHOLDER_CONTACT and we will issue you an API key. See Authentication for how to handle it.

2. Make a request

curl -H "X-Api-Key: $KAMEE_API_KEY" \
"https://kamee.fit/api/plans?discipline=running"

The discipline parameter is optional. Omit it for the whole catalog, or pass strength or running.

3. Read the response

{
"generatedAt": "2026-07-17T12:00:00.000Z",
"plans": [
{
"id": "3f2c8a1e-6b7d-4e9f-a1b2-c3d4e5f60718",
"title": "Couch to 5K",
"summary": "Nine weeks from the couch to your first 5K.",
"coverUrl": "https://ywkqixaobbjxdncvnqav.supabase.co/storage/v1/object/public/plan-covers/couch-to-5k.jpg",
"level": "beginner",
"discipline": "running",
"disciplineLabel": "Outdoor",
"weeksCount": 9,
"daysPerWeek": 3,
"estMinutesPerSession": 30,
"webUrl": "https://kamee.fit/plans/3f2c8a1e-6b7d-4e9f-a1b2-c3d4e5f60718",
"appUrl": "kamee://plan/3f2c8a1e-6b7d-4e9f-a1b2-c3d4e5f60718"
}
]
}

Every field is documented in the API reference.

4. Render it

This runs on your server, never in the browser — the key must not be shipped to a client. See Calling from a browser if you need the data client-side.

async function getPlans(discipline) {
const url = new URL('https://kamee.fit/api/plans');
if (discipline) url.searchParams.set('discipline', discipline);

const res = await fetch(url, {
headers: {'X-Api-Key': process.env.KAMEE_API_KEY},
});

if (!res.ok) {
throw new Error(`Kamee API returned ${res.status}`);
}

const {plans} = await res.json();
return plans;
}

Three things to get right before you ship:

  • Cache the result. Do not call this per page view — see Caching and freshness.
  • Link with webUrl, not appUrl, unless you already know the Kamee app is installed — see Linking to plans.
  • Handle the failure case. The snippet above throws on a bad response, which is fine for a first request, but don't let that become an empty catalog in production — fall back to your last good copy instead. See Errors.