Poshmark sold listings

GET /v1/poshmark/sold searches one page of Poshmark US sold listings by keyword, with condition and price filters, and returns JSON.

GEThttps://api.soldgraph.com/v1/poshmark/sold

Search Poshmark US sold listings by keyword. Each call returns one page of results, not a full sales history. Poshmark has no public API of its own. See Poshmark API.

displayed_price is the listing's asking price, not what the buyer paid. Offers and bundles can change the final price. price, shipping, sold_at and took_offer are always null. displayed_shipping and shipping_text are always null too, because Poshmark search doesn't show shipping.

sold_date_text is when the listing changed to sold out, as a full timestamp. sold_date is its date part, like 2026-09-28. condition is Poshmark's own code, like nwt or ug. brand and size are what the seller entered.

ParameterTypeDefaultDescription
qstringRequiredSearch keywords, 1–200 characters, as you'd type them into the marketplace's search box. Be specific: model, size, grade, edition.
pageinteger, 1–1001Source page to fetch. On Poshmark, Mercari and Depop, pages after 1 also need cursor.
min_priceinteger, 0–1000000Lowest price, in whole US dollars. Optional. Must not be more than max_price. You can send it without max_price.
max_priceinteger, 0–1000000Highest price, in whole US dollars. Optional. You can send it without min_price.
marketplaceposhmarkposhmarkOptional. If sent, it must be poshmark.
countryususOnly us is supported.
conditionnwt, uln, ug or ufOne of Poshmark's own condition codes: nwt (new with tags), uln (like new), ug (good) or uf (fair). Rows use the same codes. Poshmark filters one condition at a time, so more than one returns 422.
cursorstringThe previous page's next_cursor. Leave it out on page 1. Required on every later page.
curl -G https://api.soldgraph.com/v1/poshmark/sold \  -H "Authorization: Bearer $SOLDGRAPH_KEY" \  --data-urlencode "q=Levis 501" \  -d page=1

The first call usually returns 202 and a job to poll. Search jobs covers polling and retries.

#Filters

  • condition takes one Poshmark code: nwt, uln, ug or uf. Poshmark filters one condition at a time, so more than one returns 422.
  • min_price and max_price are whole US dollars. You can send either one alone.

Poshmark applies the filters, so reported_total counts only matching listings. Keep the same filters on every page.

#Condition codes

The API returns Poshmark's condition code as-is. It doesn't turn codes into words or match them to eBay's conditions. For reference, the codes mean:

CodeMeaningCan filter by it
nwtNew with tagsYes
not_nwtNew without tagsNo
retBoutique or retailNo
ulnLike newYes
ugGoodYes
ufFairYes

#Pages and cursors

Start with page=1 and no cursor. For the next page, send the same q with page set to next_page and cursor set to next_cursor from the last result.

  • A later page without a cursor, or a cursor in the wrong format, returns 422.
  • A cursor Poshmark doesn't accept fails the job with error.code rejected. It costs nothing.
  • page_size counts the rows Poshmark returned before we removed listings that aren't sold. So count can be smaller.
  • Results are in Poshmark's order, and reported_total may be capped.
  • If Poshmark finds no matches, we drop the unrelated suggestions it shows and return an empty page.

In the Try it panel below, set page and paste next_cursor into cursor to get a later page. The dashboard Playground has a Next page button that does this for you.

#Example response

