Mercari active listings
GET /v1/mercari/listings searches one page of Mercari US active listings by keyword, with condition, price, category and brand filters.
https://api.soldgraph.com/v1/mercari/listingsSearch Mercari US listings that are for sale now. Each call returns one page of up to 100 rows, in the order you pick with sort.
displayed_price is the price Mercari shows. listed_at is when the listing was created. displayed_shipping and shipping_text are always null, because we can't verify Mercari's shipping amounts. promoted, bid_count, ends_at, best_offer and location_text are always null too. format is always fixed_price.
condition is Mercari's label, like Like New, and condition_id is its number. Rows also have Mercari's seller, category and brand IDs. brand and size are always null, because Mercari search doesn't return those names. Listings with a sale in progress are left out.
| Parameter | Type | Default | Description |
|---|---|---|---|
q | string | Required | Search keywords, 1–200 characters, as you'd type them into the marketplace's search box. Be specific: model, size, grade, edition. |
page | integer, 1–100 | 1 | Source page to fetch. On Poshmark, Mercari and Depop, pages after 1 also need cursor. |
min_price | integer, 0–1000000 | Lowest price, in whole US dollars. Optional. Must not be more than max_price. You can send it without max_price. | |
max_price | integer, 0–1000000 | Highest price, in whole US dollars. Optional. You can send it without min_price. | |
marketplace | mercari | mercari | Optional. If sent, it must be mercari. |
country | us | us | Only us is supported. |
condition | new, like_new, good, fair or poor | One Mercari condition: new, like_new, good, fair or poor. Rows return Mercari's label and condition_id. | |
cursor | string | The previous page's next_cursor. Leave it out on page 1. Keep every other parameter the same. | |
count | integer, 1–100 | 100 | Most rows per page. Mercari can return fewer. |
sort | best_match, newest, price_asc, price_desc or most_popular | best_match | Mercari's result order. newest sorts by when the listing was created. |
category_id | integer, 1–2147483647 | Mercari numeric category ID. Optional. | |
brand_id | integer, 1–2147483647 | Mercari numeric brand ID. Optional. |
curl -G https://api.soldgraph.com/v1/mercari/listings \ -H "Authorization: Bearer $SOLDGRAPH_KEY" \ --data-urlencode "q=sony headphones" \ -d page=1 \ -d count=25The first call usually returns 202 and a job to poll. Search jobs covers polling and retries.
#Filters and sorting
conditiontakes one Mercari condition:new,like_new,good,fairorpoor.min_priceandmax_priceare whole US dollars. You can send either one alone.category_idandbrand_idare Mercari's numeric IDs.countsets the most rows per page, from 1 to 100.sortisbest_match(default),newest,price_asc,price_descormost_popular.newestorders by when the listing was created.
Mercari applies the filters, so reported_total counts only matching listings. Keep the same filters, sort and count on every page.
#Pages and cursors
Start with page=1 and no cursor. For the next page, send page set to next_page and cursor set to next_cursor from the last result.
- A later page without a cursor, a cursor from a different search, or a cursor in the wrong format returns
422. - When
next_cursoris null, you're on the last page. You can request at most 100 pages. page_sizecounts the rows Mercari returned before we removed listings that aren't for sale. Socountcan be smaller.- Results are in the order you pick with
sort.reported_totalmay be capped. - The same listing can show up on more than one page. Deduplicate by
idwhen you combine pages.
The dashboard Playground has Next page and Start over buttons that handle cursors for you.
#Example response
{ "request_id": "00000000-0000-4000-8000-000000000001", "status": "complete", "credits": 1, "cached": false, "result": { "provider": "mercari", "country": "us", "query": "sony headphones", "page": 1, "page_size": 1, "count": 1, "reported_total": 1, "next_page": null, "collected_at": "2026-09-23T14:02:11Z", "schema_version": 1, "completeness": "provider_page_only", "data": [ { "id": "m00000000001", "title": "Illustrative Sony headphones listing", "link": "https://www.mercari.com/us/item/m00000000001/", "promoted": null, "format": "fixed_price", "displayed_price": { "amount": 42, "currency": "USD" }, "displayed_price_text": "$42.00", "displayed_shipping": null, "shipping_text": null, "condition": "Good", "brand": null, "size": null, "listed_at": "2026-09-27T10:04:12-07:00", "bid_count": null, "ends_at": null, "best_offer": null, "seller_text": "123456789", "location_text": null, "image": null, "condition_id": 3, "brand_id": 1, "category_id": 1594, "seller_id": "123456789", "status": "active" } ], "field_notes": "Displayed prices are marketplace listing amounts, not independently verified transaction or accepted-offer amounts. Sold timestamps are source-reported and may be absent. Trading items are excluded. Brand/category IDs are source IDs; labels and size are null. Reported totals may be capped. Results cover one source page only.", "next_cursor": null }}| Field | Type | Description |
|---|---|---|
request_id | string | ID of this request. Poll it at /v1/jobs/{request_id}. |
status | string | pending, complete or failed. Always check it, even on HTTP 200. |
credits | integer | Requests charged: 1 when complete, 0 while pending or when failed. |
cached | boolean | True when the result came from the 15-minute cache. |
poll_url | string | Only while pending. A path like /v1/jobs/{id}: join it to https://api.soldgraph.com, not to the /v1 base URL. |
error.code | string | Only when failed. See failed job codes. |
result | object | Only when complete. One source page from the marketplace. |
result.provider | string | Marketplace ID, like ebay or poshmark. |
result.country | string | Always us. |
result.query | string | The q you sent, with extra spaces removed. |
result.page | integer | The page you asked for. |
result.count | integer | Rows in result.data on this page. |
result.reported_total | integer | Total matches the marketplace reports for the search. It may be rounded or capped. |
result.next_page | integer | null | Send this as page to get the next page. Null on the last page. |
result.collected_at | string | When we collected the page, as an ISO 8601 timestamp. |
result.schema_version | integer | Version of this response shape. Currently 1. |
result.completeness | string | Always provider_page_only: one page, not a full sales history. |
result.field_notes | string | Plain-text notes on how to read this page's fields. |
result.page_size | integer | Rows Mercari returned before we removed listings that aren't for sale. It can be larger than count. |
result.next_cursor | string | null | Send this as cursor, with page=next_page, to get the next page. Null on the last page. |
result.data[].id | string | The marketplace's listing ID. |
result.data[].title | string | null | Listing title as shown. |
result.data[].link | string | URL of the listing on the marketplace. |
result.data[].promoted | null | Always null on Mercari. |
result.data[].format | string | Always fixed_price on Mercari. |
result.data[].displayed_price | object | { amount, currency } of the price Mercari shows. |
result.data[].displayed_price_text | string | null | The price text, like $35.00. |
result.data[].displayed_shipping | null | Always null on Mercari. |
result.data[].shipping_text | null | Always null on Mercari. |
result.data[].condition | string | null | Mercari's condition label: New, Like New, Good, Fair or Poor. |
result.data[].brand | null | Always null on Mercari. Search doesn't return the brand name. |
result.data[].size | null | Always null on Mercari. Search doesn't return the size. |
result.data[].listed_at | string | null | When the listing was published, as an ISO 8601 timestamp. |
result.data[].bid_count | null | Always null on Mercari. |
result.data[].ends_at | null | Always null on Mercari. |
result.data[].best_offer | null | Always null on Mercari. |
result.data[].seller_text | string | null | The seller's Mercari ID, as a string. |
result.data[].location_text | null | Always null on Mercari. |
result.data[].image | string | null | Image URL on Mercari's image CDN. |
result.data[].status | string | Always active on this route. Listings with a sale in progress are left out. |
result.data[].seller_id | string | null | The seller's Mercari ID. |
result.data[].condition_id | integer | null | Mercari's condition number: 1 new, 2 like new, 3 good, 4 fair, 5 poor. |
result.data[].category_id | integer | null | Mercari's category ID for the listing. |
result.data[].brand_id | integer | null | Mercari's brand ID. The brand name isn't returned. |