# eBay Scraper – Listings, Prices, Auctions & Item Details (`ninhothedev/ebay-scraper`) Actor

Scrape eBay search results & item pages on 12 marketplaces: price, bids, end time, shipping, condition, seller feedback, sold count, item specifics, images. Filters + URLs.

- **URL**: https://apify.com/ninhothedev/ebay-scraper.md
- **Developed by:** [ninhothedev](https://apify.com/ninhothedev) (community)
- **Categories:** E-commerce, Lead generation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.00 / 1,000 results

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

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 Scraper – Listings, Prices, Auctions & Item Details

Scrape **eBay search results and item pages** on 12 eBay marketplaces (eBay.com, .co.uk, .de, .fr, .it, .es, .com.au, .ca, .at, .ch, .nl, .ie). Get prices, original/strikethrough prices, auction bids and end times, shipping costs, condition, seller name and feedback, sold counts, watchers, sponsored flags and images. Optionally open every listing to add **item specifics (brand, model, MPN, UPC/EAN), all images, seller feedback score, quantity available/sold, returns policy, item location, category path and the full description text**. No eBay account or API key needed. Export to JSON, CSV, Excel or straight into your tools.

### What data can you extract?

| Field | Example |
|---|---|
| `item_id`, `url`, `title` | `860040249865`, `https://www.ebay.co.uk/itm/860040249865`, `Brand New Sealed LEGO Star Wars UCS Millennium Falcon 75192` |
| `price`, `currency`, `price_text` | `599.84`, `GBP`, `£599.84` |
| `original_price`, `discount_percent`, `price_max` | `599.99`, `5.0`, upper end of variation price ranges |
| `condition`, `seller_type` | `Brand new`, `Gewerblich` (business/private on EU sites) |
| `buying_format`, `accepts_best_offer` | `AUCTION`, `BUY_IT_NOW`, `BEST_OFFER`, `AUCTION_WITH_BIN` · `true` |
| `bids`, `time_left`, `end_time`, `bin_price` | `1`, `3m`, `2026-10-15T20:59:00Z`, Buy It Now price of auctions |
| `shipping_cost`, `free_shipping`, `shipping_text` | `47.04`, `false`, `+ £47.04 postage estimate` |
| `location`, `free_returns` | `Surbiton, United Kingdom`, `false` |
| `seller`, `seller_feedback_percent`, `seller_feedback_count` | `day9576`, `100`, `362` |
| `sold_count`, `watchers`, `rating`, `ratings_count` | `8`, `13`, `4.5`, `12` |
| `is_sponsored`, `is_new_listing` | `true` / `false` |
| `image`, `thumbnails`, `images` | 1600 px image + all gallery images |
| `category_id`, `category_path`, `epid` | `19006`, `Toys & Games > LEGO …`, eBay product ID |
| `item_specifics`, `brand`, `model`, `mpn`, `gtin` | `{"LEGO Set Number": "75192", …}`, `LEGO`, `75192` |
| `quantity_available`, `quantity_sold` | `10`, `154` (multi-quantity listings) |
| `returns_text`, `returns_accepted`, `delivery_text` | `No returns accepted`, `false`, `Varies` |
| `description_text` | Seller description as plain text |
| `marketplace`, `search_query`, `page`, `position`, `scraped_at` | `ebay.co.uk`, `lego 75192`, `1`, `1`, ISO timestamp |

Every row has the same flat structure in all modes. Detail fields are empty unless **Scrape item details** is enabled.

### How to use

1. Enter one or more **search keywords** (or paste eBay search, category, store or item URLs).
2. Pick the **marketplace** and optional filters: condition, buying format (auction / Buy It Now / Best Offer), price range, sort order (newly listed, ending soonest, price), category ID, item location/country, free shipping, seller.
3. Set **Max items**, optionally enable **Scrape item details**, and click **Start**.

```json
{
  "searchQueries": ["nintendo switch oled", "steam deck"],
  "marketplace": "ebay.de",
  "condition": ["used"],
  "buyingFormat": "all",
  "minPrice": 100,
  "maxPrice": 400,
  "sort": "newest",
  "maxItems": 200,
  "includeDetails": true
}
```

Auction sniping example: `"buyingFormat": "auction", "sort": "ending_soonest"` gives you live auctions with bids, time left and computed `end_time` (UTC).

### Output example

Real row from a test run (`includeDetails: true`, shortened):

```json
{
  "item_id": "860040249865",
  "url": "https://www.ebay.co.uk/itm/860040249865",
  "title": "Brand New Sealed LEGO Star Wars UCS Millennium Falcon 75192 Mint Condition",
  "subtitle": null,
  "price": 599.84,
  "price_max": null,
  "currency": "GBP",
  "price_text": "£599.84",
  "original_price": null,
  "discount_percent": null,
  "bin_price": null,
  "condition": "Brand new",
  "seller_type": null,
  "buying_format": "BEST_OFFER",
  "accepts_best_offer": true,
  "bids": null,
  "time_left": null,
  "end_time": "2026-11-13T12:10:43.000Z",
  "end_time_text": null,
  "shipping_cost": 47.04,
  "free_shipping": false,
  "shipping_text": "+ £47.04 postage estimate",
  "location": "Surbiton, United Kingdom",
  "free_returns": false,
  "seller": "day9576",
  "seller_feedback_percent": 100,
  "seller_feedback_count": 362,
  "sold_count": null,
  "watchers": null,
  "status": "active",
  "is_sponsored": false,
  "is_new_listing": false,
  "is_fewer_words_match": false,
  "rating": 5,
  "ratings_count": null,
  "image": "https://i.ebayimg.com/images/g/uD8AAeSw87Bqejee/s-l1600.jpg",
  "thumbnails": [
    "https://i.ebayimg.com/images/g/uD8AAeSw87Bqejee/s-l225.webp",
    "https://i.ebayimg.com/images/g/KJQAAeSwMyRqejee/s-l225.webp"
  ],
  "category_id": "19006",
  "epid": "15048276757",
  "marketplace": "ebay.co.uk",
  "search_query": null,
  "search_url": "https://www.ebay.co.uk/sch/i.html?_nkw=lego+75192&_ipg=60",
  "page": 1,
  "position": 1,
  "details_scraped": true,
  "images": [
    "https://i.ebayimg.com/images/g/uD8AAeSw87Bqejee/s-l1600.webp",
    "https://i.ebayimg.com/images/g/KJQAAeSwMyRqejee/s-l1600.webp"
  ],
  "item_specifics": {
    "LEGO Theme": "Star Wars",
    "LEGO Set Number": "75192",
    "Number of Pieces": "7541",
    "Retired": "Yes",
    "Material": "Plastic",
    "Year Manufactured": "2019"
  },
  "brand": "LEGO",
  "model": null,
  "mpn": "75192",
  "gtin": null,
  "condition_description": "New: A brand-new, unused, unopened and undamaged item in original retail packaging (where …",
  "quantity_available": null,
  "quantity_sold": null,
  "quantity_text": null,
  "seller_feedback_score": 362,
  "seller_url": null,
  "seller_items_sold": null,
  "shipping_details": "Will post to Germany. Read item description or contact seller for postage options. postage Located in: Surbiton, United Kingdom",
  "delivery_text": "Varies",
  "item_location": "Surbiton, United Kingdom",
  "returns_text": "No returns accepted",
  "returns_accepted": false,
  "category_path": null,
  "description_text": "brand new sealed box item\nmint condition",
  "scraped_at": "2026-10-15T20:56:20Z"
}
```

Dataset views: **Listings** (overview), **Auctions** (bids, time left, end time) and **Item details** (specifics, quantities, returns).

### Pricing

Pay per result, no subscription:

- **$1.00 per 1,000 listings** from search results.
- **+$2.00 per 1,000 listings** when *Scrape item details* is enabled (each listing page is opened; item URLs always include details).

Example: 1,000 listings = **$1.00**; 1,000 listings with full item details = **$3.00**. That is cheaper than the most-used eBay actors in the Store ($2.50–$5.00 per 1,000) while returning more fields.

### Use cases

- **Price monitoring & repricing**: track competitor prices, discounts and shipping costs per marketplace.
- **Market research & product sourcing**: find demand (sold counts, watchers) and price spreads across 12 countries.
- **Auction sniping & deal alerts**: schedule "ending soonest" or "newly listed" searches and push new deals to Slack/email.
- **Lead generation**: collect active eBay sellers in a niche with feedback scores and store links.
- **Catalog enrichment**: map listings to brand/MPN/UPC/EAN via item specifics.
- **Brand protection**: detect unauthorized sellers or counterfeit listings by keyword and seller.

### Integrations

Use the Apify API, schedules and webhooks, or connect to **Make, Zapier, n8n, Google Sheets, Airbyte, Slack** and more.

```python
from apify_client import ApifyClient

client = ApifyClient("<YOUR_APIFY_TOKEN>")
run = client.actor("ninhothedev/ebay-scraper").call(run_input={
    "searchQueries": ["iphone 15"], "marketplace": "ebay.com", "maxItems": 100,
})
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item["title"], item["price"], item["currency"], item["url"])
```

```javascript
import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: '<YOUR_APIFY_TOKEN>' });
const run = await client.actor('ninhothedev/ebay-scraper').call({ searchQueries: ['iphone 15'], maxItems: 100 });
const { items } = await client.dataset(run.defaultDatasetId).listItems();
```

### FAQ

**Is scraping eBay legal?** The actor only collects publicly visible listing data (no login, no personal data beyond public seller usernames). Check eBay's terms and your local laws for your use case.

**Can it scrape sold / completed listings?** No. Since 2025 eBay shows sold and completed search results only to signed-in users, and this actor does not log in. If you request them, the run scrapes active listings instead and says so in the status message and `RUN_SUMMARY`.

**How many results can I get?** eBay shows up to ~10,000 results per search. Split big searches by category, price range or condition to get more. `maxItems` is an exact cap.

**What about blocking?** eBay uses Akamai bot protection. The actor rotates proxy sessions and real-browser TLS fingerprints. If a page stays blocked on datacenter proxies, it retries that page through residential proxies automatically. Failed sources are listed in the `RUN_SUMMARY` record; partial results are always kept.

**Why is `is_sponsored` sometimes empty?** Some marketplaces (e.g. eBay.fr/.it/.es) don't expose the promoted flag in the page data. Then the field is `null` (unknown), not `false`.

**Can I schedule it?** Yes. Use Apify Schedules (e.g. hourly "newly listed" searches) plus webhooks or integrations to get alerts.

**Support?** Open an issue on the actor's Issues tab. Feature requests are welcome.

### Related actors by ninhothedev

- [Amazon Product Scraper](https://apify.com/ninhothedev/amazon-product-scraper)
- [Kleinanzeigen Scraper](https://apify.com/ninhothedev/kleinanzeigen-scraper)
- [Willhaben Scraper](https://apify.com/ninhothedev/willhaben-scraper)
- [Shopify Store Scraper](https://apify.com/ninhothedev/shopify-store-scraper)

# Actor input Schema

## `searchQueries` (type: `array`):

One or more eBay search terms (e.g. 'iphone 15', 'rolex submariner', 'lego 75192'). Each keyword is searched on the selected marketplace with the filters below. eBay operators work too: "exact phrase", -exclude, (a,b) for OR.

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

Paste any eBay URL: search result pages (/sch/i.html?...), category or browse pages (/b/...), seller store pages (/str/...) or single item pages (/itm/123456789012). Search URLs keep all their own filters; item URLs are scraped with full details. Plain item IDs are accepted too.

## `marketplace` (type: `string`):

Which eBay site to search for keywords. URLs use their own domain automatically.

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

Exact cap on the total number of listings saved across all keywords and URLs. 0 = no limit (eBay shows at most ~10,000 results per search).

## `maxItemsPerQuery` (type: `integer`):

Optional cap per keyword or URL, useful when tracking many keywords. 0 = only the global limit applies.

## `condition` (type: `array`):

Only listings in these conditions. Leave empty for all.

## `buyingFormat` (type: `string`):

Auctions only, Buy It Now only, or listings accepting Best Offer.

## `minPrice` (type: `integer`):

Minimum item price in the marketplace currency.

## `maxPrice` (type: `integer`):

Maximum item price in the marketplace currency.

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

Result order. 'Ending soonest' is ideal for auction sniping, 'Newly listed' for deal monitoring.

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

Optional eBay category ID (the number in category URLs, e.g. 9355 = Cell Phones & Smartphones, 31387 = Wristwatches). A category URL is accepted too.

## `itemLocation` (type: `string`):

Where the item is located relative to the marketplace.

## `locationCountry` (type: `string`):

Only items located in this country, 2-letter code: US, GB, DE, FR, IT, ES, AU, CA, CN, JP, HK, NL, AT, CH, PL, IE, BE, SE, KR, TW, IN, TR. Overrides 'Item location'.

## `freeShippingOnly` (type: `boolean`):

Only listings with free shipping/delivery.

## `sellerUsername` (type: `string`):

Only listings from this eBay seller (user ID).

## `excludeSponsored` (type: `boolean`):

Drop promoted (sponsored) results. Every row also has an is_sponsored flag.

## `excludeFewerWordsMatches` (type: `boolean`):

eBay pads small result sets with 'Results matching fewer words' – loosely related items. Enabled = keep only real matches for keyword searches.

## `includeDetails` (type: `boolean`):

Open every listing page to add item specifics (brand, model, MPN, UPC/EAN …), all images, seller feedback score & items sold, quantity available/sold, shipping, returns policy, item location and category path. One extra request per item – slower, same price.

## `includeDescription` (type: `boolean`):

Also download the seller's full item description as plain text (requires 'Scrape item details').

## `maxConcurrency` (type: `integer`):

Parallel item-page requests when details are enabled.

## `maxPages` (type: `integer`):

Safety limit on result pages per keyword/URL (60–240 items per page). 0 = until Max items is reached.

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

eBay blocks bots aggressively. Apify Proxy (datacenter) is used by default with session + browser-fingerprint rotation.

## `residentialFallback` (type: `boolean`):

If eBay blocks the datacenter proxies repeatedly, switch to Apify residential proxies automatically so the run still finishes.

## Actor input object example

```json
{
  "searchQueries": [
    "iphone 15"
  ],
  "marketplace": "ebay.com",
  "maxItems": 20,
  "maxItemsPerQuery": 0,
  "condition": [],
  "buyingFormat": "all",
  "sort": "best_match",
  "itemLocation": "default",
  "freeShippingOnly": false,
  "excludeSponsored": false,
  "excludeFewerWordsMatches": true,
  "includeDetails": false,
  "includeDescription": false,
  "maxConcurrency": 3,
  "maxPages": 0,
  "proxyConfiguration": {
    "useApifyProxy": true
  },
  "residentialFallback": true
}
```

# Actor output Schema

## `listings` (type: `string`):

No description

## `details` (type: `string`):

No description

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

No description

## `auctions` (type: `string`):

No description

# 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 = {
    "searchQueries": [
        "iphone 15"
    ],
    "marketplace": "ebay.com",
    "maxItems": 20,
    "proxyConfiguration": {
        "useApifyProxy": true
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("ninhothedev/ebay-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 = {
    "searchQueries": ["iphone 15"],
    "marketplace": "ebay.com",
    "maxItems": 20,
    "proxyConfiguration": { "useApifyProxy": True },
}

# Run the Actor and wait for it to finish
run = client.actor("ninhothedev/ebay-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 '{
  "searchQueries": [
    "iphone 15"
  ],
  "marketplace": "ebay.com",
  "maxItems": 20,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}' |
apify call ninhothedev/ebay-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,ninhothedev/ebay-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/d7p0fY8Tbu0ZfunP8/builds/PbnyKKJHyB3GsQCuI/openapi.json
