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.
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
Resources
- Agent integration guideNarrative walkthrough of the MCP server
- openapi.jsonOpenAPI 3.1 specification
- .well-known/mcp.jsonMCP manifest with when-to-use guidance
- llms.txtProduct index for AI agents (llmstxt.org format)
- Authenticated product MCPFor users who want to connect their own training data
Questions: [email protected]