Looking for the overview — what this API returns, what it costs, and a call you can run without a key? See the GOAT API page →
E-commerce & Marketplaces

GOAT API & Scraper

The GOAT API returns live sneaker and streetwear resale data as clean JSON.

5 actionsLive JSON1,000 free credits$0.67–$1.50 / 1,000 creditsMCP-ready
Get a free keyOpen in playground

🤖 Using an AI assistant? Copy this link into ChatGPT / Claude / Cursor — it reads every endpoint and parameter instantly and tells you if this API fits your use case.

The primary search endpoint returns matching products (id, slug, URL, name, image, category) plus curated collections, and product_detail and prices expose the resale pricing and variant data behind a listing. You can also suggest queries and pull related products. It is built for resale-price intelligence, sneaker apps and reselling tools that need GOAT market data without scraping a heavily-defended marketplace. One ReefAPI key, one shared credit pool, the standard envelope.

Reference

Reading GOAT prices: units, size scale and the condition flags

Resale APIs commonly return integer cents. This one does not: every figure is a decimal dollar amount. The rows below were read from live calls on the Air Jordan 1 Retro High OG 'Chicago' 2015 (product_id 14741) on 2026-08-27 with the default condition=used and country=US.

FieldWhat it isMeasured value
lowest_ask_usd / price_usdLive lowest ask as a decimal number of US dollars. Not cents.257.0 for size 8.5, meaning $257 and not $2.57
display_price_usdGOAT's retail display price for the model, not a resale ask.160.0, while the cheapest used pair asked 257.0
size / size_unitUS sizing, half sizes as .5 decimals.size_unit "us", size_range 7 through 18 (23 values)
conditionOnly two values exist: used and new_no_defects.used returned 15 priced sizes; new_no_defects size 10 in GB returned none
box_conditionPer-listing box state.no_original_box, good_condition
defectsFree-text defect summary, or null."Discoloration, Scuffs"
sale_status / instant_ship / is_goat_cleanListing state and GOAT's own fulfilment flags."active", false, false
min_offer_usd / max_offer_usdThe offer floor and ceiling GOAT accepts on this product.25.0 / 4000.0, with is_offerable true
skuManufacturer style code, space-separated rather than hyphenated."555088 101"
product_idInteger on product_detail and prices, string in search rows.14741 (integer) vs "1567309" (string)

The prices action probes every size and returns only the ones with a live ask: meta.sizes_probed said 23 while meta.record_count said 15, and the eight missing sizes are dropped rather than returned at zero. Separately, display_price_local is not pinned by the `country` parameter. The same product came back as USD 160.00 on one call and EUR 139.00 on another minutes later, so compute on the *_usd fields and treat the local block as display-only.

Live example

Real request and response JSON

Captured from the indexed primary action, search, on .

Captured request
{
  "method": "POST",
  "url": "https://api.reefapi.com/goat/v1/search",
  "headers": {
    "x-api-key": "$REEF_KEY",
    "content-type": "application/json"
  },
  "body": {
    "query": "air jordan 4"
  }
}
Captured response
{
  "ok": true,
  "meta": {
    "api": "goat",
    "endpoint": "search",
    "mode": "live",
    "latency_ms": 614.9,
    "record_count": 25,
    "bytes": 11222,
    "cache_hit": false,
    "stop_reason": "complete",
    "query": "air jordan 4",
    "pagination": {
      "has_more": false
    },
    "charged_credits": 1,
    "version": "1.0.0"
  },
  "data": {
    "results": [
      {
        "product_id": "1567309",
        "slug": "air-jordan-4-retro-black-cat-2025-fv5029-010",
        "url": "https://www.goat.com/sneakers/air-jordan-4-retro-black-cat-2025-fv5029-010",
        "name": "Air Jordan 4 Retro 'Black Cat' 2025",
        "image": "https://image.goat.com/attachments/product_template_pictures/images/112/064/690/original/1567309_00.png.png",
        "category": "shoes"
      },
      {
        "product_id": "1709894",
        "slug": "air-jordan-4-retro-rare-air-tour-yellow-io2463-102",
        "url": "https://www.goat.com/sneakers/air-jordan-4-retro-rare-air-tour-yellow-io2463-102",
        "name": "Air Jordan 4 Retro 'Rare Air - Tour Yellow' 2026",
        "image": "https://image.goat.com/attachments/product_template_pictures/images/118/284/859/original/1709894_00.png.png",
        "category": "shoes"
      },
      {
        "product_id": "1653296",
        "slug": "air-jordan-4-retro-toro-bravo-2026-fq8138-600",
        "url": "https://www.goat.com/sneakers/air-jordan-4-retro-toro-bravo-2026-fq8138-600",
        "name": "Air Jordan 4 Retro 'Toro Bravo' 2026",
        "image": "https://image.goat.com/attachments/product_template_pictures/images/115/979/043/original/1653296_00.png.png",
        "category": "shoes"
      }
    ],
    "collections": [
      {
        "record_id": "5a48381c-ac1c-4883-95e3-b8be04efd5c8",
        "title": "Air Jordan 4",
        "slug": "air-jordan-4-alias",
        "subtype": "StaticCollection"
      },
      {
        "record_id": "8440c30c-f511-4a03-9139-ed16c4046765",
        "title": "Air Jordan 4",
        "slug": "air-jordan-4",
        "subtype": "StaticCollection"
      },
      {
        "record_id": "5b4928f8-26ed-4196-87c1-3716811ee057",
        "title": "FORMAT | AIR JORDAN 4",
        "slug": "format-air-jordan-4",
        "subtype": "StaticPictureCollection"
      }
    ]
  }
}
Actions

