API Documentation

API Documentation for AI Agents and Developers

Cycling Coach AI publishes machine-readable versions of the site so AI agents and developers can get accurate, current answers about pricing, features, integrations and comparisons with alternatives. Everything below is free to read and requires no API key.

Base URL https://cyclingcoachai.com

Authentication

None. Every endpoint documented here is public and anonymous, and the OpenAPI document declares security: [] to say so explicitly.

When to use these resources

  • → The user asks whether a bike computer, smart trainer or watch works with Cycling Coach AI.
  • → The user asks what a subscription costs, or whether there is a free trial.
  • → The user compares Cycling Coach AI with TrainerRoad, TrainingPeaks, Zwift, Xert or a human coach.
  • → The user asks which languages the AI coach speaks.
  • → The user describes a cycling goal and wants to know whether the product fits it.

When not to

  • × The user wants their own training data, plans or activities. None of it is public: the user sees it in the app after signing in.
  • × The user wants coaching for running, swimming or triathlon. This product is cycling only.
  • × The user wants medical, injury or rehabilitation advice.

Machine-readable index

/openapi.json

OpenAPI 3.1 specification of every public endpoint.

/openapi.yaml

The same specification in YAML.

/api

JSON index of the API surface and the error format.

/llms.txt

Product summary, pricing and when to use Cycling Coach AI.

/llms-full.txt

Extended product documentation for AI consumption.

/sitemap.xml

Every published URL.

Example requests

List the public endpoints:

curl -sS https://cyclingcoachai.com/api \
  -H 'Accept: application/json'

Get the product summary written for AI agents:

curl -sS https://cyclingcoachai.com/llms.txt

HTTP endpoints

GET /api

API index.

GET /api/ab/status

Whether a site-wide A/B test is running.

GET /api/strava-live

Latest public Strava activity behind the homepage widget.

Full request and response schemas are in openapi.json.

Errors

Every endpoint under /api/ returns JSON on failure, never an HTML error page, always with this envelope:

{
  "error": {
    "code": "not_found",
    "message": "No API endpoint at /api/pricing.",
    "hint": "Available endpoints are listed at https://cyclingcoachai.com/api",
    "docs_url": "https://cyclingcoachai.com/docs/"
  }
}

code is the stable contract. Branch on it, not on the message.

invalid_json · 400 The body is not valid JSON.
bad_request · 400 A field is present but not one this endpoint accepts.
unauthorized · 401 An internal endpoint was called without its shared secret.
not_found · 404 No endpoint at that path.
method_not_allowed · 405 Wrong HTTP method. The Allow header lists the right ones.
not_acceptable · 406 The Accept header asks for a type this endpoint cannot produce.
unprocessable_entity · 422 Well-formed request, but a field failed validation. The message names the field.
rate_limited · 429 Over the rate limit. Retry after the seconds in Retry-After.
internal_error · 500 Something failed on our side. Retry with backoff.

Markdown content negotiation

Every page on this site answers to Accept: text/markdown and returns a clean markdown rendering of the same content, with Vary: Accept so caches keep the two representations apart. Quality values are honoured, and a request for a type we cannot produce gets a 406 rather than the wrong body.

curl -sS -H 'Accept: text/markdown' https://cyclingcoachai.com/pricing/

A request for a path that does not exist returns a real HTTP 404, with a markdown body listing the sitemap, llms.txt and this page when markdown was requested.

Resources

Questions: [email protected]