Secondhand-fashion pricing and resale research
Use Depop endpoints to turn secondhand-fashion pricing and resale research into repeatable API requests with documented inputs and JSON responses.
Turn public Depop pages into structured resale-fashion data — keyword and filtered listing search, full item detail with photos and seller info, a seller's shop catalog, and the category taxonomy, all as normalized JSON. Credential-free.
Search Depop listings and get item detail, seller shops, and the category taxonomy as structured JSON.
Endpoint families
6
Documented params
42
Examples
10
Live catalog snapshot
Active endpoints
10
Methods
GET
Required params
17
Schema refs
10
{
"platform": "Depop",
"endpoint": "depop-search",
"method": "GET",
"path": "/depop/search",
"auth": "apiKey"
}Use cases
Search Depop listings and get item detail, seller shops, and the category taxonomy as structured JSON.
Use Depop endpoints to turn secondhand-fashion pricing and resale research into repeatable API requests with documented inputs and JSON responses.
Use Depop endpoints to turn seller and shop monitoring into repeatable API requests with documented inputs and JSON responses.
Use Depop endpoints to turn category and trend tracking into repeatable API requests with documented inputs and JSON responses.
Managed execution
Crawlora's Depop API is designed around Depop's own data surface, not a generic fetch endpoint — combining endpoint-specific request logic, managed infrastructure, parsing, normalization, billing, and Playground-tested examples.
Request behavior for Depop endpoints is tuned to the platform's own response shapes and edge cases.
Supported Depop endpoints can use managed proxy routing to improve reliability and reduce infrastructure work.
Dynamic Depop pages can be routed through managed browser instances where JavaScript rendering is required.
Challenge pages and unusable Depop responses are detected and surfaced clearly, not silently returned as empty data.
Depop results are returned as documented JSON instead of raw HTML.
Test the same Depop route from Docs and Playground before production integration.
Coverage map
These cards are generated from the active endpoint catalog, so the landing page reflects the same API surface used by Docs and Playground.
/depop/item/{slug}
/depop/search
/depop/brands
/depop/categories
/depop/search-sellers
/depop/shop/{username}
Endpoint catalog
/depop/searchSearches Depop's resale-fashion marketplace by free-text keyword, with optional price, condition, colour, category, subcategory, gender, kids-department, brand, discount, and sort filters, returning normalized listing summaries (title, price, brand, condition, like count, photos, sizes), a pagination cursor, and the total matching count. Public data sourced from Depop's own search API.
Response notes
- `id` is the item's URL slug (e.g. `ag_boutique-vintage-mid-rise-bootcut-levi-2476`), not a numeric database id — pass it directly as the `slug` path parameter to `/depop/item/{slug}` for full item detail. - `price_cents` and `shipping_cents` are omitted (zero) when Depop's own response doesn't include a parseable amount for that listing. - `like_count` is the listing's like count, requested by default on every search (`0` is omitted from the response, same as other zero-valued optional fields). - `has_more` and `next_cursor` reflect Depop's own pagination state — when `has_more` is `true`, pass `next_cursor` as the following request's `after` value to fetch the next page. `next_cursor` is an opaque string; don't parse it. - A search with no matching listings returns `200` with `"items": []`. - A missing `query` returns `400` before any upstream request is made. - An unrecognized `condition`, `colours`, `sort`, `category`, or `gender` value, a malformed `subcategory`, `brand_ids`, or `sizes` entry, or `price_min` greater than `price_max` returns `400` before any upstream request is made. Example response: ```json { "code": 200, "msg": "OK", "data": { "query": "nike jacket", "total_results": 90627, "has_more": true, "next_cursor": "MnwyNHwxNzg1OTUzNjM1.BOOSTED_EXHAUSTED.0", "items": [ { "id": "harsisonmn-nike-virginia-tech-track-and-27fc", "url": "https://www.depop.com/products/harsisonmn-nike-virginia-tech-track-and-27fc/", "title": "Nike College Track and Field black windbreaker jacket #trackandfield", "description": "Nike College Track and Field black windbreaker jacket #trackandfield\n\nNike womens medium jacket, #trackandfield\n#nike #jacket", "brand_name": "Nike", "condition": "used_excellent", "colours": ["black"], "price_cents": 800, "currency": "USD", "shipping_cents": 199, "thumbnail_url": "https://media-photos.depop.com/r1/329377772/4357366076_0948c314910046e9946f466fc1d87e70/P0.jpg", "photos": [ "https://media-photos.depop.com/r1/329377772/4357366076_0948c314910046e9946f466fc1d87e70/P0.jpg" ], "sizes": ["M"], "location": "Charlotte, United States", "like_count": 3 } ] } } ```
/depop/item/{slug}Returns a normalized Depop item-detail page: description, all photos, price, condition, brand, size, seller info, and a "similar items" carousel when the page has one. Public data sourced from Depop's own item pages.
Response notes
- `title` is the item's description text up to its first line break — Depop does not expose a separate, shorter title field; `description` is the full text. - `seller` (username, id, verification status, display name, avatar) is only available on this endpoint, not on `/depop/search`'s listing summaries. - `similar_items` is populated when the item page has a "Similar items" carousel, using the same shape as `/depop/search`'s listing summaries. Omitted (not an empty array) when the page doesn't have one. A separate "More from this seller" carousel is also visible on Depop's own item page but isn't included here — it loads via a client-side-only fetch this endpoint doesn't reproduce. For a richer, paginated (up to 150 results) similar-items lookup, use [`GET /depop/item/{slug}/similar`](depop-item-similar.md) instead. - An unknown or delisted item slug returns `404`. - A missing `slug` returns `400` before any upstream request is made. Example response: ```json { "code": 200, "msg": "OK", "data": { "id": "ag_boutique-vintage-mid-rise-bootcut-levi-2476", "url": "https://www.depop.com/products/ag_boutique-vintage-mid-rise-bootcut-levi-2476/", "title": "Vintage Mid rise Bootcut Levi Jeans", "description": "Vintage Mid rise Bootcut Levi Jeans\nSize 6 (28-30 inch waist) They are mid rise *not low rise*\nInseam: 31 inches\n#Levis #flare", "brand_name": "Levi's", "condition": "used_like_new", "colours": ["blue", "navy"], "price_cents": 1500, "original_price_cents": 1800, "currency": "USD", "shipping_cents": 399, "photos": [ "https://media-photos.depop.com/b1/42916032/4363725919_6c94f1277d5b4ba4890ff74980b79b23/P0.jpg" ], "location": "Monroe, United States", "sizes": ["6"], "seller": { "id": 42916032, "username": "ac_boutique", "verified": false, "first_name": "Alaina", "picture_url": "https://media-photos.depop.com/b1/42916032/3675424939_2e6b5627f8084c269b32054ed071f56e/U1.jpg" }, "similar_items": [ { "id": "lsamcminn-vintage-inspired-levis-superlow-flare-jeans-bb57", "url": "https://www.depop.com/products/lsamcminn-vintage-inspired-levis-superlow-flare-jeans-bb57/", "title": "Vintage-inspired Levi's Superlow Flare jeans in a light wash", "brand_name": "Levi's", "condition": "used_good", "colours": ["blue"], "price_cents": 1700, "currency": "USD", "shipping_cents": 399, "thumbnail_url": "https://media-photos.depop.com/r1/39600511/4353764468_d4c5a9c42c714b679ae7e63f9c9ee22d/P0.jpg", "location": "Santa Rosa, United States" } ] } } ```
/depop/shop/{username}Returns a Depop seller's public shop: profile (rating, sold count, followers, bio) plus current listings, with optional price, condition, colour, category, subcategory, gender, discount, and sort filters. Public data sourced from Depop's own shop pages.
Response notes
- This endpoint parses the shop page's rendered HTML, not a JSON API (none was found for per-seller listings) — so each item in `items` is a lighter shape than `/depop/search`'s: no brand, condition, colour, description, or size, since the shop page doesn't render those per card. `id` is the item's URL slug, same identifier space as `/depop/search`'s `id` and `/depop/item/{slug}`'s `slug` — chain any item into `/depop/item/{slug}` for full detail. - `followers_count` and `following_count` are approximate once Depop abbreviates them in the UI (e.g. "2.35K" → `2350`) — Depop doesn't render the exact count past a certain size. - `currency` is always `"USD"` — inferred from the `$` symbol the page renders, not read from an explicit field (unlike `/depop/search` and `/depop/item/{slug}`, which get an explicit currency code from Depop's own JSON). - A shop with no current listings returns `200` with `"items": []`. - An empty or malformed `username` returns `400` before any upstream request is made. An unrecognized `condition`, `colours`, `sort`, `category`, or `gender` value, a malformed `subcategory` or `sizes` entry, or `price_min` greater than `price_max`, also returns `400`. - A nonexistent username returns `404`. Example response: ```json { "code": 200, "msg": "OK", "data": { "username": "villafanashop", "display_name": "Julian A Villafana", "bio": "Welcome to my shop! I specialize in cute and trendy graphic tees. Fast shipping, friendly service, and quality guaranteed. Tysm", "avatar_url": "https://media-photos.depop.com/b1/415677839/3527467429_405c6ee819bc4c9d89713521974688b9/U1.jpg", "verified": true, "rating": 4.7, "rating_count": 1445, "sold_count": 8810, "followers_count": 2350, "following_count": 12, "activity_status": "Active today", "items": [ { "id": "vill7fanashop-supreme-tiger-graphic-t-shirt-black-00e8", "url": "https://www.depop.com/products/vill7fanashop-supreme-tiger-graphic-t-shirt-black-00e8/", "thumbnail_url": "https://media-photos.depop.com/b1/415677839/4067598019_5faee8ecbec942739452db1dfdc5563a/P8.jpg", "price_cents": 1686, "original_price_cents": 2286, "currency": "USD" } ] } } ```
/depop/categoriesReturns Depop's full department, category, and subcategory taxonomy -- every value usable with /depop/search's and /depop/shop/{username}'s category/subcategory filters. Tries a live refresh from Depop's own category-filter API first and falls back to a static snapshot on any failure, so this never errors.
Response notes
- `departments` has exactly 4 entries: `womenswear` (gender `female`), `menswear` (gender `male`), `kidswear` (`is_kids: true`, no gender), and `everything-else` (no gender, not kids-scoped — items outside clothing, e.g. beauty, home, art). - Each department's `categories[].slug` is the value to pass as `/depop/search`'s or `/depop/shop/{username}`'s `category` query parameter. Most category slugs are shared across departments (e.g. `tops` exists under both `womenswear` and `menswear`) — pair a category slug with the matching department's `gender`/`is_kids` when you also want to scope by department. - Each category's `subcategories[].slug` is the value to pass as `subcategory` (comma-separated for multiple), scoped to that category — a subcategory slug from one category is not guaranteed valid under a different category. - This data changes rarely. When the live refresh succeeds, a newly added category or subcategory shows up immediately; when it fails (upstream down, blocked, or unexpected shape), the response falls back to a static snapshot that lags until this package is re-synced. Example response (truncated): ```json { "code": 200, "msg": "OK", "data": { "departments": [ { "id": "womenswear", "name": "Women", "gender": "female", "categories": [ { "slug": "tops", "name": "Tops", "subcategories": [ { "slug": "tshirts", "name": "T-shirts" }, { "slug": "hoodies", "name": "Hoodies" } ] } ] }, { "id": "kidswear", "name": "Kids", "is_kids": true, "categories": [ { "slug": "bundles", "name": "Clothing bundles", "subcategories": [ { "slug": "bundles", "name": "Clothing bundles" } ] } ] }, { "id": "everything-else", "name": "Everything else", "categories": [ { "slug": "beauty", "name": "Beauty", "subcategories": [ { "slug": "makeup", "name": "Makeup" }, { "slug": "skincare", "name": "Skincare" } ] } ] } ] } } ```
/depop/brandsReturns Depop's full brand directory (id, name, slug), not just brands with active listings for a given search -- resolves the search endpoint's otherwise-opaque brand_ids filter to human-readable names. Public data sourced from Depop's own brand-directory API.
Response notes
- `brands` is sorted by numeric `id` for a deterministic order. - `id` is the same numeric brand id `/depop/search`'s `brand_ids` filter accepts. Example response: ```json { "code": 200, "msg": "OK", "data": { "total": 4213, "brands": [ {"id": 1, "name": "Aloye", "slug": "aloye"}, {"id": 2, "name": "Diamond Supply Co.", "slug": "diamond-supply-co"}, {"id": 270, "name": "Nike", "slug": "nike"} ] } } ```
/depop/item/{slug}/similarReturns items similar to a given Depop listing, via Depop's dedicated similar-items API -- richer and paginated (up to 150 per page) compared to the small, non-paginated "similar items" carousel already included in item detail. Public data sourced from Depop's own similar-items API.
Response notes
- Items are shaped identically to `/depop/search`'s listing summaries (title, price, brand, condition, like count, photos, sizes). - Resolving `slug` to the source item requires an internal item-page fetch before the similar-items lookup — allow for slightly higher latency than `/depop/search`. - `has_more` and `next_cursor` reflect Depop's own pagination state — when `has_more` is `true`, pass `next_cursor` as the following request's `after` value to fetch the next page. - An unknown or delisted source item slug returns `404`. - A missing `slug` or a `limit` over `150` returns `400` before any upstream request is made. Example response: ```json { "code": 200, "msg": "OK", "data": { "items": [ { "id": "rayofsuashineva-artsy-chic-boho-luxe-eclectic-d9c0", "url": "https://www.depop.com/products/rayofsuashineva-artsy-chic-boho-luxe-eclectic-d9c0/", "title": "Artsy chic", "description": "Artsy chic\n\nBoho luxe\n\nMichael Simon jacket, multicolor plaid jacket", "brand_name": "Other", "condition": "used_excellent", "colours": ["multi"], "price_cents": 2500, "currency": "USD", "shipping_cents": 199, "thumbnail_url": "https://media-photos.depop.com/b1/264682642/4443656880_c7418b1968634a5a8a7e98ba0a863801/P0.jpg", "sizes": ["M"], "location": "Durham, United States", "like_count": 0 } ], "has_more": true, "next_cursor": "NQ" } } ```
/depop/search-sellersFinds Depop users/sellers by name or username. A matched result's username can be passed directly to GET /depop/shop/{username} for that seller's full shop. Public data sourced from Depop's own user-search API.
Response notes
- `first_name`/`last_name` reflect whatever the seller has set on their profile — either or both may be empty. - `avatar_url` is omitted when the seller has no profile picture set. - A missing `query` returns `400` before any upstream request is made. - A query with no matching sellers returns `200` with `"sellers": []`. Example response: ```json { "code": 200, "msg": "OK", "data": { "query": "red corte", "sellers": [ { "id": 22564880, "username": "red4201", "first_name": "Red", "last_name": "Cortes" }, { "id": 51552506, "username": "redecorate", "first_name": "kai", "avatar_url": "https://media-photos.depop.com/b1/51552506/2384449778_27b1e362ea8c462096725bfe9f018bc3/U1.jpg" } ] } } ```
/depop/search/facetsReturns result-count breakdowns per department/category/subcategory for a search query, via Depop's dedicated aggregates API -- a distinct upstream call from search itself, not embedded in its response. Public data sourced from Depop's own search-aggregates API.
Response notes
- `departments` is sorted alphabetically by department name; each department's `categories`/`subcategories` are sorted alphabetically by `id` for a deterministic order. - `categories`/`subcategories` are already department-scoped — unlike `/depop/search`'s own `category`/`subcategory` filters, which apply across all departments, a facet's `count` here only covers listings within that specific department. - `subcategories` are omitted (not an empty array) for a department with no subcategory breakdown in the upstream response. - A missing `query` returns `400` before any upstream request is made. Example response: ```json { "code": 200, "msg": "OK", "data": { "query": "bandage dress", "departments": [ { "department": "menswear", "count": 39, "categories": [ {"id": "coats-jackets", "count": 4}, {"id": "fancy-dress", "count": 14}, {"id": "tops", "count": 12} ], "subcategories": [ {"id": "jackets", "count": 4}, {"id": "tshirts", "count": 5} ] }, { "department": "womenswear", "count": 23744, "categories": [ {"id": "dresses", "count": 22504}, {"id": "tops", "count": 509} ], "subcategories": [ {"id": "shift-dresses", "count": 22}, {"id": "wedding-dresses", "count": 7} ] } ] } } ```
/depop/sizesReturns Depop's full, multi-region size taxonomy -- every composite id usable with /depop/search's and /depop/shop/{username}'s sizes filter. Public data sourced from Depop's own size-filter API.
Response notes
- `departments` only includes `kidswear`, `menswear`, and `womenswear` — `everything-else` (see [`/depop/categories`](depop-categories.md)) has no clothing sizes and is omitted. - Each department groups its sizes into `categories` (e.g. "Tops", "Bottoms", "Shoes"), each of which groups sizes further into `regions` (`EUR`, `UK`, `US`, `AU`). - Each size's `id` (e.g. `"4.17"`) is the exact value to pass — comma -separated for multiple — as `/depop/search`'s or `/depop/shop/{username}`'s `sizes` query parameter. It omits the region suffix Depop's own page URLs display (e.g. `4.17-US`) — that suffix is decorative only; the bare `id` is what both endpoints actually key off. - A size id is not scoped to a specific `category`/`gender`/`is_kids` combination by `/depop/search` or `/depop/shop/{username}` — pairing an id from the wrong category (e.g. a Shoes id while filtering Tops) simply returns zero results rather than an error. Example response (truncated): ```json { "code": 200, "msg": "OK", "data": { "departments": [ { "id": "womenswear", "name": "Women", "categories": [ { "id": "wmns-tops-sizes", "name": "Tops", "regions": [ { "region": "US", "sizes": [ { "id": "4.17", "name": "M" }, { "id": "4.18", "name": "L" } ] } ] } ] } ] } } ```
/depop/suggestReturns Depop's own search-box autocomplete suggestions for a partial query, including the category a suggestion maps to when relevant. Public data sourced from Depop's own search-suggestions API.
Response notes
- `value` is the suggested phrase with Depop's own bold-match markup stripped (the upstream API wraps the substring matching `query` in `**...**` for highlighting; this endpoint returns the plain text). - `group`, `suggested_filter_label`, and `gender` are present when the suggestion maps to a specific Depop category/department (e.g. `group` `tops`, `suggested_filter_label` `"in Women's Tops"`, `gender` `female`) — all three omitted for a plain free-text suggestion with no category match. - A missing `query` returns `400` before any upstream request is made. - Suggestions with no results return `200` with `"suggestions": []`. Example response: ```json { "code": 200, "msg": "OK", "data": { "query": "red corte", "suggestions": [ { "value": "red corset", "group": "tops", "suggested_filter_label": "in Women's Tops", "gender": "female" }, { "value": "red corset" }, { "value": "red corset top" } ] } } ```
Related APIs
Marketplaces & Retail
Collect marketplace product signals from Amazon without building brittle storefront scrapers.
Marketplaces & Retail
Build resale, pricing, and marketplace workflows from structured eBay data.
Marketplaces & Retail
Turn public Shop.app product and merchant pages into structured JSON for e-commerce product intelligence, price research, shop monitoring, and marketplace discovery workflows.
How to scrape Depop
Crawlora's Depop endpoints return listing search, item detail, seller shops, and categories as normalized JSON with one API key — no login or account required.
Send a keyword to /depop/search, with optional price, condition, colour, and category filters.
Pass an item slug from a search result to /depop/item/{slug} for full detail, photos, and seller info.
Pass a username to /depop/shop/{username} for that seller's shop catalog.
Use /depop/categories for the full department/category/subcategory taxonomy.
Add the sizes param (composite ids from /depop/sizes) to /depop/search or /depop/shop/{username} to filter listings by size.
FAQ
Send a keyword to Crawlora's /depop/search endpoint and get normalized listing cards — title, price, brand, condition, photos — as structured JSON.
No Depop account or login is required from the caller — only your Crawlora API key.
Yes — /depop/shop/{username} returns a seller's shop listing catalog as structured JSON.
Yes — pass a size composite id (from /depop/sizes) to /depop/search's or /depop/shop/{username}'s sizes param to restrict results to that size.