What the GOAT API does

ActionDescriptionConcrete use caseKey params
searchSearch GOAT for products by keyword. Returns matching products (name, slug, brand image, category) plus related curated collections. Resolves the `slug`/`product_id` you feed into product_detail and prices. `limit` caps results.Pricing teams call search to search GOAT for products by keyword.query, limit
suggestAutocomplete suggestions for a partial query — quick product + collection name matches as the customer types. Lighter than search.Marketplace operators call suggest to get autocomplete suggestions for a partial query.query
product_detailFull catalogue record for one product by `slug` / `url` / `product_id`: name, nickname, brand, SKU, colorway, designer, gender, silhouette, release date, season, materials, size range, taxonomy, images, the GOAT display price and the offer floor/ceiling. Pair with `prices` for the live per-size resale grid.Catalog enrichment teams call product_detail to get full catalogue record for one product by `slug` / `url` / `product_id`.slug, url, product_id
pricesLive per-size resale price grid for a product (the market-data moat). For each size of the given `condition` it returns the lowest live ask + listing count, plus the cheapest listing overall. Accepts `slug`/`url`/`product_id`. `condition` (used/new_no_defects), `country` set the market. Optional `size` narrows to one size (returns every live listing for it). Honest-empty when nothing is listed.Retail analysts call prices to get live per-size resale price grid for a product (the market-data moat).slug, url, product_id, condition, country, ...
relatedProducts related to one product by `slug`/`url`: GOAT's recommended products plus the brand / category / silhouette grids GOAT surfaces on the page. Catalogue discovery from any starting product.Pricing teams call related to get products related to one product by `slug`/`url`.slug, url
Code samples

Call search from your stack

curl -X POST https://api.reefapi.com/goat/v1/search \
  -H "x-api-key: $REEF_KEY" \
  -H "content-type: application/json" \
  -d '{"query":"air jordan 4"}'
MCP one-liner
Ask your MCP-connected assistant: call reefapi.goat.search with {"query":"air jordan 4"}.
Use cases

Who uses this API and why

  • Resale-price tools call search then prices to track a sneaker's market value across sizes.
  • Sneaker apps use product_detail to show live GOAT listings alongside other marketplaces.
  • Resellers use related and suggest to discover trending models and comparable products.
FAQ

Questions developers ask before integrating

Are GOAT prices in cents?

No, they are decimal US dollars. A live per-size grid returned lowest_ask_usd values of 893.0, 1709.0, 428.0 and 257.0, and the cheapest listing on that shoe was $257. The same holds for price_usd on individual listings, display_price_usd, min_offer_usd and max_offer_usd. Dividing by 100 will put you off by two orders of magnitude.

Why does the price grid return fewer sizes than the shoe is made in?

Because a size with no live ask is omitted rather than returned with a null price. On the Chicago 2015 the response carried meta.sizes_probed 23 and meta.record_count 15: eight sizes had nothing listed in that condition and market at that moment. The full manufactured run is in product_detail's size_range, so join the two if you need a complete grid with the gaps marked.

Which size scale are the prices keyed by?

US. product_detail returns size_unit "us" and a size_range of decimals from 7 to 18, with half sizes as 7.5, 8.5 and so on, and the prices grid uses the same numbers. Changing `country` changes the market you are pricing, not the size scale, so a call with country=GB is still asking for a US 10 rather than a UK 10.

What does the country parameter actually change?

It selects which market's asks GOAT quotes. Twelve countries are accepted: US, GB, DE, FR, IT, CA, AU, JP, KR, HK, NL and ES. It does not reliably relabel the currency. A live call with country=JP for size 9 returned 20 listings whose price_local block still read USD, alongside price_usd 458.10. Treat the *_usd fields as the number and country as a market selector.

What is the difference between display_price_usd and the price grid?

display_price_usd is GOAT's retail reference for the model; the grid is what people are asking today. On the Chicago 2015 those were 160.0 and 257.0, a roughly 60 percent resale premium on the cheapest available pair. Do not read display_price_usd as a current market price, and do not compare it against sold data.

Why did my prices call return ok:true with an empty list?

