eBay Product Listing Scraper (Location, Condition & Shipping)
Pricing
from $5.99 / 1,000 results
eBay Product Listing Scraper (Location, Condition & Shipping)
eBay Product Listing Scraper extracts product listings with location, condition, shipping details, prices, seller information, ratings, product titles, and listing URLs. Ideal for price comparison, marketplace research, inventory analysis, competitor monitoring, and product sourcing.
Pricing
from $5.99 / 1,000 results
Rating
0.0
(0)
Developer
Scrapier
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
2 days ago
Last modified
Categories
Share
eBay Product Listing Scraper — Filtered Results with Shipping Data
Scrape eBay search and category pages with real, server-side item-location, condition, price-range and sort filters applied to the same request the scraper already makes — no client-side post-filtering. Each result comes back as a listing row with title, price, condition, image, and structured shippingCost, itemLocation, buyingFormat and returnsAccepted columns split out of the raw card text. Every response is structured JSON — ready to pass directly to an LLM, index into a vector store, or feed a monitoring pipeline. Paste any eBay search URL, set the filters you want, and get back rows you can query, diff, or pipe into a spreadsheet without touching eBay's API.
🛒 What is the eBay Product Listing Scraper (Location, Condition & Shipping)?
It's an Apify Actor that fetches one or more eBay search-result or category-page URLs, applies real eBay search filters — item location, item condition, price range, sort order — as query parameters on the same request, and extracts every listing card into a dataset row. It splits eBay's unlabeled attribute text (delivery cost, ship-from location, buying format, returns policy) into named fields instead of leaving them as one raw array. No eBay account, login, or API key is required — it works from public eBay search pages the way a browser would see them.
Key capabilities:
- 📍 Bulk search URLs — paste one or more eBay search/category URLs (
searchUrls); filters apply to every one - 🌍 Item-location filtering — restrict to domestic (US) or worldwide shipping using eBay's own
LH_PrefLocparameter - 🏷️ Condition filtering — multi-select New, New (other), Certified Refurbished, Seller Refurbished, Used, or For parts/not working
- 💰 Price-range filtering — set a minimum and/or maximum price, applied server-side
- ↕️ Sort control — Best Match, Price low→high, Price high→low, or Newly listed
- 🚚 Structured shipping/location/format/returns columns — parsed out of each card instead of one unlabeled text blob
📦 What data can you get with this eBay scraper?
Every URL you submit returns one row per listing card found on that page, with the fields below extracted from eBay's own HTML.
| Result type | Extracted fields | Primary use case |
|---|---|---|
| Listing | product_title, condition, price, original_price, image_url, itemId, product_url | Core catalog data — sourcing, price comparison, listings feeds |
| Structured attributes | shippingCost, itemLocation, buyingFormat, returnsAccepted, card_attribute | Fulfillment and terms comparison without hand-parsing text |
| Run metadata | input_url, scrapedAt | Traceability — which search produced the row, and when |
Structured shipping, location, format & returns columns
eBay's search cards render shipping cost, ship-from location, buying format and return policy as one unlabeled row of text per card. This Actor classifies that text into four named fields — shippingCost, itemLocation, buyingFormat, returnsAccepted — so you can filter or sort on them directly instead of regex-parsing a free-text array yourself. The original unlabeled array (card_attribute) is still included for backward compatibility. A field is null only when that specific listing's card genuinely doesn't display that attribute — never a guessed or faked value:
{"shippingCost": "+$8.50 delivery","itemLocation": "Located in United States","buyingFormat": "Buy It Now","returnsAccepted": "30 days returns","card_attribute": ["+$8.50 delivery","Located in United States","Buy It Now","30 days returns"]}
Full-resolution images & normalized item data
Every image_url is rewritten from eBay's default thumbnail size token (s-l64, s-l140, s-l225, etc.) to s-l1600, the site's real maximum resolution — useful for reselling listings or building a visual catalog. itemId and product_url are parsed and normalized from the card's link (https://www.ebay.com/itm/<id>), so both fields are stable join keys even when the raw href carries tracking query parameters.
🆚 How does this differ from the official eBay API?
eBay does publish an official API — the Browse API, part of the eBay Developer Program. The item_summary/search method returns search results, but access and shape differ from what this Actor gives you directly from a search URL.
| Feature | eBay Browse API (official) | This Actor |
|---|---|---|
| Access requirement | eBay Developer account + OAuth application access token via the client credentials grant flow (developer.ebay.com, checked 2026-08-15) | Apify account only — no eBay account or API key |
| Query input | q / category_ids plus a documented filter syntax you build yourself | Paste the actual eBay search URL you'd browse to |
| Location filter | Supported via documented filter parameters | preferredLocation mapped directly to eBay's own LH_PrefLoc search-page parameter |
| Condition filter | conditionIds filter, documented condition-ID list | itemCondition multi-select mapped to eBay's own LH_ItemCondition codes |
| Price filter | price:[min..max] filter syntax | priceMin / priceMax, applied in the search page's own currency |
| Results per call | limit max 200 per call, overall result set capped at 10,000 items (developer.ebay.com, checked 2026-08-15) | One page per submitted search URL — whatever eBay itself renders on that page, no built-in pagination beyond it |
| Shipping/location/format as flat fields | Returned nested inside the item summary response object | shippingCost, itemLocation, buyingFormat, returnsAccepted split into flat top-level columns |
Use the official Browse API if you already have Developer Program approval and want a programmatic, OAuth-authenticated integration with eBay's own guaranteed response schema. Use this Actor if you'd rather paste the exact eBay search URL you already filter and sort in your browser and get structured rows back, with no OAuth setup or token refresh to maintain.
🧭 How to scrape eBay with this Actor
- Open the Actor on its Apify Store listing and click Try for free (or Start, if you already have it).
- Paste one or more eBay search or category URLs into
searchUrls— this is the only field you strictly need. - Set the real query controls you want:
preferredLocation,itemCondition,priceMin/priceMax, andsortBy. Leave any of them at their default to skip that filter. - Click Start.
- Watch rows land in the Output tab live, then export the dataset as JSON, CSV, Excel, or XML, or pull it with the API.
How to run multiple searches in one job
searchUrls accepts an array — paste every eBay search or category URL you want scraped in the same run, one per line in the stringList editor. The filters you set (preferredLocation, itemCondition, priceMin/priceMax, sortBy) are applied to every URL in the batch identically. Listings that appear under more than one of your search URLs in the same run are deduplicated by eBay's own itemId, so you won't get the same item twice from overlapping searches.
⬇️ Input
All fields are optional at the schema level, but the run needs at least one URL in searchUrls (or the legacy urls) — without one, the run logs an error and stops with zero rows.
| Parameter | Required | Type | Constraints | Description |
|---|---|---|---|---|
searchUrls | No | array | editor: stringList | Paste one or more eBay search or category URLs. Example: search results for "Nike shoes", a category page, or a saved search. The filters below are applied on top of each URL. |
urls | No | array | editor: stringList | Legacy field name, kept for backward compatibility with the base eBay Product Listing Scraper. If you're setting up a new run, use searchUrls above instead — this field is only read when searchUrls is empty. |
preferredLocation | No | string | enum: any (Any location), domestic (Domestic (US) only), worldwide (Worldwide); default any; editor: select | Filter listings by item ship-from location. any leaves eBay's own default (unfiltered) results. |
itemCondition | No | array of string | enum per item: new, newOther, certifiedRefurbished, sellerRefurbished, used, forPartsNotWorking; default []; editor: select | Filter listings by condition. Select one or more; leave empty for all conditions. |
priceMin | No | integer | minimum: 0 | Only return listings priced at or above this amount (in the search page's local currency). Leave empty for no minimum. |
priceMax | No | integer | minimum: 0 | Only return listings priced at or below this amount (in the search page's local currency). Leave empty for no maximum. |
sortBy | No | string | enum: bestMatch (Best Match), priceLowest (Price: lowest first), priceHighest (Price: highest first), newlyListed (Newly listed); default bestMatch; editor: select | How eBay should order the search results before they're scraped. |
proxyConfiguration | No | object | editor: proxy; default { "useApifyProxy": false } | Optional Apify Proxy settings. Default: no proxy selected; the Actor falls back automatically if needed. |
Example input:
{"searchUrls": ["https://www.ebay.com/sch/260010/i.html?_nkw=shoe&Brand=Nike"],"preferredLocation": "domestic","itemCondition": ["new", "sellerRefurbished"],"priceMin": 20,"priceMax": 150,"sortBy": "priceLowest","proxyConfiguration": { "useApifyProxy": false }}
Common pitfall: preferredLocation only exposes two real filter values — domestic (eBay's LH_PrefLoc=1) and worldwide (LH_PrefLoc=2). eBay's own filter panel also has a third value for North America, but this Actor's input doesn't expose it — there's no way to request it through this field. Also, priceMin/priceMax are applied in whatever currency the search page itself uses — a .co.uk or .de search URL filters in GBP/EUR, not USD, even though the field is a plain integer with no currency selector.
⬆️ Output
Each run pushes one dataset row per listing card found, as typed, normalized JSON with a consistent schema across runs. Export from the Output tab as JSON, CSV, Excel, XML, or an RSS feed, or pull the dataset with the API.
Scraped results
[{"itemId": "185432109876","product_title": "Nike Air Max 270 Men's Running Shoes - White/Black","condition": "Pre-Owned","price": "$54.99","original_price": "$69.99","image_url": "https://i.ebayimg.com/images/g/abcAAOSw~example/s-l1600.jpg","shippingCost": "+$8.50 delivery","itemLocation": "Located in United States","buyingFormat": "Buy It Now","returnsAccepted": "30 days returns","card_attribute": ["+$8.50 delivery","Located in United States","Buy It Now","30 days returns"],"product_url": "https://www.ebay.com/itm/185432109876","input_url": "https://www.ebay.com/sch/260010/i.html?_nkw=shoe&Brand=Nike&LH_PrefLoc=1&_udlo=20&_udhi=150&_sop=15","scrapedAt": "2026-08-15T09:12:33.104211+00:00"},{"itemId": "185432110022","product_title": "Nike Revolution 6 Women's Training Shoes - Black","condition": "New with box","price": "$42.00","original_price": null,"image_url": "https://i.ebayimg.com/images/g/def456~example/s-l1600.jpg","shippingCost": "Free delivery","itemLocation": "Located in United States","buyingFormat": "Buy It Now","returnsAccepted": null,"card_attribute": ["Free delivery","Located in United States","Buy It Now"],"product_url": "https://www.ebay.com/itm/185432110022","input_url": "https://www.ebay.com/sch/260010/i.html?_nkw=shoe&Brand=Nike&LH_PrefLoc=1&_udlo=20&_udhi=150&_sop=15","scrapedAt": "2026-08-15T09:12:33.611903+00:00"},{"itemId": "185432110399","product_title": "Nike Court Vision Low Sneakers - White/Navy","condition": "Seller refurbished","price": "$38.50","original_price": "$65.00","image_url": "https://i.ebayimg.com/images/g/ghi789~example/s-l1600.jpg","shippingCost": "+$5.99 delivery","itemLocation": "Located in United States","buyingFormat": "Buy It Now","returnsAccepted": "Free returns","card_attribute": ["+$5.99 delivery","Located in United States","Buy It Now","Free returns"],"product_url": "https://www.ebay.com/itm/185432110399","input_url": "https://www.ebay.com/sch/260010/i.html?_nkw=shoe&Brand=Nike&LH_PrefLoc=1&_udlo=20&_udhi=150&_sop=15","scrapedAt": "2026-08-15T09:12:34.002556+00:00"}]
shippingCost, itemLocation, buyingFormat and returnsAccepted are null (as in the second row above) only when that specific listing card genuinely doesn't render that attribute — never a faked or inferred value.
💡 How can I use the data extracted with this Actor?
- 🛍️ Resellers and sourcing teams: filter to
neworsellerRefurbishedcondition inside a price band, then compareshippingCostandbuyingFormatacross sellers before sourcing. - 🤖 AI engineers and LLM developers: run a search, get back structured JSON, and pass the listing array straight into an LLM as grounded context for a shopping agent or price-comparison assistant.
- 📊 Market researchers: scrape the same category with different
sortBy/priceMin/priceMaxcombinations to map how price and condition mix shifts across a category. - 🧾 Product and pricing teams: track
priceandoriginal_priceside by side to spot discounting patterns for a given search, without hand-building eBay's filter URLs each time.
📈 How do you monitor eBay prices and shipping costs over time?
Price monitoring on eBay means re-running the same filtered search on a schedule and comparing what changes between runs — a listing dropping in price, a shippingCost going from a flat fee to free, or an item disappearing from the result set entirely (sold or delisted). Because itemId is a stable key parsed straight from each listing's URL, you can join today's run against yesterday's on that field and diff price, original_price, shippingCost and itemLocation directly.
A simple workflow: save the same searchUrls + filter combination as an Apify schedule that runs on the interval you choose, pull each run's dataset via the API keyed on itemId, and alert whenever price or shippingCost moves outside the range you care about. Because the filters are applied server-side on the same request, every scheduled run reflects the exact same eBay-side result set — domestic-only, a given condition mix, a given price band — so the diff is measuring real listing changes, not a shift in what got scraped.
🔌 Integrate this Actor and automate your workflow
This Actor works with any language or tool that can send an HTTP request — it runs on Apify, so it's reachable through the Apify API and every official Apify client.
REST API with Python
from apify_client import ApifyClientclient = ApifyClient("<YOUR_APIFY_API_TOKEN>")run_input = {"searchUrls": ["https://www.ebay.com/sch/260010/i.html?_nkw=shoe&Brand=Nike"],"preferredLocation": "domestic","priceMin": 20,"priceMax": 150,"sortBy": "priceLowest",}run = client.actor("ebay-product-listing-scraper-location-condition-and-shipping").call(run_input=run_input)for item in client.dataset(run["defaultDatasetId"]).iterate_items():print(item["product_title"], item["price"], item["shippingCost"])
Scheduled monitoring and delivery
Set up an Apify Schedule against this Actor with a fixed searchUrls + filter input to re-run it automatically on the interval you choose, then pull each run's dataset via the API or export it directly from the Console. There is no separate webhook or push-delivery feature built into the Actor itself — Apify's own schedule and dataset-export tooling is the delivery path.
⚖️ Is it legal to scrape eBay listings?
Yes — scraping publicly accessible eBay search-result pages is generally legal in most jurisdictions, and this Actor returns only what any visitor sees on those pages. In hiQ Labs, Inc. v. LinkedIn Corp. (9th Cir. 2019), the court held that scraping publicly accessible web data does not violate the Computer Fraud and Abuse Act. Because this Actor extracts product-listing data — titles, prices, shipping terms — rather than personal information about identifiable individuals, it's governed primarily by eBay's own Terms of Service and database-rights law in applicable jurisdictions, not by GDPR or CCPA, which apply to personal data. Scraping for one-off research and scraping for ongoing operational monitoring or resale carry different risk profiles under a platform's ToS. Consult your legal team for commercial use cases involving bulk data storage.
❓ Frequently asked questions
Can I filter by item location and how accurate is it?
Yes — set preferredLocation to domestic or worldwide and the Actor applies eBay's own LH_PrefLoc server-side search parameter, the same filter you'd click on eBay's results page. Only these two filterable values are exposed (plus any for eBay's unfiltered default); eBay's own filter panel has a third North America value that this Actor's input does not expose.
Can I change the sort order of results?
Yes — sortBy accepts bestMatch (default), priceLowest, priceHighest, or newlyListed, applied via eBay's own _sop sort parameter on the same request, so the order you get back is eBay's real sort, not a client-side re-sort after the fact.
How does this Actor handle eBay's anti-bot measures?
It escalates its connection automatically: it validates every response against eBay's real page markers (s-card__link, /itm/ links) and a minimum page-size threshold before accepting it as a real page, rather than trusting a 200 status alone. If your selected connection doesn't return a valid page, it retries, then falls through no-proxy, then Apify Proxy datacenter, then Apify Proxy residential tiers with backoff between attempts, and remembers whichever connection worked for the rest of that run.
Does this Actor extract structured shipping, location, format and returns data?
Yes — every row includes shippingCost, itemLocation, buyingFormat and returnsAccepted as separate fields, classified out of eBay's raw per-card attribute text. Any one of them is null on a given row only when that listing's card genuinely doesn't display that attribute.
How many results does this Actor return per query?
It returns every listing card present on the single eBay page rendered for each URL you submit in searchUrls — whatever eBay itself renders on that page. There's no built-in pagination that follows a "next page" link, so if you need more results than one page holds, submit the search with a category/keyword refinement or a next-page URL as a separate entry in searchUrls.
How do I monitor eBay prices over time with this Actor?
Save your searchUrls and filter combination as an Apify Schedule, pull each run's dataset via the API, and diff price, original_price and shippingCost against the previous run keyed on itemId — see "How do you monitor eBay prices and shipping costs over time?" above for the full workflow.
Does this Actor work with Claude, ChatGPT, and AI agent frameworks?
It's callable as a standard HTTP endpoint by any agent framework through the Apify API — an agent can trigger a run, poll or wait for it to finish, and pull the structured JSON dataset as grounded context for a shopping or price-comparison answer.
How does this differ from the base eBay Product Listing Scraper?
This variant adds real server-side location, condition, price-range and sort filtering on top of the base actor's search-URL fetching, and splits the base's single unlabeled attribute array into the shippingCost, itemLocation, buyingFormat and returnsAccepted columns — the base's raw card_attribute array is still included unchanged for backward compatibility. It also accepts the base's urls field as a legacy alias, so existing input JSON built for the base actor still runs.
Can I use this Actor without managing proxies or an eBay account?
Yes. No eBay login or API key is needed — it reads public search pages. Proxy handling is automatic by default: leave proxyConfiguration unset and the Actor escalates through connection tiers on its own, or supply your own Apify Proxy configuration to use as the first connection it tries.
💬 Your feedback
Found a bug, or a field that doesn't extract the way you expect? Let Scrapier know through the Actor's Issues tab on Apify Console, or leave a review on the Store listing — reports like these drive fixes and future updates.