# eBay Market Analyser: Prices, Competition & Profit (`best_actors/ebay-market-analyser`) Actor

Keywords in, the live eBay market out: price range with postage, seller concentration, China competition, optional real sold data and your profit per sale. 8 eBay sites. Pay only for keywords with real data.

- **URL**: https://apify.com/best_actors/ebay-market-analyser.md
- **Developed by:** [Lewis O'Rorke](https://apify.com/best_actors) (community)
- **Categories:** E-commerce, Business
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

Pay per event

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 Market Analyser: Prices, Competition & Profit

**Type the products you're thinking of selling. For each one, get the whole
eBay market in one row: the real price range with postage, how many sellers
you'd be up against, how much of the market a few big sellers hold, how many
listings ship from China, how fast new competition is arriving, and, if you
want it, real sold data and your profit per sale.**

Most eBay scrapers hand you hundreds of raw listings and leave the maths to
you. This Actor does the maths. One keyword in, one decision-ready answer out,
on 8 eBay sites.

***

### Who it is for

- **Resellers and arbitrage sellers** checking whether a product is worth sourcing
- **Dropshippers** testing product ideas before listing
- **Brands and Amazon sellers** sizing up eBay as a second channel
- **Product researchers** comparing dozens of niches at once
- **Anyone building a sourcing tool** who needs clean market numbers through an API

***

### What you get for each keyword

#### The live market (always included)

| Field | What it means |
|---|---|
| `summary` | One plain-English line about the market |
| `active_listings_total` | How many live listings eBay has for the search |
| `price_low`, `price_p25`, `price_median`, `price_p75`, `price_high` | Price range **including postage**, so it compares like for like |
| `free_postage_share` | How many competitors post for free. If most do, you'll need to as well |
| `unique_sellers`, `top_seller_share`, `top3_sellers_share` | How crowded the market is, and whether a few sellers dominate it |
| `business_seller_share`, `avg_seller_feedback_pct`, `top_rated_share` | How professional the competition is |
| `ships_from_china_share`, `ships_from_abroad_share` | How much of the market is overseas sellers you'd compete with on price |
| `listed_last_30_days_share` | How fast new sellers are piling in |
| `main_category` | The eBay category it sells in |
| `cheapest_listings` | The 5 cheapest relevant listings, with links |

#### Real sold data (optional, one tick box)

| Field | What it means |
|---|---|
| `sold_per_month` | Estimated sales per month, worked out from the real dates of recent sales |
| `sold_price_low` … `sold_price_high` | What it actually sells for, not what sellers ask |
| `sold_free_postage_share` | Free postage among the listings that actually sold |

#### Your profit (optional, with your cost)

| Field | What it means |
|---|---|
| `profit_per_sale`, `margin_pct` | After eBay fees, your cost and your shipping |
| `break_even_price` | The price where you make nothing |
| `profit_verdict` | `profitable` (15%+ margin), `thin` or `loss` |
| `price_basis` | Uses the **sold** median when you add sold data, otherwise the live median |

***

### Why the numbers are trustworthy

- **Accessories and near-misses are filtered out.** Search "logitech g305" on
  eBay and you also get G304 mice, replacement mouse feet and USB cables "for"
  the G305. By default the Actor keeps only listings and sales that name every
  word of your keyword. In testing that removed 29 of 100 live listings and 6
  of 20 sales for that one search.
- **Extreme prices are trimmed.** Bundles and spare parts outside 30% to 300%
  of the median are dropped before any statistic is worked out.
- **Prices include postage.** A £5 item with £4 postage is a £9 item to the buyer.
- **Sales per month come from real sale dates,** not the window you asked for.
  A busy product can fill 50 sales in two days, and counting that as a month
  would understate demand massively.
- **Live data comes from eBay's official Browse API,** not from scraping pages.

***

### How to use it (step by step)

#### 1. Add your keywords

One product per line, the way a buyer would search: `logitech g305`,
`vacuum storage bags`, `magnetic phone holder`. Up to 100 per run.

#### 2. Pick the eBay site

UK, US, Germany, France, Italy, Spain, Australia or Canada. Prices come back
in that site's currency.

#### 3. (Optional) Add your cost

Enter what one unit costs you, plus your shipping cost per order. Check the fee
settings (13% + 0.30 suits most UK and US categories). Each keyword then gets a
profit, margin, break-even price and verdict.

#### 4. (Optional) Add sold data

Tick **Add real sold data**. Nothing else to set up. The Actor runs the
well-known `caffein.dev/ebay-sold-listings` Actor for real completed sales, and
Apify bills that Actor to your account at its own price: about $0.0035 per sale
fetched, so the default 25 sales per keyword is about $0.09. If it can't run
(for example your account is out of credit), you still get the live market data
and a note saying why.

#### 5. Click Start

A run of 10 keywords takes about 15 seconds without sold data, or a minute or
two with it. Export as Excel, CSV or JSON, or connect it to Google Sheets,
Zapier, Make or your own app.

***

### Ready-made examples

**Quick check of three product ideas on eBay UK**

```json
{
  "keywords": ["logitech g305", "vacuum storage bags", "magnetic phone holder"],
  "marketplace": "EBAY_GB"
}
```

**Is it profitable? Cost £12, free postage, eBay UK, with sold data**

```json
{
  "keywords": ["logitech g305"],
  "marketplace": "EBAY_GB",
  "yourCost": 12,
  "yourShippingCost": 0,
  "includeSoldData": true,
  "soldRowsPerKeyword": 50
}
```

**Compare the same product on eBay US and Germany**: run it twice with
`marketplace` set to `EBAY_US` and then `EBAY_DE`.

**Broad category research**: turn off **Only listings that name every keyword
word** for loose keywords like `kitchen gadgets`.

***

### Pricing

- **Per keyword analysed:** charged only when the keyword has live listings.
- **Per keyword with sold data added:** charged only when real matching sales
  were found.

You are **never** charged for:

- a keyword with no listings
- keywords skipped because eBay's daily limit was reached (the run tells you to try again tomorrow)
- sold data that couldn't be fetched (no credit, upstream problem)

The sold-data Actor's own cost (about $0.0035 per sale) is billed to your Apify
account by Apify, separately.

***

### Honest limits

- **The live sample is eBay's best-match first 10 to 200 listings,** not every
  listing. `active_listings_total` gives the full count.
- **The title filter is strict by design.** A listing that spells the product
  differently ("G-305") is dropped. Turn the filter off for broad keywords.
- **Sold data comes from another Actor.** If it breaks or changes its price,
  you still get the live market, with a note.
- **Fees vary by category and seller level.** Set `feePercent` to match your
  account for exact profit figures.
- **eBay limits how many searches the Actor can make per day** (one per
  keyword). The Actor checks the remaining allowance with eBay before every
  run. If it runs low, the run analyses what it can, tells you when it resets
  (07:00 UTC), and charges nothing for skipped keywords.

***

### FAQ

**Do I need an eBay account or eBay API keys?**
No. Nothing to set up at all: no eBay account, no API keys, no tokens.

**Why is sold data billed separately?**
eBay doesn't offer sold data through its public API, so it comes from a
separate Actor. Apify bills that Actor to your account at its own price, so the
cost is transparent and nothing is marked up.

**Why do live and sold prices differ so much?**
They often do, and that's the point. Sellers ask more than buyers pay, and
used sales pull the sold median down. Price against what actually sells.

**Something is wrong or missing.**
Open an issue on the Issues tab with your run link and I'll look at it.

# Actor input Schema

## `keywords` (type: `array`):

One product per line, as a buyer would search it, e.g. 'logitech g305' or 'vacuum storage bags'. Up to 100.

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

Which eBay to analyse. Prices come back in that site's currency.

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

Which listings (and sales) to include.

## `buyItNowOnly` (type: `boolean`):

Leave out auctions, whose current bid is not a selling price.

## `strictTitleMatch` (type: `boolean`):

Drops accessories and near-misses (a 'G304' when you searched 'G305', a cable 'for' your product). Turn off for broad category keywords.

## `listingsPerKeyword` (type: `integer`):

Best-match listings eBay returns, used for the statistics. The total count on eBay is reported separately.

## `yourCost` (type: `number`):

What one unit costs you, in the site's currency. Adds profit, margin, break-even price and a verdict.

## `yourShippingCost` (type: `number`):

What you pay to post one order. Prices are compared including postage.

## `feePercent` (type: `number`):

eBay final value fee plus payment fees, as a percentage. Around 13% for most UK and US categories.

## `feeFixed` (type: `number`):

The fixed per-order fee, e.g. 0.30.

## `includeSoldData` (type: `boolean`):

Adds real completed sales: sales per month and sold price range. Uses the caffein.dev eBay Sold Listings Actor, which Apify bills to your account at its own price (about $0.0035 per sale fetched, so about $0.09 per keyword at 25 sales). Nothing to set up.

## `soldDays` (type: `integer`):

How far back to look for sales.

## `soldRowsPerKeyword` (type: `integer`):

More sales gives a steadier median but costs more (about $0.0035 per sale).

## Actor input object example

```json
{
  "keywords": [
    "logitech g305",
    "vacuum storage bags"
  ],
  "marketplace": "EBAY_GB",
  "condition": "any",
  "buyItNowOnly": true,
  "strictTitleMatch": true,
  "listingsPerKeyword": 100,
  "yourShippingCost": 0,
  "feePercent": 13,
  "feeFixed": 0.3,
  "includeSoldData": false,
  "soldDays": 30,
  "soldRowsPerKeyword": 25
}
```

# Actor output Schema

## `markets` (type: `string`):

No description

## `all` (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 = {
    "keywords": [
        "logitech g305",
        "vacuum storage bags"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("best_actors/ebay-market-analyser").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 = { "keywords": [
        "logitech g305",
        "vacuum storage bags",
    ] }

# Run the Actor and wait for it to finish
run = client.actor("best_actors/ebay-market-analyser").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 '{
  "keywords": [
    "logitech g305",
    "vacuum storage bags"
  ]
}' |
apify call best_actors/ebay-market-analyser --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,best_actors/ebay-market-analyser"
        }
    }
}
```

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/uEKkAOO3q9Q5DvVOF/builds/FW60MBowYBnPttKfP/openapi.json
