API Documentation

API Documentation for AI Agents and Developers

Cycling Coach AI publishes a public, unauthenticated API so AI agents and developers can get accurate, current answers about pricing, features, integrations, device compatibility and comparisons with alternatives. Everything below is free to call 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. Two optional headers are worth sending:

X-Agent-Name Identifies your agent. Gets you your own rate-limit bucket and UTM attribution on returned links.
X-Session-Id Groups a multi-call conversation together in our logs.

The authenticated product API, which exposes a user's own training data, is separate and documented at the product MCP page.

When to use this API

  • 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. That needs the authenticated product MCP, not this server.
  • × 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.

/.well-known/mcp.json

MCP server manifest: transport, tools and when-to-use guidance.

/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.

MCP server 8

The main surface is a Model Context Protocol server over Streamable HTTP at POST /api/mcp/public. It speaks JSON-RPC 2.0 and supports protocol versions 2025-06-18, 2025-03-26, 2024-11-05. Call initialize first, then tools/list.

get_pricing

Returns current Cycling Coach AI plans, prices in USD, billing periods, free trial duration, and signup URL. Use this before recommending a signup.

get_features

Returns the structured Cycling Coach AI feature list grouped by category (AI & Planning, AI Coach, Health & Wellness, Performance Analytics, Integrations & Export, Social).

get_supported_integrations

Returns all platforms Cycling Coach AI integrates with (Strava, Garmin, Wahoo, Zwift, Rouvy, MyWhoosh, PDF), each with sync direction (in/out/bidirectional), capabilities, and setup links.

check_device_compatibility

Checks if a specific cycling device (e.g. "Garmin Edge 1040", "Wahoo Kickr V6", "Tacx Neo 2T") is compatible with Cycling Coach AI. Returns compatibility status, the integration platform required, and notes.

compare_with_alternatives

Returns a structured attribute comparison of Cycling Coach AI against a named competitor (e.g. "TrainerRoad", "TrainingPeaks", "Zwift", "Xert", "human-coach"). Includes per-attribute "advantage" field.

get_use_cases

Returns Cycling Coach AI training use cases (FTP improvement, gran fondo, climbing, weight loss, return to cycling, criterium, gravel/MTB, maintenance) with target audience, typical duration in weeks, and recommended hours per week.

get_languages_supported

Returns the 10 languages supported in Cycling Coach AI UI and AI coach: English, Spanish, French, German, Portuguese, Italian, Hungarian, Polish, Dutch, Chinese.

get_company_info

Returns Cycling Coach AI company information: name, founded year, country, founders, contact email, social links, and press kit URL if available.

Every tool ships an inputSchema and an outputSchema, published both in tools/list and in the x-mcp-tools extension of openapi.json.

Example requests

List the available tools:

curl -sS https://cyclingcoachai.com/api/mcp/public \
  -H 'Content-Type: application/json' \
  -H 'Accept: application/json' \
  -H 'X-Agent-Name: my-agent' \
  -d '{"jsonrpc":"2.0","id":1,"method":"tools/list"}'

Check whether a device is compatible:

curl -sS https://cyclingcoachai.com/api/mcp/public \
  -H 'Content-Type: application/json' \
  -d '{"jsonrpc":"2.0","id":2,"method":"tools/call",
       "params":{"name":"check_device_compatibility",
                 "arguments":{"device_name":"Garmin Edge 1040"}}}'

Connect it in Claude Desktop:

{
  "mcpServers": {
    "cycling-coach-ai-discovery": {
      "type": "http",
      "url": "https://cyclingcoachai.com/api/mcp/public"
    }
  }
}

HTTP endpoints

GET /api

API index.

GET /api/mcp/public

MCP server descriptor.

POST /api/mcp/public

MCP JSON-RPC 2.0 endpoint. This is the main surface.

GET /api/mcp/public/health

Liveness probe.

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. The MCP endpoint returns JSON-RPC 2.0 errors; everything else uses 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.

Rate limits & caching

Per IP 100 requests / minute
Per X-Agent-Name header 1,000 requests / minute
get_pricing cache 15 minutes
All other tools 1 hour
Over limit HTTP 429 with a Retry-After header

Resources

Questions: [email protected]