ThredUp $1.5๐Ÿ’ฐ Secondhand Fashion Listings & Prices avatar

ThredUp $1.5๐Ÿ’ฐ Secondhand Fashion Listings & Prices

Pricing

from $1.50 / 1,000 listing results

Go to Apify Store
ThredUp $1.5๐Ÿ’ฐ Secondhand Fashion Listings & Prices

ThredUp $1.5๐Ÿ’ฐ Secondhand Fashion Listings & Prices

Scrape ThredUp.com resale listings by keyword, department, brand, size, condition and price. Returns 35+ fields per item: brand, price, original price, MSRP, size, colors, materials, condition, category and all photos. Search and URL modes, sorts and filters.

Pricing

from $1.50 / 1,000 listing results

Rating

0.0

(0)

Developer

Abot API

Abot API

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

17 days ago

Last modified

Share

ThredUp Scraper

Scrape public listings from ThredUp, one of the largest online resale and thrift marketplaces for secondhand clothing, shoes and accessories. Give it keywords plus a department and filters, or paste ThredUp category and item URLs, and get clean structured JSON: brand, price, original price, MSRP, size, colors, materials, condition, category and every photo. Search and URL modes, four sort orders, and brand, category, material, condition and price filters are all built in.

Why this scraper

  • Returns 35+ fields per item with no extra request: brand, price vs original price vs MSRP, size, condition, colors, materials, category, department and all photo URLs.
  • Two modes: keyword search with filters, or paste ThredUp category (PLP) and item URLs directly.
  • Filter by department, category, brand, material, style, condition and price range.
  • Three sort orders: relevance, price low to high, price high to low.
  • Optional full details: item description and garment measurements (chest, waist, inseam, length).
  • Fast, resilient extraction with automatic session refresh and retry.
  • Resume & recurring updates โ€” turn on Incremental mode to get only NEW, UPDATED and REAPPEARED items on every scheduled run, or resume one specific interrupted crawl with resumeFromRunId.

Data you get

Sample shape: values are illustrative placeholders, not from a live listing.

FieldExample
id200000000
itemNumber1500000000
urlhttps://www.thredup.com/product/1500000000
titleSample Item Title
descriptionShort item description appears here.
brandSample Brand
price24.99
originalPrice39.99
msrp89
conditionexcellent
sizeDisplaySize M
departmentwomen
categorydresses
colorNames["Black"]
materials["Cotton"]
newWithTagsfalse
imageUrlhttps://tup-images.thredup.com/assets/000000000/xlarge.jpg
imageUrls["https://tup-images.thredup.com/assets/000000000/xlarge.jpg"]
fullDescriptionFull description appears when Fetch full details is on.
measurements{ "chest": "00", "length": "00" }

How to use

Search a department with filters:

{
"mode": "search",
"searchQueries": ["nike dress"],
"department": "women",
"brands": ["Nike"],
"priceMin": 15,
"priceMax": 60,
"sortBy": "price_low_high",
"maxItems": 50,
"proxy": { "useApifyProxy": true, "apifyProxyGroups": ["RESIDENTIAL"], "apifyProxyCountry": "US" }
}

Browse a whole category with full details:

{
"mode": "search",
"department": "juniors",
"categories": ["jeans"],
"fetchDetails": true,
"maxItems": 40
}

Paste ThredUp URLs (category pages and item pages):

{
"mode": "url",
"urls": [
"https://www.thredup.com/women?department_tags=women",
"https://www.thredup.com/product/1500000000"
]
}

Input parameters

ParameterTypeDefaultDescription
modestringsearchsearch (keywords + filters) or url (paste ThredUp URLs).
searchQueriesarraynoneKeywords (search mode). Leave empty to browse by filters.
departmentstringwomenwomen, juniors, girls, boys, maternity, plus, petite, designer, handbags, shoes, accessories.
categoriesarraynoneCategory tags (e.g. dresses, jeans, sneakers).
brandsarraynoneBrand names (e.g. Nike, Madewell).
materials / stylesarraynoneMaterial and style tags.
conditionarraynoneCondition tags (excellent, very_good, good, like_new, new_with_tags).
clearanceOnlybooleanfalseOnly return items ThredUp flags as clearance (search mode).
priceMin / priceMaxintegernonePrice range in USD.
sortBystringrelevancerelevance, price_low_high, price_high_low.
urlsarraynoneThredUp category or item URLs (url mode).
fetchDetailsbooleanfalseVisit each item for full description and measurements.
maxItemsinteger20The single run cap. Set 0 for unlimited.
maxPagesinteger0Optional cap on result pages per query. Leave empty (or 0) for no page limit: the run then stops only when maxItems is reached or ThredUp stops serving further pages. See "How deep a search goes" below for ThredUp's own depth limit.
proxyobjectResidential USProxy configuration.
resumeFromRunIdstringnoneContinue one specific previous run/dataset: items already collected there are skipped. For recurring monitoring of the same search, use Incremental mode instead โ€” see "Resume & recurring updates" below.
incrementalModebooleanfalseDaily/recurring monitoring of this same search. First run returns everything as NEW; later runs return only NEW/UPDATED/REAPPEARED by default. See "Resume & recurring updates" below.
stateKeystringnoneOptional name for a monitoring campaign, so its incremental state stays stable or is deliberately shared. Auto-derived from your search/URL/filter settings when left empty.
emitUnchangedbooleanfalseIncremental mode only. Also return items unchanged since the last run, marked UNCHANGED. Adds and bills extra rows you already have.
emitExpiredbooleanfalseIncremental mode only. Also return items from a previous run no longer found, marked EXPIRED, once a run has fully scanned the search (not capped, not a resume, and narrow enough that ThredUp serves the whole result set). Adds and bills extra synthetic rows.

