GOAT Scraper - Sneaker Asks, Last Sale, Sizes & Prices
Pricing
from $1.00 / 1,000 product results
GOAT Scraper - Sneaker Asks, Last Sale, Sizes & Prices
Scrape GOAT (goat.com), the sneaker and streetwear resale marketplace. Search or paste product, brand, collection and category URLs. 45+ fields per product: lowest ask, Instant Ship price, last sale and stock status for every size, retail, SKU, colorway, release date, images and story.
Pricing
from $1.00 / 1,000 product results
Rating
0.0
(0)
Developer
Abot API
Maintained by CommunityActor stats
1
Bookmarked
4
Total users
2
Monthly active users
9 days ago
Last modified
Categories
Features
Share
GOAT Scraper: Sneaker Asks, Last Sale, Sizes & Prices
GOAT Scraper turns GOAT, the sneaker and streetwear resale marketplace, into structured product data. Search by keyword, browse the catalogue with filters alone, or paste GOAT product, search, brand, collection and category links. Every product comes back with its full identity, and with Fetch full market data on, the live per size market table: lowest ask, Instant Ship price, last sold price and stock status for every size in the market you choose. Export the dataset as JSON, CSV or Excel, or pull it straight into your app through the API.
Why This Scraper?
- Four ways to reach the catalogue. Search by keyword, browse by filters alone, or paste GOAT product, search, brand, collection and category links. A pasted browse link is paged like a search; a pasted product link always returns that single product in full.
- Full product identity every time. Brand, SKU, colorway, designer, silhouette, sizing, release date, retail price, images and the product story, whichever mode found it.
- The live per size market table on demand. Turn on Fetch full market data for the lowest ask, Instant Ship price, last sold price and stock status for every size, and pay the extra fee only when you use it.
- A real ship-to market, not a currency label. GOAT prices and stocks sizes differently per country, so switching Market genuinely changes which sizes and prices come back, not just how they are labelled.
- Server side filters. Brand, category, activity, gender, condition, size, price and release year all narrow GOAT's own search, so a filtered run reads fewer pages instead of throwing rows away afterwards.
- Built for monitoring. Incremental mode returns only new and changed products on recurring runs, and price, ask or stock moves are reported as the signal they are on a resale marketplace, not filtered out as noise.
- Fails loudly instead of going quiet. A run the site refuses stops with a clear message, so "nothing matched this search" is never confused with "GOAT could not be reached".
Use Cases
- Resale investors and flippers: compare lowest ask, last sale and Instant Ship price across sizes to spot underpriced pairs.
- Sneaker release trackers: monitor new drops and price movement on hyped releases as soon as they land on GOAT.
- Marketplace and price comparison tools: feed product identity, retail price and live market data into your own app or tracker.
- Reselling and inventory businesses: check stock status and per size pricing across a catalogue before buying or listing.
- Market research and data science: build a history of ask and sale prices per size for sneaker market analysis.
Data You Get
Sample shape: values are illustrative placeholders, not from a live record.
| Field | Example |
|---|---|
productId, slug, url | GOAT's product id, its URL slug and the product page link |
name, nickname | Full product name and its short nickname |
brand, sku, colorway, color | Brand, style code, colorway text and base colour |
designer, silhouette, midsole, upperMaterial | Design attributes, when GOAT publishes them |
productCategory, productType, activities | Shoes, clothing or accessories, product type, and activity tags |
gender, genders | Primary audience and every audience it is cut for |
sizeRange, sizeUnit, sizeBrand | Every size the product exists in, and the sizing system |
releaseDate, releaseYear, releaseMonth, season | Release data |
retailPrice | Original retail price, USD |
lowestAsk, instantShipLowestAsk | Lowest ask and Instant Ship price, USD |
lowestAskSource | "search_match" (the one variant matched) or "all_sizes" (true minimum, with Fetch full market data on) |
matchedSize, matchedCondition, matchedBoxCondition | The variant GOAT's own search matched |
isUnderRetail, hasStock, status | Whether it sits under retail, whether there is stock, listing status |
minimumOffer, maximumOffer | The offer bounds GOAT enforces |
story, storyHtml | The product write-up, plain and as HTML |
imageUrl, gridImageUrl, originalImageUrl | Product images |
collectionSlugs | GOAT collections the product is featured in |
market, currency, localPricing | The market you asked for, and the retail price and ask in that market's own currency |
siteName, scrapedAt | Provenance |
sizes[] | With Fetch full market data on: one row per size, with condition, lowest ask, Instant Ship price, last sale and stock status |
lastSale, lastSaleLow, lastSaleHigh, totalSizeCount | With Fetch full market data on: recent sale price roll up and market depth |
changeType, changedFields, firstSeenAt, lastSeenAt | Incremental mode only: how the product changed since the last run |
priceChanges, variantChanges | Compact updates only: old and new value of each moved price or stock field |
otherChanges | Compact updates with change scope all only: old and new value of every other moved top level field, null when none |
With Fetch full market data on, a row also carries the full image gallery (imageUrls), every size option GOAT lists, classification flags (taxonomy, isOfferable, isResellable) and per condition listing counts. detailCarriedForward appears, and is true, only when a market fetch failed and the row was repaired from the previous run instead of left blank.
How to Use
- Pick a mode:
search(by keyword) orurl(paste GOAT links). - For search mode, fill in Search terms, or leave it empty and set filters alone to browse the whole catalogue. For URL mode, paste product, search, brand, collection or category links (leave the field untouched and url mode scrapes one example of each shape: a search page, a product page, a brand page and the sneakers category); the same filters apply to every pasted browse link.
- Turn on Fetch full market data if you need the per size ask, Instant Ship price, last sale and stock table, and set Max items to control run size and cost.
- Click Start, then download the dataset as JSON, CSV or Excel, or read it through the API.
Keyword search:
{"mode": "search","searchTerms": ["air jordan 1", "nike dunk low"],"maxItems": 50}
Browse the catalogue with filters alone (no search terms):
{"mode": "search","searchTerms": [],"brands": ["Nike"],"activity": "basketball","maxPriceUsd": 150,"releaseYearFrom": 2024,"maxItems": 200}
Paste GOAT links, with full market data:
{"mode": "url","urls": ["https://www.goat.com/brands/new-balance","https://www.goat.com/sneakers"],"fetchDetails": true,"maxItems": 100}
A different ship-to market, Instant Ship stock only:
{"mode": "search","searchTerms": ["yeezy 350"],"market": "GB","instantShipOnly": true,"maxItems": 30}
Run it from your code
Python:
from apify_client import ApifyClientclient = ApifyClient("<YOUR_APIFY_TOKEN>")run = client.actor("abotapi/goat-sneaker-scraper").call(run_input={"mode": "search", "searchTerms": ["air jordan 1"], "maxItems": 20})for product in client.dataset(run["defaultDatasetId"]).iterate_items():print(product["name"], product["lowestAsk"])
JavaScript:
import { ApifyClient } from 'apify-client';const client = new ApifyClient({ token: '<YOUR_APIFY_TOKEN>' });const run = await client.actor('abotapi/goat-sneaker-scraper').call({ mode: 'search', searchTerms: ['air jordan 1'], maxItems: 20 });const { items } = await client.dataset(run.defaultDatasetId).listItems();
Or connect it to Make, Zapier, n8n, Google Sheets or webhooks from the Integrations tab.
Max items and GOAT's own limits
GOAT's own search returns at most 1000 products for any single search term, brand, collection or category link; the run logs it when this ceiling truncates a scope. Max items is the cap on top of that: raise it, or set it to 0, to collect everything up to GOAT's own ceiling. Max pages is a separate safety bound on how many result pages one search term or link can walk; leave it at 0 to let Max items decide instead.
Resume and recurring updates
- Resume (
resumeFromRunId) continues one interrupted run: paste its run or dataset id and the actor skips every product it already collected there, so you don't pay twice. - Incremental mode (
incrementalMode) is for scheduled runs over the same search, filters and market. Each product is classifiedNEW,UPDATED(withchangedFields, since a price, ask or stock move is the signal on a resale marketplace, not noise),UNCHANGED(suppressed and not billed unlessemitUnchangedis on),REAPPEAREDorEXPIRED(only after a run that scanned the whole tracked scope, and only withemitExpired).stateKeynames or shares the stored state, so two differently configured searches never mix. With incremental mode off, output is exactly as before.
What is compared. By default the whole product record: name, brand, colorway, release data, retail price, lowest ask, instant ship ask, last sale, stock flags and every size row with its ask and stock status. Excluded: the scrape timestamp and the carried-forward marker, which change on every run, plus any field you list in ignoreFieldsForChanges. The excluded fields stay in the output.
Ignore fields (ignoreFieldsForChanges). Field names to leave out of change detection, for example color. A dotted name reaches inside every size row while its ask and stock stay tracked, for example sizes.sizeValue. Unchanged is decided by re-checking the stored record against your current list, so editing the list does not return a wave of false updates. With no State key, a changed list starts a new automatic baseline (the first run returns everything as NEW); name a State key to keep one baseline.
Price and stock monitoring (all optional, off by default).
changeScope=priceAndStock: only a move of the lowest ask, instant ship ask, retail price, under-retail flag, in-stock flag or last sale, or of a size row's ask, instant ship ask or stock status, returnsUPDATED. Size rows are matched by size, shoe condition and box condition, in any order. Description, images and release data never do.compactUpdates:UPDATEDandEXPIREDrows are short (ids, url, name, current ask, retail price and stock flags) withpriceChangesandvariantChangesshowing old and new values; with the change scope set to all,otherChangesalso holds the old and new value of any other moved top level field (null when none).NEWrows stay complete. The Fetch full market data event is charged only for a row that actually carries the market table, so a compact row does not trigger it.expireAfterMissedScans(default 1): withemitExpired, a product is markedEXPIREDonly after it was missing from that many complete scans in a row.EXPIREDmeans no longer listed in this search; a listing drop and a delisting cannot be told apart without opening each product, so read availability from the stock fields.
Output views
The dataset has three tabs: Overview (identity, lowest ask, retail price and stock), Detail (per-size market) (the per size table when Fetch full market data is on) and Changes (incremental) (change type, changed fields, price and variant changes).
Send results into your apps (MCP connectors)
Optionally pipe the scraped results into the apps you already use, via Model Context Protocol (MCP) connectors. This is an extra delivery step after the scrape: the Apify dataset is never changed and nothing extra is billed.
What gets written to the connector: a condensed, human-readable summary of each product, not the full JSON. The complete record always stays in the Apify dataset.
- Authorize a connector once under Apify, Settings, Integrations (Notion, Linear, Airtable, or Apify).
- Select it in the "Pipe results into your apps" input field (
mcpConnectors). If the picker is empty, you have not authorized a connector yet. - For Notion, also set
notionParentPageUrlto the page where items should be created. maxNotifyListingscaps how many items are written to each connector per run (default 50).
The connection is mediated by Apify's MCP proxy, so this actor never sees your third-party credentials. Leave the field empty to skip.
Input Parameters
| Parameter | Type | Default | Description |
|---|---|---|---|
mode | string | search | search (GOAT keyword search) or url (process pasted GOAT links). |
searchTerms | array | ["air jordan 1"] | Terms to search GOAT for (search mode). Leave empty with a filter set to browse the whole catalogue. |
urls | array | one example of each shape (search, product, brand, category) | GOAT product, search, brand, collection or category links (url mode). With the field untouched, url mode scrapes one example of each shape. Add ?page=3 to a browse link to start walking from that page. |
brands | array | (none) | Only these brands, OR-ed together. Applies in both modes. |
productCategory | string | any | shoes, clothing, accessories, bags or collectibles. Applies in both modes. |
activity | string | any | lifestyle, running, basketball or skateboarding. Applies in both modes. |
gender | string | any | men, women, youth or infant. Applies in both modes. |
condition | string | any | new_no_defects, new_with_defects or used. Also narrows the per size market table when Fetch full market data is on. |
sizeUs | string | (none) | Only this US size, for example 10 or 9.5. |
minPriceUsd | integer | (none) | Only products whose lowest ask is at least this many USD. |
maxPriceUsd | integer | (none) | Only products whose lowest ask is at most this many USD. |
releaseYearFrom | integer | (none) | Only products released in this year or later. |
releaseYearTo | integer | (none) | Only products released in this year or earlier. |
inStockOnly | boolean | false | Only products that currently have stock on GOAT. |
instantShipOnly | boolean | false | Only products with an Instant Ship price. |
underRetailOnly | boolean | false | Only products whose lowest ask is below retail price. |
market | string | US | Ship-to market: US, GB, CA, AU, DE or JP. Changes which sizes and prices come back; top level money fields stay USD. |
sortResultsBy | string | relevance | Order of the rows this run collected (not the whole catalogue): relevance, price_asc, price_desc, release_newest or release_oldest. Use the price filters to target the cheapest or dearest listings across the whole catalogue. |
fetchDetails | boolean | false | Fetch each product's live per size market table (lowest ask, Instant Ship price, last sold price, stock status), full image gallery, offer bounds and for sale counts. Charged once per product on top of the per result fee. |
maxItems | integer | 20 | Stop after this many products across all search terms and links. 0 = unlimited (up to GOAT's own ceiling). |
maxPages | integer | 0 | Safety bound on result pages walked per search term or link. 0 = no separate limit; Max items decides instead. |
resumeFromRunId | string | (none) | Continue one interrupted run: paste its run id or dataset id. |
incrementalMode | boolean | false | Return only new and changed products on scheduled runs over the same search. |
stateKey | string | (none) | Name or share an incremental-mode state. Left empty, a key is derived automatically from the mode, search terms, links, filters, market and the Fetch full market data setting. |
emitUnchanged | boolean | false | Also return (and bill) products unchanged since the last run. |
emitExpired | boolean | false | Also return (and bill) products no longer found, after a complete scan of the tracked search. |
changeScope | string | all | Incremental mode: all or priceAndStock (only price, ask and stock moves return UPDATED). |
compactUpdates | boolean | false | Incremental mode: short UPDATED and EXPIRED rows with priceChanges and variantChanges. |
expireAfterMissedScans | integer | 1 | With emitExpired: complete scans in a row a product must be missing before it is EXPIRED. |
ignoreFieldsForChanges | array | [] | Incremental mode: field names (or dotted names such as sizes.sizeValue) excluded from change detection. |
mcpConnectors | array | [] | Optional MCP connectors that receive a short summary of each product after the run. |
notionParentPageUrl | string | no default (empty) | Notion parent page URL or id; needed only for the Notion connector. |
maxNotifyListings | integer | 50 | Cap on items written to each connector per run. The dataset is unaffected. |
proxy | object | Apify Proxy | Connection settings. |
Output Example
Sample shape: values are illustrative placeholders, not from a live record.
{"productId": 90000001,"slug": "sample-brand-classic-runner-ab1234-100","url": "https://www.goat.com/sneakers/sample-brand-classic-runner-ab1234-100","name": "Sample Brand Classic Runner","nickname": "Classic Runner","brand": "Sample Brand","sku": "AB1234-100","colorway": "White/Black","color": "White","productCategory": "shoes","productType": "sneakers","gender": "men","sizeRange": ["7", "8", "9", "10", "11"],"releaseDate": "2024-03-01T00:00:00.000Z","releaseYear": 2024,"retailPrice": 120.0,"lowestAsk": 95.0,"instantShipLowestAsk": 110.0,"lowestAskSource": "all_sizes","isUnderRetail": true,"hasStock": true,"status": "active","imageUrl": "https://image.goat.com/sample-1.png","market": "US","currency": "USD","localPricing": { "currency": "USD", "retailPrice": 120.0, "lowestAsk": 95.0 },"sizes": [{"size": "9","shoeCondition": "new_no_defects","boxCondition": "good_condition","lowestAsk": 100.0,"instantShipLowestAsk": 115.0,"lastSale": 98.0,"stockStatus": "single_in_stock"},{"size": "10","shoeCondition": "new_no_defects","boxCondition": "good_condition","lowestAsk": 95.0,"instantShipLowestAsk": 110.0,"lastSale": 102.0,"stockStatus": "multiple_in_stock"}],"lowestAskSize": "10","lastSale": 100.0,"lastSaleLow": 98.0,"lastSaleHigh": 102.0,"totalSizeCount": 2,"siteName": "GOAT","scrapedAt": "2026-01-01T00:00:00Z"}
Plan Requirement
GOAT's product pages sit behind an anti-bot check that frequently challenges standard and datacenter connections, while its catalogue search is open on the connection you select. Catalogue results therefore load on the default Proxy setting, and per size market reads move to Apify Residential (which uses your own residential proxy traffic), then to a backup connection, when a connection is challenged repeatedly. Residential access is not included in Apify free plans; on those plans the actor continues on a backup connection and some market pages may still be unavailable. If a run is affected, the log says so:
- Selected connection unavailable: "The selected connection is unavailable to this run. Apify free plans do not include residential proxies. Continuing on a backup connection; some pages may still be unavailable."
- Served by the backup: "Served over the backup connection (the default connection was unavailable)."
- Proxy refused (run fails): "The proxy connection was refused for this account, so no page could be read. Your Apify plan does not include proxy access; a paid plan is required."
- No results (run fails): "No results: residential proxies are unavailable on this run (Apify free plans do not include them), and the backup connection could not load the requested GOAT pages."
- Pages failed to load (run fails): "Could not load any results page (the requests failed), so nothing was collected. This is a connection problem, not an empty search. Please try again later."
Billing: each product returned is billed as a dataset item. With Fetch full market data on, a detail-enrichment event is also billed, one per delivered product that carries the per size market table. It is charged as each enriched product is delivered (together with the batch of rows that carries it), never before the row is in your dataset; compact, unchanged, suppressed and failed rows are never charged it, and a catalogue only run never triggers it. The Pricing tab shows the current rates. Use Max items to cap cost.
FAQ
How much does it cost?
You pay per product returned (dataset item), plus one detail-enrichment event per delivered product when Fetch full market data is switched on. The Pricing tab shows the current rates. Use Max items to cap the cost of any run.
Is it legal to scrape GOAT?
This actor collects only publicly available marketplace data. You are responsible for how you use it: follow GOAT's terms and the laws that apply to you, and get legal advice if you plan commercial redistribution. Product images and write ups may be subject to third party rights.
Can I get only new or changed products on a schedule?
Yes. Schedule the actor from the Schedules tab and turn on Incremental mode. Each run then returns only new and changed products, and unchanged ones are not billed. A price, ask or stock move is reported as an update, since that is the signal on a resale marketplace.
Why did a run return fewer products than I expected?
GOAT's own search returns at most 1000 products for any single search term, brand, collection or category link; a very broad scope is truncated there and the run says so in the log. Narrow it with the brand, category, size, price or release year filters to reach the rest, or check whether Max items stopped the run first.
Why did my run fail instead of returning an empty dataset?
If GOAT refuses every request, the run stops with a clear message so "nothing matched this search" is never confused with "nothing could be read". Run it again in a few minutes, or switch the Proxy setting to Apify Residential.
Can I automate this with my own tools?
Yes. Call it from the Apify API or client libraries, schedule it, or connect it to Make, Zapier, n8n, Google Sheets or webhooks from the Integrations tab.
๐ Want more fashion data?
Pair this actor with these related scrapers from the same team:
| ๐ KREAM Scraper Scrape KREAM (kream.co.kr) sneaker and fashion resale data by keyword search, filters... | ๐ KLEKT Sneaker & Apparel Resale Scraper Scrape sneaker and streetwear listings from KLEKT (klekt.com). Browse the catalog with... |
| ๐ SNKRDUNK Scraper Scrape SNKRDUNK (snkrdunk.com), Japan's sneaker and streetwear resale marketplace: JP and... | ๐ StockX Scraper Scrape StockX market data by keyword, category or URL. Every row carries lowest ask... |
| ๐ท๏ธ ThredUp Scraper Scrape ThredUp resale listings by keyword, department, brand, size, condition, price or... | ๐ Kohl's Scraper Scrape Kohl's (kohls.com) products by keyword search or category browsing. Extract... |
๐ Browse all abotapi scrapers
๐ฌ Support
- ๐ Found a bug or a missing field? Open a ticket on the Issues tab. We usually reply within hours.
- ๐ ๏ธ Need another site, extra fields or a private build? Email contact@abotapi.com.
- โญ Enjoying it? A quick review on the actor page helps other users find it.