The FlyAway golf course database is readable without an account: no API key, no OAuth, no signup. Every operation listed here answers an anonymous GET request and returns JSON. The complete machine-readable description is published as an OpenAPI 3.1 document.
Three calls cover most of what an integration needs: resolve a course, read its full profile, or find the courses nearest a coordinate.
# Full profile of one course
curl -s "https://api.flyawaygolf.com/v2/golfs/profile/golf-national"
# The 10 courses nearest a coordinate, with distances in metres
curl -s "https://api.flyawaygolf.com/v2/search/map/golfs?lat=48.75&long=2.07&max_distance=50000&limit=10"
# The same course as prose, for a language model
curl -s "https://flyawaygolf.com/golfs/golf-national/llm.md"
# Base URL
https://api.flyawaygolf.com/v2Generated from the OpenAPI document, so this table and the specification cannot drift apart. Every operation is a GET, and every successful response is wrapped in a top-level data key.
| Operation | Endpoint | Description |
|---|---|---|
| Courses | ||
| listGolfCourses | GET /golfs | List golf courses |
| getGolfCourseProfile | GET /golfs/profile/{slug} | Get the full profile of a golf course |
| getGolfCourseSummary | GET /seo/golfs/{identifier} | Get a compact summary of a golf course |
| resolveGolfCourseId | GET /golfs/resolve/{golf_id} | Resolve a course id to its slug |
| searchGolfCoursesByLocation | GET /search/map/golfs | Find golf courses around a coordinate |
| Directory | ||
| listContinents | GET /public/golfs/continents | List continents with course counts |
| listCountries | GET /public/golfs/countries | List countries with course counts |
| getDirectoryEntry | GET /public/golfs/{slug} | Get a continent or a country by slug |
| listCountryRegions | GET /public/golfs/{country}/regions | List the regions of a country |
| listRegionGolfCourses | GET /public/golfs/{country}/{region} | List the golf courses of a region |
| listCityGolfCourses | GET /public/golfs/{country}/{region}/{city} | List the golf courses of a city |
| Rankings | ||
| listBestGolfCoursesWorldwide | GET /public/best/world | List the highest-rated courses worldwide |
| listBestGolfCoursesByArea | GET /public/best/{slug} | List the highest-rated courses of a continent or country |
| listBestGolfCoursesByRegion | GET /public/best/{country}/{region} | List the highest-rated courses of a region |
| Metadata | ||
| getCountryMetadata | GET /seo/country/{slug} | Get breadcrumbs and counts for a country |
| getContinentMetadata | GET /seo/continent/{slug} | Get breadcrumbs and counts for a continent |
| getRegionMetadata | GET /seo/region/{country}/{region} | Get breadcrumbs and counts for a region |
| Enumeration | ||
| listSitemapContinents | GET /seo/sitemap/continents | Enumerate every continent slug |
| listSitemapCountries | GET /seo/sitemap/countries | Enumerate every country slug |
| listSitemapRegions | GET /seo/sitemap/regions | Enumerate every region slug |
| listSitemapCities | GET /seo/sitemap/cities | Enumerate every city slug |
| Agent files | ||
| getGolfCourseMarkdown | GET /golfs/{slug}/llm.md | Get a golf course as markdown |
| getLlmsTxt | GET /llms.txt | Get the llms.txt index |
| getOpenApiDocument | GET /openapi.json | Get this document |
Four machine-readable files describe the site to an agent. Read llms.txt first: it states what the dataset contains, when FlyAway is the right source, and the URL patterns for everything else.
/llms.txt — What FlyAway is, what the dataset contains, when to use it, and the URL patterns for everything else. Start here./llms-full.txt — The same, at length: the product surface, the data model and the caveats in full./openapi.json — The public API as an OpenAPI 3.1 document. Also served as YAML at /openapi.yaml./golfs/{slug}/llm.md — Any course as markdown, e.g. https://flyawaygolf.com/golfs/golf-national/llm.md./sitemaps/index — The sitemap index: every indexable URL, paginated, including all 35,165 course pages.The public read endpoints take no credentials — send the request and read the response. Endpoints that touch a member's own data (rounds, statistics, messages, the AI assistant) require a session token issued by the FlyAway apps; they are not part of the public surface and are deliberately absent from the OpenAPI document, because an agent cannot call them.
Stay under 5 requests per second from a single IP, and cache what you read: course data does not change from one week to the next. FlyAway follows the RFC 9331 convention on any response that carries a quota — RateLimit-Limit, RateLimit-Remaining and RateLimit-Reset, plus Retry-After on a 429. A response carrying none of those headers was not counted against a per-caller quota. On a 429, back off for the number of seconds given by Retry-After and retry once.
Failures return a JSON body with an error object carrying a human-readable message and a stable numeric code. A 400 means the identifier or a query parameter was rejected; a 404 means nothing matches it.
The OpenAPI document is written to be loaded directly as a function-calling manifest: every operation carries a unique operationId, a description written for a model rather than for a search engine, typed parameters with ranges and patterns, and a response schema. Convert it with your framework's OpenAPI-to-tools helper and no hand-written wrapper is needed.
There is no official CLI or MCP server yet. Until there is, the OpenAPI document is the supported integration path, and the markdown course pages are the supported way to read a single course as prose.
Technical questions the documentation does not answer are welcome by email. Please include the exact URL you called and the response you received.
[email protected]