# eBay Scraper - Products, Sellers, Prices & Monitoring (`abotapi/ebay-com-scraper`) Actor

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.

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

## Pricing

from $1.20 / 1,000 listing results

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?

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

## eBay Marketplace Scraper

Pull structured listing data from eBay across sixteen country storefronts. Search by keyword, by
category id or by seller username, 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.

### 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.
- **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 feedback 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,
  UPDATED or REAPPEARED, with the changed field names listed on every updated row. Auction countdowns
  are excluded from change detection, so a ticking clock 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 rows you
  already have.

### Data You Get

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

| Field | Example |
| --- | --- |
| `itemId` | `"000000000001"` |
| `url` | `"https://www.ebay.com/itm/000000000001"` |
| `title` | `"Sample Listing Title"` |
| `subtitle` | `"Sample seller strapline"` |
| `condition` | `"Good - Refurbished"` |
| `conditionId` | `"2030"` |
| `brand` | `"Sample Brand"` |
| `marketplace` | `"com"` |
| `marketplaceDomain` | `"www.ebay.com"` |
| `price` | `224.17` |
| `priceMax` | `545.25` |
| `priceText` | `"$224.17 to $545.25"` |
| `currency` | `"USD"` |
| `originalPrice` | `263.73` |
| `discountPercent` | `15.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` | `1560` |
| `sellerName` | `"examplestore"` |
| `sellerUrl` | `"https://www.ebay.com/sch/examplestore/m.html"` |
| `sellerFeedbackPercent` | `99.6` |
| `sellerFeedbackCount` | `172600` |
| `badges` | `["Sample Badge"]` |
| `imageUrl` | `"https://i.ebayimg.com/images/g/000000000000/s-l500.webp"` |
| `attributes` | `["Buy It Now", "Free delivery", "Located in United States"]` |
| `images` | `["https://i.ebayimg.com/images/g/000000000000/s-l1600.jpg"]` |
| `itemSpecifics` | `{"Processor": "Sample Processor", "SSD Capacity": "1 TB"}` |
| `categoryPath` | `["Electronics", "Computers", "Laptops"]` |
| `description` | `"Full seller description text appears here when Read item pages is on."` |
| `detailIncomplete` | `true` (present only when Read item pages is on and this listing's item page was still refused after a retry — the row carries its result-card fields and is not billed the item page event) |
| `mpn` | `"SAMPLE-MPN"` |
| `model` | `"Sample Model"` |
| `color` | `"Black"` |
| `availability` | `"In Stock"` |
| `quantityAvailable` | `10` |
| `quantitySold` | `1560` |
| `paymentMethods` | `["PayPal", "Visa"]` |
| `returnPolicy` | `"Returns: Seller does not accept returns"` |
| `searchQuery` | `"laptop"` |
| `pageNumber` | `1` |
| `scrapedAt` | `"2026-01-01T00:00:00Z"` |
| `changeType` | `"NEW"` |
| `changedFields` | `[]` |

Fields from `images` down to `returnPolicy` are `null` unless **Read item pages** is on.

### How to Use

Search one marketplace by keyword:

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

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

```json
{
  "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 two whole seller stores with their item pages:

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

Scrape pasted links, mixing marketplaces and link kinds:

```json
{
  "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
}
```

Monitor the same search daily and get only what changed:

```json
{
  "mode": "search",
  "queries": ["pokemon card"],
  "incrementalMode": true,
  "maxItems": 0
}
```

### Input Parameters

| Parameter | Type | Default | Description |
| --- | --- | --- | --- |
| `mode` | string | `search` | `search` or `url`. |
| `queries` | array | `["laptop"]` | Search keywords. Search mode only. |
| `sellerUsernames` | array | empty | Seller usernames whose listing pages are walked. Search mode only. |
| `marketplace` | string | `com` | Which of the sixteen storefronts to search. Search mode only; a pasted link carries its own. |
| `categoryId` | string | empty | Numeric category id from the marketplace's own category links. |
| `condition` | array | empty | New, Open box, the four refurbished grades, Seller refurbished, Used, For parts. Multi-select. |
| `buyingFormat` | string | `any` | Any, Buy It Now, Auction, Accepts offers. |
| `minPrice` / `maxPrice` | integer | empty | Price band in the marketplace's own currency. |
| `freeShippingOnly` | boolean | `false` | Keep only listings flagged as free delivery. |
| `freeReturnsOnly` | boolean | `false` | Keep only listings offering free returns. |
| `returnsAcceptedOnly` | boolean | `false` | Keep only listings that accept returns at all. |
| `itemLocation` | string | `default` | Marketplace default, marketplace country only, same continent, or worldwide. |
| `sortBy` | string | `best_match` | Best match, ending soonest, newly listed, price and delivery lowest or highest. |
| `urls` | array | two examples | Result, seller, browse category and item links. URL mode only. |
| `minSellerFeedbackPercent` | integer | empty | Applies in both modes. Sellers with no score yet are kept. |
| `fetchDetails` | boolean | `false` | Read each listing's item page. Adds one Item page event per listing. Refused item pages get a second pass; a listing that still cannot be read ships without details, flagged `detailIncomplete`, unbilled. |
| `maxItems` | integer | `20` | The run's cap. `0` means unlimited. |
| `maxPages` | integer | `0` | Result pages per keyword, seller or link. `0` means no limit. |
| `resumeFromRunId` | string | empty | Continue one interrupted run from its run or dataset id. |
| `incrementalMode` | boolean | `false` | Return only what changed since the last run of the same search. |
| `stateKey` | string | empty | Name a monitoring campaign, or deliberately share state. |
| `emitUnchanged` | boolean | `false` | Also return, and bill, UNCHANGED rows. |
| `emitExpired` | boolean | `false` | Also return, and bill, EXPIRED rows. |
| `proxy` | object | Apify Proxy on | Connection configuration. |
| `mcpConnectors` | array | empty | Optional MCP connectors to also write results into. |
| `notionParentPageUrl` | string | empty | Notion parent page id or URL, Notion connector only. |
| `maxNotifyListings` | integer | `50` | Cap on items written to each connector. |

### Output Example

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

```json
{
  "itemId": "000000000001",
  "url": "https://www.ebay.com/itm/000000000001",
  "title": "Sample Listing Title",
  "subtitle": "Sample seller strapline",
  "condition": "Good - Refurbished",
  "conditionId": "2030",
  "brand": "Sample Brand",
  "marketplace": "com",
  "marketplaceDomain": "www.ebay.com",
  "price": 224.17,
  "priceMax": 545.25,
  "priceText": "$224.17 to $545.25",
  "currency": "USD",
  "originalPrice": 263.73,
  "discountPercent": 15.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": 1560,
  "sellerName": "examplestore",
  "sellerUrl": "https://www.ebay.com/sch/examplestore/m.html",
  "sellerFeedbackPercent": 99.6,
  "sellerFeedbackCount": 172600,
  "badges": ["Sample Badge"],
  "imageUrl": "https://i.ebayimg.com/images/g/000000000000/s-l500.webp",
  "attributes": ["Buy It Now", "Free delivery", "Located in United States"],
  "images": ["https://i.ebayimg.com/images/g/000000000000/s-l1600.jpg"],
  "itemSpecifics": { "Processor": "Sample Processor", "SSD Capacity": "1 TB" },
  "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": 263.73,
  "availability": "In Stock",
  "quantityAvailable": 10,
  "quantitySold": 1560,
  "paymentMethods": ["PayPal", "Visa"],
  "shippingDetails": "Shipping: Sample shipping line",
  "returnPolicy": "Returns: Seller does not accept returns",
  "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"
}
```

### 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.

### Known Limits

Stated plainly so you can decide before you run.

- **Sold and completed listings are behind an eBay account and cannot be read.** Both the
  `LH_Sold=1` and `LH_Complete=1` filters were probed live on 2026-09-04, on two different connection
  pools: eBay answers them with its sign-in page, not with results. This scraper therefore does not
  offer a sold-listings toggle rather than offering one that silently returns nothing. If a run does
  hit a sign-in page (for example from a pasted link carrying those filters), the log says so
  explicitly and the run does not pretend the search was empty.
- **The Philippines storefront is not offered.** `ebay.ph` redirects to the United States storefront,
  so listing it as a separate marketplace would be an option that quietly does something else.
- **The Canada storefront is less reliable on the default connection.** It answers more consistently
  on the alternative option in the Connection section, and the run says so at startup when you pick
  the Canada storefront without one.
- **Some labels are richest on English-language storefronts.** The structural fields (item id, title,
  price, currency, seller, feedback score, image) are read the same way on all sixteen. A handful of
  derived labels (`listingType`, `freeShipping`, `soldCount`, `freeReturns`) are parsed from the
  marketplace's own wording and are most complete on the English-language storefronts. The raw wording
  is always available in `attributes` regardless of language.
- **Promoted listings can appear ahead of the requested sort order.** That is the marketplace's own
  behaviour, not something a scraper can undo.
- **`conditionId` is populated from English condition labels.** On other storefronts `condition`
  carries the marketplace's own wording and `conditionId` may be `null`.
- **Incremental mode deliberately ignores some fields.** `timeLeft`, `attributes`, `scrapedAt`,
  `updatedAt`, `sourceUrl`, `pageNumber` and `searchQuery` never appear in `changedFields`: an auction
  countdown moves on every fetch and would otherwise rewrite every auction row every run. Every real
  change still shows up, because each of those is also carried by a structured field that is tracked.

### Plan Requirement

Apify Proxy is recommended and the default configuration is enough for fifteen of the sixteen
marketplaces. No eBay account, API key or other credential is required.

# Actor input Schema

## `mode` (type: `string`):

Choose 'search' to search a marketplace by keyword, seller, category and filters, or 'url' to scrape pasted links.

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

Only used when mode = search, ignored in url mode. One or more keywords, for example 'laptop', 'pokemon card' or a part number. Leave empty to browse a category or a seller alone.

## `sellerUsernames` (type: `array`):

Only used when mode = search, ignored in url mode. One or more seller usernames, for example 'examplestore'. Each seller's own listing page is walked forward. Combine with keywords, or use on its own to pull a whole store.

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

Only used when mode = search, ignored in url mode where the marketplace is taken from each pasted link's own address. Every option here was checked live and returns real results. Prices come back in that marketplace's own currency.

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

Optional. Keep only listings in this marketplace category, given as the numeric id that appears in the marketplace's own category links (for example 177 for PC laptops). Combine with a keyword, or use on its own to browse a whole category.

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

Optional. Keep only listings in these conditions. Selecting several returns listings in any of them. Applied by the marketplace itself, so it narrows the result count at the source.

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

Optional. Keep only listings sold in this format. Applied by the marketplace itself.

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

Optional. Keep only listings priced at or above this amount, in the selected marketplace's own currency. Applied by the marketplace itself.

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

Optional. Keep only listings priced at or below this amount, in the selected marketplace's own currency. Applied by the marketplace itself.

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

Optional. Keep only listings the marketplace flags as free delivery. Applied by the marketplace itself.

## `freeReturnsOnly` (type: `boolean`):

Optional. Keep only listings that offer free returns. Applied by the marketplace itself.

## `returnsAcceptedOnly` (type: `boolean`):

Optional. Keep only listings that accept returns at all, whether or not the buyer pays for them. Applied by the marketplace itself.

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

Optional. Keep only listings held in this region, as the marketplace defines it relative to the storefront you selected. Applied by the marketplace itself.

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

The order the marketplace returns results in. All five are the marketplace's own orderings, applied at the source. Promoted listings can still appear ahead of the requested order.

## `urls` (type: `array`):

Only used when mode = url, ignored in search mode. Mix freely: item pages such as /itm/123456789012 , result pages such as /sch/i.html?\_nkw=laptop , seller listing pages such as /sch/examplestore/m.html , and browse category pages such as /b/PC-Laptops-Netbooks/177 .

## `minSellerFeedbackPercent` (type: `integer`):

Optional. Keep only listings from sellers with at least this positive feedback percentage. Applied to the results in both modes. A seller too new to have a score yet is kept rather than dropped.

## `fetchDetails` (type: `boolean`):

Read each listing's own item page for the full image gallery, the item specifics table, the category trail, brand, MPN, model, quantity available and sold, payment methods and the seller's full description. One extra request per listing, billed as one Item page event per listing returned. Pasted item links always read their item page, since a pasted link has no result card behind it. If the marketplace refuses some item pages, every affected listing is retried once before the run ends; a listing that still could not be read ships with its result-card fields, carries detailIncomplete: true, and is not billed the item page event.

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

Maximum number of listings to return across the whole run. This is the run's cap. Use 0 for unlimited.

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

Maximum number of result pages read per keyword, seller or link. 0 means no limit, which is the default: the run then stops only at Max listings, at the end of the results, or when a page returns nothing new.

## `resumeFromRunId` (type: `string`):

Paste a previous run ID or dataset ID to continue a large pull without returning or charging for listings already collected there. Use this after an interrupted run. For recurring monitoring of the same search, use Incremental mode below instead.

## `incrementalMode` (type: `boolean`):

Turn this on for daily or recurring monitoring. The first run returns every matching listing as NEW. Later runs normally return only NEW, UPDATED and REAPPEARED listings. Turn on Emit unchanged or Emit expired only when you also want those rows returned (and billed). State is kept separately for each search, filter and lookup setup; use State key to name or deliberately share a monitoring campaign.

## `stateKey` (type: `string`):

Optional. Name this monitoring campaign to keep its state stable, or to deliberately share state across differently configured runs. Leave empty to let the actor derive a key automatically from the mode, marketplace, keywords, sellers, links and filters, so different searches never mix state with each other.

## `emitUnchanged` (type: `boolean`):

Off by default. Turn on to also return listings that have not changed since the last run, marked UNCHANGED. This returns, and bills, extra rows you already have, so leave it off unless you want the full snapshot every run.

## `emitExpired` (type: `boolean`):

Off by default. Turn on to also return listings that were present in a previous run but are no longer found, marked EXPIRED. Only produced once a run has fully scanned the tracked search, so never when Max listings capped it or when Resume was used. This returns, and bills, extra synthetic rows, so leave it off unless you need expiry tracking.

## `proxy` (type: `object`):

Apify Proxy is recommended. The standard pool is the default and is sufficient for fifteen of the sixteen marketplaces.

## `mcpConnectors` (type: `array`):

Optionally send results into the apps you already use, via Model Context Protocol (MCP) connectors. Authorize one under Apify, Settings, API & Integrations, then select it here. Notion gets a rich page-per-item export; other connectors get a best-effort write or digest. Leave empty to skip; never changes the dataset output. Supported: Notion (https://mcp.notion.com/mcp), Linear (https://mcp.linear.app/sse), Airtable (https://mcp.airtable.com/mcp), Apify (https://mcp.apify.com).

## `notionParentPageUrl` (type: `string`):

URL or id of the Notion page under which item pages are created. Required to enable the Notion export; ignored by other connectors.

## `maxNotifyListings` (type: `integer`):

Cap on items written to each connector per run. Does not affect the dataset.

## Actor input object example

```json
{
  "mode": "search",
  "queries": [
    "laptop"
  ],
  "marketplace": "com",
  "buyingFormat": "any",
  "freeShippingOnly": false,
  "freeReturnsOnly": false,
  "returnsAcceptedOnly": false,
  "itemLocation": "default",
  "sortBy": "best_match",
  "urls": [
    "https://www.ebay.com/sch/i.html?_nkw=mechanical+keyboard",
    "https://www.ebay.co.uk/sch/i.html?_nkw=vinyl+record"
  ],
  "fetchDetails": false,
  "maxItems": 20,
  "maxPages": 0,
  "incrementalMode": false,
  "emitUnchanged": false,
  "emitExpired": false,
  "proxy": {
    "useApifyProxy": true
  },
  "maxNotifyListings": 50
}
```

# Actor output Schema

## `overview` (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 = {
    "mode": "search",
    "queries": [
        "laptop"
    ],
    "marketplace": "com",
    "urls": [
        "https://www.ebay.com/sch/i.html?_nkw=mechanical+keyboard",
        "https://www.ebay.co.uk/sch/i.html?_nkw=vinyl+record"
    ],
    "incrementalMode": false,
    "emitUnchanged": false,
    "emitExpired": false,
    "proxy": {
        "useApifyProxy": true
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("abotapi/ebay-com-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 = {
    "mode": "search",
    "queries": ["laptop"],
    "marketplace": "com",
    "urls": [
        "https://www.ebay.com/sch/i.html?_nkw=mechanical+keyboard",
        "https://www.ebay.co.uk/sch/i.html?_nkw=vinyl+record",
    ],
    "incrementalMode": False,
    "emitUnchanged": False,
    "emitExpired": False,
    "proxy": { "useApifyProxy": True },
}

# Run the Actor and wait for it to finish
run = client.actor("abotapi/ebay-com-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 '{
  "mode": "search",
  "queries": [
    "laptop"
  ],
  "marketplace": "com",
  "urls": [
    "https://www.ebay.com/sch/i.html?_nkw=mechanical+keyboard",
    "https://www.ebay.co.uk/sch/i.html?_nkw=vinyl+record"
  ],
  "incrementalMode": false,
  "emitUnchanged": false,
  "emitExpired": false,
  "proxy": {
    "useApifyProxy": true
  }
}' |
apify call abotapi/ebay-com-scraper --silent --output-dataset

```

## MCP server setup

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