ThredUp $1.5💰 Secondhand Fashion Listings & Prices
Pricing
from $1.50 / 1,000 listing results
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
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
2 days ago
Last modified
Categories
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.
| Field | Example |
|---|---|
| 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 |
| sizeDisplay | Size M |
| department | women |
| category | dresses |
| colorNames | ["Black"] |
| materials | ["Cotton"] |
| newWithTags | false |
| imageUrl | https://tup-images.thredup.com/assets/000000000/xlarge.jpg |
| imageUrls | ["https://tup-images.thredup.com/assets/000000000/xlarge.jpg"] |
| fullDescription | Full 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
| Parameter | Type | Default | Description |
|---|---|---|---|
| mode | string | search | search (keywords + filters) or url (paste ThredUp URLs). |
| searchQueries | array | none | Keywords (search mode). Leave empty to browse by filters. |
| department | string | women | women, juniors, girls, boys, maternity, plus, petite, designer, handbags, shoes, accessories. |
| categories | array | none | Category tags (e.g. dresses, jeans, sneakers). |
| brands | array | none | Brand names (e.g. Nike, Madewell). |
| materials / styles | array | none | Material and style tags. |
| condition | array | none | Condition tags (excellent, very_good, good, like_new, new_with_tags). |
| clearanceOnly | boolean | false | Only return items ThredUp flags as clearance (search mode). |
| priceMin / priceMax | integer | none | Price range in USD. |
| sortBy | string | relevance | relevance, price_low_high, price_high_low. |
| urls | array | none | ThredUp category or item URLs (url mode). |
| fetchDetails | boolean | false | Visit each item for full description and measurements. |
| maxItems | integer | 20 | The single run cap. Set 0 for unlimited. |
| maxPages | integer | 200 | Safety bound on pages per query; the run stops at maxItems. |
| proxy | object | Residential US | Proxy configuration. |
| resumeFromRunId | string | none | Continue 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. |
| incrementalMode | boolean | false | Daily/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. |
| stateKey | string | none | Optional 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. |
| emitUnchanged | boolean | false | Incremental mode only. Also return items unchanged since the last run, marked UNCHANGED. Adds and bills extra rows you already have. |
| emitExpired | boolean | false | Incremental 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:
| Field | Description |
|---|---|
changeType | NEW | UPDATED | UNCHANGED | REAPPEARED | EXPIRED |
changedFields | Top-level fields that changed since last seen; non-empty only for UPDATED |
firstSeenAt | When this item was first observed by this monitoring campaign |
lastSeenAt | When 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:
| Need | Use |
|---|---|
| A crawl stopped and should continue | resumeFromRunId |
| Run the same search every day and receive only changes | incrementalMode |
| Keep separate daily campaigns for similar searches | distinct stateKey values |
| Run a normal full snapshot | leave 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.