GolfData docs
Read-only golf equipment prices through REST and MCP. Start keyless, add a key when you need metered history and compare.
Quickstart
Try it keyless
Search and single product lookup need no key. Run the curl below.
Get a free key
One POST issues 1,000 lookups a month, forever. No card.
Call the API
Send x-api-key on metered routes. Read the 402 body when a call needs more.
Authentication
Search, single product lookup, pricing, meta, spotlight and limits are keyless at 10 requests per minute per IP. Everything else takes an x-api-key header. Keys come from POST /v1/keys.
Endpoints
| Endpoint | Access | Lookups | Curl |
|---|---|---|---|
| GET /v1/meta | Keyless | Free | curl "https://golfdata.co/v1/meta" |
| GET /v1/pricing | Keyless | Free | curl "https://golfdata.co/v1/pricing" |
| GET /v1/spotlight | Keyless | Free | curl "https://golfdata.co/v1/spotlight" |
| GET /v1/limits | Keyless | Free | curl "https://golfdata.co/v1/limits" |
| GET /v1/products | Keyless | Free | curl "https://golfdata.co/v1/products?brand=...&category=...&q=...&limit=..." |
| GET /v1/products/{id} | Keyless | 1 | curl "https://golfdata.co/v1/products/..." |
| GET /p/{slug}/{id} | Keyless | Free | curl "https://golfdata.co/p/.../..." |
| GET /p/{id} | Keyless | Free | curl "https://golfdata.co/p/..." |
| GET /compare/{slug}/{idA}/{idB} | Keyless | Free | curl "https://golfdata.co/compare/.../.../..." |
| GET /drops | Keyless | Free | curl "https://golfdata.co/drops" |
| GET /drops/{category} | Keyless | Free | curl "https://golfdata.co/drops/..." |
| GET /partners | Keyless | Free | curl "https://golfdata.co/partners" |
| GET /brands | Keyless | Free | curl "https://golfdata.co/brands" |
| GET /brands/{brand} | Keyless | Free | curl "https://golfdata.co/brands/..." |
| GET /retailers | Keyless | Free | curl "https://golfdata.co/retailers" |
| GET /retailers/{retailer} | Keyless | Free | curl "https://golfdata.co/retailers/..." |
| GET /badge/{productId}.svg | Keyless | Free | curl "https://golfdata.co/badge/....svg" |
| GET /v1/prices/current | Key | 1 | curl "https://golfdata.co/v1/prices/current?product_id=..." -H "x-api-key: gd_free_..." |
| GET /v1/prices/history | Key | 2 | curl "https://golfdata.co/v1/prices/history?product_id=...&days=..." -H "x-api-key: gd_free_..." |
| GET /v1/compare | Key | 2 | curl "https://golfdata.co/v1/compare?product_id=..." -H "x-api-key: gd_free_..." |
| GET /v1/offers/discover | Key | 2 | curl "https://golfdata.co/v1/offers/discover?canonical_product_id=...&variant_id=...&offset=..." -H "x-api-key: gd_free_..." |
| GET /v1/offers/verified | Key | 2 | curl "https://golfdata.co/v1/offers/verified?source_kind=...&source_id=...&canonical_product_id=...&variant_id=..." -H "x-api-key: gd_free_..." |
| POST /v1/keys | Keyless | Free | curl -X POST https://golfdata.co/v1/keys -H "content-type: application/json" -d '{"email":"you@example.com"}' |
| GET /reports/2026-08 | Keyless | Free | curl "https://golfdata.co/reports/2026-08?session_id=..." |
| GET /v1/keys/claim | Keyless | Free | curl "https://golfdata.co/v1/keys/claim?session_id=..." |
| POST /v1/contact | Keyless | Free | curl -X POST https://golfdata.co/v1/contact -H "content-type: application/json" -d '{"company":"Acme","email":"you@example.com","reason":"retailer"}' |
| POST /mcp | Keyless | Free | curl -X POST https://golfdata.co/mcp -H "content-type: application/json" -d '{"jsonrpc":"2.0","id":1,"method":"tools/list"}' |
Response examples
GET /v1/meta
Catalog stats: counts by category, enrichment coverage, snapshot count, freshness.
curl "https://golfdata.co/v1/meta" {"name":"GolfDataAPI","price_snapshots_total":374050,"latest_snapshot_at":"2026-09-16T12:00:00Z","enrichment_coverage":{"enriched":958,"partial":1501,"flagged":483,"unenriched":6587,"not_found":58}} Counts are live; call /v1/meta for the current numbers.
GET /v1/pricing
Price ladder, lookup costs and machine URLs.
curl "https://golfdata.co/v1/pricing" {"unit_price_usd":0.005,"lanes":[{"name":"keyless","price_usd":0,"rate_limit_per_min":10},{"name":"free","price_usd":0,"lookups":1000},{"name":"builder","price_usd":49,"lookups":10000}],"free_key_url":"https://golfdata.co/v1/keys","openapi_url":"https://golfdata.co/openapi.json"} GET /v1/spotlight
Twelve enriched products with 90 day daily-low series, current low, 30 and 90 day lows. Cached one hour.
curl "https://golfdata.co/v1/spotlight" {"count":12,"generated_at":"2026-09-16T12:00:00Z","products":[{"id":"29fab062-2d10-4aae-b545-e1ca7e4a269c","name":"Callaway Golf Elyte Hybrid","brand":"Callaway","current_low":175.99,"low_30d":175.99,"low_90d":175.99,"series":[{"date":"2026-09-16","low":175.99}]}]} GET /v1/limits
Caller's lane and remaining quota, or the keyless limits without a key.
curl "https://golfdata.co/v1/limits" {"lane":"keyless","remaining":null,"rate_limit_per_min":10,"pricing_url":"https://golfdata.co/v1/pricing"} GET /v1/products
Search canonical products.
curl "https://golfdata.co/v1/products?brand=...&category=...&q=...&limit=..." {"products":[{"id":"f6d55db1-e9e6-44c7-b85c-9d289e24b671","name":"DARKSPEED LS Driver","brand":"Cobra","category":"drivers","msrp":549,"enrichment_status":"enriched"}],"count":1} GET /v1/products/{id}
One product plus its enrichment_sources provenance rows.
curl "https://golfdata.co/v1/products/..." {"id":"f6d55db1-e9e6-44c7-b85c-9d289e24b671","name":"DARKSPEED LS Driver","brand":"Cobra","model":"DARKSPEED LS Driver","category":"drivers","msrp":549,"enrichment_status":"enriched","enrichment_sources":[]} GET /p/{slug}/{id}
Public HTML product page with current price and 90 day history.
curl "https://golfdata.co/p/.../..." <!doctype html><html><head><title>DARKSPEED LS Driver price history and lowest price | GolfData</title></head><body>...</body></html> GET /p/{id}
Redirect to the canonical public HTML product page.
curl "https://golfdata.co/p/..." HTTP 301 -> /p/darkspeed-ls-driver/f6d55db1-e9e6-44c7-b85c-9d289e24b671 GET /compare/{slug}/{idA}/{idB}
Public HTML price comparison page for two canonical products.
curl "https://golfdata.co/compare/.../.../..." {"ok":true} GET /drops
Public HTML page of the biggest current price drops, grouped by category.
curl "https://golfdata.co/drops" {"ok":true} GET /drops/{category}
Public HTML page of the biggest price drops in one category.
curl "https://golfdata.co/drops/..." {"ok":true} GET /partners
Public HTML partner kit page with free key, badge and Price Index terms for publishers and creators.
curl "https://golfdata.co/partners" {"ok":true} GET /brands
Public HTML index of major golf brands.
curl "https://golfdata.co/brands" {"ok":true} GET /brands/{brand}
Public HTML hub of observed prices for one major brand.
curl "https://golfdata.co/brands/..." {"ok":true} GET /retailers
Public HTML index of retailers with fresh priced products.
curl "https://golfdata.co/retailers" {"ok":true} GET /retailers/{retailer}
Public HTML hub of products a retailer prices lowest.
curl "https://golfdata.co/retailers/..." {"ok":true} GET /badge/{productId}.svg
Embeddable SVG price badge for one product.
curl "https://golfdata.co/badge/....svg" {"ok":true} GET /v1/prices/current
Latest stored advertised prices per retailer with optional machine checked verdicts.
curl "https://golfdata.co/v1/prices/current?product_id=..." -H "x-api-key: gd_free_..." {"product_id":"f6d55db1-e9e6-44c7-b85c-9d289e24b671","offers":[{"retailer":"Amazon","price":449.99,"in_stock":true,"url":"https://www.amazon.com/dp/example"}]} GET /v1/prices/history
Daily price snapshots per retailer, days up to 365.
curl "https://golfdata.co/v1/prices/history?product_id=...&days=..." -H "x-api-key: gd_free_..." {"product_id":"f6d55db1-e9e6-44c7-b85c-9d289e24b671","days":30,"rows":[{"retailer":"Amazon","price":449.99,"recorded_at":"2026-09-16T12:00:00Z"}]} GET /v1/compare
Current prices plus min, max, median, 30 and 90 day lows, and optional machine checked verdicts.
curl "https://golfdata.co/v1/compare?product_id=..." -H "x-api-key: gd_free_..." {"product_id":"f6d55db1-e9e6-44c7-b85c-9d289e24b671","stats":{"low_30d":449.99,"low_90d":449.99,"median":479.99},"retailers":[{"retailer":"Amazon","current_price":449.99}]} GET /v1/offers/discover
Discover admitted marketplace sources and verify each through the Chip gate.
curl "https://golfdata.co/v1/offers/discover?canonical_product_id=...&variant_id=...&offset=..." -H "x-api-key: gd_free_..." {"offers":[],"next_offset":null,"selection_metadata_not_offer":null} GET /v1/offers/verified
Verify one known marketplace source (golf-offer.v1).
curl "https://golfdata.co/v1/offers/verified?source_kind=...&source_id=...&canonical_product_id=...&variant_id=..." -H "x-api-key: gd_free_..." {"verified_offer":{"source_kind":"product","source_id":"...","price":449.99,"currency":"USD"}} POST /v1/keys
Issue a free key to an email, once per email. Body {email}, JSON or form-encoded. 3 per minute per IP.
curl -X POST https://golfdata.co/v1/keys -H "content-type: application/json" -d '{"email":"you@example.com"}' {"key":"gd_free_...","lane":"free","lookups_per_month":1000,"pricing_url":"https://golfdata.co/v1/pricing"} GET /reports/2026-08
Paid August 2026 Market Movement Report as HTML. Stripe Payment Link redirects here with session_id; the session is the access token.
curl "https://golfdata.co/reports/2026-08?session_id=..." <!doctype html><html><head><title>Golf Equipment Price Index, August 2026, Market Movement Report | GolfData</title></head><body>...</body></html> GET /v1/keys/claim
Claim the paid key for a completed Stripe Checkout Session, once. Stripe Payment Links redirect here with session_id. 3 per minute per IP.
curl "https://golfdata.co/v1/keys/claim?session_id=..." {"key":"gd_live_...","lane":"builder","lookups_per_month":10000} POST /v1/contact
Submit a retailer or brand contact request. Body {company,email,feed_url,message,reason}, JSON or form-encoded.
curl -X POST https://golfdata.co/v1/contact -H "content-type: application/json" -d '{"company":"Acme","email":"you@example.com","reason":"retailer"}' {"status":"received","message":"We will reply within two business days."} POST /mcp
MCP streamable HTTP, JSON-RPC 2.0. Same reads as tools.
curl -X POST https://golfdata.co/mcp -H "content-type: application/json" -d '{"jsonrpc":"2.0","id":1,"method":"tools/list"}' {"jsonrpc":"2.0","id":1,"result":{"tools":[{"name":"search_products"},{"name":"get_product"},{"name":"get_current_prices"},{"name":"get_price_history"},{"name":"compare_prices"}]}} MCP setup
Add the server to Claude, Cursor or ChatGPT with the same config block. The transport is streamable HTTP JSON-RPC 2.0.
{
"mcpServers": {
"golfdata": { "url": "https://golfdata.co/mcp" }
}
} Rate limits and quotas
A successful nonempty result consumes the route's lookup units. An error or empty result consumes zero units when atomic metering is enabled. Send an Idempotency-Key header of 8 to 128 characters on a metered call if you may retry it; reusing that key returns 409 and does not repeat the charge or result. Check /v1/limits for recorded usage.
| Lane | Requests per minute | Monthly lookups |
|---|---|---|
| keyless | 10 | Custom |
| free | 10 | 1,000 |
| pack | 60 | 4,000 |
| builder | 60 | 10,000 |
| pro | 300 | 50,000 |
| enterprise | Custom | Custom |
Errors
402
Key required or lane exhausted. The body carries pricing and key URLs.
{
"error": "key_required",
"message": "This route needs x-api-key.",
"pricing_url": "https://golfdata.co/v1/pricing",
"free_key_url": "https://golfdata.co/v1/keys",
"docs_url": "https://golfdata.co/llms.txt"
} 429
Rate limit or quota reached. Retry after the returned delay.
{
"error": "rate_limit",
"retry_after_seconds": 6,
"message": "Slow down. This lane allows 10 requests per minute.",
"pricing_url": "https://golfdata.co/v1/pricing"
} Integrity levels
Check each field's provenance and observation date before citing it.
Key fields traced, the rest unconfirmed. Check the fields you cite.
Needs human review before it is cited or shipped.