3-Year eBay Sold History API
Search up to 3 years of eBay sold history by keyword with GET /v1/research/sold, on every CompSniper plan including free.
GET /v1/research/sold returns eBay sold history going back up to 3 years, across all eight eBay
sites, with the same API key you already use for /v1/scrape. It is available on every plan,
including free.
Use it when 90 days is not enough: slow-moving items, seasonal trends, price changes after a release,
or a sale you remember from last year. For the most recent individual sales with full listing fields
and AI cleanup, keep using /v1/scrape.
How far back it goes
Up to 3 years before today. That is eBay's own limit for sold research data: in our October 2026 tests,
asking for 4 or 6 years returned exactly the same 3-year window, and eBay's own date picker stops at 3
years. Any startDate from 3 years ago up to today works.
Make a request
curl --fail-with-body \
-H "Authorization: Bearer cs_live_REPLACEWITHYOURKEY" \
"https://api.compsniper.com/v1/research/sold?keyword=nintendo+switch+oled&startDate=2023-10-11&endDate=2026-10-10&sort=lastSoldDescending&limit=50"import requests
response = requests.get(
"https://api.compsniper.com/v1/research/sold",
headers={"Authorization": "Bearer cs_live_REPLACEWITHYOURKEY"},
params={
"keyword": "nintendo switch oled",
"startDate": "2023-10-11",
"endDate": "2026-10-10",
"sort": "lastSoldDescending",
"limit": 50,
},
timeout=60,
)
response.raise_for_status()
data = response.json()
for row in data["results"]:
print(row["lastSoldDate"], row["soldUnits"], row["averageSoldPrice"]["amount"], row["title"])Parameters
| Parameter | Values | Default |
|---|---|---|
keyword | 1 to 200 characters | Required |
startDate | YYYY-MM-DD, no earlier than 3 years before today | Required |
endDate | YYYY-MM-DD, on or after startDate, no later than today (UTC) | Required |
ebaySite | ebay.com, ebay.co.uk, ebay.com.au, ebay.ca, ebay.de, ebay.fr, ebay.it, ebay.es | ebay.com |
sort | lastSoldDescending (newest sale first) or quantityAscending (eBay's units-sold order) | quantityAscending |
limit | 10, 20, or 50 rows per page | 50 |
page | 1 to 200 | 1 |
singleUnitOnly | true returns only listings that sold exactly one unit | false |
Unknown or repeated parameters are rejected with 400 invalid_params, so a typo never silently
changes your results.
Response
{
"source": "ebay_product_research",
"ebaySite": "ebay.com",
"displayCurrency": "USD",
"startDate": "2023-10-11",
"endDate": "2026-10-10",
"page": 1,
"limit": 50,
"sourceResultCount": 50,
"resultCount": 50,
"hasNextPage": true,
"nextPage": 2,
"relevanceApplied": false,
"warnings": [
"Listing-level records, not a transaction feed. Multi-unit rows contain averages.",
"USD is the research display currency, not necessarily the listing's original currency.",
"Older listing titles, links, images and conditions may be unavailable."
],
"results": [
{
"itemId": "267809186741",
"title": "Nintendo Switch OLED Console White Joy-Con Dock AC Adapter + 2 Games Included!",
"itemUrl": "https://www.ebay.com/itm/267809186741",
"imageUrl": "https://i.ebayimg.com/images/g/L3IAAeSwLcZqyUSi/s-l1200.png",
"recordType": "single_unit_listing",
"soldUnits": 1,
"averageSoldPrice": { "amount": "184.00", "currency": "USD", "display": "$ 184.00" },
"totalSales": { "amount": "184.00", "currency": "USD", "display": "$ 184.00" },
"averageShipping": { "amount": "10.00", "currency": "USD", "display": "$ 10.00" },
"soldPrice": { "amount": "184.00", "currency": "USD", "display": "$ 184.00" },
"soldDate": "2026-10-09",
"lastSoldDate": "2026-10-09",
"listingFormat": "Fixed price",
"condition": null
}
],
"requestId": "20fca48c-c1d6-4096-8f39-73a65d1cb9af"
}Rows are listings, not single transactions
Each row is one eBay listing and everything it sold inside your date range:
recordType: "single_unit_listing": the listing sold one unit.soldPriceandsoldDateare that sale.recordType: "listing_aggregate": the listing sold several units (common for multi-quantity fixed-price listings).soldUnitsis how many,averageSoldPriceandtotalSalesdescribe them,lastSoldDateis the most recent one, andsoldPriceandsoldDatearenull.
Use singleUnitOnly=true when you want one-off sales only, for example graded cards or used electronics.
Other things to know
- Prices are always USD, on every eBay site, because that is how eBay's research data is reported.
- No AI cleanup.
relevanceAppliedis alwaysfalse: rows are eBay's results for your keyword, so accessories and lots can appear. Filter by title on your side, or use precise keywords. - Condition is not available in this data (
conditionisnull). Older listings can also be missing a title, link, or image.
Pagination
Each page holds up to 50 rows. Follow nextPage while hasNextPage is true, up to page 200
(10,000 rows for one search). Each page is a separate request.
Billing and limits
- One page = one request from your normal monthly allowance (or purchased credits). There is no separate plan.
- Failed requests are free. A timeout, upstream error, or cancelled request is never charged.
- History has its own per-minute cap: 20 searches per minute per account, in addition to your plan's
normal per-minute limit. Every response carries
X-History-RateLimit-LimitandX-History-RateLimit-Remaining. Need more? Contact support.
Errors
| Status | Code | Meaning | What to do |
|---|---|---|---|
| 400 | invalid_params | Missing keyword, bad date, date older than 3 years, unknown parameter | Fix the request; do not retry as is |
| 429 | history_rate_limited | More than your history searches per minute | Wait for Retry-After, then retry |
| 429 | rate_limited | Your plan's per-minute limit | Wait for Retry-After, then retry |
| 429 | quota_exceeded | Monthly allowance and credits used up | Upgrade, buy credits, or wait for reset |
| 502, 503 | historical_unavailable | eBay's research source did not answer this time | Retry after a few seconds, with a bound |
All error bodies include code, error, and requestId. See Errors and
Rate limits for the shared rules.