How deep a search goes

There is no page limit in this actor by default: maxPages is empty (0) and the walk keeps going until ThredUp itself stops serving pages, or until maxItems is reached.

ThredUp's own search backend, however, only serves the first ~10,000 matches of any one query or filter set, at 48 items per page. A broad search such as all of women reports a fixed total of 10001 and stops after 209 pages no matter how many items actually exist behind it. That is a limit of the site, not of this actor, and raising maxPages cannot get past it.

To collect more than that from a large department, split the search into narrower slices that each stay under the limit (by brand, by category, by price band, by condition) and run them separately. A slice that reports a real total below 10001 is served in full.

This also decides when emitExpired can fire. An EXPIRED row means "this item was in the previous run and is genuinely gone now", which is only knowable after a run saw the complete result set. On a search that hit the ~10,000 limit, an item can drop out of view simply because newer listings pushed it past the limit, so the actor deliberately skips EXPIRED detection for that run and says so in the log, rather than billing tombstones for items that are still listed.

Output example

Sample shape: values are illustrative placeholders, not from a live listing.

{
"id": 200000000,
"itemNumber": "1500000000",
"url": "https://www.thredup.com/product/1500000000",
"title": "Sample Item Title",
"description": "Short item description appears here.",
"brand": "Sample Brand",
"price": 24.99,
"originalPrice": 39.99,
"msrp": 89,
"condition": "excellent",
"newWithTags": false,
"sizeDisplay": "Size M",
"department": "women",
"category": "dresses",
"colorNames": ["Black"],
"materials": ["Cotton"],
"photoIds": ["000000000"],
"imageUrls": ["https://tup-images.thredup.com/assets/000000000/xlarge.jpg"],
"favoriteCount": 0,
"warehouseId": 0
}

Incremental mode only. When incrementalMode is on, every returned record also carries:

FieldDescription
changeTypeNEW | UPDATED | UNCHANGED | REAPPEARED | EXPIRED
changedFieldsTop-level fields that changed since last seen; non-empty only for UPDATED
firstSeenAtWhen this item was first observed by this monitoring campaign
lastSeenAtWhen this item was last observed

These four fields are absent on a normal run (incrementalMode off) โ€” the output shape is unchanged.

Resume & recurring updates

There are two different things here โ€” pick the one that matches what you're doing:

NeedUse
A crawl stopped and should continueresumeFromRunId
Run the same search every day and receive only changesincrementalMode
Keep separate daily campaigns for similar searchesdistinct stateKey values
Run a normal full snapshotleave both off

Resume (resumeFromRunId) continues one specific interrupted or previous large crawl: paste a run ID or dataset ID and this run skips items already collected there, returning only the remaining new items.

Incremental mode (incrementalMode) is for a schedule (for example, daily): the actor remembers the previous run of the same search by itself, so you never paste a run ID. The first run returns everything as NEW. Later runs return only NEW, UPDATED, and REAPPEARED items by default โ€” duplicates and unchanged items are suppressed (and not charged for the detail-enrichment surcharge, even when fetchDetails fetched them). Turn on emitUnchanged or emitExpired only when you also want those rows returned (and billed for). State is isolated per search/URL and filter/fetchDetails setup automatically; set stateKey to name or deliberately share a monitoring campaign.

An item is only compared field-by-field against its previous snapshot when both sides of a field have a value โ€” a field that came back empty on one fetch and populated on the next (ThredUp's session layer occasionally returns a leaner payload) is never counted as a change on its own, so it never falsely bills an UPDATED row.

Fields excluded from change detection

None. Two live fetches of the same items roughly 2.5 minutes apart, through the actor's own listing and detail extraction path with fetchDetails on, came back byte-identical across every output field โ€” there is no relative-timestamp or rotating-token field to normalize away here.

Send results into your apps (MCP connectors)

Optionally pipe results into the apps you already use, through Model Context Protocol (MCP) connectors. Authorize a connector under Apify, Settings, API and Integrations, then select it in the mcpConnectors input. For Notion, also set notionParentPageUrl. Each item is written as a condensed, human-readable summary (title plus key fields), not the full JSON; the complete record always stays in the Apify dataset. Leave the field empty to skip; it never changes the dataset output.

Plan requirement

ThredUp only serves connections from the United States and filters non-US and datacenter connections. Use Apify Residential proxy with country US (Starter plan or higher includes Residential proxy access). On a free plan or a non-residential connection, runs will usually return zero items and a notice explaining the upgrade path.