# Depop.com scraper (`lukass/depop-scraper`) Actor

Join 30 million+ users to buy, sell, discover and explore the most inspiring and unique things in the world.

- **URL**: https://apify.com/lukass/depop-scraper.md
- **Developed by:** [Lukáš Širhal](https://apify.com/lukass) (community)
- **Categories:** E-commerce
- **Stats:** 2 total users, 2 monthly users, 50.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $3.00 / 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.

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

### What does Depop scraper do?

Depop scraper gets structured data out of [Depop](https://www.depop.com/): listings, full product details, whole shops
and seller reviews.

It can:

- **Search by keyword**, with the same filters the site offers — price range, condition, colour, brand, category, size,
  department and sort order.
- **Scrape any depop.com URL** — product, search, category or shop. Filters already in the URL are kept, so you can
  paste a filtered search straight from your browser.
- **Scrape entire shops** by username or user id, including sold items if you want them.
- **Find shops by keyword** and scrape everything they sell.
- **Scrape seller reviews**, as either the seller or the buyer side.
- **Cap the run** by total items or by pages per source, shared fairly between sources.

### How to scrape Depop

1. Click **Try for free**.
2. Enter a keyword, paste depop.com URLs, or name a shop.
3. Click **Run**.
4. When it finishes, preview or download your data from the **Dataset** tab.

### Examples

Search several keywords in the US marketplace, cheapest first:

```json
{
    "search": ["vintage levis", "carhartt jacket"],
    "country": "us",
    "sortBy": "priceAsc",
    "priceMin": 10,
    "priceMax": 60,
    "maxItems": 200
}
```

Scrape one shop with its reviews:

```json
{
    "sellers": ["jeansforever"],
    "includeSellerDetails": true,
    "includeSellerReviews": true,
    "reviewRoles": ["seller"]
}
```

Find shops by keyword and scrape their stock:

```json
{
    "searchSellers": ["vintage denim"],
    "maxSellersPerQuery": 5,
    "maxItems": 500
}
```

Paste a filtered search straight from the browser:

```json
{
    "startUrls": [
        { "url": "https://www.depop.com/search/?q=jeans&brands=270&priceMax=50&sort=priceAscending" },
        { "url": "https://www.depop.com/category/mens/tops/t-shirts/" }
    ]
}
```

### Input

Everything is optional except the proxy, but you need at least one of `search`, `startUrls`, `sellers`, `searchSellers`,
or a filter.

#### Sources

| Field                | Type    | Description                                                                                                                         |
|----------------------|---------|-------------------------------------------------------------------------------------------------------------------------------------|
| `search`             | Array   | Keywords to search for, one per line.                                                                                               |
| `startUrls`          | Array   | depop.com URLs. Product, search, category and shop URLs are supported; filters in the URL are applied. Brand landing pages are not. |
| `sellers`            | Array   | Shop usernames or numeric user ids.                                                                                                 |
| `searchSellers`      | Array   | Keywords to find shops by. Every matching shop is then scraped like one you named directly.                                         |
| `maxSellersPerQuery` | Integer | How many shops to take per shop-search keyword. Default 10.                                                                         |

#### Filters

| Field                     | Type    | Description                                                                                         |
|---------------------------|---------|-----------------------------------------------------------------------------------------------------|
| `country`                 | Select  | Marketplace to search: `gb`, `us`, `au`, `nz`, `ca`, `de`, `fr`, `ie`, `it`. Sets the currency too. |
| `sortBy`                  | Select  | `relevance`, `newest`, `priceAsc`, `priceDesc`.                                                     |
| `priceMin` / `priceMax`   | Integer | Price bounds in the marketplace currency, applied to the pre-tax item price.                        |
| `condition`               | Array   | `brand_new`, `used_like_new`, `used_excellent`, `used_good`, `used_fair`.                           |
| `colours`                 | Array   | Colour slugs, e.g. `black`, `blue`, `tan`.                                                          |
| `brands`                  | Array   | Numeric brand ids, e.g. `270` for Nike. Brand names are not accepted.                               |
| `categories`              | Array   | Numeric category ids. A parent id also matches everything below it.                                 |
| `groups` / `productTypes` | Array   | Department group and product type slugs, e.g. `bottoms` / `jeans`.                                  |
| `sizes`                   | Array   | Composite size ids, `variantSetId.variantId`, e.g. `22.5`.                                          |
| `gender`                  | Select  | `male`, `female`, `unisex`.                                                                         |
| `isKids`                  | Boolean | Kidswear only.                                                                                      |
| `onlyDiscounted`          | Boolean | Discounted listings only.                                                                           |

#### Output and limits

| Field                  | Type    | Description                                                                           |
|------------------------|---------|---------------------------------------------------------------------------------------|
| `fetchDetails`         | Boolean | One extra request per listing for the full product record. On by default.             |
| `includeSellerDetails` | Boolean | Adds seller rating, reviews, items sold and followers. One cached request per seller. |
| `includeSellerReviews` | Boolean | Also scrape each shop's reviews as separate records.                                  |
| `reviewRoles`          | Array   | `seller`, `buyer`, or both.                                                           |
| `includeSoldItems`     | Boolean | Include items no longer on sale when scraping a shop.                                 |
| `maxItems`             | Integer | Stop after this many dataset records, split evenly between sources (see below).       |
| `maxPagesPerSource`    | Integer | Pagination cap per keyword, URL or shop. 100 listings per page.                       |
| `proxy`                | Object  | Proxy configuration.                                                                  |

Depop rejects datacenter connections, so a **residential proxy is strongly recommended**.

#### How `maxItems` is shared

The allowance is split evenly between sources — each keyword, each URL, each shop, each shop-search keyword.
`maxItems: 12` over three keywords and one shop gives 3 records each, rather than letting whichever source finishes
first take all 12.

A source that runs out of listings before spending its share hands the remainder back, so the run still reaches
`maxItems` when the items exist somewhere. Shops found by `searchSellers` share the allowance of the keyword that found
them.

#### Turning off `fetchDetails`

Listing pages already carry most of a record. With `fetchDetails: false` a run is one request per 100 items instead of
one per item, which is much faster and cheaper. What you give up depends on the source:

- **Search results** lose the seller username, condition, colour, group, product type and comment count.
- **Shop listings** lose only the like and comment counts.

### Output

One record per listing. `brand`, `gender`, `itemGroup`, `productType`, `condition`, `colour` and `sellerUserName` need
`fetchDetails` when the source is a keyword search; the `seller*` rating fields need `includeSellerDetails`.

```json
{
    "itemId": 895913565,
    "slug": "jeansforeve0-1220-vintage-y2k-2000s-g-star-f785",
    "itemUrl": "https://www.depop.com/products/jeansforeve0-1220-vintage-y2k-2000s-g-star-f785/",
    "itemName": "1220 Vintage y2k 2000s g-star embroidered navy blue euro archive pants size 32",
    "status": "S",
    "isSold": false,
    "isBoosted": false,
    "brand": "g-star",
    "brandId": 1458,
    "gender": "male",
    "isKids": false,
    "itemGroup": "bottoms",
    "productType": "trousers",
    "categories": [3],
    "categoryPath": "Menswear > Bottoms",
    "condition": "used_fair",
    "colour": ["navy", "blue"],
    "size": "32\"",
    "sizes": [{ "id": 15, "name": "32\"", "quantity": 1 }],
    "quantity": 1,
    "currency": "USD",
    "priceAmount": 55,
    "priceWithTax": 66.55,
    "priceTotalEstimated": 66.55,
    "priceOriginal": 55,
    "discountPercentage": null,
    "isDiscounted": false,
    "priceTax": 11.55,
    "priceMarketplaceFee": 0,
    "priceShipping": 6.99,
    "hasFreeShipping": false,
    "shippingBoundary": "NATIONAL",
    "country": "US",
    "address": "Houston, United States",
    "handDelivery": false,
    "images": ["https://media-photos.depop.com/.../P0.jpg"],
    "mainPicture": "https://media-photos.depop.com/.../P0.jpg",
    "likeCount": 12,
    "commentCount": 0,
    "datePublished": "2026-08-29T01:03:14.279648Z",
    "dateCreated": "2026-08-29T00:51:02.104Z",
    "sellerId": 374026552,
    "sellerUserName": "jeansforever",
    "sellerUrl": "https://www.depop.com/jeansforever/",
    "sellerVerified": true,
    "sellerRating": 5,
    "sellerRatingCount": 475,
    "sellerItemsSold": 1663,
    "sellerFollowers": 489,
    "scrapedAt": "2026-09-04T11:46:40.303Z"
}
```

Review records are in the same dataset, marked with `"kind": "review"`:

```json
{
    "kind": "review",
    "reviewId": "50582908c37f456399d7f75db6a1549c",
    "sellerId": 374026552,
    "sellerUserName": "jeansforever",
    "role": "seller",
    "rating": 5,
    "text": "Fast shipping, exactly as described",
    "date": "2026-09-03T23:43:57.242747Z",
    "authorId": 273648958,
    "authorUserName": "ssabr1naaa",
    "productId": 829961375,
    "productUrl": "https://www.depop.com/products/jeansforevee-vintage-y2k-2000s-levi-505-3e12/"
}
```

### How much will it cost?

The Actor is billed per result, at **$3 per 1,000 records**.

Apify gives
you $5 in free usage credits every month on the [free plan](https://apify.com/pricing), which is roughly **1,600 listings a month at no cost**. For regular scraping, the [$
49/month Starter plan](https://apify.com/pricing) also includes the residential proxy this Actor needs.

Turning `fetchDetails` off makes a run dramatically faster, since one request then returns 100 listings instead of one.

### Is it legal to scrape Depop?

Note that personal data is protected by GDPR in the European Union and by other regulations around the world. You should not scrape personal data unless you
have a legitimate reason to do so. If you're unsure whether your reason is legitimate, consult your lawyers. We also recommend that you read our blog
post: [is web scraping legal?](https://blog.apify.com/is-web-scraping-legal/)

# Actor input Schema

## `search` (type: `array`):

Keywords to search for, one per line.

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

depop.com URLs to scrape. Product, search, category and shop URLs are supported, and any filters in the URL are applied. Brand landing pages are not.

## `sellers` (type: `array`):

Depop shop usernames or numeric user ids. Scrapes each shop's listings.

## `searchSellers` (type: `array`):

Keywords to search Depop shops for. Every matching shop is then scraped like one you named directly.

## `maxSellersPerQuery` (type: `integer`):

How many shops to take from each shop-search keyword.

## `country` (type: `string`):

Which regional marketplace to search. Also sets the currency prices are quoted in.

## `sortBy` (type: `string`):

Order of the search results. 'Newly listed' is the one to use for monitoring fresh listings.

## `priceMin` (type: `integer`):

Lowest listing price to include, in the marketplace currency. Applies to the item price before tax.

## `priceMax` (type: `integer`):

Highest listing price to include, in the marketplace currency. Applies to the item price before tax.

## `condition` (type: `array`):

Item conditions to include.

## `colours` (type: `array`):

Colour slugs, e.g. black, white, blue, red, green, pink, brown, tan, grey.

## `brands` (type: `array`):

Numeric brand ids, e.g. 270 for Nike. Brand names are not accepted by the API.

## `categories` (type: `array`):

Numeric category ids, e.g. 10 for womenswear bottoms. A parent id also matches everything below it.

## `groups` (type: `array`):

Department group slugs, e.g. tops, bottoms, dresses, footwear, accessories, coats-jackets.

## `productTypes` (type: `array`):

Product type slugs within a group, e.g. jeans, tshirts, hoodies.

## `sizes` (type: `array`):

Composite size ids in the form variantSetId.variantId, e.g. 22.5. Size ids are specific to a category's size set.

## `gender` (type: `string`):

Filter by the department a listing is sold under.

## `isKids` (type: `boolean`):

Return only kidswear listings.

## `onlyDiscounted` (type: `boolean`):

Return only listings whose price has been reduced.

## `fetchDetails` (type: `boolean`):

One extra request per listing, adding condition, colour, group, product type, seller username, likes and comment counts. Turn off for a cheaper, shallower run.

## `includeSellerDetails` (type: `boolean`):

Adds the seller's rating, review count, items sold and follower counts. One extra request per seller, cached across their items.

## `includeSellerReviews` (type: `boolean`):

For each shop, also scrape its reviews as separate dataset records.

## `reviewRoles` (type: `array`):

Whether to scrape reviews the user received as a seller, as a buyer, or both.

## `includeSoldItems` (type: `boolean`):

When scraping a shop, also return items that are no longer on sale.

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

Stop after this many dataset records. The allowance is split evenly between sources (each keyword, URL and shop); a source that runs out early hands its remainder to the others. Leave empty for no limit.

## `maxPagesPerSource` (type: `integer`):

Pagination cap per keyword, URL or shop. 100 listings per page. Leave empty for no limit.

## `proxy` (type: `object`):

Depop rejects datacenter connections; residential proxy is strongly recommended.

## Actor input object example

```json
{
  "search": [
    "jeans"
  ],
  "maxSellersPerQuery": 10,
  "country": "gb",
  "sortBy": "relevance",
  "isKids": false,
  "onlyDiscounted": false,
  "fetchDetails": true,
  "includeSellerDetails": false,
  "includeSellerReviews": false,
  "reviewRoles": [
    "seller"
  ],
  "includeSoldItems": false,
  "maxItems": 100,
  "proxy": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}
```

# Actor output Schema

## `results` (type: `string`):

Every record the run produced, in the default dataset.

## `resultsCsv` (type: `string`):

The same records as a CSV file.

## `overview` (type: `string`):

The dataset's overview view, with the most useful columns only.

# 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 = {
    "search": [
        "jeans"
    ],
    "maxItems": 100,
    "proxy": {
        "useApifyProxy": true,
        "apifyProxyGroups": [
            "RESIDENTIAL"
        ]
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("lukass/depop-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 = {
    "search": ["jeans"],
    "maxItems": 100,
    "proxy": {
        "useApifyProxy": True,
        "apifyProxyGroups": ["RESIDENTIAL"],
    },
}

# Run the Actor and wait for it to finish
run = client.actor("lukass/depop-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 '{
  "search": [
    "jeans"
  ],
  "maxItems": 100,
  "proxy": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}' |
apify call lukass/depop-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,lukass/depop-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/6qz4gNdVgqXnh8YbZ/builds/qF5d0nPvkKBHXGmvK/openapi.json
