Depop $1💰 URL Keyword and Review Scraper
Pricing
from $1.00 / 1,000 results
Depop $1💰 URL Keyword and Review Scraper
From $1/1k. Scrape depop.com search results, listings, shops, and reviews into JSON, CSV, or Excel, including titles, descriptions, prices, shipping, brands, conditions, colours, sizes, photos, and seller profiles.
Pricing
from $1.00 / 1,000 results
Rating
0.0
(0)
Developer
Abot API
Maintained by CommunityActor stats
0
Bookmarked
9
Total users
2
Monthly active users
7 days ago
Last modified
Categories
Share
Depop Scraper: Items, Shops & Reviews
Pull structured data from Depop without writing a line of code. This actor turns Depop search results, product pages, seller shops, and seller reviews into clean JSON, CSV, or Excel rows. It reads the same JSON the Depop website uses, so every record is complete and consistent: title, full description, price and shipping, brand, condition, colours, sizes, all photos, and the seller's public profile.
Three ways to start: search by keyword with filters, paste any mix of product / search / shop URLs, or list sellers to pull every review they have received.
Why this scraper
- Three modes in one actor: keyword search, URL input (product, search, or shop), and seller reviews.
- Rich product records: title, description, price 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, gender, price range, and sort.
- Shop sweep: paste a seller URL and the actor walks every item they have listed.
- Fast and lightweight: reads JSON directly, no heavy page rendering, optional detail enrichment only when you want it.
- 12 marketplaces supported (US, UK, AU, EU, NZ, CA) with the correct currency per market.
- Walks the whole catalogue by default.
maxPagesdefaults to 0 (unlimited): the walk keeps going until the source reports its total, a page comes back empty, or a page repeats content already served this walk. There is no artificial page-number ceiling;maxListingsis the cap you actually want. maxListingsis the sole cap on volume (default 20, so a first run is small and fast; set 0 for unlimited).- Resumable runs: set
resumeFromRunIdto a previous run or dataset id to collect only the items that run doesn't already have (a delta). Long unlimited runs also checkpoint their progress to the key-value store, so an Apify platform migration or a Resurrect of a failed run picks up where it left off instead of starting over. - Resume & recurring updates — turn on Incremental mode to get only NEW, UPDATED, and REAPPEARED items on a scheduled run of the same search, or use Resume to continue one specific interrupted crawl with
resumeFromRunId. See "Resume & recurring updates" below.
Data you get
Sample shape, values are illustrative placeholders, not from a live listing.
| 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 fetchDetails is on." |
| price | 30 |
| totalPrice | 30 |
| buyerFee | 0 |
| tax | 0 |
| taxType | "n/a" |
| shippingCost | 5 |
| shippingBoundary | "NATIONAL" |
| shippingId | "USPS" |
| nationalShippingCost | 0 |
| currency | "USD" |
| isReduced | true |
| discountPercentage | 28 |
| originalPriceBeforeDiscount | 70 |
| discountType | "VALUE_FLASH_SALE" |
| status | "ONSALE" |
| brandName | "Sample Brand" |
| brandIsKnown | true |
| conditionName | "Like new condition" |
| colours | ["black", "white"] |
| colourIds | ["black", "white"] |
| material | ["Polyester", "Rubber"] |
| age | ["Modern"] |
| style | ["Sportswear", "Streetwear"] |
| source | ["Preloved"] |
| attributeTags | { "occasion": ["Casual"], "trainersType": ["Running"] } |
| categoryName | "Shoes" |
| group | "tops" |
| productTypeName | "Sweatshirts" |
| gender | "unisex" |
| quantity | 1 |
| sizes | [{ "id": 0, "name": "M", "quantity": 1, "status": "STATUS_ONSALE" }] |
| variants | [{ "variantId": 0, "quantity": 1 }] |
| hasFreeShipping | true |
| 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" |
| pictureCount | 1 |
| sellerUsername | "sampleseller" |
| sellerId | "00000000" |
| sellerVerified | false |
| sellerItemsSold | 0 |
| sellerReviewsRating | 5 |
| sellerReviewsTotal | 0 |
| sellerLastSeen | "2026-01-01T00:00:00.000Z" |
| sellerOnVacation | false |
| raw | { complete product object with every original field } |
Review rows (Reviews mode) carry these fields instead:
Sample shape, values are illustrative placeholders.
| Field | Example |
|---|---|
| id | "00000000:000000000" |
| kind | "review" |
| role | "seller" |
| rating | 5 |
| text | "Sample review text appears here." |
| date | "2026-01-01T00:00:00.000Z" |
| authorUsername | "samplereviewer" |
| productId | "000000000" |
| productPicture | "https://media-photos.depop.com/b1/00000000/0000000000_0000/P0.jpg" |
| sellerId | "00000000" |
| sellerUsername | "sampleseller" |
| sellerUrl | "https://www.depop.com/sampleseller/" |
| sellerReviewsTotal | 0 |
| sellerItemsSold | 0 |
Incremental mode only. When incrementalMode is on, every returned row (product or review) also carries:
| Field | Description |
|---|---|
changeType | NEW | UPDATED | 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 |
How to use
Search by keyword with filters:
{"mode": "search","queries": ["nike vintage", "carhartt jacket"],"country": "us","sortBy": "newest","minPrice": 20,"maxPrice": 100,"maxPages": 5,"proxy": { "useApifyProxy": true, "apifyProxyGroups": ["RESIDENTIAL"], "apifyProxyCountry": "US" }}
Search with brand and condition filters plus full detail enrichment:
{"mode": "search","queries": ["shoes"],"country": "gb","brands": ["270"],"conditions": ["used_like_new", "used_excellent"],"fetchDetails": true,"maxListings": 50,"proxy": { "useApifyProxy": true, "apifyProxyGroups": ["RESIDENTIAL"], "apifyProxyCountry": "GB" }}
Mixed URLs (product page, search page, and a whole shop):
{"mode": "url","urls": ["https://www.depop.com/products/sampleseller-sample-item-0000/","https://www.depop.com/search/?q=carhartt","https://www.depop.com/sampleseller/"],"maxPages": 3,"proxy": { "useApifyProxy": true, "apifyProxyGroups": ["RESIDENTIAL"], "apifyProxyCountry": "US" }}
Pull every review for one or more sellers:
{"mode": "reviews","sellers": ["sampleseller", "https://www.depop.com/anotherseller/"],"reviewRole": "seller","maxPages": 10,"proxy": { "useApifyProxy": true, "apifyProxyGroups": ["RESIDENTIAL"], "apifyProxyCountry": "US" }}
Input parameters
| Parameter | Type | Default | Description |
|---|---|---|---|
| mode | string | search | search, url, or reviews. |
| queries | array | ["nike vintage"] | Keywords (Search mode). Each runs its own paginated search. |
| country | string | us | Marketplace and currency. Also the default proxy country. |
| sortBy | string | relevance | relevance, newest, price-asc, or price-desc (Search mode). |
| minPrice | integer | (none) | Minimum price in the marketplace currency. |
| maxPrice | integer | (none) | Maximum price in the marketplace currency. |
| gender | string | any | any, female, male, or unisex (Search mode). |
| brands | array | [] | Numeric brand IDs (Search mode). |
| categories | array | [] | Numeric category IDs (Search mode). |
| colours | array | [] | Colour slugs such as black, white, pink (Search mode). |
| conditions | array | [] | brand_new, used_like_new, used_excellent, used_good, used_fair. |
| groups | array | [] | Department group slugs such as tops, footwear (Search mode). |
| sizes | array | [] | Numeric size IDs (Search mode, advanced). |
| urls | array | (example) | Product, search, or shop URLs (URL mode). |
| sellers | array | (example) | Usernames, shop URLs, or numeric IDs (Reviews mode). |
| reviewRole | string | seller | seller or buyer reviews (Reviews mode). |
| maxPages | integer | 0 | Max pages per keyword / URL / shop / 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 this walk. |
| maxListings | integer | 20 | Total item cap across all keywords / URLs / shops / sellers. The sole volume cap once maxPages is unlimited. 0 means unlimited. |
| fetchDetails | boolean | true | Enrich each item with full description, photos, material/style, and seller stats. Turn off for lighter SERP-only runs. |
| proxy | object | Residential | Proxy configuration. Residential is recommended. |
| resumeFromRunId | string | (none) | Continue one specific previous run/dataset: items already collected there are skipped, so this run only appends new items. For recurring daily monitoring of the same search, use Incremental mode instead — see "Resume & recurring updates" below. |
| incrementalMode | boolean | false | Daily/recurring monitoring of this same search, URLs, or sellers. First run returns everything as NEW; later runs return only NEW/UPDATED/REAPPEARED — unchanged items are suppressed (not returned, not billed). See "Resume & recurring updates" below. |
| stateKey | string | (none) | Incremental mode only. Name this monitoring campaign to keep its state stable, or to deliberately share state across differently-configured runs. Leave empty to derive a key automatically from the search/URL/seller and filter settings. |
| 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 tracked search (Max Pages Per Search and Max Items both unlimited, and Resume not used). Adds and bills extra synthetic rows. |
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 / automatic checkpoint recovery |
| Run the same search/URLs/sellers 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. An automatic same-run checkpoint also protects against platform migrations/Resurrects without any input needed.
Incremental mode (incrementalMode) is for a schedule (for example, daily): the actor remembers the previous run of the same search/URLs/sellers 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 — items unchanged since the last run are always suppressed (not returned, not charged). Turn on emitExpired only when you also want previously-seen items that vanished returned (and billed) as EXPIRED. State is isolated per search/URL/seller and filter setup automatically; set stateKey to name or deliberately share a monitoring campaign.
Scheduled-run example — same search, run daily:
Day 1 (first run ever for this search):
{ "mode": "search", "queries": ["nike vintage"], "incrementalMode": true }
→ every item comes back with "changeType": "NEW".
Day 2 (the schedule fires again, identical input):
{ "mode": "search", "queries": ["nike vintage"], "incrementalMode": true }
→ items whose price/status/etc. changed come back as "changeType": "UPDATED" with changedFields listing what changed, brand-new items come back as "changeType": "NEW", items that vanished and came back come back as "changeType": "REAPPEARED" — and items that are still there, unchanged, are not returned at all (suppressed, not charged).
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.
- Authorize a connector once under Apify → Settings → Integrations (Notion, Linear, Airtable, or Apify).
- Select it in the "Pipe results into your apps" input field. (If the picker is empty, you haven't authorized a connector yet.)
- For Notion, also set
notionParentPageUrlto 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.
Output example
Sample shape, values are illustrative placeholders, not from a live listing.
{"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
This site accepts traffic only from residential connections, so a Residential proxy is required for reliable results. Residential proxy is included on Apify paid plans (Starter and above). On the free plan, runs may return zero items because datacenter connections are rejected by the site.
Pick the marketplace country that matches your target audience; the actor pins the residential proxy to that country by default and quotes prices in the matching currency. You can override the proxy country in the Proxy field.