# ThredUp Scraper - Secondhand Fashion, Prices & Brands (`logiover/thredup-scraper`) Actor

Scrape ThredUp secondhand fashion listings by category or department. Extract brand, price, size, condition, materials, colors, photos, and availability for resale research, pricing analysis, and fashion trends. No API key, no login.

- **URL**: https://apify.com/logiover/thredup-scraper.md
- **Developed by:** [Logiover](https://apify.com/logiover) (community)
- **Categories:** E-commerce
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $3.50 / 1,000 results

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.
Actors are written with capital "A".

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

## ThredUp Scraper - Secondhand Fashion, Prices & Brands

Scrape ThredUp secondhand fashion listings at scale. Extract brand, price, size, condition, materials, colors, photos, and availability from any ThredUp category page. No API key, no login required.

### What does ThredUp Scraper do?

ThredUp Scraper extracts structured product data from [thredup.com](https://www.thredup.com), the world's largest online thrift store. It fetches ThredUp category and department listing pages, parses the server-side rendered Apollo GraphQL cache embedded in the HTML, and extracts all item fields without needing a browser or headless rendering. Each page yields up to 120 items, and the scraper paginates automatically to collect thousands of listings in a single run. It works with any ThredUp department (women, kids) and category path (dresses, shoes, tops, jeans, etc.). Since all data comes from ThredUp's own SSR cache, the fields are clean, structured, and match what you see on the site. No API key, no login, no cookies required.

### Who is it for?

- **Resale entrepreneurs** tracking ThredUp pricing to source inventory or set competitive prices on Poshmark, Mercari, or eBay.
- **Fashion researchers** studying secondhand market trends, brand popularity, and pricing patterns across categories.
- **Data analysts** building dashboards on resale fashion economics, markdown strategies, and inventory turnover.
- **E-commerce teams** benchmarking their own products against ThredUp's secondhand pricing and availability.
- **Sustainability researchers** quantifying the scale and composition of the secondhand fashion market.

### Use cases

- **Price monitoring**: Track how ThredUp prices change across brands, categories, and conditions over time.
- **Brand analysis**: Compare how different fashion brands retain value in the secondhand market (MSRP vs. resale price).
- **Inventory research**: Find high-demand categories with low supply or discover which sizes and colors sell fastest.
- **Competitive intelligence**: Benchmark your resale business against ThredUp's pricing, discounts, and promo strategies.
- **Academic research**: Collect large-scale secondhand fashion datasets for studies on circular economy, sustainability, or consumer behavior.

### Why use ThredUp Scraper?

- **No API key or login** - Works out of the box. No authentication, no cookies, no account needed.
- **22 structured fields** per item - Brand, price, MSRP, promo price, discount, size, colors, materials, condition, photos, and more.
- **Bulk extraction** - Each page returns up to 120 items. Paginate across hundreds of pages to collect thousands of listings.
- **Filter by category** - Scrape any ThredUp department or sub-category using standard URL paths (women, kids, dresses, shoes, tops).
- **Export to CSV, JSON, or Excel** - Download results in any format directly from Apify, or push to Google Sheets, Slack, or your database.
- **Pay-per-result pricing** - Only pay for what you scrape. No monthly subscriptions, no minimum commitments.

### What data can you extract?

ThredUp Scraper extracts 22 fields for every listing. Here is the complete list:

| Field | Type | Description |
|-------|------|-------------|
| itemNumber | text | ThredUp unique item identifier |
| title | text | Product listing title (e.g., "Nike Running Shoes") |
| brand | text | Brand name (e.g., Nike, Lululemon, Zara) |
| category | text | Product category (e.g., Casual Dress, Jeans, Sneakers) |
| price | number | Current listing price in USD |
| msrp | number | Manufacturer's suggested retail price |
| promoPrice | number | Discounted price when a promo code applies |
| discountPercent | number | Promotion discount percentage |
| sizeDisplay | text | Display size (e.g., "Size M", "Size 8") |
| colors | text | Color names, comma-separated |
| materials | text | Material composition (e.g., "100% Cotton") |
| condition | text | Quality rating: excellent, very good, good, fair |
| newWithTags | text | Whether item is new with original tags (true/false) |
| availability | text | Stock status (InStock, Sold) |
| department | text | Department (women, kids) |
| styleTags | text | Style descriptors (maxi, midi, athletic, etc.) |
| favoriteCount | number | Number of users who favorited this item |
| isP2P | text | Whether it is a peer-to-peer listing (true/false) |
| clearance | text | Whether item is on clearance (true/false) |
| imageUrl | link | Direct URL to the item's primary image |
| url | link | Full URL to the product detail page |
| searchTerm | text | ThredUp's AI-generated description of the item |

Here is a sample output record:

```json
{
  "itemNumber": "235542905",
  "title": "Lulus Casual Dress",
  "brand": "Lulus",
  "category": "Casual Dress",
  "price": "35.99",
  "msrp": "64",
  "promoPrice": "17.99",
  "discountPercent": "50",
  "sizeDisplay": "Size M",
  "colors": "Blue",
  "materials": "100% POLYESTER",
  "condition": "excellent",
  "newWithTags": "false",
  "availability": "InStock",
  "department": "women",
  "styleTags": "maxi",
  "favoriteCount": "12",
  "isP2P": "false",
  "clearance": "false",
  "imageUrl": "https://cf-assets-thredup.thredup.com/assets/961419702/xlarge.jpg",
  "url": "https://www.thredup.com/product/women-polyester-lulus-blue-casual-dress/235542905",
  "searchTerm": "Navy blue maxi dress with halter neck and large floral print in pink and cream hues"
}
```

### How to use

#### Option A: Scrape by department

Scrape all listings in a ThredUp department (e.g., women, kids):

1. Go to [ThredUp Scraper](https://apify.com/logiover/thredup-scraper) on Apify Store.
2. Click **Try for free**.
3. Add one or more department URLs to **ThredUp listing URLs**.
4. Set **Max items** (e.g., 500) and **Max pages per URL** (e.g., 5).
5. Click **Start** and wait for the run to complete.
6. Download your data as CSV, JSON, or Excel from the **Dataset** tab.

Input example:

```json
{
  "startUrls": ["https://www.thredup.com/women"],
  "maxItems": 500,
  "maxPages": 5
}
```

#### Option B: Scrape by category

Scrape a specific sub-category within a department:

1. Navigate to ThredUp and browse to your desired category (e.g., Women > Dresses).
2. Copy the URL from your browser (e.g., `https://www.thredup.com/women/dresses`).
3. Paste it into **ThredUp listing URLs** in the actor input.
4. Start the run.

Input example:

```json
{
  "startUrls": [
    "https://www.thredup.com/women/dresses",
    "https://www.thredup.com/women/jeans",
    "https://www.thredup.com/kids/shoes"
  ],
  "maxItems": 1000,
  "maxPages": 10
}
```

### Input parameters

| Parameter | Type | Default | Description |
|-----------|------|---------|-------------|
| startUrls | array | `["https://www.thredup.com/women"]` | ThredUp category or listing page URLs to scrape |
| maxItems | integer | 200 | Maximum total items to scrape. Set 0 for unlimited. |
| maxPages | integer | 5 | Maximum pages per start URL. Each page has up to 120 items. |
| proxyConfig | object | `{"useApifyProxy": true}` | Proxy configuration. Datacenter proxies work fine. |

Full input JSON:

```json
{
  "startUrls": ["https://www.thredup.com/women"],
  "maxItems": 200,
  "maxPages": 5,
  "proxyConfig": { "useApifyProxy": true }
}
```

### Output example

```json
{
  "itemNumber": "234024280",
  "title": "Weddington Way Cocktail Dress",
  "brand": "Weddington Way",
  "category": "Cocktail Dress",
  "price": "78.99",
  "msrp": "191",
  "promoPrice": "39.49",
  "discountPercent": "50",
  "sizeDisplay": "Size 6",
  "colors": "Gold",
  "materials": "100% Polyester",
  "condition": "excellent",
  "newWithTags": "true",
  "availability": "InStock",
  "department": "women",
  "styleTags": null,
  "favoriteCount": "2",
  "isP2P": "false",
  "clearance": "false",
  "imageUrl": "https://cf-assets-thredup.thredup.com/assets/961435974/xlarge.jpg",
  "url": "https://www.thredup.com/product/women-polyester-weddington-way-gold-cocktail-dress/234024280",
  "searchTerm": "Long rose gold pleated evening gown with halter neck and waistband"
}
```

### Tips for best results

- **Use category paths for precision.** URLs like `/women/dresses` return only dresses, while `/women` returns everything. Narrow your scope for relevant data.
- **Start small, then scale.** Set maxItems to 200 for a test run, then increase once you confirm the data meets your needs.
- **Each page returns up to 120 items.** Set maxPages based on how many items you want: 5 pages = up to 600 items.
- **ThredUp caps results at ~10,000 per query.** For broader coverage, use multiple category URLs instead of one top-level department.
- **Combine multiple categories.** Add several URLs to startUrls to scrape dresses, shoes, and tops in a single run.
- **Schedule regular runs.** ThredUp's inventory changes constantly. Set up daily or weekly schedules to track pricing trends.
- **Check the availability field.** Items can sell between runs. Filter by `InStock` to get only available items.
- **Use promoPrice for real pricing.** Many items have active promotions. The promoPrice field shows the actual lowest price buyers see.
- **The condition field matters.** Filter by `excellent` or `newWithTags: true` to find the best-condition items.
- **Monitor favoriteCount for demand signals.** Items with high favorite counts indicate buyer interest and competitive pressure.

### Integrations

ThredUp Scraper works with all Apify integrations:

- **Google Sheets** - Automatically export scraped data to a Google Sheets spreadsheet after each run.
- **Slack** - Get notifications in your Slack channel when a scraping run completes.
- **Zapier** - Connect ThredUp data to 5,000+ apps. Trigger workflows when new items match your criteria.
- **Make (Integromat)** - Build automated pipelines that process ThredUp data and push it to your systems.
- **Webhooks** - Receive HTTP callbacks when runs finish. Push data to your own API endpoints.
- **Scheduled runs** - Set up hourly, daily, or weekly scraping schedules directly in the Apify console.

### API usage

#### cURL

```bash
curl -X POST "https://api.apify.com/v2/acts/logiover~thredup-scraper/runs?token=YOUR_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "startUrls": ["https://www.thredup.com/women/dresses"],
    "maxItems": 500
  }'
```

#### Node.js

```javascript
import { ApifyClient } from 'apify-client';

const client = new ApifyClient({ token: 'YOUR_TOKEN' });
const run = await client.actor('logiover/thredup-scraper').call({
    startUrls: ['https://www.thredup.com/women/dresses'],
    maxItems: 500,
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items);
```

#### Python

```python
from apify_client import ApifyClient

client = ApifyClient("YOUR_TOKEN")
run = client.actor("logiover/thredup-scraper").call(run_input={
    "startUrls": ["https://www.thredup.com/women/dresses"],
    "maxItems": 500,
})
items = client.dataset(run["defaultDatasetId"]).list_items().items
print(items)
```

### Use with AI agents (MCP)

ThredUp Scraper is available as an MCP tool for AI agents. Connect it to Claude, ChatGPT, or any MCP-compatible agent to let the AI scrape ThredUp data on demand. For example, prompt your agent: "Scrape the top 200 women's dresses on ThredUp and summarize which brands have the highest resale value compared to their MSRP."

### FAQ

#### Is ThredUp Scraper free to use?

ThredUp Scraper is free to try on Apify's free tier. You get $5 of monthly compute credits, which is enough to scrape several thousand ThredUp listings. Larger-scale scraping requires a paid Apify plan.

#### What ThredUp categories can I scrape?

You can scrape any category that has a public ThredUp URL. This includes departments (women, kids), sub-categories (dresses, jeans, shoes, tops, jackets), and nested paths. If it has a URL on thredup.com, you can scrape it.

#### How many items can I scrape per run?

Each page returns up to 120 items, and ThredUp shows up to ~10,000 items per query. For larger datasets, use multiple category URLs. There is no hard limit in the scraper itself beyond the maxItems and maxPages settings.

#### Why do I get zero results for some URLs?

ThredUp's server-side rendering only works for standard category paths like `/women`, `/women/dresses`, or `/kids/shoes`. URLs with search query parameters (like `?search_tags=...`) may return zero items because ThredUp loads search results client-side. Use category paths instead.

#### Why are some fields null?

Not every ThredUp listing has all fields populated. For example, `styleTags` is null when ThredUp hasn't tagged the item's style. `promoPrice` and `discountPercent` are null when no promotion applies. This is normal and reflects the source data.

#### Can I export data to CSV, Excel, or Google Sheets?

Yes. After a run completes, download results in CSV, JSON, Excel, or XML format from the Dataset tab. You can also set up automatic export to Google Sheets through Apify integrations.

#### How fast is the scraper?

Each page fetch takes 1-3 seconds. A typical run scraping 600 items (5 pages) completes in under 30 seconds. Larger runs with thousands of items take a few minutes.

#### Is scraping ThredUp legal?

ThredUp Scraper only accesses publicly available data on thredup.com. It does not bypass any authentication, log in to accounts, or access private user data. See the legality section below for details.

#### Does it scrape product detail pages?

Currently the scraper extracts data from listing/category pages, which already include 22 fields per item. The listing page data comes from ThredUp's server-side Apollo GraphQL cache and includes all key product fields.

#### How often is ThredUp's inventory updated?

ThredUp processes thousands of new items daily. If you need fresh data, schedule runs daily or even multiple times per day. The scraper always fetches the current live listings.

#### Can I filter by brand, size, or price?

ThredUp's category pages support some URL-based filtering. The most reliable approach is to use the specific category paths you find on thredup.com. The scraper extracts all items from the page, and you can filter the results by any field after scraping.

#### Are there related scrapers?

Check the Related scrapers section below for alternatives and complementary tools.

### Is it legal?

ThredUp Scraper accesses only publicly available product listing data on thredup.com. No login credentials, API keys, or private user data are accessed or required. The scraper does not circumvent any access controls or anti-bot measures that would restrict public access. All data collected is the same information available to any visitor browsing thredup.com. Users are responsible for ensuring their use of scraped data complies with ThredUp's Terms of Service and applicable data protection regulations. This tool is provided for legitimate research, analysis, and business purposes.

### Related scrapers

- [Poshmark Scraper](https://apify.com/logiover/poshmark-scraper) - Scrape Poshmark listings for secondhand fashion comparison.
- [eBay Scraper](https://apify.com/logiover/ebay-scraper) - Extract product listings from eBay for pricing benchmarks.
- [Amazon Product Scraper](https://apify.com/logiover/amazon-product-scraper) - Scrape Amazon product data including prices and reviews.
- [Etsy Scraper](https://apify.com/logiover/etsy-scraper) - Extract Etsy product listings for handmade and vintage items.

# Actor input Schema

## `startUrls` (type: `array`):

One or more ThredUp category or listing page URLs to scrape. Examples: https://www.thredup.com/women, https://www.thredup.com/women/dresses, https://www.thredup.com/kids/shoes

## `maxItems` (type: `integer`):

Maximum number of items to scrape across all URLs. Set 0 for unlimited.

## `maxPages` (type: `integer`):

Maximum number of pages to scrape per start URL. Each page has up to 120 items.

## `proxyConfig` (type: `object`):

Proxy settings. Datacenter proxies work fine.

## Actor input object example

```json
{
  "startUrls": [
    "https://www.thredup.com/women"
  ],
  "maxItems": 200,
  "maxPages": 5,
  "proxyConfig": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

## `itemNumber` (type: `string`):

No description

## `title` (type: `string`):

No description

## `brand` (type: `string`):

No description

## `category` (type: `string`):

No description

## `price` (type: `string`):

No description

## `msrp` (type: `string`):

No description

## `promoPrice` (type: `string`):

No description

## `discountPercent` (type: `string`):

No description

## `sizeDisplay` (type: `string`):

No description

## `colors` (type: `string`):

No description

## `materials` (type: `string`):

No description

## `condition` (type: `string`):

No description

## `newWithTags` (type: `string`):

No description

## `availability` (type: `string`):

No description

## `department` (type: `string`):

No description

## `styleTags` (type: `string`):

No description

## `favoriteCount` (type: `string`):

No description

## `isP2P` (type: `string`):

No description

## `clearance` (type: `string`):

No description

## `imageUrl` (type: `string`):

No description

## `url` (type: `string`):

No description

## `searchTerm` (type: `string`):

No description

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "startUrls": [
        "https://www.thredup.com/women"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("logiover/thredup-scraper").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = { "startUrls": ["https://www.thredup.com/women"] }

# Run the Actor and wait for it to finish
run = client.actor("logiover/thredup-scraper").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "startUrls": [
    "https://www.thredup.com/women"
  ]
}' |
apify call logiover/thredup-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,logiover/thredup-scraper"
        }
    }
}

```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/ksohp9IHecaZGTh0d/builds/dx0cH7BZ4ttps2Mzz/openapi.json
