Every API here is available over the APIs.io API and to AI agents over MCP.
{
"openapi": "3.1.0",
"info": {
"title": "GolfDataAPI",
"version": "1.0.0",
"description": "Golf equipment catalog and dated retailer price observations. $0.005 per lookup."
},
"servers": [
{
"url": "https://golfdata.co"
}
],
"components": {
"securitySchemes": {
"apiKey": {
"type": "apiKey",
"in": "header",
"name": "x-api-key"
}
},
"schemas": {
"AgentOffer": {
"type": "object",
"required": [
"source",
"canonical_product_id",
"offer_id",
"variant_id",
"variant",
"attributes",
"title",
"merchant",
"image_url",
"price",
"last_observed_price",
"stock",
"verification",
"affiliate",
"unknown_fields"
],
"properties": {
"source": {
"type": "object",
"required": [
"kind",
"id"
],
"properties": {
"kind": {
"type": "string",
"enum": [
"deal",
"product"
]
},
"id": {
"type": "string",
"format": "uuid"
}
}
},
"canonical_product_id": {
"type": "string",
"format": "uuid"
},
"offer_id": {
"type": "string",
"format": "uuid"
},
"variant_id": {
"type": [
"string",
"null"
],
"format": "uuid"
},
"variant": {
"oneOf": [
{
"type": "object",
"required": [
"hand",
"flex",
"loft",
"shaftMaterial",
"shaftModel",
"setMakeup",
"headSize",
"length",
"condition"
],
"properties": {
"hand": {
"type": [
"string",
"null"
]
},
"flex": {
"type": [
"string",
"null"
]
},
"loft": {
"type": [
"number",
"null"
]
},
"shaftMaterial": {
"type": [
"string",
"null"
]
},
"shaftModel": {
"type": [
"string",
"null"
]
},
"setMakeup": {
"type": [
"string",
"null"
]
},
"headSize": {
"type": [
"string",
"null"
]
},
"length": {
"type": [
"string",
"null"
]
},
"condition": {
"type": [
"string",
"null"
]
}
}
},
{
"type": "null"
}
]
},
"attributes": {
"type": "object",
"additionalProperties": {
"type": [
"string",
"number",
"null"
]
}
},
"title": {
"type": "string"
},
"merchant": {
"type": "string"
},
"image_url": {
"type": [
"string",
"null"
]
},
"price": {
"type": "object",
"required": [
"amount",
"currency",
"observed_at",
"freshness"
],
"properties": {
"amount": {
"type": [
"number",
"null"
]
},
"currency": {
"type": "null"
},
"observed_at": {
"type": "string",
"format": "date-time"
},
"freshness": {
"type": "string"
}
}
},
"last_observed_price": {
"type": "object",
"required": [
"amount",
"currency",
"observed_at"
],
"properties": {
"amount": {
"type": "number"
},
"currency": {
"type": "null"
},
"observed_at": {
"type": "string",
"format": "date-time"
}
}
},
"stock": {
"type": "object",
"required": [
"in_stock_at_observation",
"observed_at"
],
"properties": {
"in_stock_at_observation": {
"const": true
},
"observed_at": {
"type": "string",
"format": "date-time"
}
}
},
"verification": {
"type": "object",
"required": [
"path",
"link_verified_at",
"policy_version",
"valid_until"
],
"properties": {
"path": {
"const": "chip-commerce-gate"
},
"link_verified_at": {
"type": "string",
"format": "date-time"
},
"policy_version": {
"type": "string"
},
"valid_until": {
"type": "string",
"format": "date-time"
}
}
},
"affiliate": {
"type": "object",
"required": [
"status",
"network",
"url",
"click_attribution"
],
"properties": {
"status": {
"type": "string",
"enum": [
"affiliate",
"nonaffiliate"
]
},
"network": {
"type": "string"
},
"url": {
"type": "string"
},
"click_attribution": {
"const": "not_created"
}
}
},
"unknown_fields": {
"type": "array",
"items": {
"type": "string"
}
},
"actionability": {
"type": "object",
"required": [
"status",
"blockers"
],
"properties": {
"status": {
"const": "not_purchase_ready"
},
"blockers": {
"type": "array",
"items": {
"type": "string"
}
}
}
}
},
"description": "Read-only observed evidence. verified_offer is not purchase readiness. Currency is unknown; no click attribution or purchase authority is created. valid_until bounds verification evidence, not a merchant price guarantee."
},
"VerifiedOfferResponse": {
"oneOf": [
{
"type": "object",
"required": [
"schema_version",
"status",
"reason",
"offer"
],
"properties": {
"schema_version": {
"const": "golf-offer.v1"
},
"status": {
"const": "verified_offer"
},
"reason": {
"type": [
"string",
"null"
]
},
"offer": {
"$ref": "#/components/schemas/AgentOffer"
}
}
},
{
"type": "object",
"required": [
"schema_version",
"status",
"reason",
"offer"
],
"properties": {
"schema_version": {
"const": "golf-offer.v1"
},
"status": {
"const": "check_price"
},
"reason": {
"type": [
"string",
"null"
]
},
"offer": {
"$ref": "#/components/schemas/AgentOffer"
}
}
},
{
"type": "object",
"required": [
"schema_version",
"status",
"reason",
"offer"
],
"properties": {
"schema_version": {
"const": "golf-offer.v1"
},
"status": {
"const": "unavailable"
},
"reason": {
"type": [
"string",
"null"
]
},
"offer": {
"type": "null"
}
}
}
]
},
"OfferDiscoveryResponse": {
"type": "object",
"required": [
"schema_version",
"canonical_product_id",
"variant_id",
"status",
"results",
"variants",
"variants_truncated",
"coverage"
],
"properties": {
"schema_version": {
"const": "golf-offers.v1"
},
"canonical_product_id": {
"type": "string",
"format": "uuid"
},
"variant_id": {
"type": [
"string",
"null"
],
"format": "uuid"
},
"status": {
"type": "string",
"enum": [
"offers",
"unavailable",
"variant_required",
"variant_unavailable",
"invalid_request"
]
},
"results": {
"type": "array",
"items": {
"$ref": "#/components/schemas/VerifiedOfferResponse"
}
},
"variants": {
"type": "array",
"items": {
"type": "object",
"required": [
"variant_id",
"attributes",
"specs_verified",
"specs_observed_at",
"role"
],
"properties": {
"variant_id": {
"type": "string",
"format": "uuid"
},
"attributes": {
"type": "object",
"additionalProperties": {
"type": [
"string",
"number"
]
}
},
"specs_verified": {
"type": "boolean"
},
"specs_observed_at": {
"type": [
"string",
"null"
],
"format": "date-time"
},
"role": {
"const": "selection_metadata_not_offer"
}
}
}
},
"variants_truncated": {
"type": "boolean"
},
"coverage": {
"type": "object",
"required": [
"candidates_examined",
"unavailable_count",
"source_window_count",
"source_window_truncated",
"may_have_more",
"next_offset",
"pagination_consistency"
],
"properties": {
"candidates_examined": {
"type": "integer"
},
"unavailable_count": {
"type": "integer"
},
"source_window_count": {
"type": "integer"
},
"source_window_truncated": {
"type": [
"boolean",
"null"
]
},
"may_have_more": {
"type": "boolean"
},
"next_offset": {
"type": [
"integer",
"null"
],
"minimum": 0,
"maximum": 15
},
"pagination_consistency": {
"const": "live_window_not_snapshot"
}
}
}
}
},
"OfferVerdict": {
"type": "object",
"required": [
"verdict",
"reasons"
],
"properties": {
"verdict": {
"type": "string",
"enum": [
"pass",
"hold",
"reject"
]
},
"reasons": {
"type": "array",
"items": {
"type": "string"
}
}
}
}
}
},
"paths": {
"/v1/catalog": {
"get": {
"summary": "Reviewed factual records independently eligible for agent API use; no affiliate enrollment required.",
"description": "Costs 0 lookup(s) at $0.005 each. Works without a key, 10 per minute per IP.",
"parameters": [
{
"name": "limit",
"in": "query",
"required": false,
"schema": {
"type": "string"
}
},
{
"name": "offset",
"in": "query",
"required": false,
"schema": {
"type": "string"
}
}
],
"security": [
{},
{
"apiKey": []
}
],
"responses": {
"200": {
"description": "OK",
"content": {
"application/json": {
"schema": {
"type": "object"
}
}
}
},
"400": {
"description": "Invalid input."
},
"402": {
"description": "Key required. Body carries pricing_url, free_key_url, docs_url and checkout_url when set."
},
"409": {
"description": "Idempotency key already used for this API key when atomic metering is enabled."
},
"429": {
"description": "Rate limit or quota reached. Body carries retry_after_seconds and the same URLs."
},
"502": {
"description": "Upstream data request failed."
},
"503": {
"description": "Backend or atomic usage reservation/finalization unavailable."
}
}
}
},
"/catalog": {
"get": {
"summary": "Reviewed factual catalog for public web display.",
"description": "Costs 0 lookup(s) at $0.005 each. Works without a key, 10 per minute per IP.",
"parameters": [
{
"name": "limit",
"in": "query",
"required": false,
"schema": {
"type": "string"
}
},
{
"name": "offset",
"in": "query",
"required": false,
"schema": {
"type": "string"
}
}
],
"security": [
{},
{
"apiKey": []
}
],
"responses": {
"200": {
"description": "OK",
"content": {
"application/json": {
"schema": {
"type": "object"
}
}
}
},
"400": {
"description": "Invalid input."
},
"402": {
"description": "Key required. Body carries pricing_url, free_key_url, docs_url and checkout_url when set."
},
"409": {
"description": "Idempotency key already used for this API key when atomic metering is enabled."
},
"429": {
"description": "Rate limit or quota reached. Body carries retry_after_seconds and the same URLs."
},
"502": {
"description": "Upstream data request failed."
},
"503": {
"description": "Backend or atomic usage reservation/finalization unavailable."
}
}
}
},
"/v1/meta": {
"get": {
"summary": "Catalog stats: counts by category, enrichment coverage, snapshot count, freshness.",
"description": "Costs 0 lookup(s) at $0.005 each. Works without a key, 10 per minute per IP.",
"parameters": [],
"security": [
{},
{
"apiKey": []
}
],
"responses": {
"200": {
"description": "OK",
"content": {
"application/json": {
"schema": {
"type": "object"
}
}
}
},
"400": {
"description": "Invalid input."
},
"402": {
"description": "Key required. Body carries pricing_url, free_key_url, docs_url and checkout_url when set."
},
"409": {
"description": "Idempotency key already used for this API key when atomic metering is enabled."
},
"429": {
"description": "Rate limit or quota reached. Body carries retry_after_seconds and the same URLs."
},
"502": {
"description": "Upstream data request failed."
},
"503": {
"description": "Backend or atomic usage reservation/finalization unavailable."
}
}
}
},
"/v1/pricing": {
"get": {
"summary": "Price ladder, lookup costs and machine URLs.",
"description": "Costs 0 lookup(s) at $0.005 each. Works without a key, 10 per minute per IP.",
"parameters": [],
"security": [
{},
{
"apiKey": []
}
],
"responses": {
"200": {
"description": "OK",
"content": {
"application/json": {
"schema": {
"type": "object"
}
}
}
},
"400": {
"description": "Invalid input."
},
"402": {
"description": "Key required. Body carries pricing_url, free_key_url, docs_url and checkout_url when set."
},
"409": {
"description": "Idempotency key already used for this API key when atomic metering is enabled."
},
"429": {
"description": "Rate limit or quota reached. Body carries retry_after_seconds and the same URLs."
},
"502": {
"description": "Upstream data request failed."
},
"503": {
"description": "Backend or atomic usage reservation/finalization unavailable."
}
}
}
},
"/v1/spotlight": {
"get": {
"summary": "Twelve enriched products with 90 day daily-low series, current low, 30 and 90 day lows. Cached one hour.",
"description": "Costs 0 lookup(s) at $0.005 each. Works without a key, 10 per minute per IP.",
"parameters": [],
"security": [
{},
{
"apiKey": []
}
],
"responses": {
"200": {
"description": "OK",
"content": {
"application/json": {
"schema": {
"type": "object"
}
}
}
},
"400": {
"description": "Invalid input."
},
"402": {
"description": "Key required. Body carries pricing_url, free_key_url, docs_url and checkout_url when set."
},
"409": {
"description": "Idempotency key already used for this API key when atomic metering is enabled."
},
"429": {
"description": "Rate limit or quota reached. Body carries retry_after_seconds and the same URLs."
},
"502": {
"description": "Upstream data request failed."
},
"503": {
"description": "Backend or atomic usage reservation/finalization unavailable."
}
}
}
},
"/v1/limits": {
"get": {
"summary": "Caller's lane and remaining quota, or the keyless limits without a key.",
"description": "Costs 0 lookup(s) at $0.005 each. Works without a key, 10 per minute per IP.",
"parameters": [],
"security": [
{},
{
"apiKey": []
}
],
"responses": {
"200": {
"description": "OK",
"content": {
"application/json": {
"schema": {
"type": "object"
}
}
}
},
"400": {
"description": "Invalid input."
},
"402": {
"description": "Key required. Body carries pricing_url, free_key_url, docs_url and checkout_url when set."
},
"409": {
"description": "Idempotency key already used for this API key when atomic metering is enabled."
},
"429": {
"description": "Rate limit or quota reached. Body carries retry_after_seconds and the same URLs."
},
"502": {
"description": "Upstream data request failed."
},
"503": {
"description": "Backend or atomic usage reservation/finalization unavailable."
}
}
}
},
"/v1/products": {
"get": {
"summary": "Search canonical products.",
"description": "Costs 0 lookup(s) at $0.005 each. Works without a key, 10 per minute per IP.",
"parameters": [
{
"name": "brand",
"in": "query",
"required": false,
"schema": {
"type": "string"
}
},
{
"name": "category",
"in": "query",
"required": false,
"schema": {
"type": "string"
}
},
{
"name": "q",
"in": "query",
"required": false,
"schema": {
"type": "string"
}
},
{
"name": "limit",
"in": "query",
"required": false,
"schema": {
"type": "string"
}
}
],
"security": [
{},
{
"apiKey": []
}
],
"responses": {
"200": {
"description": "OK",
"content": {
"application/json": {
"schema": {
"type": "object"
}
}
}
},
"400": {
"description": "Invalid input."
},
"402": {
"description": "Key required. Body carries pricing_url, free_key_url, docs_url and checkout_url when set."
},
"409": {
"description": "Idempotency key already used for this API key when atomic metering is enabled."
},
"429": {
"description": "Rate limit or quota reached. Body carries retry_after_seconds and the same URLs."
},
"502": {
"description": "Upstream data request failed."
},
"503": {
"description": "Backend or atomic usage reservation/finalization unavailable."
}
}
}
},
"/v1/products/{id}": {
"get": {
"summary": "One product plus its enrichment_sources provenance rows.",
"description": "Costs 1 lookup(s) at $0.005 each. Works without a key, 10 per minute per IP.",
"parameters": [
{
"name": "id",
"in": "path",
"required": true,
"schema": {
"type": "string"
}
},
{
"name": "Idempotency-Key",
"in": "header",
"required": false,
"description": "8–128 characters. Reuse returns 409 without a second charge only when atomic metering is enabled. The legacy metering lane ignores this header; do not assume replay protection.",
"schema": {
"type": "string",
"minLength": 8,
"maxLength": 128
}
}
],
"security": [
{},
{
"apiKey": []
}
],
"responses": {
"200": {
"description": "OK",
"content": {
"application/json": {
"schema": {
"type": "object"
}
}
}
},
"400": {
"description": "Invalid input."
},
"402": {
"description": "Key required. Body carries pricing_url, free_key_url, docs_url and checkout_url when set."
},
"409": {
"description": "Idempotency key already used for this API key when atomic metering is enabled."
},
"429": {
"description": "Rate limit or quota reached. Body carries retry_after_seconds and the same URLs."
},
"502": {
"description": "Upstream data request failed."
},
"503": {
"description": "Backend or atomic usage reservation/finalization unavailable."
}
}
}
},
"/p/{slug}/{id}": {
"get": {
"summary": "Public HTML product page with dated price observations and available history.",
"description": "Costs 0 lookup(s) at $0.005 each. Works without a key, 10 per minute per IP.",
"parameters": [
{
"name": "slug",
"in": "path",
"required": true,
"schema": {
"type": "string"
}
},
{
"name": "id",
"in": "path",
"required": true,
"schema": {
"type": "string"
}
}
],
"security": [
{},
{
"apiKey": []
}
],
"responses": {
"200": {
"description": "OK",
"content": {
"text/html": {
"schema": {
"type": "string"
}
}
}
},
"400": {
"description": "Invalid input."
},
"402": {
"description": "Key required. Body carries pricing_url, free_key_url, docs_url and checkout_url when set."
},
"409": {
"description": "Idempotency key already used for this API key when atomic metering is enabled."
},
"429": {
"description": "Rate limit or quota reached. Body carries retry_after_seconds and the same URLs."
},
"502": {
"description": "Upstream data request failed."
},
"503": {
"description": "Backend or atomic usage reservation/finalization unavailable."
}
}
}
},
"/p/{id}": {
"get": {
"summary": "Redirect to the canonical public HTML product page.",
"description": "Costs 0 lookup(s) at $0.005 each. Works without a key, 10 per minute per IP.",
"parameters": [
{
"name": "id",
"in": "path",
"required": true,
"schema": {
"type": "string"
}
}
],
"security": [
{},
{
"apiKey": []
}
],
"responses": {
"200": {
"description": "OK",
"content": {
"text/html": {
"schema": {
"type": "string"
}
}
}
},
"301": {
"description": "Redirect to canonical product URL.",
"headers": {
"Location": {
"schema": {
"type": "string"
}
}
}
},
"400": {
"description": "Invalid input."
},
"402": {
"description": "Key required. Body carries pricing_url, free_key_url, docs_url and checkout_url when set."
},
"409": {
"description": "Idempotency key already used for this API key when atomic metering is enabled."
},
"429": {
"description": "Rate limit or quota reached. Body carries retry_after_seconds and the same URLs."
},
"502": {
"description": "Upstream data request failed."
},
"503": {
"description": "Backend or atomic usage reservation/finalization unavailable."
}
}
}
},
"/compare/{slug}/{idA}/{idB}": {
"get": {
"summary": "Public HTML price comparison page for two canonical products.",
"description": "Costs 0 lookup(s) at $0.005 each. Works without a key, 10 per minute per IP.",
"parameters": [
{
"name": "slug",
"in": "path",
"required": true,
"schema": {
"type": "string"
}
},
{
"name": "idA",
"in": "path",
"required": true,
"schema": {
"type": "string"
}
},
{
"name": "idB",
"in": "path",
"required": true,
"schema": {
"type": "string"
}
}
],
"security": [
{},
{
"apiKey": []
}
],
"responses": {
"200": {
"description": "OK",
"content": {
"text/html": {
"schema": {
"type": "string"
}
}
}
},
"400": {
"description": "Invalid input."
},
"402": {
"description": "Key required. Body carries pricing_url, free_key_url, docs_url and checkout_url when set."
},
"409": {
"description": "Idempotency key already used for this API key when atomic metering is enabled."
},
"429": {
"description": "Rate limit or quota reached. Body carries retry_after_seconds and the same URLs."
},
"502": {
"description": "Upstream data request failed."
},
"503": {
"description": "Backend or atomic usage reservation/finalization unavailable."
}
}
}
},
"/drops": {
"get": {
"summary": "Public HTML page of the biggest current price drops, grouped by category.",
"description": "Costs 0 lookup(s) at $0.005 each. Works without a key, 10 per minute per IP.",
"par
# --- truncated at 32 KB (64 KB total) ---
# Full source: https://artifacts.apis.io/golfdata-co/openapi/_original/golfdata-co-api-openapi.json