GOAT API & Scraper
The GOAT API returns live sneaker and streetwear resale data as clean JSON.
🤖 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.
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.
| Field | What it is | Measured value |
|---|---|---|
| lowest_ask_usd / price_usd | Live 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_usd | GOAT's retail display price for the model, not a resale ask. | 160.0, while the cheapest used pair asked 257.0 |
| size / size_unit | US sizing, half sizes as .5 decimals. | size_unit "us", size_range 7 through 18 (23 values) |
| condition | Only two values exist: used and new_no_defects. | used returned 15 priced sizes; new_no_defects size 10 in GB returned none |
| box_condition | Per-listing box state. | no_original_box, good_condition |
| defects | Free-text defect summary, or null. | "Discoloration, Scuffs" |
| sale_status / instant_ship / is_goat_clean | Listing state and GOAT's own fulfilment flags. | "active", false, false |
| min_offer_usd / max_offer_usd | The offer floor and ceiling GOAT accepts on this product. | 25.0 / 4000.0, with is_offerable true |
| sku | Manufacturer style code, space-separated rather than hyphenated. | "555088 101" |
| product_id | Integer 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.
Real request and response JSON
Captured from the indexed primary action, search, on .
{
"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"
}
}{
"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"
}
]
}
}What the GOAT API does
| Action | Description | Concrete use case | Key params |
|---|---|---|---|
| search | Search 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 |
| suggest | Autocomplete 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_detail | 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. | Catalog enrichment teams call product_detail to get full catalogue record for one product by `slug` / `url` / `product_id`. | slug, url, product_id |
| prices | 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. | 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, ... |
| related | Products 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 |
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"}'import requests
r = requests.post(
"https://api.reefapi.com/goat/v1/search",
headers={"x-api-key": REEF_KEY},
json={
"query": "air jordan 4"
},
)
print(r.json()["data"])const res = await fetch("https://api.reefapi.com/goat/v1/search", {
method: "POST",
headers: {
"x-api-key": process.env.REEF_KEY,
"content-type": "application/json",
},
body: JSON.stringify({
"query": "air jordan 4"
}),
});
const { ok, data, meta, error } = await res.json();Ask your MCP-connected assistant: call reefapi.goat.search with {"query":"air jordan 4"}.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.
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.