# Depop Scraper - Listings, Shops, Sellers & Reviews (`abotapi/depop-scraper`) Actor

From $1/1K. Scrape Depop search results, listings, shops, and reviews to JSON, CSV, or Excel. Extract titles, prices, shipping, brands, conditions, colours, sizes, photos, descriptions, and seller profiles.

- **URL**: https://apify.com/abotapi/depop-scraper.md
- **Developed by:** [Abot API](https://apify.com/abotapi) (community)
- **Categories:** E-commerce, Automation, Developer tools
- **Features:** Limited permissions
- **Stats:** 90 total users, 28 monthly users, 99.7% runs succeeded, 2 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.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.
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?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
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.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## 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.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

## Depop Scraper: Items, Shops & Reviews

Depop Scraper turns Depop into structured product and seller data. Search by keyword with brand, category, colour, condition, and price filters, paste product, search, shop, or category URLs, or list sellers to pull every review they have received. Each record comes back as clean JSON, CSV, or Excel rows, or read straight through the API: title, full description, price and shipping, brand, condition, colours, sizes, every photo, and the seller's public profile.

### Why This Scraper?

- **Three ways in.** Keyword search with filters, URL input (product, search, or a whole shop, walked item by item), or a seller's reviews.
- **Rich product records.** Title, description, price and shipping breakdown, brand, condition, colours, sizes, every photo, like count, and seller profile.
- **Seller reviews on demand.** One row per review, with rating, text, date, reviewer, and the product the review is about.
- **Source-side filters.** Brand, category, colour, condition, department group, gender, price range, and sort order, so you never post-filter a huge dataset yourself.
- **12 marketplaces.** US, UK, Australia, Ireland, Italy, France, Germany, Spain, Netherlands, Belgium, New Zealand and Canada, each in its local currency.
- **Depth on demand.** Switch on detail enrichment for seller profile, full description, colours, material and condition, and pay the enrichment charge only when you use it.
- **Built for schedules.** Incremental mode returns only new and changed items on recurring runs, and Resume continues an interrupted run without duplicate charges.

### Use Cases

- **Resale and vintage sourcing:** track new listings for specific brands, keywords, or price ranges before they sell.
- **Price and market research:** compare prices, discounts, and shipping costs across brands and categories.
- **Seller due diligence:** pull a shop's reviews and rating history before buying from or partnering with them.
- **Trend and demand tracking:** monitor a category or keyword over time with scheduled, incremental runs.
- **Marketplace analytics:** build datasets of condition, brand, and size distribution for research or reporting.

### Data You Get

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

| Field | Example |
| --- | --- |
| `id` | `"000000001"` |
| `slug` | `"seller-name-sample-item-0000"` |
| `url` | `"https://www.depop.com/products/seller-name-sample-item-0000/"` |
| `title` | `"Sample Vintage Jacket"` |
| `description` | `"Full item description appears here when detail enrichment is on."` |
| `price` | `30` |
| `currency` | `"USD"` |
| `shippingCost` | `5` |
| `isReduced` | `true` |
| `discountPercentage` | `28` |
| `status` | `"ONSALE"` |
| `brandName` | `"Sample Brand"` |
| `conditionName` | `"Like new condition"` |
| `colours` | `["black", "white"]` |
| `sizes` | `[{ "id": 0, "name": "M", "quantity": 1 }]` |
| `categoryName` | `"Shoes"` |
| `gender` | `"unisex"` |
| `likeCount` | `0` |
| `pictures` | `["https://media-photos.depop.com/b1/00000000/0000000000_0000/P0.jpg"]` |
| `mainPicture` | `"https://media-photos.depop.com/b1/00000000/0000000000_0000/P0.jpg"` |
| `sellerUsername` | `"sampleseller"` |
| `sellerItemsSold` | `0` |
| `sellerReviewsRating` | `5` |
| `raw` | `{ complete source object with every original field }` |

`conditionName`, `colours`, `categoryName`, `sellerUsername`, `sellerItemsSold`, and `sellerReviewsRating` are populated only when `fetchDetails` is on (it is off by default); with it off you get the faster search-card fields and `null` placeholders for the rest. Product records also carry a full price and shipping breakdown (`totalPrice`, `buyerFee`, `tax`, `taxType`, `shippingId`, `nationalShippingCost`), plus `material`, `age`, `style`, `source`, `attributeTags`, `variants`, `sku`, `isBoosted`, `isSold`, `hasFreeShipping`, `pictureCount`, `sellerVerified`, `sellerLastSeen`, and `sellerOnVacation`. `isBoosted` comes from Search and URL-search results; `isSold` comes from a seller's shop listing. A field only available from one source is `null` on rows built from a different source.

Reviews mode returns a different row shape: `id`, `kind`, `role`, `rating`, `text`, `date`, `transactionId`, `authorId`, `authorUsername`, `authorVerified`, `productId`, `productPicture`, `sellerId`, `sellerUsername`, `sellerUrl`, `sellerVerified`, `sellerBio`, `sellerFollowers`, `sellerFollowing`, `sellerReviewsTotal`, `sellerReviewsRating`, `sellerItemsSold`, `sellerPictureUrl`, and `raw`.

When `incrementalMode` is on, every returned row, product or review, also carries `changeType` (`NEW`, `UPDATED`, `REAPPEARED`, or `EXPIRED`), `changedFields` (populated only for `UPDATED`), `firstSeenAt`, and `lastSeenAt`.

### How to Use

1. Pick a **mode**: `search` (by keyword), `url` (paste product, search, or shop links), or `reviews` (pull feedback for one or more sellers).
2. Fill in the fields for that mode: keywords and filters for search, links for URL mode, sellers for reviews.
3. Set **Max Items** and **Max Pages Per Search** to control run size and cost, then click **Start**. The default proxy (Apify datacenter) works on every plan; **Residential proxy is recommended** for the most reliable results.
4. Download the dataset as JSON, CSV, or Excel, or read it through the API.

**Search by keyword with filters:**

```json
{
  "mode": "search",
  "queries": ["nike vintage", "carhartt jacket"],
  "country": "us",
  "sortBy": "newest",
  "minPrice": 20,
  "maxPrice": 100,
  "maxPages": 5,
  "proxy": { "useApifyProxy": true }
}
```

**Brand and condition filters, with detail enrichment on:**

```json
{
  "mode": "search",
  "queries": ["shoes"],
  "country": "gb",
  "brands": ["270"],
  "conditions": ["used_like_new", "used_excellent"],
  "fetchDetails": true,
  "maxListings": 50
}
```

**Paste links (product page, search page, a whole shop, or a category):**

```json
{
  "mode": "url",
  "urls": [
    "https://www.depop.com/products/sampleseller-sample-item-0000/",
    "https://www.depop.com/search/?q=carhartt",
    "https://www.depop.com/sampleseller/",
    "https://www.depop.com/category/home/"
  ],
  "maxPages": 3
}
```

**Every review for one or more sellers:**

```json
{
  "mode": "reviews",
  "sellers": ["sampleseller", "https://www.depop.com/anotherseller/"],
  "reviewRole": "seller",
  "maxPages": 10
}
```

#### Run it from your code

Python:

```python
from apify_client import ApifyClient

client = ApifyClient("<YOUR_APIFY_TOKEN>")
run = client.actor("abotapi/depop-scraper").call(run_input={"mode": "search", "queries": ["nike vintage"]})
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item["title"], item["price"], item["currency"])
```

JavaScript:

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

const client = new ApifyClient({ token: '<YOUR_APIFY_TOKEN>' });
const run = await client.actor('abotapi/depop-scraper').call({ mode: 'search', queries: ['nike vintage'] });
const { items } = await client.dataset(run.defaultDatasetId).listItems();
```

Or connect it to Make, Zapier, n8n, Google Sheets, or webhooks from the **Integrations** tab.

#### How maxPages and maxListings interact

`maxPages` defaults to `0` (unlimited): a search, shop, or review walk keeps going until the source reports it has no more results, a page comes back empty, or a page repeats content already served in that same walk, so there is no artificial page ceiling. `maxListings` (default `20`) is the cap you actually want. When several keywords, URLs, shops, or sellers run in the same call, the budget is split proportionally across them so each gets a share instead of the first one taking it all. Set `maxListings` to `0` for a fully unlimited run.

#### Resume and recurring updates

- **Resume** (`resumeFromRunId`) continues one interrupted run: paste its run or dataset id and the actor skips everything already collected there, so you don't pay twice. Long unlimited runs also checkpoint their own progress, so a platform migration or a manual Resurrect picks up where it left off.
- **Incremental mode** (`incrementalMode`) is for scheduled runs over the same search, URLs or sellers. Each item is classified `NEW`, `UPDATED` (with `changedFields`), `REAPPEARED`, or `EXPIRED` (only with `emitExpired` on, and only after a run that scanned the whole tracked scope: `maxPages` and `maxListings` both unlimited, Resume not used). Unchanged items are always suppressed and not billed. `stateKey` names or shares the stored state; leaving it empty derives one from the search, URL or seller and filter setup.
- **What counts as a change.** Seller and shopper activity never makes an item `UPDATED`: `likeCount`, `sellerLastSeen`, the seller stats (`sellerItemsSold`, `sellerReviewsTotal`, `sellerReviewsRating`, `sellerAverageShippingDays`, `sellerFollowers`, `sellerFollowing`) and the `raw` / `sellerRaw` passthrough are ignored. Add any other fields to `ignoreFieldsForChanges`; ignored fields are still returned.
- **Using both.** Resume plus Incremental mode on a search that already has saved state is rejected with a message asking you to drop one. Used together the first time, the resumed items seed the baseline so they won't show as `NEW` on the next run.

### Send results into your apps (MCP connectors)

Optionally pipe the scraped results into the apps you already use, via Model Context Protocol (MCP) connectors. This is an extra delivery step **after** the scrape: the Apify dataset is never changed.

**What gets written to the connector:** a condensed, human-readable **summary** of each record, not the full JSON. Each item becomes one entry with a **title** and its key fields flattened to plain text. The **complete record always stays in the Apify dataset**.

1. Authorize a connector once under **Apify → Settings → Integrations** (Notion, Linear, Airtable, or Apify).
2. Select it in the **"Pipe results into your apps"** input field. (If the picker is empty, you haven't authorized a connector yet.)
3. For **Notion**, also set `notionParentPageUrl` to the page where items should be created.

The connection is mediated by Apify's MCP proxy, so this actor never sees your third-party credentials. Leave the field empty to skip.

### Input Parameters

| Parameter | Type | Default | Description |
| --- | --- | --- | --- |
| `mode` | string | `search` | `search`, `url`, or `reviews`. |
| `queries` | array | (none, example prefilled) | Search keywords (Search mode). Each keyword runs its own paginated search; results are combined. |
| `sortBy` | string | `relevance` | `relevance`, `newest`, `price-asc`, or `price-desc` (Search mode). |
| `minPrice` | integer | (none) | Minimum price in the marketplace currency (Search mode). |
| `maxPrice` | integer | (none) | Maximum price in the marketplace currency (Search mode). |
| `gender` | string | `any` | `any`, `female`, `male`, or `unisex` (Search mode). |
| `brands` | array | (none) | Numeric brand IDs (Search mode). Leave empty for all brands. |
| `categories` | array | (none) | Numeric category IDs (Search mode). |
| `colours` | array | (none) | Colour slugs such as black, white, pink (Search mode). |
| `conditions` | array | (none) | One or more of brand_new, used_like_new, used_excellent, used_good, used_fair. |
| `groups` | array | (none) | Department group slugs such as tops, footwear, coats-jackets (Search mode). |
| `sizes` | array | (none) | Numeric size IDs, category-specific (Search mode, advanced). |
| `urls` | array | (none, example prefilled) | Product, search, shop, or category URLs (URL mode). Category URLs support womens, mens, kids, home and beauty, plus women's and men's sub-pages (e.g. `/category/womens/tops/`); empty or unrecognised category pages are skipped with a warning. Search filters above are ignored in this mode. |
| `sellers` | array | (none, example prefilled) | Seller usernames, shop URLs, or numeric user IDs (Reviews mode). |
| `reviewRole` | string | `seller` | `seller` or `buyer` reviews (Reviews mode). |
| `country` | string | `us` | Marketplace region and currency for Search mode; fills the gap when a pasted URL doesn't name its own country; also the default proxy country. |
| `maxPages` | integer | `0` | Max pages per keyword, URL, shop, or seller. `0` means unlimited: the walk stops on its own at the source's reported total, an empty page, or a page that repeats content already served in that walk. |
| `maxListings` | integer | `20` | Total item cap across all keywords, URLs, shops, or sellers combined. `0` means unlimited. |
| `fetchDetails` | boolean | `false` | Fetch each item's detail page to add full description, all photos, colours, material, style, condition, category, and seller stats. Leave off for lighter, search-card-only runs. |
| `proxy` | object | `{ "useApifyProxy": true }` (Apify datacenter) | Proxy configuration. Residential is recommended for the most reliable results. Datacenter by default; refused connections switch to Apify Residential automatically, then to a backup connection. |
| `resumeFromRunId` | string | (none) | Continue one previous run or dataset by id; items already collected there are skipped, so this run returns only new items. |
| `incrementalMode` | boolean | `false` | Turn on for daily/recurring monitoring of the same search, URLs, or sellers. Returns only `NEW`, `UPDATED`, and `REAPPEARED` items after the first run. |
| `stateKey` | string | (none) | Name or share an incremental-mode monitoring campaign. Left empty, a key is derived automatically from the search/URL/seller and filter setup. |
| `emitExpired` | boolean | `false` | Incremental mode only. Also return items no longer found, marked `EXPIRED`, once a run has fully scanned the tracked scope. |
| `ignoreFieldsForChanges` | string\[] | `[]` | Incremental mode only. Extra output fields to ignore when deciding whether an item is `UPDATED` (seller activity/stats, `likeCount` and the raw passthrough are always ignored). |
| `mcpConnectors` | array | (none) | Optional: send a summary of each record to apps you authorized under Integrations. |
| `notionParentPageUrl` | string | (none) | Notion connector only: page under which records are created. |
| `maxNotifyListings` | integer | `50` | Cap on items written to each connector per run. Does not affect the dataset. |

### Output Example

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

```json
{
  "id": "000000001",
  "slug": "sampleseller-sample-vintage-jacket-0000",
  "url": "https://www.depop.com/products/sampleseller-sample-vintage-jacket-0000/",
  "title": "Sample Vintage Jacket",
  "description": "Full item description appears here when fetchDetails is on.",
  "price": 30,
  "totalPrice": 30,
  "shippingCost": 5,
  "currency": "USD",
  "isReduced": false,
  "status": "ONSALE",
  "brandName": "Sample Brand",
  "brandId": "0000",
  "conditionName": "Like new condition",
  "colours": ["black"],
  "categoryName": "Coats & Jackets",
  "gender": "unisex",
  "sizes": [{ "id": 0, "name": "M", "quantity": 1 }],
  "likeCount": 0,
  "pictures": ["https://media-photos.depop.com/b1/00000000/0000000000_0000/P0.jpg"],
  "mainPicture": "https://media-photos.depop.com/b1/00000000/0000000000_0000/P0.jpg",
  "sellerId": "00000000",
  "sellerUsername": "sampleseller",
  "sellerVerified": false,
  "sellerItemsSold": 0,
  "sellerReviewsRating": 5,
  "sellerReviewsTotal": 0,
  "countryCode": "US"
}
```

### Plan Requirement

**Residential proxy is recommended** for the most reliable results, especially for large or frequent runs: pick Residential under the Proxy field. The actor also works on every Apify plan, including the free plan. By default it starts on Apify datacenter proxy, keeping each connection the site accepts and switching to a fresh one when the site refuses it. If datacenter connections keep being refused, the run switches to Apify Residential proxy for the rest of the run. Residential traffic is billed to your Apify plan like any Residential run. If your plan does not include Apify Residential or Apify Proxy at all (the free plan does not), the run continues on a backup connection at no extra cost to you. Choose the marketplace country that matches your target audience: prices are quoted in that currency, and residential connections use that country.

### FAQ

#### How much does it cost?

You pay per record returned, plus optional detail-enrichment usage when `fetchDetails` is on. The **Pricing** tab shows the current rates. Use **Max Items** and **Max Pages Per Search** to cap the cost of any run.

#### Is it legal to scrape Depop?

This actor collects only publicly available marketplace data. You are responsible for how you use it: follow Depop's terms and the laws that apply to you, and get legal advice if you plan commercial redistribution. Product photos and seller-written text may be subject to third-party rights.

#### Can I get only new or changed items on a schedule?

Yes. Schedule the actor from the **Schedules** tab and turn on **Incremental mode**. Each run then returns only `NEW`, `UPDATED`, and `REAPPEARED` items for the same search, URLs, or sellers, and unchanged items are not billed. Use `stateKey` to keep separate monitoring campaigns apart.

#### What is the difference between Resume and Incremental mode?

`resumeFromRunId` continues one specific interrupted or previous run and returns only the items that run doesn't already have. Incremental mode is for running the same search, URLs, or sellers again and again on a schedule and getting only what changed since last time. Combining both on a search that already has incremental state is rejected with a clear message; use one or the other.

#### Why did my run return an empty dataset instead of failing?

This actor treats "nothing usable came back" as a completed run with zero items, not an error: it retries and switches connections automatically when a request is rejected. The run stops outright only when a `resumeFromRunId` you provided cannot be resolved, or when Incremental mode and Resume are combined in a way that would corrupt an existing monitoring campaign. Any other empty result is a completed run with 0 items and a "No results returned for the given criteria." status message. The most common causes are search filters that match nothing, or an invalid username, slug, or URL; check the run log for details.

#### Can I use it with AI agents or MCP?

Yes. Call it from any Apify integration or MCP client, and use the connector field to push results into Notion, Linear, or Airtable.

### 🔗 Want more e-commerce data?

Pair this actor with these related scrapers from the same team:

<table>
<tr><td>🛒 <a href="https://apify.com/abotapi/mercari-jp-scraper"><b>Mercari Japan Scraper</b></a><br>From $0.80/1K. Scrape Mercari Japan listings, sellers and reviews at scale. Extract...</td><td>🏷️ <a href="https://apify.com/abotapi/vinted-fr-scraper"><b>Vinted.fr</b></a><br>Scrape Vinted.fr, France's C2C second-hand fashion marketplace: search with...</td></tr>
<tr><td>🛒 <a href="https://apify.com/abotapi/etsy-marketplace-scraper"><b>Etsy Scraper</b></a><br>Scrape Etsy listings by keyword, category, or URL. Extract titles, shops, prices...</td><td>🏷️ <a href="https://apify.com/abotapi/vinted-marketplace-scraper"><b>Vinted Multi-Country Scraper</b></a><br>Scrape Vinted across 27 country marketplaces: keyword search with brand, price and...</td></tr>
<tr><td>🏷️ <a href="https://apify.com/abotapi/thredup-scraper"><b>ThredUp Scraper</b></a><br>Scrape ThredUp resale listings by keyword, department, brand, size, condition, price or...</td><td>🧩 <a href="https://apify.com/abotapi/grailed-marketplace-scraper"><b>Grailed Scraper</b></a><br>Scrape Grailed by keyword, category, designer, condition, size or URL. Extract prices and...</td></tr>
</table>

👉 [Browse all abotapi scrapers](https://apify.com/abotapi)

### 💬 Support

- 🐞 **Found a bug or a missing field?** Open a ticket on the [Issues tab](https://apify.com/abotapi/depop-scraper/issues/open). We usually reply within hours.
- 🛠️ **Need another site, extra fields or a private build?** Email <contact@abotapi.com>.
- ⭐ **Enjoying it?** A quick review on the actor page helps other users find it.

# Actor input Schema

## `mode` (type: `string`):

How to find data to scrape. 'search' and 'url' return items; 'reviews' returns one row per review left for the listed sellers.

## `queries` (type: `array`):

Keywords to search for (Search mode only). Multi-keyword supported. Each keyword runs its own paginated search; results are combined.

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

Result ordering (Search mode only). Default = relevance. Depop has removed the 'Newly listed' sort; choosing it runs the search by relevance.

## `minPrice` (type: `integer`):

Minimum price in the marketplace currency. Leave empty for no minimum.

## `maxPrice` (type: `integer`):

Maximum price in the marketplace currency. Leave empty for no maximum.

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

Filter by department (Search mode only).

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

Numeric brand IDs (Search mode only). E.g. 270 = Nike. Multiple selectable. Leave empty for all brands.

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

Numeric category IDs (Search mode only). E.g. 231 = Shoes. Multiple selectable.

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

Colour slugs (Search mode only). E.g. black, white, pink, blue, red, green, multi. Multiple selectable.

## `conditions` (type: `array`):

Condition slugs (Search mode only). One or more of: brand_new, used_like_new, used_excellent, used_good, used_fair.

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

Department group slugs (Search mode only). E.g. tops, bottoms, footwear, accessories, coats-jackets. Multiple selectable.

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

Numeric size IDs (Search mode only, advanced). Size IDs are category-specific (the same number means a different size for shoes vs. dresses) — find one on a real listing's size selector. Leave empty unless you know them. Matching is done against each result's own size data, since the site's own size filter does not reliably narrow results upstream.

## `urls` (type: `array`):

Direct Depop URLs (URL mode only). Multi-URL supported. Accepts product URLs (/products/<slug>/), search URLs (/search/?q=...), shop URLs (/<username>/, which walk every item the seller has listed), and category URLs (/category/<slug>/) for womens, mens, kids, home and beauty, including women's and men's sub-pages such as /category/womens/tops/ or /category/mens/tops/tshirts/. Category pages that Depop itself shows empty (e.g. luxury, plus-size, petite, pets, brand, electronics) and other category paths are skipped with a warning rather than guessed. The search filters above are ignored in URL mode; if the pasted URL doesn't name a country, the marketplace region below is used.

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

Seller usernames, shop URLs, or numeric user IDs (Reviews mode only). Multi-seller supported; each seller's reviews are surfaced as separate rows.

## `reviewRole` (type: `string`):

Whether to fetch reviews the user received as a seller or as a buyer (Reviews mode only).

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

Which regional inventory and currency to use in Search mode. In URL mode this only fills the gap when a pasted URL doesn't already name its own country. Also used as the default residential proxy country.

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

Maximum pages to walk per keyword / URL / shop / seller. ~24 items per page; up to 20 reviews per page. Set 0 for unlimited (the walk still stops naturally at the end of results; bounded by Max Items).

## `maxListings` (type: `integer`):

Cap across all keywords / URLs / shops / sellers combined. Default 20. Set 0 for unlimited (capped only by Max Pages and the natural end of results).

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

If on (Search and URL modes, including shop URLs), the actor opens each item's detail page to add the seller (username, ID, verified badge, photo), full description, all photos, colours, material, style, condition, category and seller rating / items-sold stats. Charged as a detail-enrichment event per item. Off by default (faster, cheaper runs that return search-card fields only); turn on when you need seller and full item details. Not used in Reviews mode.

## `resumeFromRunId` (type: `string`):

Optional. ID of a previous run of this actor (or a dataset ID). Items already in that dataset are skipped, so this run returns only NEW items (a delta). Combine both runs' datasets for the full set. For recurring/scheduled monitoring of the same search, use Incremental mode below instead.

## `incrementalMode` (type: `boolean`):

Turn this on for daily/recurring monitoring of the same search, URLs, or sellers. The first run returns everything as NEW. Later runs return only NEW, UPDATED, and REAPPEARED items — items unchanged since the last run are suppressed (not returned, not billed). State is kept separately per search/URL/seller and filter setup; use State key below to name or deliberately share a monitoring campaign. To continue one specific interrupted run instead, use Resume from a previous run above.

## `stateKey` (type: `string`):

Optional. Name this monitoring campaign to keep its state stable, or to deliberately share state across differently-configured runs. Leave empty to let the actor derive a key automatically from the search/URL/seller and filter settings — different setups then never mix state with each other.

## `emitExpired` (type: `boolean`):

Off by default. Turn on to also return items that were present in a previous run but are no longer found, marked EXPIRED. Only produced once a run has fully scanned the tracked search (Max Pages Per Search and Max Items both set to 0/unlimited, and Resume not used) — this returns and bills extra synthetic rows, so leave it off unless you need expiry tracking.

## `ignoreFieldsForChanges` (type: `array`):

Output field names that should NOT make an item count as UPDATED. Always ignored: likeCount, sellerLastSeen, the seller stats (sellerItemsSold, sellerReviewsTotal, sellerReviewsRating, sellerAverageShippingDays, sellerFollowers, sellerFollowing) and the raw / sellerRaw passthrough. They describe the seller or shopper activity rather than the listing, and change on almost every run. Add fields such as description or pictures here if changes to them are not relevant to you. Ignored fields are still returned in the output.

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

Residential proxy is recommended for the most reliable results, especially for large or frequent runs. The default is Apify datacenter proxy (Automatic), which works on every plan: if datacenter connections are refused, the run switches to Apify Residential automatically, then to a backup connection. The residential country follows the marketplace country above.

## `mcpConnectors` (type: `array`):

Optionally send the scraped results into the apps you already use, via Model Context Protocol (MCP) connectors. Authorize a connector once under Apify → Settings → Integrations, then select it here. The connector receives a condensed, human-readable summary per item (title + key fields), not the full JSON — the complete record stays in the dataset. Leave empty to skip. Supported: Notion (https://mcp.notion.com/mcp), Linear (https://mcp.linear.app/sse), Airtable (https://mcp.airtable.com/mcp), Apify (https://mcp.apify.com).

## `notionParentPageUrl` (type: `string`):

URL (or id) of the Notion page under which item pages are created. Required to enable the Notion export; ignored by other connectors.

## `maxNotifyListings` (type: `integer`):

Cap on items written to each connector per run. Does not affect the dataset.

## Actor input object example

```json
{
  "mode": "search",
  "queries": [
    "nike vintage"
  ],
  "sortBy": "relevance",
  "gender": "any",
  "brands": [],
  "categories": [],
  "colours": [],
  "conditions": [],
  "groups": [],
  "sizes": [],
  "urls": [
    "https://www.depop.com/search/?q=carhartt"
  ],
  "sellers": [
    "mishmoshmart"
  ],
  "reviewRole": "seller",
  "country": "us",
  "maxPages": 0,
  "maxListings": 20,
  "fetchDetails": false,
  "incrementalMode": false,
  "emitExpired": false,
  "proxy": {
    "useApifyProxy": true
  },
  "maxNotifyListings": 50
}
```

# Actor output Schema

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

No description

## `items` (type: `string`):

No description

## `detail` (type: `string`):

No description

## `reviews` (type: `string`):

No description

## `changes` (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 = {
    "mode": "search",
    "queries": [
        "nike vintage"
    ],
    "brands": [],
    "categories": [],
    "colours": [],
    "conditions": [],
    "groups": [],
    "sizes": [],
    "urls": [
        "https://www.depop.com/search/?q=carhartt"
    ],
    "sellers": [
        "mishmoshmart"
    ],
    "incrementalMode": false,
    "emitExpired": false,
    "proxy": {
        "useApifyProxy": true
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("abotapi/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 = {
    "mode": "search",
    "queries": ["nike vintage"],
    "brands": [],
    "categories": [],
    "colours": [],
    "conditions": [],
    "groups": [],
    "sizes": [],
    "urls": ["https://www.depop.com/search/?q=carhartt"],
    "sellers": ["mishmoshmart"],
    "incrementalMode": False,
    "emitExpired": False,
    "proxy": { "useApifyProxy": True },
}

# Run the Actor and wait for it to finish
run = client.actor("abotapi/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 '{
  "mode": "search",
  "queries": [
    "nike vintage"
  ],
  "brands": [],
  "categories": [],
  "colours": [],
  "conditions": [],
  "groups": [],
  "sizes": [],
  "urls": [
    "https://www.depop.com/search/?q=carhartt"
  ],
  "sellers": [
    "mishmoshmart"
  ],
  "incrementalMode": false,
  "emitExpired": false,
  "proxy": {
    "useApifyProxy": true
  }
}' |
apify call abotapi/depop-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,abotapi/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/PUe0ccR6QW3BQ9OAI/builds/1rnUrg95rC6uOhaQa/openapi.json
