# eBay Product Scraper & Price Change Monitor (`luminar/ebay-product-scraper-price-monitor`) Actor

Search eBay listings, filter prices and condition, read item details, and track newly observed listings and price changes across repeated runs.

- **URL**: https://apify.com/luminar/ebay-product-scraper-price-monitor.md
- **Developed by:** [Luka](https://apify.com/luminar) (community)
- **Categories:** E-commerce, AI
- **Stats:** 2 total users, 1 monthly users, 60.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.25 / 1,000 listing delivereds

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

Turn public eBay listings into a sourcing shortlist or a repeatable price watchlist.

- Compare asking prices, current auction bids, condition and seller information.
- Export stable listing IDs and URLs for spreadsheets and AI agent workflows.
- Keep a baseline and receive newly observed listings and changed values on later checks.

An observed listing includes `listingId`, `title`, `price`, `currency`, `condition`, `sellerName`, `marketplace` and `url`. Missing secondary source fields are `null`; prices are never invented.

### 🚀 Start in 60 seconds

Keep **United States**, enter a search term, and run with **20 listings / 1 page**. Open the **Listings** Dataset view. The default does not open every item detail and is the least expensive way to explore a search.

### 🎯 Choose the right workflow

| Workflow | Result |
|---|---|
| Current listings | A deduplicated snapshot of the requested listings. |
| Monitor changes — first run | A baseline of current listings saved under your watchlist name. |
| Monitor changes — later runs | `NEW` and `UPDATED` observations with before/after values. Unchanged listings do not create paid change rows. |

Reuse identical targets, filters, limits and watchlist name for comparisons. Changing the scope starts a separate baseline. Search rankings can change; `NEW` means absent from the previous observed window, not a newly created eBay listing. A missing result never proves that an item sold or ended.

### 📦 What you get

The Dataset contains `listing`, `change` and a free `summary` row. Keep `recordType` when processing mixed rows. CSV, Excel and JSON exports are available through Apify.

Listing fields include stable ID and URL, title, displayed price/range, currency, condition, buying format when exposed, current bid count, shipping information and seller feedback. Optional details add published brand, description, image URLs and availability when present. Shipping is destination-dependent; an unknown destination is left empty.

Change rows include `changeType`, `changeId`, `before`, `after` and `changedFields`. Observation time alone does not create a change.

![eBay listing results with observed price, condition, seller and source URL](https://api.apify.com/v2/key-value-stores/XXgGPjWtA5Q3AkzDX/records/ebay-listings.png)

### 🎛️ Input guide

Use **Search terms** for keyword searches. **Search URLs** retain supported filters from a public eBay search. **Item URLs** read exact listings; clear Search terms when you want only a watchlist.

Search-term filters cover condition, buying format, minimum/maximum item price, free shipping, category, seller and sort order. Saved URLs keep their own filters and marketplace. Results are processed in input order up to the global listing limit.

Increase both **Maximum pages per search** and **Maximum listings** to read additional pages. **Include item details** adds one separately checked page per successfully read detail. An unavailable optional detail keeps the basic listing and marks `detailStatus=UNAVAILABLE`; it does not advance a monitor baseline as complete.

### 💰 Pricing

One successfully verified search page or item detail costs **$0.02**. Failed pages are not charged. Each delivered listing or actionable change adds the rate below. Summaries and unchanged observations are free. Platform usage is included.

| Apify plan | Per 1,000 listings or changes |
|---|---:|
| Free | $2.60 |
| Bronze | $2.25 |
| Silver | $1.70 |
| Gold | $1.25 |
| Platinum | $1.25 |
| Diamond | $1.25 |

For example, 20 listings from one search page cost **$0.072 on Free**, without details. A later one-page monitor check with no changes costs **$0.02**. Opening 20 additional detail pages adds **$0.40** if all 20 succeed. Set both the input charge ceiling and the platform charge limit to cover the full requested maximum; an insufficient ceiling stops work before source access.

### ✅ Coverage you can trust

`COMPLETE` means the requested source traversal finished. `CAPPED` identifies a requested page or listing limit. `PARTIAL` identifies an unavailable requested detail. A verified empty search is `EMPTY_CONFIRMED`; blocked or unverified source data is never called empty.

Inspect the run summary for each target's reached pages, delivered rows and stop reason. The maximum listing count is a ceiling, not a guarantee. Large requests may need a longer Apify timeout; time limits stop work honestly and do not manufacture completeness.

### 🔌 API and automation

Apify runs the scraping; no eBay developer credentials are required. AI agents can use the structured input, stable IDs, change IDs and run summary through Apify's Actor tools or API. Save a Task to reuse an input, then send Dataset rows to a spreadsheet or downstream workflow. Scheduling is optional and is configured by the account owner.

```json
{"workflow":"snapshot","queries":["used iphone 13"],"marketplace":"US","condition":"used","maxListings":20,"maxPages":1,"maxBuyerChargeUsd":2}
```

### ⚠️ Not yet supported

Login-only data, private seller information, completed-sale verification, tax-inclusive checkout totals and inferred removal/sold events are outside this Actor's scope. Listing descriptions, variant ranges and delivery estimates are observations, not purchase guarantees. Do not run simultaneous updates of the same watchlist; a concurrent update is rejected.

### ❓ FAQ and support

**Why did no change rows appear?** A successful repeat check can find the same values. Read the free summary to distinguish no changes from a failed or capped source.

**Why is an item more expensive than the minimum search price?** A search card can show a variant range or current auction bid. The Actor labels ranges and bids; it does not promise that every variant is available at the minimum.

**What should an agent do after failure?** Inspect the run summary. Correct invalid input or budget first. If a monitor requires review, keep its watchlist unchanged and send the run URL through the Actor's Issues tab; do not repeatedly restart an ambiguous paid delivery.

# Actor input Schema

## `workflow` (type: `string`):

Snapshot exports current listings. Monitor saves a first baseline, then returns newly observed listings and changed values on later runs.

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

One search per line. Leave empty when using only saved search URLs or exact item URLs.

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

Market used for search terms. A supplied URL keeps its own eBay market.

## `searchUrls` (type: `array`):

Optional public eBay search URLs with keyword or seller and supported filters. Clear search terms to use only these URLs.

## `itemUrls` (type: `array`):

Optional exact public eBay item URLs. Clear search terms to check only this watchlist. Up to 50 URLs.

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

Applies to search terms. Saved search URLs use their own filters.

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

Auction prices are current bids, never final sale prices.

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

Optional lower item-price bound in the marketplace currency. Shipping and tax are separate.

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

Optional upper item-price bound in the marketplace currency.

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

Select the source search order. Price sorts follow the marketplace ordering.

## `freeShipping` (type: `boolean`):

Applies the source free-shipping filter. This is not a guarantee for a different delivery destination.

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

Optional eBay category number. Leave 0 for all categories.

## `seller` (type: `string`):

Optional seller filter for keyword searches. Use the public seller username.

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

Also opens each discovered item for available brand, description, image URLs and shipping context. Adds a checked-page charge per successfully read detail. Unavailable details retain the basic listing and are marked unavailable.

## `stateNamespace` (type: `string`):

Monitor only: reuse this name and identical targets, filters and limits to compare with the previous successful check.

## `maxListings` (type: `integer`):

Global maximum across all targets, in input order. This is a limit, not a promise that the source has that many results.

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

Maximum search pages per target. Increase together with the listing limit to go beyond page one.

## `maxBuyerChargeUsd` (type: `number`):

The complete requested workload must fit this ceiling before work starts. Increase the platform charge limit too when necessary.

## Actor input object example

```json
{
  "workflow": "snapshot",
  "queries": [
    "used iphone 13"
  ],
  "marketplace": "US",
  "searchUrls": [],
  "itemUrls": [],
  "condition": "all",
  "buyingFormat": "all",
  "sort": "bestMatch",
  "freeShipping": false,
  "categoryId": "0",
  "includeDetails": false,
  "stateNamespace": "default",
  "maxListings": 20,
  "maxPages": 1,
  "maxBuyerChargeUsd": 2
}
```

# Actor output Schema

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

Open listings, changes and the free run summary.

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

Coverage and accepted billing counts.

# 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 = {
    "workflow": "snapshot",
    "queries": [
        "used iphone 13"
    ],
    "marketplace": "US",
    "searchUrls": [],
    "itemUrls": [],
    "condition": "all",
    "buyingFormat": "all",
    "sort": "bestMatch",
    "freeShipping": false,
    "categoryId": "0",
    "includeDetails": false,
    "stateNamespace": "default",
    "maxListings": 20,
    "maxPages": 1,
    "maxBuyerChargeUsd": 2
};

// Run the Actor and wait for it to finish
const run = await client.actor("luminar/ebay-product-scraper-price-monitor").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 = {
    "workflow": "snapshot",
    "queries": ["used iphone 13"],
    "marketplace": "US",
    "searchUrls": [],
    "itemUrls": [],
    "condition": "all",
    "buyingFormat": "all",
    "sort": "bestMatch",
    "freeShipping": False,
    "categoryId": "0",
    "includeDetails": False,
    "stateNamespace": "default",
    "maxListings": 20,
    "maxPages": 1,
    "maxBuyerChargeUsd": 2,
}

# Run the Actor and wait for it to finish
run = client.actor("luminar/ebay-product-scraper-price-monitor").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 '{
  "workflow": "snapshot",
  "queries": [
    "used iphone 13"
  ],
  "marketplace": "US",
  "searchUrls": [],
  "itemUrls": [],
  "condition": "all",
  "buyingFormat": "all",
  "sort": "bestMatch",
  "freeShipping": false,
  "categoryId": "0",
  "includeDetails": false,
  "stateNamespace": "default",
  "maxListings": 20,
  "maxPages": 1,
  "maxBuyerChargeUsd": 2
}' |
apify call luminar/ebay-product-scraper-price-monitor --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,luminar/ebay-product-scraper-price-monitor"
        }
    }
}
```

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/czCwO15zBDu1125kI/builds/XL9U5BrpNoW7bNhQf/openapi.json
