eBay Scraper - Products, Sellers, Prices & Monitoring avatar

eBay Scraper - Products, Sellers, Prices & Monitoring

Pricing

from $1.20 / 1,000 listing results

Go to Apify Store
eBay Scraper - Products, Sellers, Prices & Monitoring

eBay Scraper - Products, Sellers, Prices & Monitoring

Scrape eBay by keyword, category, seller or pasted link across 16 country storefronts. Returns id, title, condition, price, buying format, delivery, returns, seller feedback and more, with optional item specifics and full descriptions. Incremental mode tracks changes.

Pricing

from $1.20 / 1,000 listing results

Rating

0.0

(0)

Developer

Abot API

Abot API

Maintained by Community

Actor stats

0

Bookmarked

5

Total users

3

Monthly active users

7 days ago

Last modified

Categories

Share

eBay Marketplace Scraper: Listings, Prices, Sellers & Item Details

eBay Marketplace Scraper turns eBay into structured listing data across sixteen country storefronts. Search by keyword, seller username or category id, or paste links you already have: result pages, seller listing pages, browse category pages and individual item pages are all accepted and can be mixed in one run. Every listing comes back as one flat row with the price, the buying format, delivery, the seller and their feedback score, and, when you ask for it, the full image gallery, the item specifics table and the seller's own description. Export to JSON, CSV or Excel, or pull the results straight into your app through the API.

Why This Scraper?

  • Sixteen marketplaces, each checked live. United States, United Kingdom, Germany, Australia, Canada, France, Italy, Spain, Ireland, Austria, Switzerland, Netherlands, Poland, Hong Kong, Singapore and Malaysia. Every one was fetched and confirmed to return real, id-bearing listings before it was offered as an option, and prices come back in that storefront's own currency. (The Philippines is not offered: ebay.ph redirects to the United States storefront, so listing it separately would be an option that quietly does something else.)
  • Around 45 fields per listing, including the low and high end of a variant price range, the pre-discount price and computed discount percentage, bid count and time left on auctions, the sold count, the item location, and the seller's positive-feedback percentage and score. Most of that arrives from the result page itself, so it costs nothing extra.
  • Four ways in. Keyword search, a whole seller's store, a category id, or pasted links. Search filters use the marketplace's own native filters (condition, buying format, price band, delivery, returns, item location, sort order) so they narrow the result set at the source rather than throwing rows away after you have paid for them.
  • A search that matches nothing returns nothing. eBay answers a no-match query with a full page of loosely related suggestions that sit in the same result list as genuine matches. This scraper reads the page's own result count and returns zero rows instead of handing you sixty listings that have nothing to do with your query.
  • Incremental mode for recurring runs. Schedule the same search daily and get only what is NEW or UPDATED by default, with the changed field names listed on every updated row; turning on Emit expired also gets you EXPIRED and, on a later run, REAPPEARED. Auction countdowns and walk bookkeeping never count as a change, so a ticking clock or a re-ordered page never bills you for a change that did not happen.
  • Resume a large pull from a previous run id without re-returning or re-charging for listings you already have.

Use Cases

  • Resellers and arbitrage sellers: track prices, discounts and sold counts across marketplaces to spot underpriced inventory worth flipping.
  • Price monitoring tools: feed a comparison site or a price-tracking bot with live listings converted to each storefront's own currency.
  • Sourcing and catalog research: pull a whole seller's store with item specifics and full descriptions before deciding what to list elsewhere.
  • Listing and brand monitoring: watch a category or keyword for new and changed listings on a recurring schedule.
  • Market and demand research: track sold counts and auction activity for a keyword over time with Incremental mode.

Data You Get

Sample shape, values are illustrative placeholders, not from a live listing.

