# eBay Sold Comps - Resale Comp Intelligence (`mddunno128/resale-comp-intelligence`) Actor

Analyze recent eBay sold listings for resale research. Get price ranges, comparable-listing evidence and optional profit scenarios. $0.25 per analysis plus source fees up to $0.10.

- **URL**: https://apify.com/mddunno128/resale-comp-intelligence.md
- **Developed by:** [AI-HUB](https://apify.com/mddunno128) (community)
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

$0.25 / resale analysis

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

## Resale Comp Intelligence

Turn a focused item search into a compact resale analysis backed by recent eBay.com sold-listing records. Get price percentiles, a sample sales pace, optional estimated resale profit, and up to 12 supporting comps.

### Example input

```json
{
  "query": "Sony WH-1000XM5",
  "count": 20,
  "daysToScrape": 30,
  "itemCondition": "used",
  "buyPrice": 120,
  "estimatedFeePct": 13.5,
  "estimatedOutboundShipping": 12,
  "excludeBestOffer": true
}
```

Use the brand and exact model. Choose 5–20 comps and a 1–90 day lookback. For a valid analysis, at least five comparable listings must survive filtering. Buy price and outbound shipping are in USD. Omit buy price to omit profit estimates.

### Results

One dataset row contains price minimum, 25th percentile, median, mean, 75th percentile and maximum; heuristic fast-sale/list targets; sample sales pace; estimated fees, net profit and ROI when a buy price is supplied; and source run/dataset IDs with listing evidence.

The fast-sale target is 97% of the median and the listing target is the 75th percentile. These are transparent heuristics, not validated predictions. Sample sales pace is calculated only from dated records in the capped sample; it is not total market sales or sell-through rate.

### Read the evidence quality first

The `quality` section accounts for all received records: retained listings plus exclusions for invalid records, unsold items, currency, duplicates, missing prices, relevance, product identity, multi-item lots, accessories/defects, Best Offers and outliers. Each excluded record has one reason, assigned in that order. Counts describe this sample only.

It also shows the oldest/newest usable sale dates and flags missing shipping costs, missing sale currencies and missing dates. Fewer than ten usable comps triggers a small-sample warning. If Best Offers are explicitly included, the result warns that their asking prices are not the undisclosed accepted prices. `reviewRecommended` is a rule-based warning flag, not a confidence score or guarantee; even an unflagged sample can contain imperfect matches.

Example: an offline replay of a historical 20-record source sample retained 12 comps after excluding three Best Offers, two accessories and three WH-1000XM5SA suffix variants from a WH-1000XM5 query, with a $159.44 median and two unknown shipping costs. Sony describes the SA edition as a soft-case variant; the matcher conservatively keeps exact identifiers separate. The earlier looser method retained 15 at $155.76. Neither number is a live quote or independently verified valuation. Check the source listings and quality warnings before applying any pricing estimate.

### Price and limits

The price is **$0.25 per successful analysis**, with no additional start or dataset-item fee for this Actor.

This Actor also runs [eBay Sold Listings Search](https://apify.com/caffein.dev/ebay-sold-listings) using the run's Apify account. **Upstream charges are separate**, capped at **$0.10 per upstream run**, and may apply even when fewer than five usable comps are found. Budget for up to **$0.35 in combined event charges**; the parent run limit does not serve as a shared parent-and-child budget. This Actor makes one upstream request, asks for at most 20 results, imposes a 180-second upstream timeout, and disables automatic upstream retries.

As checked on 2026-09-21, the source's highest tier price is $0.004/result plus $0.00005 per GB on start. With the 2 GB source run, 20 results cost approximately $0.08010. Prices can change: runtime checks refuse unreviewed pricing models, extra events, higher costs or broader permissions.

No analysis fee is charged for failed upstream runs or fewer than five usable comps. The result is saved before the analysis charge. If saving fails, the analysis charge is not attempted. Missing/incorrect monetization settings prevent upstream work entirely.

### Method and limitations

- Best Offer accepted listings are excluded by default because accepted prices may not be disclosed.
- Explicitly unsold records, duplicate listing IDs/URLs and non-USD records are excluded.
- Query-token overlap filters plainly unrelated titles. Numeric model/capacity labels in the query must appear in the title; common separators are tolerated. Requested variant words such as Pro or OLED must appear. Additional generation/variant checks cover iPhone, Pixel, Galaxy S and RTX titles. Missing identifiers are excluded; alternative naming and unsupported product families still need review. This is lexical matching, not a verified product catalog.
- Explicit multi-item lots (such as "lot of 2" or "2x") are excluded unless the query requests a lot, pack, set or bundle. Other bundle/set titles trigger a warning; prices remain whole-listing totals, with no per-unit normalization.
- Explicit replacement-part, carrying-case-for, and broken/for-parts titles are excluded for whole-item searches. Queries explicitly seeking those items retain them. This rule is conservative and does not catch every accessory or defect.
- The 1.5×IQR rule removes price outliers when at least six records are present.
- Source data may be incomplete or inaccurate. Prices include shipping when provided by the source.
- Fees, taxes, shipping, demand and item condition affect actual proceeds. Profit calculations are estimates.

### Permissions and operation

Limited permissions only. No account credentials or private developer token are embedded. No LLM calls, trading, wallet operations, subscription purchase or Standby mode is used. Parent memory is fixed at 256 MB. The deployment defaults to a 240-second timeout and no automatic restart.

Run locally with `npm test` for offline analysis and orchestration checks. Full production execution requires configured Apify monetization and a token supplied by Apify; do not place credentials in this project.

### Profit scenarios

When `buyPrice` is supplied, `economics.scenarios` includes `lowP25`, `baseMedian` and `highP75`. Each applies your fee percentage and outbound shipping estimate to that sample percentile, reporting gross proceeds, fee, net profit, ROI and the break-even purchase price. These are scenarios, not forecasts or confidence intervals. A negative break-even price means modeled costs exceed the proceeds even at a zero acquisition cost. Taxes, labor, returns, repairs and other costs are excluded.

`economics.sensitivity` reports the median scenario's net change for one extra percentage point of selling fees and one extra dollar of outbound shipping. ROI is null when acquisition cost is zero. Unknown source shipping can affect every scenario; check `quality.warnings` first.

The offline title regression corpus contains constructed examples to catch known mistakes. Passing it does not establish accuracy across real marketplace inventory. Stricter matching can leave fewer than five usable comps; the source fee may still apply even though no analysis fee is charged.

# Actor input Schema

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

Product or item to research using verified eBay sold listings.

## `count` (type: `integer`):

Maximum sold listings to analyze. Higher counts cost more upstream.

## `daysToScrape` (type: `integer`):

How many days of recent sold listings to request from the upstream source.

## `itemCondition` (type: `string`):

Filter sold comps by item condition when supported by the upstream source.

## `buyPrice` (type: `number`):

Optional acquisition cost used for profit and ROI estimates.

## `estimatedFeePct` (type: `number`):

Used only for optional profit math. Marketplace/category fees vary.

## `estimatedOutboundShipping` (type: `number`):

Optional estimated shipping cost used only in profit and ROI calculations.

## `excludeBestOffer` (type: `boolean`):

Recommended because eBay does not disclose the actual accepted offer price.

## Actor input object example

```json
{
  "query": "Sony WH-1000XM5",
  "count": 20,
  "daysToScrape": 30,
  "itemCondition": "any",
  "estimatedFeePct": 13.5,
  "estimatedOutboundShipping": 0,
  "excludeBestOffer": true
}
```

# Actor output Schema

## `analysis` (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 = {
    "query": "Sony WH-1000XM5"
};

// Run the Actor and wait for it to finish
const run = await client.actor("mddunno128/resale-comp-intelligence").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": "Sony WH-1000XM5" }

# Run the Actor and wait for it to finish
run = client.actor("mddunno128/resale-comp-intelligence").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": "Sony WH-1000XM5"
}' |
apify call mddunno128/resale-comp-intelligence --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,mddunno128/resale-comp-intelligence"
        }
    }
}
```

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/Eq5gBtcnjzXKESaJL/builds/oH0T7hAeGTFp2Kwsg/openapi.json
