ThredUp Scraper at a glance
ThredUp Scraper is a ready-to-run Apify actor from abotapi for collecting ecommerce data. Its documented output includes item #, title, change type (incremental mode), brand and price, which you can export as JSON, CSV or Excel or read through the Apify API. It costs $2.20 per 1,000 results on the Apify Free plan and from $1.50 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, Automation, Developer Tools
- Pricing
- $2.20 per 1,000 results (Free plan), from $1.50 on paid plans
- Output
- Documented below · JSON, CSV, Excel
- Inputs
- 26 options
Scrape ThredUp resale listings by keyword, department, brand, size, condition, price or URL. Extract 35+ fields including brand, price, original price, MSRP, size, colours, materials, condition, category and all photos. Supports filters and sorting.
What ThredUp Scraper can do
- Rich fields. Returns 35+ named fields per item with no extra request: brand, price, original price, MSRP, size, condition, colors, materials, category, department and every photo URL.
- Two ways in. Two ways to collect: keyword search with department, brand, material, style, condition and price filters, or paste ThredUp category and item URLs directly.
- Sort orders. Four sort orders for search results: relevance, newest first, price low to high, price high to low.
- Full details. Optional full item details on demand: description plus garment measurements (chest, waist, inseam, length).
- Built for schedules. Built for schedules: incremental mode returns only new, updated and reappeared items on recurring runs, and a refused run fails loudly instead of quietly returning an empty dataset.
- Resume. Resume one interrupted crawl with resumeFromRunId so you never pay twice for items already collected.
Choose what to collect
These inputs let you configure ThredUp Scraper - Resale Fashion, Prices & 35+ Fields. Open the actor on Apify to enter your values and review the current options.
| Input | What it controls |
|---|---|
modestring · required | 'search' builds ThredUp queries from your keywords + filters below. 'url' walks the ThredUp category (PLP) or item URLs you paste (filter fields are read from the URL). |
searchQueriesarray | Keywords to search ThredUp for (e.g. 'nike dress', 'leather boots'). Each is scraped independently. Leave empty to browse a whole department/category by filters. |
searchQuerystring | Alias of Search keywords for a single query; merged with the list when both are given. |
departmentstring | Top-level department to search within. ThredUp carries women's, juniors and kids (girls/boys) apparel plus maternity, plus, petite, designer, handbags, shoes and accessories. Choose 'Kids' for girls and boys together, or 'All departments' for no department restriction. ThredUp has no men's department. |
categoriesarray | Category tags to narrow to (e.g. 'dresses', 'jeans', 'sneakers'). Match ThredUp's category slugs. |
brandsarray | Brand names to filter by (e.g. 'Nike', 'Madewell', 'Lululemon'). |
materialsarray | Material tags (e.g. 'Cotton', 'Leather', 'Silk'). |
Show 19 more inputs
| Input | What it controls |
|---|---|
stylesarray | Style tags (e.g. 'Casual', 'Y2K'). |
conditionarray | ThredUp condition tags to filter by (advanced; leave empty for any condition). Commonly available values: 'excellent', 'good'. The output 'condition' field shows the item's quality grade. |
clearanceOnlyboolean | Only return items ThredUp itself flags as clearance (the per-item 'clearance' field). ThredUp has no dedicated browsable clearance/sale section, so results are narrowed by that per-item flag rather than by a sale category. Applies to search mode; in URL mode the pasted link decides what is returned. |
priceMininteger | Only return items priced at or above this amount. |
priceMaxinteger | Only return items priced at or below this amount. |
sortBystring | Order results are returned in. |
urlsarray | Paste ThredUp URLs: department (/women), category (/women/dresses), paginated (?page=2), sorted (?sort=newest_first, price_low_high, price_high_low), keyword (?search_text=nike or ?search_tags=nike+dress), brand (/women/free-people), kids brand (/kids/girls/levis), brand + category (/petite/coldwater-creek/sweaters), category sub-type (/women/dresses/casual-dresses), designer (/designer/dresses), a brand-named page such as /women/available, the plain host without www (https://thredup.com/women), department landing (/handbags), filtered (?department_tags=..., not part of the example list), legacy /products//, or item pages (/product/). Multi-URL supported; filters, sort, search and start page are read from each URL. Brand names are read from the page itself, so slugs such as levis resolve to Levi's. Left untouched, the example list runs one URL of each shape. |
fetchDetailsboolean | Visit each item page to add the full description and measurements (chest, waist, inseam, length, etc.). Slower and adds a small per-item charge; leave off for fast listings (which already include brand, price, size, condition, colors, materials and all photos). |
maxItemsinteger | The single cap on this run: stop after collecting this many items (across all queries/URLs). Set 0 for unlimited. Capped at 1,000,000 items per run. |
maxPagesinteger | Optional cap on result pages per query. Leave empty (or 0) for no page limit: the run then stops only when Max items is reached or ThredUp stops serving further pages. Note that ThredUp's own search serves at most about 10,000 matches per query (209 pages), so split a very broad search into narrower slices to collect more than that. |
resumeFromRunIdstring | Paste a previous run ID or dataset ID to continue a large crawl of items without returning or charging for items already collected there. Use this after an interrupted run, or when continuing an item pull in another run. For recurring daily monitoring of the same search, use Incremental mode below instead. |
incrementalModeboolean | Turn this on for daily or recurring monitoring. The first run returns all matching items as NEW. Later runs normally return only NEW, UPDATED, and REAPPEARED items. UPDATED is decided by comparing every output field (price, condition, size, color, availability, photos and the rest) with the previous run; a field that is empty on one side is not counted as a change, and scrapedAt is excluded because it changes on every scrape. Add more exclusions in "Ignore fields when detecting changes". Turn on "Emit unchanged" or "Emit expired" only when you also want those items returned (and billed). EXPIRED is only produced after a complete scan (not capped, not a resume, not a pasted page-N link, and a search narrow enough that ThredUp serves the whole result set). State is kept separately for each search/URL and filter/fetchDetails setup; use State key when you want 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/URL and filter settings, different searches then never mix state with each other. |
emitUnchangedboolean | Off by default. Turn on to also return items 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 the full snapshot every run. |
emitExpiredboolean | Off by default. Turn on to also return items 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, and not when the search is broad enough to hit ThredUp's own limit of about 10,000 results per query (past that limit an item can drop out of view without being gone). This returns, and bills, extra synthetic rows, so leave it off unless you need expiry tracking. |
ignoreFieldsForChangesarray | Optional. Field names to exclude from UPDATED change detection, in addition to scrapedAt which is always excluded. Use a top-level name (e.g. condition) or a dotted path for nested values (e.g. photos.url). Excluded fields still appear in the output; they just never mark an item UPDATED or appear in changedFields. |
mcpConnectorsarray | Optionally send results into the apps you already use, via Model Context Protocol (MCP) connectors. Authorize one under Apify → Settings → API & Integrations, then select it here. Notion gets a rich page-per-item export; other connectors get a best-effort write/digest. Leave empty to skip; never changes the dataset output. 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.
itemNumberItem # (text)titleTitle (text)changeTypeChange type (incremental mode) (text)brandBrand (text)pricePrice (number)originalPriceOrig. price (number)msrpMSRP (number)conditionCondition (text)sizeDisplaySize (text)departmentDept (text)categoryCategory (text)colorNamesColors (array)Show 16 more fields
newWithTagsNWT (boolean)urlURL (link)imageUrlImage (image)changedFieldsChanged fields (incremental mode) (array)firstSeenAtFirst seen (incremental mode) (date)lastSeenAtLast seen (incremental mode) (date)sizeSize (alias) (text)colorColor (text)discountDiscount % (number)isNewWithTagsNew with tags (boolean)scrapedAtScraped at (date)descriptiondescription (text)fullDescriptionFull description (text)measurementsmeasurements (text)materialsmaterials (array)imageUrlsPhotos (array)Example output
An example from this actor’s documentation. Values are illustrative; this is not a fresh live result.
{
"id": 200000000,
"itemNumber": "1501420014",
"sku": "SKU0000000",
"url": "https://www.thredup.com/product/1501420014",
"title": "Sample Item Title",
"description": "Short item description appears here.",
"brand": "Sample Brand",
"brandId": 1000,
"price": 24.99,
"originalPrice": 39.99,
"msrp": 89,
"clearance": false,
"newWithTags": false,
"condition": "excellent",
"sizeDisplay": "Size M",
"department": "women",
"category": "dresses",
"categoryTags": [
"dresses"
],
"colorNames": [
"Black"
],
"materials": [
"Cotton"
],
"availability": "available",
"favoriteCount": 0,
"warehouseId": 0,
"photoIds": [
"000000000"
],
"imageUrls": [
"https://tup-images.thredup.com/assets/000000000/xlarge.jpg"
],
"imageUrl": "https://tup-images.thredup.com/assets/000000000/xlarge.jpg",
"fullDescription": null,
"measurements": null
}Ways to use this data
- Resale price tracking: monitor a brand or category's price and MSRP spread over time to spot underpriced or newly listed items.
- Competitive analysis for resale sellers: compare your own listings' pricing and condition grading against similar items already on ThredUp.
- Market research and trend analysis: build a dataset of brand, material, condition and price mix across departments to track secondhand demand.
- Personal shopping bots and alerts: watch a saved search for new drops in your size, brand or price range.
- Academic and sustainability research: study circular-fashion pricing, condition grading and turnover patterns.
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 ThredUp Scraper return?
The documented output for ThredUp Scraper includes item #, title, change type (incremental mode), brand, price, orig. price, msrp and condition. Availability of each field depends on the source page and the selected mode.
How much does ThredUp Scraper cost?
It costs $2.20 per 1,000 results on the Apify Free plan and from $1.50 on paid plans, with smaller per-run or optional feature charges listed on Apify. The Apify listing shows the current rate for every plan.
What views does the dataset have?
The dataset has three views: Overview (the main listing columns), Detail (description, measurements, materials, colors and photos) and Changes (changeType, changedFields, firstSeenAt, lastSeenAt for incremental runs).
Can I get only new or changed items on a schedule?
Yes. Schedule the actor from the Schedules tab and turn on Incremental mode. Each run then returns only NEW, UPDATED and REAPPEARED items by default, and unchanged items are not billed unless you also turn on Emit unchanged.
What's the difference between Resume and Incremental mode?
Resume (resumeFromRunId) continues one specific interrupted or previous run: paste its run or dataset ID and this run skips items already collected there. Incremental mode is for running the same search again and again, for example daily: the actor remembers the previous run of that search by itself, so you never paste an ID.
Why did a scheduled run bill more items than my Max items setting?
Max items also bounds EXPIRED detection: EXPIRED rows are returned only up to the remaining Max items share after the normal walk, and the rest stay tracked for a later run. Turn off Emit expired if you do not want these extra rows.
