GolfData API
A read-only JSON API over the same data behind the Price Index: catalog, current prices, and daily price history recorded every day.
Endpoints
| Endpoint | Access | Returns |
|---|---|---|
| GET /v1/meta | Keyless | Catalog stats: counts by category, enrichment coverage, snapshot count, freshness. |
| GET /v1/pricing | Keyless | Price ladder, lookup costs and machine URLs. |
| GET /v1/spotlight | Keyless | Twelve enriched products with 90 day daily-low series, current low, 30 and 90 day lows. Cached one hour. |
| GET /v1/limits | Keyless | Caller's lane and remaining quota, or the keyless limits without a key. |
| GET /v1/products?brand&category&q&limit | Keyless | Search canonical products. |
| GET /v1/products/{id} | Keyless | One product plus its enrichment_sources provenance rows. |
| GET /p/{slug}/{id} | Keyless | Public HTML product page with current price and 90 day history. |
| GET /p/{id} | Keyless | Redirect to the canonical public HTML product page. |
| GET /compare/{slug}/{idA}/{idB} | Keyless | Public HTML price comparison page for two canonical products. |
| GET /drops | Keyless | Public HTML page of the biggest current price drops, grouped by category. |
| GET /drops/{category} | Keyless | Public HTML page of the biggest price drops in one category. |
| GET /partners | Keyless | Public HTML partner kit page with free key, badge and Price Index terms for publishers and creators. |
| GET /brands | Keyless | Public HTML index of major golf brands. |
| GET /brands/{brand} | Keyless | Public HTML hub of observed prices for one major brand. |
| GET /retailers | Keyless | Public HTML index of retailers with fresh priced products. |
| GET /retailers/{retailer} | Keyless | Public HTML hub of products a retailer prices lowest. |
| GET /badge/{productId}.svg | Keyless | Embeddable SVG price badge for one product. |
| GET /v1/prices/current?product_id | Key | Latest stored advertised prices per retailer. |
| GET /v1/prices/history?product_id&days | Key | Daily price snapshots per retailer, days up to 365. |
| GET /v1/compare?product_id | Key | Current prices plus min, max, median and 30 and 90 day lows. |
| GET /v1/offers/discover?canonical_product_id&variant_id&offset | Key | Discover admitted marketplace sources and verify each through the Chip gate. |
| GET /v1/offers/verified?source_kind&source_id&canonical_product_id&variant_id | Key | Verify one known marketplace source (golf-offer.v1). |
| POST /v1/keys | Keyless | Issue a free key to an email, once per email. Body {email}, JSON or form-encoded. 3 per minute per IP. |
| GET /reports/2026-08?session_id | Keyless | Paid August 2026 Market Movement Report as HTML. Stripe Payment Link redirects here with session_id; the session is the access token. |
| GET /v1/keys/claim?session_id | Keyless | Claim the paid key for a completed Stripe Checkout Session, once. Stripe Payment Links redirect here with session_id. 3 per minute per IP. |
| POST /v1/contact | Keyless | Submit a retailer or brand contact request. Body {company,email,feed_url,message,reason}, JSON or form-encoded. |
| POST /mcp | Keyless | MCP streamable HTTP, JSON-RPC 2.0. Same reads as tools. |
Keys and pricing
Keyless: search and single product lookup, 10 requests per minute per IP, no signup. Everything else takes an x-api-key header. Requests without a valid key return HTTP 402 with a JSON body pointing at /v1/pricing and the free key endpoint. Lookups are metered per key at $0.005 each and every response carries an x-price-usd header.
Machine doors
MCP config
{
"mcpServers": {
"golfdata": { "url": "https://golfdata.co/mcp" }
}
} OpenAPI
The same route table, generated from the OpenAPI 3.1 document at /openapi.json.
{
"openapi": "3.1.0",
"info": {
"title": "GolfDataAPI",
"version": "1.0.0",
"description": "Golf equipment catalog and multi-retailer prices, recorded every day. $0.005 per lookup."
},
"servers": [
{
"url": "https://golfdata.co"
}
],
"components": {
"securitySchemes": {
"apiKey": {
"type": "apiKey",
"in": "header",
"name": "x-api-key"
}
}
},
"paths": {
"/v1/meta": {
"get": {
"summary": "Catalog stats: counts by category, enrichment coverage, snapshot count, freshness.",
"description"... Free key in one POST
Search and product lookups need no key. Prices, history and compare take an x-api-key header.
Data notes
Prices come from retailer and affiliate feeds, not from scraping public pages. Product ids are UUIDs from /v1/products. GET and OPTIONS, plus POST /mcp and POST /v1/keys. CORS open to all origins.