# eBay Products Scraper (`w3crawler/ebay-products-scraper`) Actor

Extract product listings that eBay exposes on its public search pages. The Actor keeps public fields and explicit access diagnostics, and stops at login, CAPTCHA, paywall, geofence, rate, device-verification, WAF, or other access boundaries without bypassing them.

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

## Pricing

from $2.99 / 1,000 products

This Actor is paid per event and usage. You are charged both the fixed price for specific events and for Apify platform usage.

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

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
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.
Actors are written with capital "A".

## 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.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

### What does eBay Products Scraper do?

This Actor extracts **public eBay search-result listings** from [eBay](https://www.ebay.com/) using the configured keyword, sort order, and condition filter. It is an **eBay API alternative for public search pages**, not a login or access-control bypass: CAPTCHA, login, paywall, geofence, rate-limit, device-verification, WAF, and access-denied responses stop the crawl and produce an explicit diagnostic row.

### Why use eBay Products Scraper?

Use the Actor for public price research, product discovery, reseller intelligence, catalog preparation, and lightweight market comparisons. It preserves the fields exposed by a result card, including item identity, title, public price text, currency, condition, seller information, shipping, bids, sold count, listing options, images, source URL, and extraction provenance.

The Actor is designed for predictable runs:

- `maxItems` is limited to 1-500.
- Requests use a bounded HTTP response size and timeout, at most ten public result pages, and an anonymous cookie session established through eBay's public help page.
- Public session state exists only for the run; the Actor does not modify browser fingerprint signals, solve challenges, use private endpoints, or save raw HTML.
- An optional `proxyConfiguration` input is supported for public requests. A proxy does not change the fail-closed behavior at an access boundary.

On Apify, you can schedule runs, call the Actor through the API tab, connect results to integrations, and monitor logs and dataset output.

### What data can eBay Products Scraper extract?

| Field | Type | Description |
|---|---|---|
| `itemId` | string | Public numeric eBay item identifier. |
| `title`, `productTitle` | string | Listing title and compatibility alias. |
| `url`, `canonicalUrl`, `trackingUrl` | string | Canonical and observed public listing URLs. |
| `price`, `priceMin`, `priceMax` | number | Numeric prices visible on the card, when present. |
| `priceText`, `currency` | string | Displayed price and inferred currency code. |
| `itemCondition` | string | Public condition label. |
| `seller`, `sellerRatingPercent`, `sellerRatingCount` | string/number | Public seller information when exposed. |
| `shipping`, `isFreeShipping`, `returnsText` | string/boolean | Public delivery and return signals. |
| `bids`, `isAuction`, `isBuyItNow`, `soldCount` | number/boolean | Public listing activity and purchase signals. |
| `recordType`, `found`, `dataAvailable`, `diagnosticCode` | string/boolean | Stable success or diagnostic classification. |

Optional product fields are omitted when eBay does not expose them. Every row includes a stable `recordId`, `ok`, `found`, `dataAvailable`, `usedProxy`, source URL, and timestamp. Diagnostic rows set the success flags to `false`.

### How to scrape eBay product search results

1. Open the **Input** tab and enter a public eBay search phrase in `query`.
2. Set `maxItems`, `sortBy`, and `condition` if you need a smaller result set or a particular ordering.
3. Optionally configure a permitted proxy or a `userAgent` request value.
4. Start the Actor and inspect the **Dataset** tab. Filter successful listings with `recordType: "ebay-product"` and diagnostics with `recordType: "ebay-product-diagnostic"`.
5. For automation, use the **API** tab or schedule the Actor from the Apify Console.

### How much will it cost to scrape eBay?

The cost depends on browser compute time and the number of public pages needed. Lower `maxItems` values generally finish sooner. A run uses at most ten result pages, one concurrent browser page, and bounded waits, so a blocked or empty public response does not trigger an unbounded crawl. Check the run's compute-unit usage in Apify for the current platform price.

### Input

See the input tab for full configuration options.

| Field | Type | Default | Required | Description |
|---|---|---:|:---:|---|
| `query` | string | — | Yes | Public eBay search keyword or product name. |
| `maxItems` | integer | `48` | No | Maximum records, from 1 to 500. |
| `sortBy` | string | `best_match` | No | `best_match`, `price_low`, `price_high`, or `newly_listed`. |
| `condition` | string | `any` | No | `any`, `new`, or `used`. |
| `userAgent` | string | fixed standard value | No | Optional public request User-Agent header. |
| `proxyConfiguration` | object | none | No | Optional permitted proxy configuration for a public request. |

### Output

You can download the dataset in various formats such as JSON, HTML, CSV, or Excel. A successful row looks like this:

```json
{
  "recordType": "ebay-product",
  "found": true,
  "dataAvailable": true,
  "itemId": "123456789012",
  "productTitle": "Example wireless headphones with charging case",
  "price": 49.99,
  "currency": "USD",
  "url": "https://www.ebay.com/itm/123456789012"
}
```

When public access is unavailable, the Actor emits a diagnostic instead of pretending that a product was found:

```json
{
  "recordType": "ebay-product-diagnostic",
  "found": false,
  "dataAvailable": false,
  "diagnosticCode": "CAPTCHA_OR_CHALLENGE",
  "diagnosticMessage": "eBay presented a CAPTCHA or human-verification challenge."
}
```

### Tips and troubleshooting

Start with a modest `maxItems` value. If the dataset contains a diagnostic row, read `diagnosticCode`, `errorMessage`, `httpStatus`, and `sourceUrl`; do not interpret a diagnostic as a product result. A `NO_PUBLIC_DATA` row means the page was reachable but did not expose a sufficiently rich public listing card. A `REQUEST_FAILED` row indicates that the bounded request attempts or browser run failed.

### Key-value store

The actor does not write custom key-value records. Product and diagnostic rows are stored in the dataset; the declared key-value store is intentionally empty.

### FAQ, disclaimers, and support

The Actor does not log in, solve CAPTCHAs, defeat paywalls, access private data, use mirrors or private endpoints, or bypass robots and WAF controls. It only extracts information that the target makes publicly visible at run time.

Our Actors are ethical and do not extract any private user data, such as email addresses, gender, or location. They only extract what the user has chosen to share publicly. We therefore believe that our Actors, when used for ethical purposes by Apify users, are safe. However, you should be aware that your results could contain personal data. Personal data is protected by the GDPR in the European Union and by other regulations around the world. You should not scrape personal data unless you have a legitimate reason to do so. If you're unsure whether your reason is legitimate, consult your lawyers.

Use the Issues tab for feedback and the API tab for programmatic access. Follow eBay's terms, robots instructions, and applicable law when using the results.

# Actor input Schema

## `query` (type: `string`):

Public eBay search keyword or product name.

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

Optional public eBay search or category URLs. When supplied, these are used instead of generating a URL from query.

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

Maximum number of public product records to emit; values are capped at 500 by the Actor.

## `sortBy` (type: `string`):

How to sort the public eBay search results.

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

Filter public eBay search results by item condition.

## `userAgent` (type: `string`):

Optional User-Agent request header for a public request. A fixed standard browser value is used when omitted; the Actor does not alter page fingerprinting or browser state.

## `timeoutMs` (type: `integer`):

Maximum time for each bounded public HTTP request.

## `maxBytes` (type: `integer`):

Stop downloading a public response after this many bytes.

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

Optional proxy for the public eBay request. Access boundaries remain terminal and are never bypassed.

## Actor input object example

```json
{
  "query": "laptop",
  "maxItems": 48,
  "sortBy": "best_match",
  "condition": "any",
  "timeoutMs": 30000,
  "maxBytes": 5000000
}
```

# Actor output Schema

## `dataset` (type: `string`):

Public eBay product records and clearly labeled diagnostic rows.

# 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 = {
    "query": "laptop"
};

// Run the Actor and wait for it to finish
const run = await client.actor("w3crawler/ebay-products-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 = { "query": "laptop" }

# Run the Actor and wait for it to finish
run = client.actor("w3crawler/ebay-products-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 '{
  "query": "laptop"
}' |
apify call w3crawler/ebay-products-scraper --silent --output-dataset

```

## MCP server setup

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