# eBay Search Results Scraper (`epicscrapers/ebay-search-results-scraper`) Actor

⚡ Scrape eBay search engine results, categories, or entire stores. Extract listing titles, prices, images, URLs, and more. Perfect for market research, price tracking, automation etc.

- **URL**: https://apify.com/epicscrapers/ebay-search-results-scraper.md
- **Developed by:** [Epic Scrapers](https://apify.com/epicscrapers) (community)
- **Categories:** E-commerce, Automation
- **Stats:** 42 total users, 11 monthly users, 90.0% runs succeeded, 1 bookmarks
- **User rating**: 5.00 out of 5 stars

## Pricing

from $1.50 / 1,000 products

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

### eBay Search Results Scraper: live eBay listings from 17 marketplaces, from keywords or any eBay search URL

eBay Search Results Scraper turns eBay searches into a spreadsheet of live listings: price, shipping, condition, auction bids and end time, coupons, seller feedback, free returns and more. Paste a search URL from any of 17 eBay sites with your filters already set, or type keywords. Use it for price monitoring, product research, competitor and seller research, or sourcing.

- **17 marketplaces, URLs included.** US, UK, Germany, France, Italy, Spain, Canada, Australia, Netherlands, Austria, Switzerland, Ireland, Poland, Hong Kong, Malaysia, Philippines and Singapore. Each one was tested with a live run. A search URL from ebay.de runs on ebay.de, with its filters.
- **Never charged for a block.** If eBay blocks the requests, the run fails with a clear message instead of "succeeding" with an empty dataset. You pay only for listings that are saved.
- **Only real matches.** When eBay has no exact matches, it fills the page with "results matching fewer words". The actor skips those, so you don't pay for listings that don't match your search.
- **Prices in the marketplace's currency**, whatever the proxy location.
- **A run summary you can check.** The `SUMMARY` record shows, for every search, eBay's advertised total, pages read, listings saved, listings filtered and why, and why the search stopped.

**Scope:** This actor returns live listings that are for sale now. For completed sales and sold prices, use [eBay Sold Listings API](https://apify.com/epicscrapers/ebay-sold-listings-api).

### What can you do with eBay Search Results Scraper?

| Goal                      | How                                                                                                      |
| ------------------------- | -------------------------------------------------------------------------------------------------------- |
| Monitor prices            | Schedule a search and compare `price`, `shippingPrice` and `couponPrice` per `listingId` between runs.   |
| Find auctions ending soon | Set `listingType: "auction"` and `sort: "ending_soonest"`, then read `bidCount` and `auctionEndTime`.    |
| Research sellers          | Compare `sellerName`, `sellerFeedbackScore`, `sellerFeedbackPercent` and `sellerIsStore` across a niche. |
| Source products abroad    | Run the same search on several marketplaces; each returns its own currency.                              |
| Reuse your eBay filters   | Set filters on the eBay website, copy the URL and paste it into **eBay search URLs**.                    |
| Keep accessories out      | Add `excludeKeywords` such as `case`, `charger` or `box only`.                                           |

### Quick start

1. Click **Try for free** and sign in to Apify.
2. Paste an eBay search URL into **eBay search URLs**, or type a keyword into **Keyword queries**.
3. For a first run, set **Maximum results per search** to `20`.
4. Click **Start**. When the run finishes, open the **Output** tab and export the data.

```json
{
    "startUrls": [{ "url": "https://www.ebay.co.uk/sch/i.html?_nkw=nintendo+switch+oled&LH_PrefLoc=1&LH_Auction=1" }],
    "maxItems": 20
}
```

### What data can you extract?

Every row is one listing found by one search.

| Group    | Fields                                                                                                                                                            |
| -------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| Listing  | `listingId`, `variationId`, `title`, `url`, `image`, `condition`, `categoryId`, `categoryName`, `location`, `hasVariations`, `sponsored`, `authenticityGuarantee` |
| Price    | `price`, `currency`, `priceText`, `originalPrice`, `discountText`, `couponPrice`, `couponText`                                                                    |
| Shipping | `shippingPrice`, `shippingText`, `deliveryText`, `freeReturns`                                                                                                    |
| Format   | `listingType`, `buyItNowAvailable`, `bestOfferAvailable`, `bidCount`, `auctionEndTime`, `quantityRemaining`, `quantitySold`, `watchCount`                         |
| Seller   | `sellerName`, `sellerFeedbackScore`, `sellerFeedbackPercent`, `sellerIsStore`, `sellerText`                                                                       |
| Product  | `rating`, `reviewCount`                                                                                                                                           |
| Search   | `query`, `site`                                                                                                                                                   |

The run also saves a `SUMMARY` record to the key-value store, with one entry per search: `advertisedTotal` (eBay's result count), `pagesFetched`, `itemsSeen`, `itemsSaved`, `filtered` (`excludedKeyword`, `duplicate`, `notMatchingQuery`), `stoppedBecause` (`max_items_reached`, `no_more_pages`, `no_results`, `ebay_pagination_cap`, `blocked` or `charge_limit_reached`) and `ebayQuery`, the query sent to eBay.

### Track listings over time with scheduled runs

#### 1. Save your input as a task

Open the actor, set your URLs or keywords, then click **Save as a new task**.

#### 2. Schedule the task

In Apify Console, go to **Schedules**, click **Create new**, choose how often to run, and add your task. See [Schedules](https://docs.apify.com/platform/schedules) and [How to create a schedule](https://help.apify.com/en/articles/7120817-how-to-create-a-schedule).

Watch how to schedule an Actor:

https://www.youtube.com/watch?v=1jI7WcVQmwM

| Use case                | Frequency   | Cron expression |
| ----------------------- | ----------- | --------------- |
| Price monitoring        | Daily       | `0 6 * * *`     |
| Auctions ending today   | Twice a day | `0 8,18 * * *`  |
| New listings in a niche | Every hour  | `0 * * * *`     |

#### 3. Send the results to a spreadsheet

Connect Google in the task's **Integrations** tab to save every run to Google Sheets or Google Drive:

https://www.youtube.com/watch?v=IFTeKdj6ZGM

#### 4. Compare runs

Join runs on `listingId`. Price changes, new listings (IDs seen for the first time) and listings that disappeared (sold or ended) fall out of a simple comparison.

### Input reference

| Field                 | Type             | Default        | Effect                                                                                                                                                                          |
| --------------------- | ---------------- | -------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `startUrls`           | Array            | Empty          | eBay search URLs from any supported site (see below). Each must contain `_nkw`. The URL's site and filters are used.                                                            |
| `queries`             | Array of strings | Empty          | Keyword searches. Provide `startUrls`, `queries`, or both.                                                                                                                      |
| `country`             | String           | `"ebay.com"`   | Marketplace for keyword searches.                                                                                                                                               |
| `condition`           | String           | `"all"`        | Keyword searches: `"all"`, `"new"`, `"used"`, `"refurbished"` or `"for_parts"`.                                                                                                 |
| `listingType`         | String           | `"all"`        | Keyword searches: `"all"`, `"auction"` or `"buy_it_now"`.                                                                                                                       |
| `sort`                | String           | `"best_match"` | Keyword searches: `"best_match"`, `"ending_soonest"`, `"newly_listed"`, `"price_asc"` or `"price_desc"` (price sorts include postage).                                          |
| `categoryId`          | String           | Empty          | Keyword searches: eBay category ID, the number after `_sacat=` in a search URL.                                                                                                 |
| `minPrice`/`maxPrice` | Number           | Empty          | Keyword searches: price range in the marketplace currency.                                                                                                                      |
| `excludeKeywords`     | Array of strings | Empty          | All searches. Single words are sent to eBay as minus terms (`-case`), and every entry is also removed from titles after the search (whole words, case- and accent-insensitive). |
| `maxItems`            | Integer          | `100`          | Maximum listings saved per URL or keyword.                                                                                                                                      |
| `delaySecs`           | Number           | `1`            | Seconds to wait between page requests.                                                                                                                                          |
| `proxyConfiguration`  | Object           | No proxy       | Optional. With Apify Proxy and no country set, each marketplace uses a proxy in its own country, and blocked requests are retried on a new IP.                                  |

#### Supported marketplaces and URLs

`ebay.com` (USD), `ebay.co.uk` (GBP), `ebay.de` (EUR), `ebay.fr` (EUR), `ebay.it` (EUR), `ebay.es` (EUR), `ebay.ca` (CAD), `ebay.com.au` (AUD), `ebay.nl` (EUR), `ebay.at` (EUR), `ebay.ch` (CHF), `ebay.ie` (EUR), `ebay.pl` (PLN), `ebay.com.hk` (HKD), `ebay.com.my` (MYR), `ebay.ph` (PHP) and `ebay.com.sg` (SGD). All 17 were tested with live searches in October 2026. URLs may start with `www.`, `m.` or the bare domain, and must use HTTPS.

URL filters checked with live searches: `_nkw`, `_sacat` (category), `_sop` (sort), `_ipg` (results per page), `_udlo`/`_udhi` (price), `_ssn` (seller), `LH_BIN`, `LH_Auction`, `LH_ItemCondition`, `LH_PrefLoc` (item location), `LH_FS` (free shipping), `LH_FR` (free returns), `LH_TitleDesc` (search descriptions), `LH_Sold`/`LH_Complete`, `LH_SellerType`, and item-specific filters such as `Brand=LEGO`. Tracking parameters such as `_from`, `_trksid` and `rt` are dropped. Other parameters are forwarded as they are, and the log warns that they weren't verified.

### Ready-to-run examples

#### Auctions ending soon in the UK, UK sellers only

```json
{
    "startUrls": [
        { "url": "https://www.ebay.co.uk/sch/i.html?_nkw=nintendo+switch+oled&LH_PrefLoc=1&LH_Auction=1&_sop=1" }
    ],
    "maxItems": 50
}
```

#### Cheapest new Buy It Now offers, accessories excluded

```json
{
    "queries": ["sony wh-1000xm5"],
    "country": "ebay.de",
    "condition": "new",
    "listingType": "buy_it_now",
    "sort": "price_asc",
    "excludeKeywords": ["case", "cushion", "ear pads", "cable"],
    "maxItems": 100
}
```

#### Same product across four markets

```json
{
    "startUrls": [
        { "url": "https://www.ebay.com/sch/i.html?_nkw=lego+75192" },
        { "url": "https://www.ebay.co.uk/sch/i.html?_nkw=lego+75192" },
        { "url": "https://www.ebay.de/sch/i.html?_nkw=lego+75192" },
        { "url": "https://www.ebay.com.au/sch/i.html?_nkw=lego+75192" }
    ],
    "maxItems": 50
}
```

### Analyze the results with ChatGPT or Claude

Export the dataset as CSV and attach it to a chat. Some prompts to start with:

**Best deals.** "These are eBay listings for one product. Rank the 10 best offers by `price + shippingPrice` (use `couponPrice` when set), and skip sellers below 98% `sellerFeedbackPercent`."

**Auction watchlist.** "List the auctions (`listingType` = auction) ending in the next 24 hours by `auctionEndTime`, with `price` and `bidCount`."

**Seller landscape.** "Group listings by `sellerName`. Show each seller's number of listings, median price and feedback, and point out the eBay Stores."

### Output

Results go to the run's default dataset. Use the views **Overview**, **Auctions & offers** or **Sellers & returns**, or export everything as JSON, CSV, Excel, XML or HTML.

This is a real row from a ebay.co.uk auction search URL on October 3, 2026:

```json
{
    "query": "lego star wars 75192",
    "listingId": "189020346296",
    "variationId": null,
    "title": "LEGO Star Wars:The Mandalorian (75292) OVP, Alle Figuren,Alle Steine , Anleitung",
    "url": "https://www.ebay.co.uk/itm/189020346296?_skw=lego+star+wars+75192&epid=13042987983&hash=item2c027d97b8%3Ag%3A-S4AAeSwIqBqvWFJ&LH_Auction=1",
    "image": "https://i.ebayimg.com/images/g/-S4AAeSwIqBqvWFJ/s-l225.jpg",
    "condition": "Pre-owned",
    "price": 127.49,
    "currency": "GBP",
    "priceText": "£127.49",
    "originalPrice": null,
    "discountText": null,
    "couponPrice": null,
    "couponText": null,
    "shippingText": "+£14.87 delivery",
    "shippingPrice": 14.87,
    "deliveryText": null,
    "location": "from Germany",
    "listingType": "auction",
    "buyItNowAvailable": false,
    "quantityRemaining": 1,
    "quantitySold": null,
    "watchCount": null,
    "bidCount": 0,
    "auctionEndTime": "2026-10-03T19:24:48.000Z",
    "categoryId": "19006",
    "categoryName": "LEGO (R) Complete Sets & Packs",
    "sellerText": "pulled-porky (353) 98.4%",
    "sellerName": "pulled-porky",
    "sellerFeedbackScore": 353,
    "sellerFeedbackPercent": 98.4,
    "sellerIsStore": false,
    "rating": 4.5,
    "reviewCount": 6,
    "sponsored": false,
    "bestOfferAvailable": false,
    "hasVariations": false,
    "freeReturns": false,
    "authenticityGuarantee": false,
    "site": "ebay.co.uk"
}
```

#### Notes on fields

- `price` is the price eBay shows in search results. On ebay.co.uk, ebay.fr and ebay.it this includes eBay's Buyer Protection fee for items from private sellers. For sold prices with the fee removed, use [eBay Sold Listings API](https://apify.com/epicscrapers/ebay-sold-listings-api).
- `shippingPrice` is `0` for free shipping (including cards that only say "Free delivery in 2-4 days") and `null` when eBay doesn't show a cost. eBay often shows "Postage not specified" for domestic UK and EU listings in search results.
- `couponPrice` is the price after the coupon shown on the card. Coupons may need a code or have conditions on eBay.
- `listingType` is `auction` or `buy_it_now`. Auctions with a Buy It Now option have `buyItNowAvailable: true`.
- Return policies: search results only show free returns (`freeReturns`). Other return terms are on the item page, which this actor doesn't open.
- `categoryName` is filled when the category appears in eBay's category list for the search. `categoryId` is filled more often.
- Each listing is saved once per search. The same listing can appear in two different searches.
- Missing values are `null`.

### FAQ

#### Why did my run fail?

The actor fails on purpose when eBay blocks its requests (HTTP 403 or 429, rejected tokens, a login wall or an unexpected response) and nothing could be saved. The status message and log give the reason, and `SUMMARY` shows `stoppedBecause: "blocked"`. Nothing was saved, so nothing was charged for results. Try again later, or enable Apify Proxy in **Proxy**. If some searches worked before the block, the run finishes, the status message lists the blocked searches, and you pay only for saved listings.

#### Why did I get no results or fewer than eBay's total?

Check `SUMMARY`. `no_results` means eBay has no exact matches; the "results matching fewer words" it showed instead were skipped (`notMatchingQuery`). Fewer records than `advertisedTotal` usually come from `maxItems`, `excludeKeywords` or duplicates, and each is counted under `filtered`.

#### Which filters work in search URLs?

See [Supported marketplaces and URLs](#supported-marketplaces-and-urls). Unverified parameters are still forwarded, and the log tells you which ones.

#### Do I need proxies, an eBay account or an API key?

No. The actor works without a proxy. The **Proxy** option is there for retries on a new IP if eBay blocks requests.

#### Is it legal to scrape eBay?

The actor collects publicly visible listing data. You are responsible for how you use it, including eBay's terms and laws such as GDPR.

### Cost

This actor uses pay-per-event pricing. You pay for each listing saved to the dataset:

| Event     | Price per 1,000 results    | Charged when                               |
| --------- | -------------------------- | ------------------------------------------ |
| `product` | $1.50 to $3, by Apify plan | A listing is saved to the default dataset. |

Apify also charges its standard tiny "Actor start" event ($0.00005) when a run starts. A run that eBay blocks saves nothing, so it costs nothing for results. Skipped listings ("fewer words" fallbacks, excluded keywords, duplicates) aren't saved or charged, and neither is the `SUMMARY` record. With Apify Proxy enabled, proxy traffic is billed to your account as usual. Set a maximum cost per run in the run options; the actor stops cleanly when it's reached. The **Pricing** tab always shows current prices.

### Use through the Apify API

```bash
curl "https://api.apify.com/v2/acts/epicscrapers~ebay-search-results-scraper/run-sync-get-dataset-items?token=YOUR_APIFY_TOKEN" \
  -X POST \
  -H "Content-Type: application/json" \
  -d '{"queries": ["iphone 15"], "country": "ebay.co.uk", "maxItems": 50}'
```

```javascript
import { ApifyClient } from 'apify-client';

const client = new ApifyClient({ token: process.env.APIFY_TOKEN });
const run = await client.actor('epicscrapers/ebay-search-results-scraper').call({
    startUrls: [{ url: 'https://www.ebay.de/sch/i.html?_nkw=iphone+15&LH_BIN=1' }],
    maxItems: 50,
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
```

For a local run, save the input in `storage/key_value_stores/default/INPUT.json` and run `apify run`.

### Responsible use

Use this actor only for lawful purposes. Follow eBay's terms, applicable laws and data protection rules. Don't collect or use personal data without a lawful reason.

### Support

Report problems or request features in the **Issues** tab. Include the run ID, the input and what you expected. The `SUMMARY` record usually shows what happened. Don't include passwords or tokens.

This actor is not affiliated with or endorsed by eBay Inc. "eBay" is a trademark of eBay Inc.

# Actor input Schema

## `startUrls` (type: `array`):

One or more eBay search result URLs from ebay.com, ebay.co.uk, ebay.de, ebay.fr, ebay.it, ebay.es, ebay.ca, ebay.com.au, ebay.nl, ebay.at, ebay.ch, ebay.ie, ebay.pl, ebay.com.hk, ebay.com.my, ebay.ph or ebay.com.sg. Each URL must contain a non-empty \_nkw search query.

## `queries` (type: `array`):

Search terms to use without URL filters. You can use this field together with eBay search URLs.

## `country` (type: `string`):

eBay marketplace for keyword searches. Prices are returned in its currency.

## `condition` (type: `string`):

Item condition filter for keyword searches.

## `listingType` (type: `string`):

Auctions or Buy It Now listings, for keyword searches.

## `sort` (type: `string`):

eBay sort order for keyword searches. Price sorts include postage.

## `categoryId` (type: `string`):

Optional eBay category ID for keyword searches: the number after \_sacat= in an eBay search URL.

## `minPrice` (type: `number`):

Optional minimum price in the selected marketplace's currency. Applies only to keyword searches.

## `maxPrice` (type: `number`):

Optional maximum price in the selected marketplace's currency. Applies only to keyword searches.

## `excludeKeywords` (type: `array`):

Words or phrases to leave out of every search, URLs included (e.g. broken, case only). Single words are sent to eBay as minus terms (-broken); every entry is also removed from titles after the search.

## `maxItems` (type: `integer`):

Maximum number of unique listings to save for each URL or keyword query.

## `delaySecs` (type: `number`):

Time, in seconds, to wait between mobile API page requests.

## `proxyConfiguration` (type: `object`):

Optional. The Actor works without a proxy. With Apify Proxy and no country set, each marketplace uses a proxy in its own country, and blocked requests are retried on a new IP.

## Actor input object example

```json
{
  "startUrls": [
    {
      "url": "https://www.ebay.com/sch/i.html?_nkw=macbook&_sacat=0&LH_BIN=1"
    }
  ],
  "country": "ebay.com",
  "condition": "all",
  "listingType": "all",
  "sort": "best_match",
  "maxItems": 100,
  "delaySecs": 1,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# Actor output Schema

## `results` (type: `string`):

Link to the dataset of scraped records

## `summary` (type: `string`):

Per search: eBay's advertised total, pages fetched, results saved, results filtered and why, and why the search stopped.

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "startUrls": [
        {
            "url": "https://www.ebay.com/sch/i.html?_nkw=macbook&_sacat=0&LH_BIN=1"
        }
    ],
    "proxyConfiguration": {
        "useApifyProxy": false
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("epicscrapers/ebay-search-results-scraper").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {
    "startUrls": [{ "url": "https://www.ebay.com/sch/i.html?_nkw=macbook&_sacat=0&LH_BIN=1" }],
    "proxyConfiguration": { "useApifyProxy": False },
}

# Run the Actor and wait for it to finish
run = client.actor("epicscrapers/ebay-search-results-scraper").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "startUrls": [
    {
      "url": "https://www.ebay.com/sch/i.html?_nkw=macbook&_sacat=0&LH_BIN=1"
    }
  ],
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}' |
apify call epicscrapers/ebay-search-results-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,epicscrapers/ebay-search-results-scraper"
        }
    }
}
```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/TqKLx5EcsbDVL4nHC/builds/XOpa1V2yoyINV2p4y/openapi.json
