eBay sold listings

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

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

Search eBay US sold listings by keyword. Each call returns one page of results, not a full sales history.

Moving off eBay's retired findCompletedItems? See findCompletedItems replacement.

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.
marketplaceebayebayOptional. If sent, it must be ebay.
countryususOnly us is supported.
conditionOne or more of new, open_box, refurbished, used, for_parts, comma-separatedeBay's own condition groups. Send one or more, separated by commas, like new,open_box. new is Brand New, open_box is Open Box or New (Other), refurbished is every refurbished grade, used is Pre-Owned and for_parts is Parts Only. eBay applies the filter.
curl -G https://api.soldgraph.com/v1/ebay/sold \  -H "Authorization: Bearer $SOLDGRAPH_KEY" \  --data-urlencode "q=sony wh-1000xm5" \  -d page=1

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

#Filters

  • condition takes one or more of eBay's condition groups, separated by commas, like new,open_box. The groups are new (Brand New), open_box (Open Box or New (Other)), refurbished (every refurbished grade), used (Pre-Owned) and for_parts (Parts Only).
  • min_price and max_price are whole US dollars. You can send either one alone.

eBay applies the filters, so reported_total counts only matching listings.

#Example response

Response
{  "request_id": "00000000-0000-4000-8000-000000000001",  "status": "complete",  "credits": 1,  "cached": false,  "result": {    "provider": "ebay",    "country": "us",    "query": "sony wh-1000xm5",    "page": 1,    "page_size": 40,    "count": 1,    "reported_total": 1,    "next_page": null,    "next_cursor": null,    "collected_at": "2026-09-23T14:02:11Z",    "schema_version": 1,    "completeness": "provider_page_only",    "data": [      {        "id": "123456789012",        "title": "Example eBay listing",        "link": "https://www.ebay.com/itm/123456789012",        "displayed_price": {          "amount": 189,          "currency": "USD"        },        "displayed_price_text": "$189.00",        "displayed_shipping": {          "amount": 9.99,          "currency": "USD"        },        "shipping_text": "+$9.99 delivery",        "sold_date": "2026-09-21",        "sold_date_text": "Sep-21 14:35",        "condition": "Pre-Owned",        "seller_text": "sonyfan_outlet (2,418) 99.6%",        "brand": null,        "size": null,        "image": "https://i.ebayimg.com/images/g/example/s-l500.jpg",        "price": null,        "shipping": null,        "sold_at": null,        "took_offer": null      }    ],    "field_notes": "Unverified fields are null. Displayed prices are not verified accepted-offer prices."  }}
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 per page, as eBay reports it.
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 | null{ amount, currency } parsed from the price shown. Null if it couldn't be read. Null when eBay shows a price range for a multi-variation listing ("$247.00 to $911.00"): the amount wouldn't say which variant. The range stays in displayed_price_text.
result.data[].displayed_price_textstring | nullThe price text as shown, like $189.00.
result.data[].displayed_shippingobject | null{ amount, currency } read from exact shipping text, like +$9.99 delivery. Free delivery is 0. Estimates and Shipping not specified are null.
result.data[].shipping_textstring | nullShipping text as shown, like +$9.99 delivery or Free delivery.
result.data[].sold_datestring | nullSale date as YYYY-MM-DD. eBay's text has no year, so we use the most recent date that matches.
result.data[].sold_date_textstring | nullSold date text as shown, like Sep-21 14:35. eBay leaves out the year.
result.data[].conditionstring | nulleBay's condition text as shown, like Pre-Owned.
result.data[].seller_textstring | nullSeller text as eBay shows it: username, feedback count and positive percentage, e.g. clutch_supply (1,325) 99.7%.
result.data[].brandnullAlways null on eBay.
result.data[].sizenullAlways null on eBay.
result.data[].imagestring | nullImage URL on i.ebayimg.com.
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.

displayed_price is the price eBay shows. It can differ from what the buyer paid, for example after an accepted offer. Fields we can't verify are null.

  • sold_date is the sale date as YYYY-MM-DD. eBay's sold_date_text has no year, so we use the most recent date that matches.
  • displayed_shipping is read only from exact text like +$9.99 delivery. Free delivery is 0. Estimates and Shipping not specified are null.
  • condition is eBay's own text, like Pre-Owned.
  • brand and size are always null on eBay. They exist so rows have the same fields on every marketplace.
Try it
Request
curl -G https://api.soldgraph.com/v1/ebay/sold \  -H "Authorization: Bearer $SOLDGRAPH_KEY" \  --data-urlencode "q=sony wh-1000xm5"
Sign in to runFree account, no card.