Every API here is available over the APIs.io API and to AI agents over MCP.
openapi: 3.2.0
info:
title: Soldgraph Depop API
version: 1.0.0
description: Resale listings from eight marketplaces (eBay in 8 countries; Vinted in the US, UK and 24 European countries; Poshmark and Whatnot in the US and Canada; Depop in the US, UK, Australia and Canada; the rest US), plus TCGplayer product search and recent card sales.
contact:
url: https://soldgraph.com/docs
servers:
- url: https://api.soldgraph.com/v1
security:
- bearer: []
tags:
- name: Depop
paths:
/depop/listings:
get:
operationId: depop_listings
tags:
- Depop
summary: Depop active listings
description: Search one page of Depop active listings by keyword, from sellers in the US, UK, Australia or Canada, up to 100 rows. Pages use a cursor. Results are cached for 15 minutes. A cache miss returns 202 and a job to poll.
externalDocs:
url: https://soldgraph.com/docs/api/depop-listings
parameters:
- name: q
in: query
required: true
description: 'Search keywords, 1–200 characters, as you''d type them into the marketplace''s search box. Be specific: model, size, grade, edition.'
schema:
type: string
minLength: 1
maxLength: 200
- name: page
in: query
required: false
description: Source page to fetch. Where an endpoint has cursor, pages after 1 also need it.
schema:
type: integer
minimum: 1
maximum: 100
default: 1
- name: min_price
in: query
required: false
description: Lowest price, in whole units of the country's currency (US dollars for us). Optional. Must not be more than max_price. You can send it without max_price.
schema:
type: integer
minimum: 0
maximum: 1000000
- name: max_price
in: query
required: false
description: Highest price, in whole units of the country's currency (US dollars for us). Optional. You can send it without min_price.
schema:
type: integer
minimum: 0
maximum: 1000000
- name: marketplace
in: query
required: false
description: Optional. If sent, it must be depop.
schema:
type: string
enum:
- depop
default: depop
- name: country
in: query
required: false
description: 'Which country''s sellers to search: us (US dollars), uk (pounds), au (Australian dollars) or ca (Canadian dollars). Results, prices, min_price and max_price use that country''s currency. Optional.'
schema:
type: string
enum:
- us
- uk
- au
- ca
default: us
- name: condition
in: query
required: false
description: 'One Depop condition: brand_new, used_like_new, used_excellent, used_good or used_fair. Rows return the same codes.'
schema:
type: string
enum:
- brand_new
- used_like_new
- used_excellent
- used_good
- used_fair
- name: count
in: query
required: false
description: Most rows per page. Depop can return fewer.
schema:
type: integer
minimum: 1
maximum: 100
default: 24
- name: cursor
in: query
required: false
description: The previous page's next_cursor. Leave it out on page 1. Keep the query, filters and count the same.
schema:
type: string
minLength: 1
maxLength: 2048
- name: Idempotency-Key
in: header
required: false
description: Send the same key when you retry the same search, so you aren't charged twice. 1–128 printable ASCII characters, no spaces.
schema:
type: string
pattern: ^[!-~]{1,128}$
responses:
'200':
description: Complete, including cache hits. Costs 1 request.
headers:
X-Request-Id:
description: Unique ID for this response. Include it when you contact support.
schema:
type: string
content:
application/json:
schema:
$ref: '#/components/schemas/DepopListingsJob'
example:
request_id: example-depop-search
status: complete
credits: 1
cached: false
result:
provider: depop
country: us
query: nike
page: 1
page_size: 5
count: 5
reported_total: 2863606
next_page: 2
next_cursor: WyJNbncxZkRFM09UQTNNRGswTlRBLkJPT1NURURfRVhIQVVTVEVELjAiLCAiNzIyMGVhY2U5NDgxZWU5Y2E5ZDllNjRhNzE3YmE5ZTk2MWRmZmM2ZDg3OTRmNDU4ODNkY2E2ZDdiMjQ3NjRlZiIsIDJd
collected_at: '2026-09-29T19:17:31.799685+00:00'
schema_version: 2
completeness: provider_page_only
summary:
priced_count: 5
currency: USD
median: 5.95
low: 5.95
high: 19.6
p25: 5.95
p75: 7
data:
- id: '929885807'
title: 'Nike Bra in solid light green Size: M 💚 #activewear #sports #nike #sportbra Brand new'
link: https://www.depop.com/products/lovexzat-nike-bra-in-solid-light-4c6d/
displayed_price:
amount: 5.95
currency: USD
displayed_price_text: $5.95
price_includes:
- buyer_fee
condition: brand_new
brand: Nike
size: M
image: https://media-photos.depop.com/r1/7548776/4806392865_e376f6e8a5e14144b78062921e1cd94e/P0.jpg
promoted: false
location_text: Los Angeles, United States
like_count: 4
- id: '930772677'
title: 'Nike SB hoodie with white and yellow ''NIKE SB'' logo, size L #skateboarding #sb'
link: https://www.depop.com/products/abbimjelsema-nike-sb-hoodie-with-white-7e9d/
displayed_price:
amount: 5.95
currency: USD
displayed_price_text: $5.95
price_includes:
- buyer_fee
condition: used_fair
brand: Nike
size: L
image: https://media-photos.depop.com/r1/218735601/4811656506_4d0e4793b3b24c6686684127e03e96ed/P0.jpg
promoted: false
location_text: Byron Center, United States
like_count: 10
- id: '930226367'
title: 'Nike Tech Fleece black sweatpants size XS #techfleece #nike#black#tech#pants'
link: https://www.depop.com/products/kanuc2i-nike-tech-fleece-black-sweatpants-b7e1/
displayed_price:
amount: 19.6
currency: USD
displayed_price_text: $19.60
price_includes:
- buyer_fee
condition: used_good
brand: Nike
size: XS
image: https://media-photos.depop.com/b1/47345678/4808288131_3f9d82598a9f4450b808552d9e1e3283/P0.jpg
promoted: false
location_text: Portland, United States
like_count: 3
- id: '929853097'
title: 'grey nike pros size small worn a few times!! #nike #nikepros #grey'
link: https://www.depop.com/products/mollygraceaver5-grey-nike-pros-size-small-448f/
displayed_price:
amount: 5.95
currency: USD
displayed_price_text: $5.95
price_includes:
- buyer_fee
condition: used_excellent
brand: Nike
size: One size
image: https://media-photos.depop.com/r1/370197255/4806213953_fcdec04586e846df916b12f133ba429d/P0.jpg
promoted: false
location_text: Ona, United States
like_count: 7
- id: '930263070'
title: 'Nike black hoodie Size XL men’s used #athleisure #nike #hoodie #sweatshirt'
link: https://www.depop.com/products/throwbakkkingz-nike-black-hoodie-size-xl-aef6/
displayed_price:
amount: 7
currency: USD
displayed_price_text: $7.00
price_includes:
- buyer_fee
condition: used_fair
brand: Nike
size: XL
image: https://media-photos.depop.com/b1/37215522/4808493787_8d99ee61ab824899a0f459149b19efc3/P0.jpg
promoted: false
location_text: Olympia, United States
like_count: 2
field_notes: Active US listings with USD prices only; non-USD source rows are excluded. displayed_price is Depop's USD headline amount; price_includes identifies fees included by the source. Price bounds apply to source search prices, which may differ from the headline. Shipping, seller identity and listing timestamps are not provided. Source order is preserved. Totals may be absent on later pages. No transaction price or sold-search capability is provided.
'202':
description: 'Pending. Poll `poll_url` (or `Location`) with the same API key. Both are paths: join them to https://api.soldgraph.com.'
headers:
X-Request-Id:
description: Unique ID for this response. Include it when you contact support.
schema:
type: string
Location:
description: Job path, like /v1/jobs/{id}.
schema:
type: string
Retry-After:
description: Always 2. Prefer long-polling with ?wait=20.
schema:
type: integer
content:
application/json:
schema:
$ref: '#/components/schemas/DepopListingsJob'
example:
request_id: 00000000-0000-4000-8000-000000000001
status: pending
credits: 0
cached: false
poll_url: /v1/jobs/00000000-0000-4000-8000-000000000001
'401':
description: 'invalid_api_key: The API key is missing, malformed or revoked.'
headers:
X-Request-Id:
description: Unique ID for this response. Include it when you contact support.
schema:
type: string
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
'403':
description: 'account_suspended: The account is suspended, so none of its keys work. Email support to restore it. origin_not_allowed: A browser sent the request from a site that isn''t allowed. Call the API from your server.'
headers:
X-Request-Id:
description: Unique ID for this response. Include it when you contact support.
schema:
type: string
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
'404':
description: 'not_found: No such path. request_not_found: The job ID is well-formed but unknown, or belongs to another account. An ID that isn''t a UUID is no such path: 404 not_found. batch_not_found: No batch with that ID belongs to this account. Or a replay of a search that failed because of the search (the body is then the failed job): not_found.'
headers:
X-Request-Id:
description: Unique ID for this response. Include it when you contact support.
schema:
type: string
content:
application/json:
schema:
anyOf:
- $ref: '#/components/schemas/Error'
- $ref: '#/components/schemas/DepopListingsJob'
'405':
description: 'method_not_allowed: Wrong method for this route. Searches, jobs and usage use GET. Only /v1/batches takes POST.'
headers:
X-Request-Id:
description: Unique ID for this response. Include it when you contact support.
schema:
type: string
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
'409':
description: 'idempotency_conflict: This Idempotency-Key was already used with different search parameters. result_not_ready: CSV was requested before every search settled. Poll as JSON until status is complete, then ask for CSV.'
headers:
X-Request-Id:
description: Unique ID for this response. Include it when you contact support.
schema:
type: string
Retry-After:
description: Seconds to wait before retrying.
schema:
type: integer
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
'413':
description: 'payload_too_large: The batch body is over 256 KB.'
headers:
X-Request-Id:
description: Unique ID for this response. Include it when you contact support.
schema:
type: string
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
'414':
description: 'uri_too_long: The query string is longer than 2,048 characters.'
headers:
X-Request-Id:
description: Unique ID for this response. Include it when you contact support.
schema:
type: string
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
'415':
description: 'unsupported_media_type: A batch must be sent as Content-Type: application/json.'
headers:
X-Request-Id:
description: Unique ID for this response. Include it when you contact support.
schema:
type: string
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
'422':
description: 'unsupported_or_invalid_query: An unknown parameter, or a value outside the documented range. error.param names the input to fix when it is one of the route''s inputs. duplicate_parameter: A parameter was sent more than once. sort_not_implemented: sort=best_deal is not available. invalid_idempotency_key: Idempotency-Key must be 1–128 printable ASCII characters, with no spaces. invalid_wait: wait must be a whole number from 0 to 20. invalid_body: The batch body is not JSON, or has no searches list. batch_too_large: The batch holds more searches than your plan allows at once. pages counts as one search per page. invalid_format: format must be json or csv, and include must be results. Or a replay of a search that failed because of the search (the body is then the failed job): rejected, filter_not_supported, filter_not_applied, location_not_served.'
headers:
X-Request-Id:
description: Unique ID for this response. Include it when you contact support.
schema:
type: string
content:
application/json:
schema:
anyOf:
- $ref: '#/components/schemas/Error'
- $ref: '#/components/schemas/DepopListingsJob'
'429':
description: 'rate_limited: More than 60 API calls this minute for your account. quota_exceeded: Your plan''s allowance is used up, and you have no extra requests left. too_many_pending: Your account has too many searches still pending. Wait for results before sending more.'
headers:
X-Request-Id:
description: Unique ID for this response. Include it when you contact support.
schema:
type: string
Retry-After:
description: Seconds to wait before retrying.
schema:
type: integer
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
'503':
description: 'Temporary failure, or a replay of a failed search (the body is then the failed job). upstream_daily_limit: The marketplace''s daily limit was reached, so new searches are paused. Cached results still work. queue_full: The collection queue is full. collection_unavailable: We can''t collect from this marketplace right now. storage_unavailable: Our database is briefly unavailable. origin_unavailable: The edge couldn''t reach our API server. service_unconfigured: The API is misconfigured on our side. Contact support.'
headers:
X-Request-Id:
description: Unique ID for this response. Include it when you contact support.
schema:
type: string
Retry-After:
description: Seconds to wait before retrying.
schema:
type: integer
content:
application/json:
schema:
anyOf:
- $ref: '#/components/schemas/Error'
- $ref: '#/components/schemas/DepopListingsJob'
components:
schemas:
Money:
type: object
required:
- amount
- currency
properties:
amount:
type: number
currency:
type: string
description: ISO 4217 code, like USD.
Error:
type: object
required:
- error
properties:
error:
type: object
required:
- code
properties:
code:
type: string
enum:
- invalid_api_key
- account_suspended
- origin_not_allowed
- not_found
- request_not_found
- batch_not_found
- method_not_allowed
- idempotency_conflict
- result_not_ready
- payload_too_large
- uri_too_long
- unsupported_media_type
- unsupported_or_invalid_query
- duplicate_parameter
- sort_not_implemented
- invalid_idempotency_key
- invalid_wait
- invalid_body
- batch_too_large
- invalid_format
- rate_limited
- quota_exceeded
- too_many_pending
- upstream_daily_limit
- queue_full
- collection_unavailable
- storage_unavailable
- origin_unavailable
- service_unconfigured
message:
type: string
description: What the code means, in plain words. On every error; safe to show to a user.
param:
type: string
description: 'On a 422: the input to fix, when it is one of the route''s inputs. Never a value.'
index:
type: integer
description: 'On a refused batch: the position of the search to fix.'
upgrade_url:
type: string
format: uri
description: 'On quota_exceeded: the billing page, where you move to a larger plan or buy extra requests.'
DepopListingsRow:
type: object
required:
- id
- title
- link
- promoted
- displayed_price
- displayed_price_text
- condition
- brand
- size
- location_text
- like_count
- image
- price_includes
properties:
id:
type: string
description: The marketplace's listing ID.
title:
type:
- string
- 'null'
description: Depop's listing description, up to 2,000 characters.
link:
type: string
description: URL of the listing on the marketplace.
promoted:
type:
- boolean
- 'null'
description: Whether Depop marks the listing as boosted.
displayed_price:
$ref: '#/components/schemas/Money'
description: '{ amount, currency } of Depop''s headline price, in the country''s currency. It includes the parts listed in price_includes. It isn''t what a buyer paid.'
displayed_price_text:
type:
- string
- 'null'
description: The headline price as text, like $52.00, £24.75, A$50.00 or C$89.00.
condition:
type:
- string
- 'null'
description: Depop's condition code, like used_good.
brand:
type:
- string
- 'null'
description: The brand Depop shows, when there is one.
size:
type:
- string
- 'null'
description: The sizes available, when Depop lists them.
location_text:
type:
- string
- 'null'
description: The location Depop shows, when there is one.
like_count:
type:
- integer
- 'null'
description: How many Depop users have liked the listing. Null when Depop doesn't report it.
image:
type:
- string
- 'null'
description: Image URL on Depop's photo CDN.
price_includes:
type: array
items:
type: string
description: 'What the headline price includes: buyer_fee, shipping_price, tax, or a mix. An empty array means none of them.'
DepopListingsJob:
type: object
required:
- request_id
- status
- credits
- cached
properties:
request_id:
type: string
description: ID of this request. Poll it at /v1/jobs/{request_id}.
status:
type: string
description: pending, complete or failed. Always check it, even on HTTP 200.
enum:
- pending
- complete
- failed
credits:
type: integer
description: 'Requests charged: 1 when complete, 0 for a page past the last one, while pending, or when failed.'
cached:
type: boolean
description: True when the result came from the 15-minute cache.
poll_url:
type: string
description: 'Only while pending. A path like /v1/jobs/{id}: join it to https://api.soldgraph.com, not to the /v1 base URL.'
result:
$ref: '#/components/schemas/DepopListingsPage'
error:
type: object
required:
- code
properties:
code:
type: string
enum:
- page_mismatch
- schema
- network
- upstream
- throttled
- blocked
- rejected
- not_found
- filter_not_supported
- filter_not_applied
- location_not_served
- auth
- daily_limit
- deadline_exceeded
- credential_storage
description: Failed job code.
message:
type: string
description: What the code means, in plain words.
DepopListingsPage:
type: object
required:
- provider
- country
- query
- page
- count
- reported_total
- next_page
- collected_at
- schema_version
- completeness
- field_notes
- page_size
- summary
- next_cursor
- reported_total
- data
properties:
provider:
type: string
description: Marketplace ID, like ebay or poshmark.
country:
type: string
description: 'The country searched: us, or on eBay the country you sent.'
query:
type: string
description: The q you sent, with extra spaces removed.
page:
type: integer
description: The page you asked for.
count:
type: integer
description: Rows in result.data on this page.
reported_total:
type:
- integer
- 'null'
description: The total Depop reports, when there is one. Often null after the first page. It doesn't mean full coverage.
next_page:
type:
- integer
- 'null'
description: Send this as page to get the next page. Null on the last page, and on page 100, the deepest page served.
collected_at:
type: string
description: When we collected the page, as an ISO 8601 timestamp.
schema_version:
type: integer
description: 'Version of the result''s shape for that marketplace: 1 or 2. It only rises when a field changes meaning.'
completeness:
type: string
description: 'provider_page_only: one page as the marketplace served it, not a full history. TCGplayer recent sales say recent_sample_only.'
field_notes:
type: string
description: Plain-text notes on how to read this page's fields.
page_size:
type: integer
description: Rows Depop returned before we removed listings that aren't active listings from the country you searched, priced in its currency. It can be larger than count.
summary:
type: object
properties:
priced_count:
type: integer
description: Rows on this page that show one price.
currency:
type: string
description: Currency of the amounts below.
median:
type:
- number
- 'null'
description: Middle displayed price of those rows.
low:
type:
- number
- 'null'
description: Lowest displayed price.
high:
type:
- number
- 'null'
description: Highest displayed price.
p25:
type:
- number
- 'null'
description: 'First-quartile displayed price: a quarter of priced rows are at or below it.'
p75:
type:
- number
- 'null'
description: Third-quartile displayed price. With `p25`, a range that ignores a stray accessory or parts listing.
required:
- priced_count
- currency
- median
- low
- high
- p25
- p75
description: 'Price maths over the rows on this page: priced_count, currency, median, low, high. No row is removed from data. Rows with no single readable price are left out of the maths.'
next_cursor:
type:
- string
- 'null'
description: Send this as cursor, with page=next_page, to get the next page. Null on the last page.
data:
type: array
items:
$ref: '#/components/schemas/DepopListingsRow'
securitySchemes:
bearer:
type: http
scheme: bearer
description: An API key from the Soldgraph dashboard, starting with sg_.