# Depop API scraper — search fashion resale listings in nine Depop markets with item price, discount, condition, size, shipping and the buyer's fee and import tax, read a full listing with the seller's rating and items sold, a seller's for-sale and sold listings, reviews and profile, similar items and search suggestions. No account, no browser.

> Search Depop listings by keyword, or browse a brand, department or category, in one of nine markets (US, UK, Australia, Canada, New Zealand, Germany, France, Italy, Ireland). Every row: listing id, slug and url, description, brand, category and subcategory, gender, condition, colours, sizes with quantities, the item price with the struck original price when reduced, shipping price, the price a buyer in that country is shown (buyer fee, import tax, national or international shipping), likes, the seller's country and whether the listing is boosted. Filter by brand, department, category, subcategory, condition, colour, price range and on-sale; sort by relevance or price; page with `next_cursor`.
> ReefAPI engine `depop` · 7 endpoints · clean JSON, no scraping or browsers to manage.

## How to call
- **Endpoint:** `POST https://api.reefapi.com/depop/v1/<action>` with a JSON body.
- **Auth:** header `x-api-key: <YOUR_REEFAPI_KEY>` — create one free (1,000 credits, no card): https://reefapi.com/signup
- **Response (every call):** `{ ok: boolean, data: ..., meta: { record_count, credits, ... }, error: { code, message } }` — branch on `ok`. Failed calls are free except verified SHEIN NOT_FOUND on product/detail and price (4 credits).
- **One key + one shared credit pool** across every ReefAPI API. Per-call credits are listed on each endpoint below.
- **Use it from an AI agent (MCP):** connect `https://api.reefapi.com/mcp` (remote streamable-http, `Authorization: Bearer <key>`) and your assistant can call these actions directly.

## Endpoints

### POST /depop/v1/search — 1 credit
Search Depop listings by keyword, or browse a brand, department or category, in one of nine markets (US, UK, Australia, Canada, New Zealand, Germany, France, Italy, Ireland). Every row: listing id, slug and url, description, brand, category and subcategory, gender, condition, colours, sizes with quantities, the item price with the struck original price when reduced, shipping price, the price a buyer in that country is shown (buyer fee, import tax, national or international shipping), likes, the seller's country and whether the listing is boosted. Filter by brand, department, category, subcategory, condition, colour, price range and on-sale; sort by relevance or price; page with `next_cursor`.