Because nothing is listed for that exact combination, and the response is honest-empty rather than an error. A live call for slug plus condition new_no_defects plus size 10 plus country GB came back with listings [], lowest null, record_count 0 and meta.stop_reason "empty_page", while still returning the product block so you know the lookup itself worked. Widen it by dropping `size`, switching condition to used, or trying country US.

What do box_condition, defects and is_goat_clean tell me?

They separate two pairs sitting at the same price. In one live size-9 grid, a $597.80 listing had box_condition no_original_box with defects null, and another at exactly $597.80 had box_condition good_condition but defects "Discoloration, Scuffs". is_goat_clean marks GOAT's own cleaning programme and came back false on every listing measured. instant_ship marks stock already held in a GOAT warehouse, which ships faster than a seller-fulfilled pair.

Should I pass slug or product_id?

Either, with `url` as a third option. Search returns both, but watch the type: search rows return product_id as a string such as "1567309", while product_detail and prices return it as an integer such as 14741. Slug is the safer key to store. It is the last path segment of goat.com/sneakers/<slug> and it embeds the SKU, for example air-jordan-1-retro-high-og-chicago-555088-101.

What is the GOAT API?

GOAT API is a ReefAPI endpoint group for goat It returns live JSON through POST requests under /goat/v1.

Is the GOAT API free to try?

Yes. ReefAPI starts with 1,000 free credits, no card required. GOAT calls use the same shared credit balance as every other ReefAPI engine.

Do I need a GOAT login or account?

No login to GOAT is needed for the API response. You call ReefAPI with your x-api-key header, and the playground can run live examples before you create a production key.

How fresh is the GOAT data?

The page example is captured from a live search call, and production requests fetch live data through ReefAPI rather than a static sample.

How many credits does the GOAT API use?

GOAT actions currently cost 1 credit per successful call. Failed or blocked calls are free. All APIs draw from one credit pool.

Can I call GOAT from an AI assistant or MCP client?

Yes. Connect ReefAPI once through MCP and your assistant can call goat actions with the same key, credit pool and JSON envelope used by normal REST requests.

docs / goat

GOAT

GOAT

base /goat/v15 endpoints
post/goat/v1/suggest1 credit

Autocomplete suggestions for a partial query — quick product + collection name matches as the customer types. Lighter than search.

ParameterAllowed / rangeDescription
queryrequired—Partial search text to complete.
Try in playground →
post/goat/v1/product_detail1 credit

Full catalogue record for one product by `slug` / `url` / `product_id`: name, nickname, brand, SKU, colorway, designer, gender, silhouette, release date, season, materials, size range, taxonomy, images, the GOAT display price and the offer floor/ceiling. Pair with `prices` for the live per-size resale grid.

ParameterAllowed / rangeDescription
slugoptional—Product slug from a GOAT URL (goat.com/sneakers/<slug>) — copy it from search results. Provide slug OR url.
urloptional—Full GOAT product URL — alternative to slug.
product_idoptional—GOAT productTemplateId (the numeric id from a search/detail result). Provide product_id OR slug OR url.
Try in playground →
post/goat/v1/prices1 credit

Live per-size resale price grid for a product (the market-data moat). For each size of the given `condition` it returns the lowest live ask + listing count, plus the cheapest listing overall. Accepts `slug`/`url`/`product_id`. `condition` (used/new_no_defects), `country` set the market. Optional `size` narrows to one size (returns every live listing for it). Honest-empty when nothing is listed.

ParameterAllowed / rangeDescription
slugoptional—Product slug from a GOAT URL (goat.com/sneakers/<slug>) — copy it from search results. Provide slug OR url.
urloptional—Full GOAT product URL — alternative to slug.
product_idoptional—GOAT productTemplateId (the numeric id from a search/detail result). Provide product_id OR slug OR url.
condition = usedoptionalused · new_no_defectsListing condition for the live price grid. 'used' is the deep public resale pool; 'new_no_defects' covers brand-new pairs.
country = USoptionalUS · GB · DE · FR · IT · CA · AU · JP · KR · HK · NL · ESMarket/country the prices are quoted for (affects asks + FX).
sizeoptional—Optional single size (e.g. 10, 10.5) — returns every live listing for just that size instead of the whole grid.
Try in playground →
Built for volume
5M+ requests a day

Measured at 60 requests a second across the fleet, with no central bottleneck. Volume pricing is on request, and per-key limits are raised for high-volume accounts.

Missing a source?
We build it

Tell us a site we do not cover yet and it becomes an engine. A customer asked for bestprice.gr on a Sunday and it was in the catalog the next day.

Support
2 minute median reply

Median time from a question in the live chat to the first answer, measured across every answered conversation. Setup help included, no support tier to buy.

One key, one balance
Every API included

No per-site plans and no separate subscriptions. One key and one credit pool across the whole catalog, so adding a source costs nothing up front.

Planning something large? Tell us the volume and the sources and we will come back with what it costs and what we would have to build.