Depop Listings Scraper
Pricing
Pay per event
Depop Listings Scraper
Sweep a Depop search query across price-band filter shards and export deduplicated listing rows — title, brand, condition, price breakdown, images, canonical URL. Depop has no pagination; coverage is bounded by the shard grid you configure, not the query's full catalogue. Vintage resale fashion.
Pricing
Pay per event
Rating
0.0
(0)
Developer
DevilScrapes
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
8 hours ago
Last modified
Categories
Share
🎯 What this scrapes
Depop is a fashion-resale marketplace with no working "load more" API — its search page SSRs exactly one static batch of listings per request and ignores page/offset entirely. This Actor gets around that by sweeping the same query across a grid of price-band shards (and, optionally, category/condition/brand/size shards), fetching each shard once, deduplicating by listing ID, and writing one clean row per unique listing: title, brand, category, condition, size, price breakdown, images, and the canonical product URL. Coverage is bounded by the shard grid you configure — more shards means more coverage, not an unlimited crawl.
🔥 What we handle for you
- 🛡️ We rotate browser fingerprints —
curl-cffiimpersonation (Chrome / Firefox / Safari) so Depop sees a real browser, not Python. - 🔁 We retry with exponential backoff on
408 / 429 / 5xxand honourRetry-After— up to 5 attempts per shard. - 🌐 We rotate proxy sessions through Apify Proxy on every block — fresh session ID, fresh exit IP; switch to RESIDENTIAL from the input form if you need it.
- 🧱 We never silently drop a shard — a bad shard is logged and skipped; if the grid would exceed your cap we truncate and say so in the run's status message.
- 🧊 We keep the dataset clean — deduplicated by listing ID, Pydantic-validated rows, ISO-8601 timestamps.
- 💰 You pay only for unique listings that land. A listing seen in two shards is billed once, not twice.
💡 Use cases
- Resale market research — pull current asking prices for a brand or item across a price grid to benchmark resale value.
- Sourcing leads — monitor a keyword across price bands to spot underpriced listings worth a closer look.
- Trend tracking — sweep the same query on a schedule and diff runs to see what's newly listed or sold through.
- Catalogue sampling — build a representative sample of a niche (brand, category, style) for downstream analysis.
⚙️ How to use it
- Click Try for free at the top of the page.
- Fill in the input form — most fields have sensible defaults.
- Click Start. Output streams into the run's dataset.
- Export from Storage → Dataset as JSON, CSV, or Excel — or fetch via the API.
📥 Input
| Field | Type | Required | Default | Notes |
|---|---|---|---|---|
query | string | yes | 'vintage carhartt jacket' | Search term to sweep across the shard grid, matched against Depop's search/?q= endpoint. 1-100 characters. |
priceShards | array | no | [[None, None], [0, 25], [25, 50], [50, 100], [100, 200], [200, None]] | Price-band grid as [min, max] pairs (either bound may be null for open-ended). This is the proven shard axis — each… |
extraShardAxes | object | no | {} | Optional candidate shard axes — category / condition / brand / size, each an array of up to 10 values. Off by default.… |
maxShardsPerRun | integer | no | 12 | Ceiling on the total number of shard requests this run will issue. Price shards are prioritized; any overflow is… |
maxListingsPerShard | integer | no | 20 | Cap on listings parsed per shard. Depop's search page SSRs about 20 listings per static batch, so values above 20 have… |
proxyConfiguration | object | no | {'useApifyProxy': True} | Apify Proxy routing. Datacenter (the default) matches the recon setup that confirmed reach on www.depop.com — switch to… |
Example input
{"query": "vintage levis jacket","priceShards": [[null,null],[25,50]],"maxShardsPerRun": 2,"maxListingsPerShard": 5,"proxyConfiguration": {"useApifyProxy": true}}
📤 Output
Every row is one dataset item.
| Field | Type | Notes |
|---|---|---|
id | string | Depop listing ID — the dedupe key across shards. |
slug | string | Depop listing slug. |
url | string | Canonical listing URL: https://www.depop.com/products/{slug}/. |
title | string | Listing title (Depop's description field — there is no separate title field). |
brand | string | Brand name, when Depop has one on file for the listing. |
category | string | Depop category name. |
condition | string | Listed condition, e.g. Good, New. |
colour | string | Listed colour attribute. |
gender | string | Listed gender attribute. |
product_type | string | Listed product-type attribute, e.g. Jacket. |
sizes | array | Sizes attached to the listing. |
country | string | Seller's listed country. |
like_count | integer | Number of likes on the listing at scrape time. |
price_total | string | Total price the buyer pays, as a decimal string. |
price_item | string | Item price component, as a decimal string. |
price_buyer_fee | string | Buyer fee component, as a decimal string. |
price_tax | string | Tax component, as a decimal string. |
price_shipping | string | Shipping component, as a decimal string. |
currency | string | ISO currency code for the price breakdown. |
image_urls | array | Listing image CDN URLs. |
matched_shard | object | The shard parameters (e.g. price_min/price_max) that produced this row — for auditability, not billed separately. |
scraped_at | string | ISO-8601 timestamp of when this row was scraped. |
Example output
{"id": "48213771","slug": "vintage-carhartt-jacket-brown-medium","url": "https://www.depop.com/products/vintage-carhartt-jacket-brown-medium/","title": "Vintage Carhartt jacket, brown, size M, light wear","brand": "Carhartt","category": "Menswear","condition": "Good","colour": "Brown","gender": "Men","product_type": "Jacket","sizes": ["M"],"country": "GB","like_count": 14,"price_total": "42.50","price_item": "35.00","price_buyer_fee": "3.50","price_tax": "0.00","price_shipping": "4.00","currency": "GBP","image_urls": ["https://media-photos.depop.com/b1/abc123.jpg"],"matched_shard": {"price_min": "25","price_max": "50"},"scraped_at": "2026-09-18T12:00:00+00:00"}
💰 Pricing
Pay-Per-Event — you pay only when these events fire:
| Event | USD | What it is |
|---|---|---|
actor-start | $0.2 | One-off warm-up charge per run |
listing-scraped | $0.004 | PPE event |
Example: 1 000 listings at the rates above ≈ $4.20. No subscription, no minimum, no card to start — Apify gives every new account $5 of free credit.
🚧 Limitations
- No true pagination — total coverage is bounded by the shard grid (price bands plus any opt-in category/condition/brand/size axes), not by the query's full catalogue size.
extraShardAxesvalues are customer-supplied candidates; the Actor validates non-triviality at runtime but does not auto-discover which values exist on Depop.- Seller profiles, order history, messaging, and other authenticated Depop features are out of scope.
❓ FAQ
Will this get every listing for my query?
No — Depop has no working pagination, so coverage is bounded by the shard grid you configure. Each price band returns Depop's own static batch of listings (roughly 20), and more shards mean more coverage, not an unlimited crawl. Widen priceShards or turn on extraShardAxes to cover more of the catalogue.
Why price shards and not just "page 2, page 3"?
Depop's search endpoint ignores page/offset entirely — repeated identical requests return the same static batch. Filtering by price band is the mechanism that actually returns a different set of listings, so that's what this Actor sweeps.
What happens if a shard is duplicate of another?
Listings are deduplicated by ID across every shard in the run, so a listing that shows up under two price bands is stored and billed exactly once.
Why is my run slow or produces fewer rows than I expected?
Each shard is one request against Depop's live search page, so runtime scales with maxShardsPerRun. A 0-row shard usually means that price band genuinely has no matches for your query, not a failure — check the run's status message for what was searched.
💬 Your feedback
Spotted a bug, hit a weird edge case, or need a new field? Open an issue on the Actor's Issues tab on Apify Console — we ship fixes weekly and we read every report.