GOAT Scraper at a glance
GOAT Scraper is a ready-to-run Apify actor from abotapi for collecting ecommerce data. Its documented output includes id, product, brand, sku and colorway, which you can export as JSON, CSV or Excel or read through the Apify API. It costs $1.80 per 1,000 results on the Apify Free plan and from $1.00 on paid plans, with smaller per-run or optional feature charges listed on Apify.
- Runs on
- Apify cloud: console, API, schedules and integrations
- Data type
- Ecommerce
- Pricing
- $1.80 per 1,000 results (Free plan), from $1.00 on paid plans
- Output
- Documented below · JSON, CSV, Excel
- Inputs
- 33 options
- Run success
- 100.0% of completed public runs in the last 30 days
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.
What GOAT Scraper can do
- 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.
Choose what to collect
These inputs let you configure GOAT Scraper - Sneaker Asks, Last Sale, Sizes & Prices. Open the actor on Apify to enter your values and review the current options.
| Input | What it controls |
|---|---|
modestring · required | How to start the scrape. 'search' runs GOAT keyword searches. 'url' processes the GOAT URLs you paste: a product URL is fetched as a single product, and a search, brand, collection or category URL is paged like a search. Only where the scope comes from differs: the filters below apply in BOTH modes. |
searchTermsarray | One or more things to search GOAT for, for example 'air jordan 1', 'nike dunk low', 'yeezy 350'. Each term is scraped independently. Search mode only: in URL mode the scope is read out of each pasted GOAT URL instead. If you leave this empty and set at least one filter, the actor browses the whole catalogue narrowed by those filters. |
urlsarray | Paste GOAT product URLs (https://www.goat.com/sneakers/), search URLs (https://www.goat.com/search?query=...), brand pages (https://www.goat.com/brands/nike), collection pages (https://www.goat.com/collections/) or category pages (https://www.goat.com/sneakers). Add ?page=3 to any browse URL to start walking from that page instead of the first. The filters below are NOT ignored here: every pasted search, brand, collection or category URL is re-run through GOAT's search with them applied. A pasted product URL is the one exception, since it returns that single product in full. |
brandsarray | Only return products from these brands, for example 'Nike', 'Air Jordan', 'adidas', 'New Balance'. Several brands are combined with OR. Leave empty for every brand. Applies in BOTH search mode and URL mode. A pasted brand page URL overrides this filter for that URL only. |
productCategorystring | Only return products in this category. Applies in BOTH search mode and URL mode. A pasted category page URL overrides this filter for that URL only. |
activitystring | Only return products GOAT files under this activity. Applies in BOTH search mode and URL mode. |
genderstring | Only return products cut for this audience. Applies in BOTH search mode and URL mode. |
Show 26 more inputs
| Input | What it controls |
|---|---|
conditionstring | Only return listings in this condition. This also narrows the per size market table when Fetch full market data is on, so the lowest ask and last sale you get back are for this condition only. Applies in BOTH search mode and URL mode. |
sizeUsstring | Only return products listed in this US size, for example '10' or '9.5'. Leave empty for every size. Applies in BOTH search mode and URL mode. |
minPriceUsdinteger | Only return products whose lowest ask is at least this many US dollars. Applies in BOTH search mode and URL mode. |
maxPriceUsdinteger | Only return products whose lowest ask is at most this many US dollars. Applies in BOTH search mode and URL mode. |
releaseYearFrominteger | Only return products released in this year or later. Applies in BOTH search mode and URL mode. |
releaseYearTointeger | Only return products released in this year or earlier. Applies in BOTH search mode and URL mode. |
inStockOnlyboolean | Only return products that currently have stock on GOAT. Applies in BOTH search mode and URL mode. |
instantShipOnlyboolean | Only return products with an Instant Ship price, meaning stock GOAT already holds and can send immediately. Applies in BOTH search mode and URL mode. |
underRetailOnlyboolean | Only return products whose lowest ask is below the original retail price. Applies in BOTH search mode and URL mode. |
marketstring | The market the prices apply to. GOAT offers different sizes at different prices per country, so this genuinely changes the asks, the last sale prices and which sizes come back. Top level money fields are always USD so rows stay comparable; the market's own currency is carried in localPricing. Applies in BOTH search mode and URL mode. |
sortResultsBystring | Order of the rows this run returns. GOAT's public search does not offer server side ordering, so this orders the products this run collected, not the whole catalogue. To target the cheapest or most expensive listings across the catalogue, use the price filters above instead. Applies in BOTH search mode and URL mode. |
fetchDetailsboolean | Fetch each product's live per size market table: lowest ask, Instant Ship price, LAST SOLD price and stock status for every size, plus the full image gallery, the offer bounds and the for sale counts. This also replaces the single sampled ask with the true lowest ask across all sizes (the row then reports lowestAskSource = all_sizes). Slower, and charged once per product. Leave off for a fast catalogue crawl: identity, retail price, release date, images, story and a sampled ask are included either way. |
maxItemsinteger | The single cap on this run: stop after collecting this many products across all search terms and URLs. Set 0 for unlimited. |
maxPagesinteger | Safety bound on how many result pages to walk per search term or URL. Leave empty (0) for no page limit: the run stops at Max items, not here. Does not impose a separate cap below Max items. GOAT itself returns at most 1000 products per search, so a very broad scope needs the filters above rather than more pages. |
resumeFromRunIdstring | Paste a previous run ID or dataset ID to continue a large crawl without returning or charging for products already collected there. Use this after an interrupted or capped run. For recurring monitoring of the same search, use Incremental mode below instead. |
incrementalModeboolean | Turn this on for daily or weekly recurring monitoring of the same search. The first run returns all matching products as NEW. Later runs normally return only NEW, UPDATED and REAPPEARED products. Compared: 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 Ignore fields. A price, ask or stock move IS reported as UPDATED: on a resale marketplace it is the signal, not noise. To be told only about price and stock moves, set What counts as a change to Price and stock only. Turn on Emit unchanged or Emit expired only when you also want those rows returned (and billed). State is kept separately per search, URL, filter and market setup; use State key to name or deliberately share a monitoring campaign. To continue one specific interrupted run instead, use Resume from a previous run above. |
stateKeystring | Optional. Name this monitoring campaign to keep its state stable, or to deliberately share state across differently configured runs. Leave empty to let the actor derive a key automatically from the search terms, URLs, filters and market, so two different searches never mix state. |
emitUnchangedboolean | Off by default. Turn on to also return products that have not changed since the last run, marked UNCHANGED. This returns, and bills, extra rows you already have, so leave it off unless you specifically want a full snapshot every run. |
emitExpiredboolean | Off by default. Turn on to also return products that were present in a previous run but are no longer found, marked EXPIRED. Only produced once a run has fully scanned the tracked search: not when Max items capped it, not when Resume was used, not when the run was blocked, and not when GOAT's 1000 product search limit truncated the scope. This returns, and bills, extra synthetic rows, so leave it off unless you need expiry tracking. |
changeScopestring | All fields (default): any change to the product record, except the scrape timestamp, returns an UPDATED row. Price and stock only: 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 (rows are matched by size, shoe condition and box condition, in any order) returns an UPDATED row; changes to descriptions, images, release data or other details never do. With no State key, changing this option starts a new automatic baseline (the first run returns everything as NEW); name a State key to keep one baseline. |
compactUpdatesboolean | Off by default. When on, UPDATED (and EXPIRED) rows are short: ids, url, name, current ask, retail price and stock flags, plus priceChanges and variantChanges showing the old and new value of each moved field per size row. With the change scope set to all, otherChanges also lists the old and new value of any other moved top level field (null when none). NEW rows always carry the complete record. The Fetch full market data fee is not charged for a compact row, because the full market table is not in it. |
expireAfterMissedScansinteger | Only used with Emit expired products. A product is marked EXPIRED only after it has been missing from this many complete scans in a row (default 1). EXPIRED means the product is no longer listed in this search; a listing drop and a delisting cannot be told apart without opening each product, so use the stock fields for availability. A product that comes back resets the count. |
ignoreFieldsForChangesarray | Optional. Field names to exclude from UPDATED change detection (they stay in the output). The scrape timestamp is always excluded. Use a dotted name to ignore a field inside every size row while still tracking its ask and stock, for example sizes.sizeValue. Ignoring sizes itself would hide size-level price and stock moves. Changing this list with no State key starts a new automatic baseline. |
mcpConnectorsarray | Optionally send the scraped results into the apps you already use, via Model Context Protocol (MCP) connectors. Authorize a connector once under Apify, Settings, Integrations, then select it here. The connector receives a condensed, human-readable summary per item (title + key fields), not the full JSON; the complete record stays in the dataset. Leave empty to skip. Supported: Notion (https://mcp.notion.com/mcp), Linear (https://mcp.linear.app/sse), Airtable (https://mcp.airtable.com/mcp), Apify (https://mcp.apify.com). |
notionParentPageUrlstring | URL (or id) of the Notion page under which item pages are created. Required to enable the Notion export; ignored by other connectors. |
maxNotifyListingsinteger | Cap on items written to each connector per run. Does not affect the dataset. |
Fields in the output
The documented dataset includes the fields below. Availability can depend on the source page and selected mode.
productIdID (number)nameProduct (text)brandBrand (text)skuSKU (text)colorwayColorway (text)productCategoryCategory (text)genderGender (text)retailPriceRetail (USD) (number)lowestAskLowest ask (USD) (number)lowestAskSourceAsk source (text)instantShipLowestAskInstant ship (USD) (number)lastSaleLast sale (USD) (number)Show 15 more fields
inStockSizeCountSizes in stock (number)totalSizeCountSizes listed (number)releaseDateReleased (text)marketMarket (text)imageUrlImage (image)urlURL (link)changeTypeChange type (incremental mode) (text)changedFieldsChanged fields (incremental mode) (array)firstSeenAtFirst seen (incremental mode) (date)lastSeenAtLast seen (incremental mode) (date)sizesPer-size market table (array)lowestAskSizeLowest ask size (text)lastSaleLowLast sale low (USD) (number)lastSaleHighLast sale high (USD) (number)hasStockIn stock (boolean)Example output
An example from this actor’s documentation. Values are illustrative; this is not a fresh live result.
{
"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,
"lowestAsk": 95,
"instantShipLowestAsk": 110,
"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,
"lowestAsk": 95
},
"sizes": [
{
"size": "9",
"shoeCondition": "new_no_defects",
"boxCondition": "good_condition",
"lowestAsk": 100,
"instantShipLowestAsk": 115,
"lastSale": 98,
"stockStatus": "single_in_stock"
},
{
"size": "10",
"shoeCondition": "new_no_defects",
"boxCondition": "good_condition",
"lowestAsk": 95,
"instantShipLowestAsk": 110,
"lastSale": 102,
"stockStatus": "multiple_in_stock"
}
],
"lowestAskSize": "10",
"lastSale": 100,
"lastSaleLow": 98,
"lastSaleHigh": 102,
"totalSizeCount": 2,
"siteName": "GOAT",
"scrapedAt": "2026-01-01T00:00:00Z"
}Ways to use this data
- 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.
Before you run
Start with a small input and check the resulting records against your expected fields. Source content and actor options can change; the current Apify listing is the reference for availability and pricing.
Questions about this actor
What data does GOAT Scraper return?
The documented output for GOAT Scraper includes id, product, brand, sku, colorway, category, gender and retail (usd). Availability of each field depends on the source page and the selected mode.
How much does GOAT Scraper cost?
It costs $1.80 per 1,000 results on the Apify Free plan and from $1.00 on paid plans, with smaller per-run or optional feature charges listed on Apify. The Apify listing shows the current rate for every plan.
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.
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.
