eBay Sold Listings Search
Pricing
from $2.50 / 1,000 results
eBay Sold Listings Search
Get confirmed eBay sold prices. Search by keyword across 8 marketplaces, filter by date range, and export clean structured data for comps, resale pricing, and market research.
Pricing
from $2.50 / 1,000 results
Rating
4.4
(14)
Developer
Caffein Dev
Maintained by CommunityActor stats
49
Bookmarked
2.9K
Total users
489
Monthly active users
1.9 days
Issues response
10 days ago
Last modified
Categories
Share
eBay Sold Listings API (Real Sold Items Only)
Fetch real sold listings from eBay — actual completed sales with final prices. This Actor returns sold items only, not active listings and not completed-but-unsold items.
Built for price analysis, resale tools, market research, and pricing intelligence.
🔎 What This API Provides
This Apify Actor extracts eBay sold listings and returns structured, machine-readable data for each sale:
- Final sold price
- Currency
- Sale end date
- Listing title
- Item URL
- Item ID
✅ Every result represents an item that actually sold ❌ No active listings ❌ No unsold “completed” listings ❌ No estimated or AI-generated prices
⚙️ Input
{"keywords": ["rtx 4080", "rtx 4090"],"categoryId": "58058", // any eBay category ID; "0" = All Categories"subcategoryId": "", // any eBay subcategory ID; overrides categoryId when set"daysToScrape": 30,"count": 100,"ebaySite": "ebay.com","sortOrder": "endedRecently","minPrice": 100,"maxPrice": 500,"itemLocation": "default","itemCondition": "any"}
| Field | Type | Default | Description |
|---|---|---|---|
keywords | string[] | required | 1–6 search terms. Each runs as a separate search with the same filters. Results are tagged with keyword for easy filtering. |
keyword | string | — | Deprecated. Use keywords array instead. Accepted for backward compatibility. |
search | string | — | Deprecated. Alias for keyword. Use keywords array instead. Accepted for backward compatibility with callers that send search. Backslash-escaped quotes (\") in the value are unescaped before the search runs. |
daysToScrape | number | 30 | Days back to scrape (1–90) |
count | number | 100 | Max results per keyword |
categoryId | string | "0" | Main category filter — accepts any eBay category ID as free text (maps to _sacat). Use "0" for All Categories. Look up IDs at sold-comps.com/ebay-categories. |
subcategoryId | string | "" | Optional subcategory filter — accepts any eBay subcategory ID as free text (maps to _sacat). If set, overrides categoryId. Look up IDs at sold-comps.com/ebay-categories. |
ebaySite | string | ebay.com | eBay marketplace (see supported sites) |
sortOrder | string | endedRecently | endedRecently · timeNewlyListed · pricePlusPostageLowest · pricePlusPostageHighest · distanceNearest |
minPrice | number | — | Minimum sold price filter |
maxPrice | number | — | Maximum sold price filter |
itemLocation | string | default | default · domestic · worldwide |
itemCondition | string | any | any · new · used |
includeCompletedListings | boolean | true | Include eBay's Completed Listings filter. Enables accurate Best Offer Accepted detection (listingType, isBestOfferAccepted). Set to false for strictly sold-only results — BOA items will show as buy_it_now. See Completed Listings & Best Offer Accepted Detection. |
Supported eBay Sites
ebay.com · ebay.co.uk · ebay.de · ebay.fr · ebay.it · ebay.es · ebay.ca · ebay.com.au
📤 Output
{"itemId": "306671421088","url": "https://www.ebay.com/itm/306671421088","title": "Apple iPhone 13 Pro Max - 128GB - Unlocked - Cracked Back","condition": "Pre-Owned","conditionId": 3000,"endedAt": "2025-12-22T05:00:00.000Z","soldPrice": "215","soldCurrency": "USD","listingType": "buy_it_now","isBestOfferAccepted": false,"buyingFormat": "buyItNow","bidCount": null,"shippingPrice": "6.20","shippingCurrency": "USD","shippingType": "paid","totalPrice": "221.20","thumbnailUrl": "https://i.ebayimg.com/thumbs/images/g/abc123/s-l500.jpg","fullResThumbnailUrl": "https://i.ebayimg.com/images/g/abc123/s-l1600.jpg","sellerUsername": "example_seller","sellerPositivePercent": 99.2,"sellerFeedbackScore": 1842,"sellerType": null,"scrapedAt": "2026-01-19T21:53:17.613Z"}
| Field | Description |
|---|---|
itemId | eBay item ID |
url | Full listing URL |
title | Listing title |
condition | Localized eBay condition label as shown on the search card (e.g. "Pre-Owned" on ebay.com, "Gebraucht" on ebay.de, "Neuf" on ebay.fr, "Nuovo" on ebay.it, "Usado" on ebay.es). null when eBay didn't display one. This is the authoritative field — what the buyer actually saw. |
conditionId | Best-effort numeric eBay condition ID resolved from condition via a static lookup table. null when condition is null or the label isn't in the lookup table (eBay can introduce new or locale-specific labels at any time — always check condition first). Common IDs: 1000 New · 1500 Open box / New Other · 1750 New with defects · 2000–2030 Refurbished tiers (Certified / Excellent / Very Good / Good) · 2500 Seller Refurbished · 2750 Like New · 3000 Used / Pre-Owned · 7000 For parts. Full reference |
categoryId | Category id used for the search (_sacat) |
category | Selected category label from the search page dropdown |
endedAt | Sale completion timestamp (ISO 8601) |
soldPrice | Final transaction price. Note: when isBestOfferAccepted is true, this is the asking price — the actual accepted offer is not disclosed by eBay. |
soldCurrency | Currency code (e.g. USD, GBP) |
listingType | How the item sold: "best_offer_accepted" · "buy_it_now" · "auction" · null (undetermined) |
isBestOfferAccepted | true if sold via an accepted Best Offer. soldPrice is the asking price, not the actual transaction price. |
buyingFormat | Richer buying-format enum: "auction" (bids only) · "buyItNow" (fixed price or best-offer) · "auctionWithBIN" (auction with a Buy It Now option) · null (undetermined) |
bidCount | Number of bids received. null for fixed-price listings or when not shown. |
shippingPrice | Shipping cost (null if not disclosed) |
shippingCurrency | Currency of shipping price |
shippingType | free · paid · pickup · unknown |
totalPrice | soldPrice + shippingPrice when currencies match, otherwise equals soldPrice |
thumbnailUrl | 500px product image URL from i.ebayimg.com. null when only a promo or logo image is available on the search card. |
fullResThumbnailUrl | High-res (1600px) product image URL, derived from thumbnailUrl. null when no product image is available. Best-effort — may 404 for listings where eBay only hosts a low-res image. |
sellerUsername | Seller username (best-effort) |
sellerPositivePercent | Positive feedback % (best-effort) |
sellerFeedbackScore | Feedback count (best-effort) |
sellerType | "private" or "business" on EU sites (ebay.de, .fr, .it, .es). null on non-EU sites or when the label is unrecognised. |
scrapedAt | Scrape timestamp (ISO 8601) |
🏷️ Completed Listings & Best Offer Accepted Detection
The includeCompletedListings input (default true) controls whether eBay's Completed Listings filter (LH_Complete=1) is sent alongside the always-present Sold filter (LH_Sold=1).
All results are genuinely sold items regardless of this setting — the LH_Sold=1 filter is always applied, so the actor never returns active or completed-but-unsold listings. This flag does not affect the sold/unsold guarantee; it only affects how accurately the actor can classify how an item sold.
Why the flag exists — an eBay HTML limitation
This is a limitation of eBay's own HTML, not a choice the actor makes. eBay only renders the signals needed to identify a Best Offer Accepted sale when the Completed Listings filter is active:
| Signal on the search card | includeCompletedListings: true (LH_Complete=1) | includeCompletedListings: false (LH_Complete=0) |
|---|---|---|
| Best-offer text | "Best offer accepted" | "or Best Offer" (or nothing) |
| Price CSS class | strikethrough | bold |
| BOA detectable? | ✅ Yes | ❌ No |
When LH_Complete=0, eBay strips the "Best offer accepted" text and the strikethrough price styling from the cards. Without those signals, a Best Offer Accepted sale is indistinguishable in the HTML from an ordinary Buy It Now sale — the actor cannot accurately detect Best Offer Accepted status for each listing.
What this means for the output
includeCompletedListings: true(default): Best Offer Accepted sales are detected.listingTypecan be"best_offer_accepted"andisBestOfferAcceptedcan betrue. (Note: even here, eBay does not disclose the actual accepted offer amount —soldPricereflects the asking price for BOA items.)includeCompletedListings: false: BOA sales are reported aslistingType: "buy_it_now"withisBestOfferAccepted: false. You still get every sold item and its sold price — you just lose the ability to know whether a given sale went through as an accepted Best Offer.
Set includeCompletedListings: false only if you want the search filter to match eBay's plain "Sold" view and don't rely on Best Offer Accepted classification.
👥 Who This API Is For
- Developers building pricing APIs or resale tools
- Data analysts and researchers
- Professional resellers and flippers
- SaaS founders validating secondary market prices
📞 Support & Feedback
For issues, questions, or feature requests, please contact the Actor author via Apify.
Category IDs & Subcategory IDs
Both categoryId and subcategoryId are free-text fields — you can pass any eBay category or subcategory ID, not just ones from a preset list. The ID is passed straight through to eBay's _sacat search parameter, so any ID eBay recognizes will work. When subcategoryId is set it overrides categoryId — the output always reflects the effective category used.
Not sure which ID to use? We maintain a full, searchable list of every eBay category and subcategory ID:
🔍 Browse & search all category IDs and subcategory IDs →