**Parameters:**
- `query` (string, optional) — Keywords. Optional when a brand, department or category is given (browse).
- `country` (enum, optional, default "us") — Depop market. Search returns that market's listings; every price is also priced for a buyer in this country (`buyer_view`: buyer fee, import tax, national or international shipping). [one of: us, gb, au, ca, nz, de, fr, it, ie]
- `region` (string, optional) — country=us only: the buyer's US state code (CA, NY, TX …). Depop's US buyer fee depends on the buyer's state — measured: CA and OR pay it, NY and TX do not. Without a state, US prices are shown with no state fee.
- `brand` (string, optional) — Brand name(s) as Depop lists them, comma-separated (up to 10): Nike, Levi's, The North Face — or Depop brand ids (`brand_id` on every row). An unknown brand is rejected, not ignored.
- `department` (enum, optional) — Depop department. [one of: men, women, kids, everything_else]
- `category` (string, optional) — Depop category id: tops, bottoms, dresses, coats-jackets, footwear, accessories, suits, jumpsuit-and-playsuit, nightwear, underwear, swim-beach-wear; everything_else: home, art, beauty, music, books-and-magazine, film, toys, sports-equipment-accesories … Rejected with the valid list when unknown or outside the department.
- `subcategory` (string, optional) — Subcategory id(s) inside the category, comma-separated: footwear → trainers, boots, loafers; tops → tshirts, hoodies, jumpers; bottoms → jeans, shorts, skirts. Needs `category`.
- `condition` (string, optional) — Condition(s), comma-separated: brand_new, used_like_new, used_excellent, used_good, used_fair.
- `colour` (string, optional) — Colour(s), comma-separated: black, grey, white, brown, tan, cream, yellow, red, burgundy, orange, pink, purple, blue, navy, green, khaki, multi, silver, gold.
- `price_min` (number, optional) — Lowest item price, in the country's currency.
- `price_max` (number, optional) — Highest item price, in the country's currency.
- `on_sale` (boolean, optional, default false) — Only listings the seller has reduced (each row then carries original_price).
- `sort` (enum, optional, default "relevance") — Order of results. Unknown values are rejected (Depop itself would silently ignore them). [one of: relevance, price_asc, price_desc]
- `limit` (integer, optional, default 24) — Listings per call, 1-100 (Depop's own page is 24).
- `cursor` (string, optional) — Continue a previous call: pass back its `next_cursor`. `next_cursor: null` is the end.
- `include_sponsored` (boolean, optional, default false) — Boosted (promoted) listings are left out by default and counted in `sponsored_dropped`; true returns them, each with `is_boosted: true`.
- `max_rotations` (integer, optional, default 3) — Advanced: how many times to retry a difficult request (1-5).

**Returns:** results[]{listing_id, slug, url, description, brand, brand_id, category, group, product_type, gender, is_kids, condition, condition_label, colours[], sizes[]{size, quantity, status}, quantity, status (on_sale|sold|reserved…), is_sold, price (number — the seller's item price now), currency (the listing's), original_price (the struck price when Depop marks the listing reduced, else null), discount_percent, is_discounted, shipping_price, buyer_view{country, us_state (country=us: the `region` used, null = no state fee), headline_price (what Depop shows a buyer in `country`), headline_currency, headline_includes{buyer_fee, tax, shipping}, buyer_fee, tax, tax_type, shipping_price, shipping_boundary (national|international)}, shipping_provider, shipping_payer, like_count, image, image_count, seller_id (seller rows and similar rows; null in search), seller_country, location, is_boosted, listed_at (seller rows and similar rows), updated_at}, count, next_cursor, has_more, total_results, sponsored_dropped, filters{}, query, country

**Example request body:**
```json
{
  "query": "nike"
}
```

### POST /depop/v1/product/detail — 1 credit
One Depop listing in full, by slug, URL or id: Depop's product title, the description, brand, category path, gender, condition, colours, sizes (including sold-out sizes) with quantities, every photo, the item price with the original price when reduced, national and international shipping prices and whether shipping is free, what a buyer in `country` is shown (buyer fee, import tax, shipping), likes, sale status (sold listings still resolve), and the seller: username, shop url, verified flag, country, star rating and review count, items sold, last seen and average days to ship.

**Parameters:**
- `listing` (string, required) — A Depop listing: its slug (the part after /products/ in the URL), the full listing URL, or the numeric listing id. Every search row returns `slug` and `listing_id`.
- `country` (enum, optional, default "us") — Depop market. Search returns that market's listings; every price is also priced for a buyer in this country (`buyer_view`: buyer fee, import tax, national or international shipping). [one of: us, gb, au, ca, nz, de, fr, it, ie]
- `region` (string, optional) — country=us only: the buyer's US state code (CA, NY, TX …). Depop's US buyer fee depends on the buyer's state — measured: CA and OR pay it, NY and TX do not. Without a state, US prices are shown with no state fee.
- `max_rotations` (integer, optional, default 3) — Advanced: how many times to retry a difficult request (1-5).

**Returns:** listing{listing_id, slug, url, description, brand, brand_id, category, group, product_type, gender, is_kids, condition, condition_label, colours[], sizes[]{size, quantity, status}, quantity, status (on_sale|sold|reserved…), is_sold, price (number — the seller's item price now), currency (the listing's), original_price (the struck price when Depop marks the listing reduced, else null), discount_percent, is_discounted, shipping_price, buyer_view{country, us_state (country=us: the `region` used, null = no state fee), headline_price (what Depop shows a buyer in `country`), headline_currency, headline_includes{buyer_fee, tax, shipping}, buyer_fee, tax, tax_type, shipping_price, shipping_boundary (national|international)}, shipping_provider, shipping_payer, like_count, image, image_count, seller_id (seller rows and similar rows; null in search), seller_country, location, is_boosted, listed_at (seller rows and similar rows), updated_at, title, group_name, colour_names[], images[], national_shipping_price, international_shipping_price, has_free_shipping, shipping_confidence, seller{id, username, url, verified, picture, country, rating, rating_scale, review_count, items_sold, last_seen, average_shipping_days}, country}

### POST /depop/v1/product/similar — 1 credit
The listings Depop shows as similar to one listing (up to 48), with the same row fields as `search` plus seller id and listing date. Works for sold listings too — similar items still for sale.

**Parameters:**
- `listing` (string, required) — A Depop listing: its slug (the part after /products/ in the URL), the full listing URL, or the numeric listing id. Every search row returns `slug` and `listing_id`.
- `country` (enum, optional, default "us") — Depop market. Search returns that market's listings; every price is also priced for a buyer in this country (`buyer_view`: buyer fee, import tax, national or international shipping). [one of: us, gb, au, ca, nz, de, fr, it, ie]
- `region` (string, optional) — country=us only: the buyer's US state code (CA, NY, TX …). Depop's US buyer fee depends on the buyer's state — measured: CA and OR pay it, NY and TX do not. Without a state, US prices are shown with no state fee.
- `limit` (integer, optional, default 24) — Maximum similar listings, 1-48.
- `include_sponsored` (boolean, optional, default false) — Boosted (promoted) listings are left out by default and counted in `sponsored_dropped`; true returns them, each with `is_boosted: true`.
- `max_rotations` (integer, optional, default 3) — Advanced: how many times to retry a difficult request (1-5).

**Returns:** listing_id, results[]{listing_id, slug, url, description, brand, brand_id, category, group, product_type, gender, is_kids, condition, condition_label, colours[], sizes[]{size, quantity, status}, quantity, status (on_sale|sold|reserved…), is_sold, price (number — the seller's item price now), currency (the listing's), original_price (the struck price when Depop marks the listing reduced, else null), discount_percent, is_discounted, shipping_price, buyer_view{country, us_state (country=us: the `region` used, null = no state fee), headline_price (what Depop shows a buyer in `country`), headline_currency, headline_includes{buyer_fee, tax, shipping}, buyer_fee, tax, tax_type, shipping_price, shipping_boundary (national|international)}, shipping_provider, shipping_payer, like_count, image, image_count, seller_id (seller rows and similar rows; null in search), seller_country, location, is_boosted, listed_at (seller rows and similar rows), updated_at}, count, sponsored_dropped, country

### POST /depop/v1/seller/listings — 1 credit
One seller's shop: their for-sale listings (in their own order, newest, or by price) or their SOLD listings, newest sale first — each with the same row fields as `search` plus the listing date. Listings the seller has boosted are included and flagged `is_boosted`. Paged with `next_cursor`.

**Parameters:**
- `seller` (string, required) — Seller username (depop.com/<username>), the shop URL, or the numeric seller id (`seller.id` / `seller_id`).
- `availability` (enum, optional, default "available") — The seller's listings for sale, or the ones they have sold (newest sale first). Depop publishes no sale date; `updated_at` is when the listing last changed. [one of: available, sold]
- `sort` (enum, optional, default "default") — Order of a seller's for-sale listings. Sold listings come newest first and take no sort. [one of: default, newest, price_asc, price_desc]
- `limit` (integer, optional, default 24) — Listings per call, 1-100.
- `cursor` (string, optional) — Continue a previous call: pass back its `next_cursor`. `next_cursor: null` is the end.
- `country` (enum, optional, default "us") — Depop market. Search returns that market's listings; every price is also priced for a buyer in this country (`buyer_view`: buyer fee, import tax, national or international shipping). [one of: us, gb, au, ca, nz, de, fr, it, ie]
- `region` (string, optional) — country=us only: the buyer's US state code (CA, NY, TX …). Depop's US buyer fee depends on the buyer's state — measured: CA and OR pay it, NY and TX do not. Without a state, US prices are shown with no state fee.
- `max_rotations` (integer, optional, default 3) — Advanced: how many times to retry a difficult request (1-5).

**Returns:** results[]{listing_id, slug, url, description, brand, brand_id, category, group, product_type, gender, is_kids, condition, condition_label, colours[], sizes[]{size, quantity, status}, quantity, status (on_sale|sold|reserved…), is_sold, price (number — the seller's item price now), currency (the listing's), original_price (the struck price when Depop marks the listing reduced, else null), discount_percent, is_discounted, shipping_price, buyer_view{country, us_state (country=us: the `region` used, null = no state fee), headline_price (what Depop shows a buyer in `country`), headline_currency, headline_includes{buyer_fee, tax, shipping}, buyer_fee, tax, tax_type, shipping_price, shipping_boundary (national|international)}, shipping_provider, shipping_payer, like_count, image, image_count, seller_id (seller rows and similar rows; null in search), seller_country, location, is_boosted, listed_at (seller rows and similar rows), updated_at}, count, next_cursor, has_more, seller{id, username}, availability, sort, country

### POST /depop/v1/seller/profile — 1 credit
A seller's public Depop shop profile by username, id or shop URL: username, verified flag, bio, website, picture, followers and following, star rating with review count (split into reviews as seller and as buyer), items sold and when they were last seen.

**Parameters:**
- `seller` (string, required) — Seller username (depop.com/<username>), the shop URL, or the numeric seller id (`seller.id` / `seller_id`).
- `max_rotations` (integer, optional, default 3) — Advanced: how many times to retry a difficult request (1-5).

**Returns:** seller{id, username, url, verified, bio, website, picture, followers, following, rating, rating_scale, review_count, reviews_as_seller, reviews_as_buyer, items_sold, last_seen}

### POST /depop/v1/seller/reviews — 1 credit
The public reviews on a seller's shop: star rating, text, date, the listing it was for, and the reviewer's username. role=seller for reviews buyers left for this seller (default), role=buyer for reviews sellers left for them as a buyer. Paged with `next_cursor`.

**Parameters:**
- `seller` (string, required) — Seller username (depop.com/<username>), the shop URL, or the numeric seller id (`seller.id` / `seller_id`).
- `role` (enum, optional, default "seller") — Which reviews to return. [one of: seller, buyer]
- `limit` (integer, optional, default 24) — Reviews per call, 1-50.
- `cursor` (string, optional) — Continue a previous call: pass back its `next_cursor`. `next_cursor: null` is the end.
- `max_rotations` (integer, optional, default 3) — Advanced: how many times to retry a difficult request (1-5).

**Returns:** reviews[]{rating, rating_scale, text, date, transaction_id, listing_id, listing_image, reviewer{id, username, verified}}, count, next_cursor, has_more, seller{id, username}, role

### POST /depop/v1/suggest — 1 credit
Depop's search suggestions for a partial query — each with the category and gender it points at — or, with type=sellers, matching seller usernames.

**Parameters:**
- `query` (string, required) — The start of a search, or of a username when type=sellers.
- `type` (enum, optional, default "keywords") — What to suggest. [one of: keywords, sellers]
- `country` (enum, optional, default "us") — Depop market. Search returns that market's listings; every price is also priced for a buyer in this country (`buyer_view`: buyer fee, import tax, national or international shipping). [one of: us, gb, au, ca, nz, de, fr, it, ie]
- `max_rotations` (integer, optional, default 3) — Advanced: how many times to retry a difficult request (1-5).

**Returns:** suggestions[]{text, category, gender, label} | sellers[]{id, username, url, picture}, count, query, type, country

**Example request body:**
```json
{
  "query": "nike"
}
```

## More
- Try it live, no code: https://reefapi.com/playground?engine=depop
- Human docs page: https://reefapi.com/docs/depop
- Overview page: https://reefapi.com/depop-api
- Every ReefAPI API in one file (for your AI): https://reefapi.com/llms-full.txt
