# eBay Deals Scraper (`apt_marble/ebay-deals-scraper`) Actor

Pull eBay's Daily Deals into a clean dataset: item, title, current price, the was-price, discount percent, quantity left, urgency badge and sponsored flag; across the whole deals hub and its Tech, Fashion, Home and More categories. No account needed. Run it on demand or on a schedule.

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

## Pricing

$0.80 / 1,000 deal scrapeds

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?

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 Deals Scraper

Turn eBay's Daily Deals into a clean, structured dataset. Pick the whole deals hub or any of its curated categories — Tech, Fashion, Home and More — and get back every deal with its current price, the crossed-out was-price, the exact discount percent, how many units are left, the urgency badge eBay shows shoppers, whether the placement is sponsored, and a direct link to the listing. Add narrow sub-categories like `tech/cell-phones` when you want to go deeper. Built for anyone who tracks bargains at scale: resellers hunting margin, price analysts watching discount depth, deal-site editors sourcing daily picks, and shoppers who want the drops in a spreadsheet instead of a scroll.

### What you can do with it

- **Watch discount depth over time** — collect the deals hub on a schedule and see how far prices fall, which categories discount hardest, and when the best drops land.
- **Source a daily deals feed** for a blog, newsletter or price-comparison site, complete with was-price, percent off and image.
- **Spot low-stock bargains** using the quantity-left figure, so you can flag the deals that are about to run out.
- **Track a single category closely** — add sub-categories such as `tech/cell-phones` or `home/kitchen-dining-bar` and pull them to the depth you choose.
- **Separate real deals from sponsored placements** with the sponsored flag on every row.
- **Feed a pricing model or dashboard** with a clean, per-deal dataset you can filter, pivot and join to your own catalogue.

### What you get

One row per deal. Abridged sample from the deals hub:

```json
{
  "dealId": "6117171195",
  "itemId": "305985665908",
  "title": "NEW Genuine Dell 65W 4.5mm AC Adapter For Dell OptiPlex 3090 Ultra Power Supply",
  "price": { "amount": 25.42, "currency": "USD" },
  "originalPrice": 26.76,
  "discountPct": 5,
  "quantityAvailable": 604,
  "hotnessBadge": null,
  "sponsored": false,
  "imageUrl": "https://i.ebayimg.com/images/g/8psAAOSwv6hhoQeJ/s-l300.jpg",
  "url": "https://www.ebay.com/itm/305985665908",
  "category": "all",
  "marketplace": "US",
  "scrapedAt": "2026-08-18T12:00:00.000Z"
}
```

Deals that are running low come back with the urgency badge and the units-left figure filled in:

```json
{
  "dealId": "6117217732",
  "itemId": "192729656885",
  "title": "Nokia 6700 Classic 5MP Handy - silber frei für alle Sim-Karten Neu",
  "price": { "amount": 266.25, "currency": "USD" },
  "quantityAvailable": 73,
  "hotnessBadge": "Almost gone",
  "sponsored": false,
  "category": "tech/cell-phones",
  "marketplace": "US"
}
```

### Input reference

| Setting | Type | Default | What it does |
| --- | --- | --- | --- |
| Deals categories | choice (multiple) | `All deals` | Which parts of eBay's Daily Deals to collect: the whole hub (`All deals`), or any of `Tech`, `Fashion`, `Home` and `More`. Pick several — each is collected up to the per-category limit. |
| Specific deal sub-categories | list of text | — | Optional. Narrow sub-categories to add on top, written as `hub/sub-category`, e.g. `tech/cell-phones`, `home/kitchen-dining-bar`, `fashion/womens-clothing`. Leave empty to just use the categories above. |
| Max deals per category | whole number | `200` | The most deals to return for each selected category or sub-category. Maximum 500. Deals pools are curated and often small, so many categories return fewer than this. |
| eBay site | choice | `United States (ebay.com)` | Which country's eBay site to read deals on. eBay's Daily Deals hub currently covers the United States site, so this is fixed to the US. |
| Parallel categories | whole number | `4` | How many categories to work on at the same time. Higher is faster, but eBay serves fewer complete pages when pushed hard. Maximum 10. |

### Output fields

| Field | Type | Description |
| --- | --- | --- |
| `dealId` | text | eBay's identifier for the deal. Empty when a deal comes from the deeper feed of a sub-category. |
| `itemId` | text | eBay's listing number for the item on offer. |
| `title` | text | Listing title as shown to shoppers. |
| `price` | object | The current deal price as `{ amount, currency }`, in US dollars. |
| `originalPrice` | number | The crossed-out was-price the deal is measured against, when eBay shows one. |
| `discountPct` | number | Percent off, as a whole number, when eBay states it. |
| `quantityAvailable` | number | Units still available. Empty when eBay does not publish it — empty means "not stated", never zero. |
| `hotnessBadge` | text | eBay's urgency label for the deal, e.g. "Almost gone". Empty when there is none. |
| `sponsored` | true/false | Whether the placement is a sponsored one. Empty on deals drawn from a sub-category feed. |
| `imageUrl` | text | The deal's product image. |
| `url` | text | Direct link to the listing. |
| `category` | text | The category or sub-category the deal was collected under. |
| `marketplace` | text | The eBay site the row was read from — `US`. |
| `scrapedAt` | text | When the row was collected. |