Response
{  "request_id": "00000000-0000-4000-8000-000000000001",  "status": "complete",  "credits": 1,  "cached": false,  "result": {    "provider": "poshmark",    "country": "us",    "query": "Levis 501",    "page": 1,    "page_size": 48,    "count": 1,    "reported_total": 1,    "next_page": null,    "collected_at": "2026-09-23T14:02:11Z",    "schema_version": 1,    "completeness": "provider_page_only",    "data": [      {        "id": "000000000000000000000001",        "title": "Example Levi’s 501 jeans",        "link": "https://poshmark.com/listing/000000000000000000000001",        "displayed_price": {          "amount": 35,          "currency": "USD"        },        "displayed_price_text": "$35.00",        "displayed_shipping": null,        "shipping_text": null,        "sold_date": "2026-09-28",        "sold_date_text": "2026-09-28T22:16:54-07:00",        "condition": "ug",        "seller_text": "closetofkate",        "brand": "Levi's",        "size": "32",        "image": "https://di2ponv0v5otw.cloudfront.net/posts/example.jpg",        "price": null,        "shipping": null,        "sold_at": null,        "took_offer": null      }    ],    "field_notes": "Displayed prices are listing asks, not verified transaction or accepted-offer amounts. sold_date_text is the inventory sold_out status change time; unverified fields are null. Only listings with sold_out inventory are included.",    "next_cursor": null  }}
FieldTypeDescription
request_idstringID of this request. Poll it at /v1/jobs/{request_id}.
statusstringpending, complete or failed. Always check it, even on HTTP 200.
creditsintegerRequests charged: 1 when complete, 0 while pending or when failed.
cachedbooleanTrue when the result came from the 15-minute cache.
poll_urlstringOnly while pending. A path like /v1/jobs/{id}: join it to https://api.soldgraph.com, not to the /v1 base URL.
error.codestringOnly when failed. See failed job codes.
resultobjectOnly when complete. One source page from the marketplace.
result.providerstringMarketplace ID, like ebay or poshmark.
result.countrystringAlways us.
result.querystringThe q you sent, with extra spaces removed.
result.pageintegerThe page you asked for.
result.countintegerRows in result.data on this page.
result.reported_totalintegerTotal matches the marketplace reports for the search. It may be rounded or capped.
result.next_pageinteger | nullSend this as page to get the next page. Null on the last page.
result.collected_atstringWhen we collected the page, as an ISO 8601 timestamp.
result.schema_versionintegerVersion of this response shape. Currently 1.
result.completenessstringAlways provider_page_only: one page, not a full sales history.
result.field_notesstringPlain-text notes on how to read this page's fields.
result.page_sizeintegerRows Poshmark returned before we removed listings that aren't sold. It can be larger than count.
result.next_cursorstring | nullSend this as cursor, with page=next_page, to get the next page. Null on the last page.
result.data[].idstringThe marketplace's listing ID.
result.data[].titlestring | nullListing title as shown.
result.data[].linkstringURL of the listing on the marketplace.
result.data[].displayed_priceobject{ amount, currency } of the listing's asking price. Not what the buyer paid.
result.data[].displayed_price_textstring | nullThe price text as shown, like $189.00.
result.data[].displayed_shippingnullAlways null on Poshmark.
result.data[].shipping_textnullAlways null on Poshmark.
result.data[].sold_datestringDate part of sold_date_text, as YYYY-MM-DD.
result.data[].sold_date_textstringWhen the listing's inventory changed to sold out, as an ISO 8601 timestamp. Not a verified sale time.
result.data[].conditionstring | nullPoshmark's own condition code, as Poshmark returns it, like nwt or ug. See condition codes.
result.data[].seller_textstring | nullThe seller's Poshmark username.
result.data[].brandstring | nullBrand as the seller entered it.
result.data[].sizestring | nullSize as the seller entered it.
result.data[].imagestring | nullImage URL on Poshmark's image CDN.
result.data[].pricenullAlways null. Reserved for a verified sale price.
result.data[].shippingnullAlways null. Reserved for a verified shipping amount.
result.data[].sold_atnullAlways null. Reserved for a verified sale time.
result.data[].took_offernullAlways null. Reserved for whether a Best Offer was accepted.
Try it
Request
curl -G https://api.soldgraph.com/v1/poshmark/sold \  -H "Authorization: Bearer $SOLDGRAPH_KEY" \  --data-urlencode "q=Levis 501"
Sign in to runFree account, no card.

The nwt filter can also return legacy ret (Boutique) rows. We observed this in live sold search; Poshmark announced conversion of Boutique listings to NWT. Returned condition codes are preserved rather than rewritten.