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

2 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.
maxPagesinteger200Safety bound on pages per query; the run stops at maxItems.
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). Adds and bills extra synthetic rows.

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.