FieldExample
itemId"000000000001"
url"https://www.ebay.com/itm/000000000001"
title"Sample Listing Title"
condition"Used"
brand"Sample Brand"
marketplace"com"
price100.0
currency"USD"
listingType"buy_it_now" (also "auction", "best_offer")
shippingText / freeShipping"Free delivery" / true
itemLocation"United States"
returnsText / freeReturns"Free returns" / true
soldCount42
sellerName"examplestore"
sellerFeedbackPercent / sellerFeedbackCount98.5 / 1234
badges["Sample Badge"]
imageUrl"https://i.ebayimg.com/images/g/000000000000/s-l500.webp"
attributes["Buy It Now", "Free delivery", "Located in United States", "Free returns", "42 sold"]
itemSpecifics{"Processor": "Sample Processor", "SSD Capacity": "1 TB"} (when Read item pages is on)
description"Full seller description text appears here when Read item pages is on."
detailIncompletetrue (only when an item page, or just its separate description document, could not be read after a retry; see "Reading item pages and the surcharge" below)
changeType"NEW" (also "UPDATED", "UNCHANGED", "REAPPEARED", "EXPIRED"; Incremental mode only)

Every listing also carries subtitle (the seller's own strapline, kept separate from the condition row), conditionId (eBay's numeric condition code, populated only when the condition wording is in English), marketplaceDomain, priceMax and priceText for variant price ranges, originalPrice and discountPercent when the card shows a strikethrough price, bidCount and timeLeft on auctions, shippingCost alongside shippingText, sellerUrl, searchQuery, sourceUrl and pageNumber for provenance, and scrapedAt for the run's own timestamp. Reading item pages additionally fills images (the full gallery), categoryPath, mpn, model, color, gtin, availability, quantityAvailable, quantitySold, paymentMethods, shippingDetails, returnPolicy, listPrice, listedAt, updatedAt and sellerNotes; all of these stay null unless Read item pages is on. Incremental mode adds changedFields (the field names that changed on an UPDATED row), firstSeenAt and lastSeenAt.

How to Use

  1. Pick a mode: search (by keyword, seller username, category id and native filters) or url (paste links).
  2. Fill in the fields for that mode, add any filters and a sort order, and turn on Read item pages if you want the image gallery, item specifics and full description.
  3. Set Max listings to control run size and cost (0 for unlimited), then click Start.
  4. Download the dataset as JSON, CSV or Excel, or read it through the API.

Search one marketplace by keyword:

{
"mode": "search",
"marketplace": "com",
"queries": ["mechanical keyboard"],
"maxItems": 50
}

Search with the marketplace's own filters, including a multi-select condition:

{
"mode": "search",
"marketplace": "co.uk",
"queries": ["vinyl record"],
"condition": ["new", "used"],
"buyingFormat": "buy_it_now",
"minPrice": 10,
"maxPrice": 60,
"freeShippingOnly": true,
"sortBy": "newly_listed",
"minSellerFeedbackPercent": 98,
"maxItems": 100
}

Pull a whole seller store with item pages:

{
"mode": "search",
"marketplace": "de",
"sellerUsernames": ["examplestore"],
"fetchDetails": true,
"maxItems": 200
}

Paste links, mixing marketplaces and link kinds:

{
"mode": "url",
"urls": [
"https://www.ebay.com/sch/i.html?_nkw=laptop&LH_BIN=1",
"https://www.ebay.co.uk/sch/examplestore/m.html",
"https://www.ebay.de/itm/000000000001",
"https://www.ebay.com/b/PC-Laptops-Netbooks/177"
],
"maxItems": 150
}

Run it from your code

Python:

from apify_client import ApifyClient
client = ApifyClient("<YOUR_APIFY_TOKEN>")
run = client.actor("abotapi/ebay-com-scraper").call(
run_input={"mode": "search", "queries": ["mechanical keyboard"], "maxItems": 20})
for listing in client.dataset(run["defaultDatasetId"]).iterate_items():
print(listing["title"], listing["price"], listing["currency"])

JavaScript:

