GolfData
Docs

GolfData docs

Read-only golf equipment prices through REST and MCP. Start keyless, add a key when you need metered history and compare.

Quickstart

1

Try it keyless

Search and single product lookup need no key. Run the curl below.

2

Get a free key

One POST issues 1,000 lookups a month, forever. No card.

3

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

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

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 and 30 and 90 day lows.

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

LaneRequests per minuteMonthly 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

Enriched

Every field traced to a source. Cite it with confidence.

Partial

Key fields traced, the rest unconfirmed. Check the fields you cite.

Flagged

Needs human review before it is cited or shipped.

Free key in one POST

1,000 lookups per month, no card. The key is shown once.