### Pricing

You pay per result, with no monthly minimum.

| What you are charged for | Price |
| --- | --- |
| Deal scraped — one deal added to your dataset | **$0.80 per 1,000** |

That is the only charge. Each deal arrives complete — price, was-price, discount, quantity, badges, image and link — at that one rate.

**Worked example.** eBay's deals pools are curated and usually small. A run over the whole hub plus Tech and Fashion typically returns a few hundred deals — well under **$0.50 per run** — so a wide daily schedule across every category costs only a couple of dollars a month.

### Limits & what this actor cannot do

- eBay's Daily Deals hub currently covers the United States site only, so every row is a US deal in US dollars.
- Deals pools are curated and often small. Many sub-categories hold only a couple of dozen deals, so a run returns what eBay is featuring, not an unlimited catalogue.
- The set of live deals rotates constantly — two runs minutes apart will differ. That is eBay refreshing its deals, not the actor missing data; collect on a schedule to follow the changes.
- Prices, discounts and stock are a snapshot at the moment of collection and keep changing afterwards.
- Units left is shown only for some deals. Where eBay does not publish it, the field comes back empty rather than as a made-up zero.
- A category eBay is not featuring right now is reported as unavailable rather than returned as empty rows.
- Speed depends on the size of the job and on eBay's own response times; no fixed throughput is promised.
- eBay's terms govern automated access. You are responsible for using the data lawfully and in line with the source site's terms, and for handling any personal data in line with applicable privacy law.

### FAQ

**Do I need an eBay account?**
No. The actor reads only what eBay shows the public on its deals pages.

**Does it need my login or password?**
No. There is nothing to connect and nothing to configure — pick your categories and press start.

**Which categories can I choose?**
The whole deals hub (`All deals`) and eBay's four curated hubs — Tech, Fashion, Home and More. For finer control, add sub-categories such as `tech/cell-phones` in the optional sub-categories list.

**Can I schedule it?**
Yes. Schedule it hourly, daily or weekly from the Apify console, and each run writes a fresh dataset you can compare against the last one — ideal for tracking how deals and discounts move.

**Why is `quantityAvailable` empty on some rows?**
Because eBay does not state a remaining quantity for every deal. When it does, the number is filled in; when it does not, the field is left empty rather than guessed at zero.

**Is the data complete?**
It is complete for everything eBay features on its deals pages at the moment you run it. Because the deals pools are curated and rotate, a run is a snapshot of what is being featured then — not an exhaustive list of every discounted item on eBay.

# Actor input Schema

## `categories` (type: `array`):

Which parts of eBay's Daily Deals to collect. Pick 'All deals' for the full hub, or one or more of the curated categories. You can select several — each is collected up to the per-category limit below.

## `spokeSlugs` (type: `array`):

Optional. Narrow, individual deal sub-categories to add on top of the categories above, written as 'hub/sub-category' — for example 'tech/cell-phones', 'home/kitchen-dining-bar' or 'fashion/womens-clothing'. Leave empty to just use the categories.

## `maxDealsPerCategory` (type: `integer`):

The most deals to return for each selected category or sub-category. Deals pools are curated and often small, so many categories return fewer than this.

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

Which country's eBay site to read deals on. eBay's Daily Deals hub currently covers the United States site, so this is fixed to the US.

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

How many categories to work on at the same time. Higher is faster, but eBay serves fewer complete pages when pushed hard. Leave at 4 unless you have a reason.

## Actor input object example

```json
{
  "categories": [
    "all"
  ],
  "spokeSlugs": [
    "tech/cell-phones"
  ],
  "maxDealsPerCategory": 200,
  "marketplace": "US",
  "maxConcurrency": 4
}
```

# Actor output Schema

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

Every deal this run collected.

## `runSummary` (type: `string`):

What this run collected, and anything it could not read.

# 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 = {
    "categories": [
        "all"
    ],
    "spokeSlugs": [
        "tech/cell-phones"
    ],
    "maxDealsPerCategory": 200,
    "marketplace": "US",
    "maxConcurrency": 4
};

// Run the Actor and wait for it to finish
const run = await client.actor("apt_marble/ebay-deals-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 = {
    "categories": ["all"],
    "spokeSlugs": ["tech/cell-phones"],
    "maxDealsPerCategory": 200,
    "marketplace": "US",
    "maxConcurrency": 4,
}

# Run the Actor and wait for it to finish
run = client.actor("apt_marble/ebay-deals-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 '{
  "categories": [
    "all"
  ],
  "spokeSlugs": [
    "tech/cell-phones"
  ],
  "maxDealsPerCategory": 200,
  "marketplace": "US",
  "maxConcurrency": 4
}' |
apify call apt_marble/ebay-deals-scraper --silent --output-dataset

```

## MCP server setup

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