import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: '<YOUR_APIFY_TOKEN>' });
const run = await client.actor('abotapi/ebay-com-scraper').call({
mode: 'search', queries: ['mechanical keyboard'], maxItems: 20,
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();

Or connect it to Make, Zapier, n8n, Google Sheets or webhooks from the Integrations tab.

Reading item pages and the surcharge

Turning on Read item pages adds one extra request per listing and bills one Item page event for every listing that is both pushed to the dataset and had its own item page successfully read. A listing whose item page is refused, and stays refused after one retry pass, ships with its result-card fields only, carries detailIncomplete: true, and is not charged the surcharge. When the item page itself is read but only its separate description document keeps failing, the listing keeps its item-specifics, images and category trail, is still stamped detailIncomplete: true for the missing description, and is still charged: the surcharge follows whether the item page was read, not whether every last field on it came back. A pasted item link has no result card behind it, so its item page is always read regardless of the Read item pages toggle, and is billed the Item page event whenever that read succeeds, even with the toggle off; it follows the same refused-item-page and description-only rules above. An UNCHANGED row suppressed by Incremental mode is never billed the surcharge, even on a run where its item page had to be read to compute the fingerprint.

Max listings, Max pages and page size

Max listings is the whole run's cap; Max pages limits how many result pages are read per keyword, seller or link before moving on, independent of the cap. When the whole run fits inside one small result page, the actor asks eBay for a 60-item page instead of a 240-item one, since a 240-item page is around 4.7 MB of transfer to keep 20 rows. Raising Max listings past 60 switches it back to the large page automatically.

Resume and recurring updates

  • Resume (resumeFromRunId) continues one interrupted run: paste its run or dataset ID and the actor skips every listing id it already returned there, so you don't pay twice. It cannot be combined with Incremental mode once that mode already has saved state for the same search: the run fails with a clear message rather than guessing which one you meant.
  • Incremental mode (incrementalMode) is for scheduled runs over the same search. The first run returns every matching listing as NEW. Later runs classify each listing NEW, UPDATED (with changedFields), or UNCHANGED (suppressed and not billed unless emitUnchanged is on). EXPIRED rows are only produced once a run has scanned the tracked search to its natural end, with no cap, no resume and at least one listing seen, and only with emitExpired on; a capped, resumed or empty-scan run keeps the existing state untouched instead of guessing. REAPPEARED is never a default outcome of turning Incremental mode on: it only fires for a listing that was previously tombstoned EXPIRED by that same complete-scan process and is then seen again on a later run. stateKey names or shares one monitoring campaign; left empty, the actor derives one from the mode, marketplace, keywords, sellers, links and filters, so different searches never collide. Incremental mode also excludes timeLeft, attributes, scrapedAt, updatedAt, sourceUrl, pageNumber and searchQuery from change detection, because an auction countdown or a walk artifact would otherwise mark a listing changed on every single run; every real change still surfaces through a tracked structured field such as listingType, bidCount or shippingCost.

Send results into your apps (MCP connectors)

Results can also be piped straight into the apps you already use, over Model Context Protocol. Authorize a connector under Apify, Settings, API & Integrations, then select it in the Export to your apps (MCP connectors, optional) section of the input.

  • mcpConnectors picks one or more authorized connectors. Leave it empty and nothing happens: the export code never runs and the dataset is byte for byte identical.
  • notionParentPageUrl is required for the Notion connector, which gets one page per listing, and is ignored by every other connector.
  • maxNotifyListings caps how many listings are written to each connector per run. It does not affect the dataset.

What gets written is a condensed, human readable summary per listing: a title plus the key fields flattened to plain text. Nested objects collapse to their main value and arrays are trimmed to a few entries. The complete record always stays in the Apify dataset.

If a connector write fails, the run logs a warning and carries on. Scrape data is never affected.

Input Parameters

ParameterTypeDefaultDescription
modestringsearchsearch or url.
queriesarrayno default (prefill: ["laptop"])Search keywords. Search mode only.
sellerUsernamesarray(none)Seller usernames whose listing pages are walked. Search mode only.
marketplacestringcomWhich of the sixteen storefronts to search. Search mode only; a pasted link carries its own.
categoryIdstring(none)Numeric category id from the marketplace's own category links.
conditionarray(none)New, Open box, the four refurbished grades, Seller refurbished, Used, For parts. Multi-select.
buyingFormatstringanyAny, Buy It Now, Auction, Accepts offers.
minPriceinteger(none)Keep only listings priced at or above this amount, in the marketplace's own currency.
maxPriceinteger(none)Keep only listings priced at or below this amount, in the marketplace's own currency.
freeShippingOnlybooleanfalseKeep only listings flagged as free delivery.
freeReturnsOnlybooleanfalseKeep only listings offering free returns.
returnsAcceptedOnlybooleanfalseKeep only listings that accept returns at all.
itemLocationstringdefaultMarketplace default, marketplace country only, same continent, or worldwide.
sortBystringbest_matchBest match, ending soonest, newly listed, price and delivery lowest or highest.
urlsarrayno default (prefill: two sample links)Result, seller, browse category and item links. URL mode only.
minSellerFeedbackPercentinteger(none)Applies in both modes. Sellers with no score yet are kept.
fetchDetailsbooleanfalseRead each listing's item page. Adds one Item page event per listing whose item page is actually read. Refused item pages get a second pass; a listing that still cannot be read ships without details, flagged detailIncomplete, unbilled.
maxItemsinteger20The run's cap. 0 means unlimited.
maxPagesinteger0Result pages per keyword, seller or link. 0 means no limit.
resumeFromRunIdstring(none)Continue one interrupted run from its run or dataset id.
incrementalModebooleanfalseReturn only what changed since the last run of the same search.
stateKeystring(none)Name a monitoring campaign, or deliberately share state.
emitUnchangedbooleanfalseAlso return, and bill, UNCHANGED rows.
emitExpiredbooleanfalseAlso return, and bill, EXPIRED rows.
proxyobjectApify Proxy onConnection configuration.
mcpConnectorsarray(none)Optional MCP connectors to also write results into.
notionParentPageUrlstring(none)Notion parent page id or URL, Notion connector only.
maxNotifyListingsinteger50Cap on items written to each connector per run.

Output Example

Sample shape, values are illustrative placeholders, not from a live listing. Shown with Read item pages and Incremental mode both on so every field appears; a default run omits changeType, changedFields, firstSeenAt and lastSeenAt, and the item-page-only fields stay null.

{
"itemId": "000000000001",
"url": "https://www.ebay.com/itm/000000000001",
"title": "Sample Listing Title",
"subtitle": "Sample seller strapline",
"condition": "Used",
"conditionId": "3000",
"brand": "Sample Brand",
"marketplace": "com",
"marketplaceDomain": "www.ebay.com",
"price": 100.0,
"priceMax": 150.0,
"priceText": "$100.00 to $150.00",
"currency": "USD",
"originalPrice": 125.0,
"discountPercent": 20.0,
"listingType": "buy_it_now",
"bidCount": null,
"timeLeft": null,
"shippingCost": null,
"shippingText": "Free delivery",
"freeShipping": true,
"itemLocation": "United States",
"returnsText": "Free returns",
"freeReturns": true,
"soldCount": 42,
"sellerName": "examplestore",
"sellerUrl": "https://www.ebay.com/sch/examplestore/m.html",
"sellerFeedbackPercent": 98.5,
"sellerFeedbackCount": 1234,
"badges": ["Sample Badge"],
"imageUrl": "https://i.ebayimg.com/images/g/000000000000/s-l500.webp",
"attributes": ["Buy It Now", "Free delivery", "Located in United States", "Free returns", "42 sold"],
"images": ["https://i.ebayimg.com/images/g/000000000000/s-l1600.jpg"],
"itemSpecifics": { "Processor": "Sample Processor", "SSD Capacity": "1 TB", "Seller Notes": "Sample seller notes." },
"categoryPath": ["Electronics", "Computers", "Laptops"],
"description": "Full seller description text appears here when Read item pages is on.",
"sellerNotes": "Sample seller notes.",
"mpn": "SAMPLE-MPN",
"model": "Sample Model",
"color": "Black",
"gtin": null,
"listPrice": 125.0,
"availability": "In Stock",
"quantityAvailable": 5,
"quantitySold": 42,
"paymentMethods": ["PayPal", "Visa"],
"shippingDetails": "Shipping: Sample shipping line",
"returnPolicy": "Returns: 30 day returns accepted",
"listedAt": "2026-01-01T00:00:00Z",
"updatedAt": "2026-01-01T00:00:00Z",
"searchQuery": "laptop",
"sourceUrl": "https://www.ebay.com/sch/i.html?_nkw=laptop",
"pageNumber": 1,
"scrapedAt": "2026-01-01T00:00:00Z",
"changeType": "NEW",
"changedFields": [],
"firstSeenAt": "2026-01-01T00:00:00Z",
"lastSeenAt": "2026-01-01T00:00:00Z"
}

Plan Requirement

Apify Proxy is recommended, and the standard connection pool built into every Apify plan is enough for fifteen of the sixteen marketplaces. The Canada storefront answers more consistently on the alternate option in the Connection section; the run says so at startup if you pick Canada without one. No eBay account, API key or other credential is required. The Pricing tab shows the current per-event rates for this actor.

FAQ

How much does it cost?

This actor uses Apify's pay-per-event pricing: one event per listing returned, one extra event per listing whose item page you had read, and one one-time event when the run starts. The Pricing tab shows the current rates. Use Max listings to cap the cost of any run.

This actor collects only publicly available listing data. You are responsible for how you use it: follow eBay's terms and the laws that apply to you, and get legal advice if you plan commercial redistribution. Listing facts such as price and availability are generally not protected, but photos and seller-written descriptions may be subject to third-party rights.

Can I get only new or changed listings on a schedule?

Yes. Schedule the actor from the Schedules tab and turn on Incremental mode. Each run then returns new and updated listings; with Emit expired on, a complete scan also returns expired listings, and a listing that later comes back is returned as reappeared. Unchanged listings are suppressed and not billed by default.

Why can't I filter for sold or completed listings?

Both eBay's LH_Sold=1 and LH_Complete=1 search filters were tested live and answered with eBay's sign-in page instead of results: those views sit behind an eBay account and cannot be read without one. This scraper does not offer a sold-listings toggle rather than offer one that would silently return nothing. If a pasted link carries either filter and hits the sign-in page, the log warns that the address was answered with a sign-in page; the run still finishes, with no rows from that link.

Why did my run fail instead of returning an empty dataset?

If every result page was refused, the run stops with a clear message so "no listings matched" is never confused with "nothing could be read". Run it again in a few minutes, or enable Apify Proxy if it is off. A search that genuinely matches nothing still succeeds with zero rows.

Can I use it with AI agents or MCP?

Yes. Call it from any Apify integration or MCP client, and use the connector field to push results into Notion, Linear or Airtable.

๐Ÿ”— More scrapers you might like

Pair this actor with these related scrapers from the same team:

๐Ÿ›’ MUJI Scraper
Scrape MUJI products from the United States, Canada and Australia storefronts. Search by...
๐Ÿท๏ธ Vinted.fr
Scrape Vinted.fr, France's C2C second-hand fashion marketplace: search with...
๐Ÿท๏ธ Vinted Multi-Country Scraper
Scrape Vinted across 27 country marketplaces: keyword search with brand, price and...
โšฝ Whatnot Scraper
Scrape Whatnot live and upcoming shows, queued items and lots, and seller profiles...
๐Ÿงฉ Digitec Galaxus Scraper
Scrape Digitec Galaxus, Switzerland's largest online retailer: products with local...
๐Ÿงฉ Grailed Scraper
Scrape Grailed by keyword, category, designer, condition, size or URL. Extract prices and...

๐Ÿ‘‰ Browse all abotapi scrapers

๐Ÿ’ฌ Support & custom scrapers

  • ๐Ÿž Found a bug or a missing field? Open a ticket on the Issues tab. We usually reply within hours.
  • ๐Ÿ› ๏ธ Need another site, extra fields or a private build? Email abotapi@proton.me or message Telegram @abotapi.
  • โญ Enjoying it? A quick review on the actor page helps other users find it.