Skip to main content
GET
Completed / Sold Listings
The completed-listings endpoint returns sold items — the closing prices buyers actually paid, with the date each item sold. Every result has sold set to true on the response envelope. This is the data resellers, flippers and pricing tools rely on, since asking prices alone don’t reflect what items actually sell for. Search by keywords, by seller, or both. With seller and no query you get everything that seller sold.

Query Parameters

string
Search keywords. Matches against listing titles. Optional when seller is set; send at least one of the two.
string
Only this seller’s sold listings, by eBay username (e.g. musicmagpie). Works on its own, with no keyword, and combines with query and every other filter.
string
default:"com"
eBay marketplace domain TLD or alias. See /v1/ebay/markets for all supported values.Examples: com, co.uk, de, fr, com.au
string
Restrict results to an eBay category id. Use /v1/ebay/categories to look up ids.
integer
default:1
Page number for paginated results. Range: 1 - 100.Use pagination.has_more to know when to stop — eBay re-serves its last page if you ask past the end, so this API returns an empty page there.
integer
Results per page. Clamped to one of 60, 120, or 240. eBay puts at most 200 sold listings on a page, so 240 returns 200 and pagination.per_page says 200; pagination.returned says how many this page holds.
string
default:"best_match"
Sort order for results. On sold listings eBay applies only the price sorts.
string
Item condition filter (new, open_box, refurbished, used, for_parts).Trading cards also accept graded and ungraded — eBay’s card conditions for slabbed (PSA / BGS / CGC) versus raw cards. Pricing a raw card against sales that include slabs skews the average badly, so price the two separately.
string
Item location.Omit it and you get eBay’s default, which mixes foreign listings into a national marketplace. Two things follow from that, and both matter for price research: a national price series picks up sales that never happened in that country, and a foreign listing’s price is shown converted into the marketplace’s currency rather than the amount it actually sold for. location=domestic removes both.Any other value returns 400 invalid_location — it is never silently ignored.
number
Minimum sold-price filter in the marketplace’s local currency.
number
Maximum sold-price filter in the marketplace’s local currency.

Response

Identical shape to /v1/ebay/search, except sold is true, each result’s price reflects the final sold price, and each result carries a sold_date.
string
The search query that was executed.
string
Marketplace domain that was searched.
boolean
Always true for completed/sold listings.
array
Array of sold listings (same SearchResult shape as active search).
object
Available filter facets keyed by name.
object
Pagination metadata with current_page, per_page, total_results, has_more.total_results is populated (the sold results page carries a match count). total_pages may be null — page with has_more rather than a fixed page total.
string
ISO 8601 timestamp when the results were scraped.

Example Response

Sold listings for one seller

Pass seller without a query to page through everything one seller sold:
Every result is one of that seller’s sales, and seller_name says so. Add query, category_id, condition or a price range to narrow it down. eBay handles the request; no eBay account or cookies are needed on your side. How far back it reaches is eBay’s own sold history for that marketplace.

Fetching every sold listing

has_more is the stop signal for bulk extraction. Increment page while it is true:
Do not loop on “until the response is empty” alone. Past its last page eBay clamps — asking for page 200 of a 133-page result set re-serves page 133. This API detects that and returns an empty page with has_more: false, but a client that ignores has_more and retries forever will keep spending credits.
Pages stop at 100, so one search returns at most 20,000 listings at per_page=200; narrow a bigger result set with condition, category_id or a price range (min_price / max_price). Use the largest per_page you can: each request costs 8 credits regardless of page size, so per_page=200 is about 3x cheaper per listing than the default.

Collecting one day’s sales

Results come newest ended_at first, so one day of a seller’s sales is a run of consecutive pages. To collect a calendar day in your timezone:
  1. Convert the day’s start and end to UTC (for Europe/London on 1 November, 2026-11-01T00:00:00Z to 2026-11-02T00:00:00Z).
  2. Walk seller=<username>&per_page=200&page=1,2,…, keeping results whose ended_at falls inside that window.
  3. Stop at the first page whose last result has ended_at before the window’s start.
  4. De-duplicate on item_id.
Things to know before you rely on the count:
  • One result per listing, not per sale. A multi-quantity listing that sold several units appears once, at its latest sale. If it sells again after your day, it moves to that later time, so walk soon after the day ends.
  • eBay’s sold index is not perfectly consistent. The same page can come back slightly different from one call to the next (one seller’s page 1 came back in three versions, 217 listings between them, 200 each). A second walk later can return a few listings the first missed. Merge walks on item_id.
  • The sold history is eBay’s. It covers roughly the last 90 days.
A walk of N pages costs 8 × N credits. Your API key’s per-minute limit counts every /v1 call, so space a long walk out; a 429 carries a Retry-After header with the seconds to wait.
Each completed/sold request costs 8 credits. Failed requests are not charged.

Authorizations

x-api-key
string
header
required

Query Parameters

query
string

Search keywords. Optional when seller is set; send at least one of the two.

seller
string

Only this seller's sold listings (eBay username, e.g. musicmagpie). Works without query.

domain
string
default:com

eBay marketplace domain TLD or alias (com, co.uk, de, fr, ...).

category_id
string

Restrict results to a category id.

page
integer
default:1

Page number for paginated results.

Required range: 1 <= x <= 100
per_page
integer

Results per page. Clamped to 60, 120 or 240; eBay puts at most 200 on a page, so 240 returns 200 and pagination.per_page says 200.

Required range: 1 <= x <= 240
sort_by
enum<string>
default:best_match

Sort order. On sold listings eBay applies only the price sorts; best_match, ending_soonest and newly_listed all return the default order, newest ended_at first.

Available options:
best_match,
ending_soonest,
newly_listed,
price_low_to_high,
price_high_to_low
condition
enum<string>

Item condition. graded / ungraded are eBay's trading-card conditions — slabbed (PSA/BGS/CGC) vs raw — so a card can be priced separately from its slabs.

Available options:
new,
open_box,
refurbished,
used,
for_parts,
graded,
ungraded
min_price
number

Minimum price filter in the marketplace's local currency.

Required range: x >= 0
max_price
number

Maximum price filter in the marketplace's local currency.

Required range: x >= 0
location
enum<string>

Item location. domestic returns only items located in this marketplace's own country (domain=fr → France only); worldwide widens to every country. Foreign listings are priced in the marketplace's currency after eBay CONVERTS them, so domestic is also how you get untouched native sale prices.

Available options:
domestic,
worldwide

Response

200 - application/json

Completed / sold listings

query
string | null
domain
string
category_id
string | null
sold
boolean
results
object[]
facets
object
pagination
object
scraped_utc
number | null
scraped_at
string | null