# Amazon Seller Scraper — Profile + Live Listings, Flat Fee (`steadyfetch/amazon-seller-scraper`) Actor

Any Amazon seller by ID, storefront or URL: name, feedback from 30 days to lifetime, registered business details, plus a full product row for every live listing. From $1.50 per 1,000 seller records, one flat fee, no add-on events. Blocked or missing sellers are never charged.

- **URL**: https://apify.com/steadyfetch/amazon-seller-scraper.md
- **Developed by:** [Steadyfetch Team](https://apify.com/steadyfetch) (community)
- **Categories:** E-commerce, Automation, Business
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.50 / 1,000 seller records

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

## Amazon Seller Scraper · Flat Fee

**Paste an Amazon seller ID or a storefront link and get the seller's profile plus their live listings — feedback history, registered business details, and a full product row for every item they sell. One flat fee per record. There is no second event to pay for, and sellers we could not deliver are never charged.**

Give it `A124O05NL4Z2HN`, or the storefront link, or the profile link, or even a product link whose seller you want. Get finished records back.

> **Unofficial.** This actor is not affiliated with, endorsed by, or sponsored by Amazon. "Amazon" and all related marks are trademarks of Amazon.com, Inc. or its affiliates. It reads only the public seller pages an ordinary browser sees. It never signs in and never touches an account.

### Output

Two record types in one dataset, told apart by `recordType`. Every column exists on every row and is null where it does not apply, so the whole run exports to one CSV.

**A profile record:**

```json
{
  "recordType": "profile",
  "sellerId": "A124O05NL4Z2HN",
  "sellerName": "decorUhome",
  "marketplace": "amazon.com",
  "storefrontUrl": "https://www.amazon.com/s?ie=UTF8&marketplaceID=ATVPDKIKX0DER&me=A124O05NL4Z2HN",
  "sellerRating": 4.9,
  "sellerRatingCount": 4396,
  "positivePercent12m": 100,
  "feedback30d": { "rating": 4.8, "count": 114 },
  "feedback90d": { "rating": 4.9, "count": 299 },
  "feedback12m": { "rating": 4.9, "count": 1233 },
  "feedbackLifetime": { "rating": 4.9, "count": 4396 },
  "businessName": "…",
  "businessType": null,
  "businessAddress": "…, CN",
  "country": "CN",
  "vatNumber": null,
  "tradeRegisterNumber": null,
  "about": "decorUhome is committed to providing …",
  "listingCount": 302,
  "charged": true,
  "status": "ok"
}
```

**A listing record** carries the same full product row **Amazon Product Scraper · Flat Fee** returns — `asin`, `title`, `brand`, `price`, `currency`, `listPrice`, `inStock`, `availability`, `buyBoxSeller`, `buyBoxSellerId`, `fulfilledByAmazon`, `soldByAmazon`, `buyBoxNote`, `rating`, `reviewCount`, `boughtInPastMonth`, `images`, `features`, `variants`, `categoryPath`, `bestSellersRank`, `specs` — plus `listingRank`, `listingPage` and the seller it belongs to.

`sellerRating` and `sellerRatingCount` are the *seller's* stars; `rating` and `reviewCount` on a listing row are the *product's*. One column never means two things.

#### Fields Amazon does not always publish

`businessName`, `businessAddress` and `country` are on most third-party profiles. **`vatNumber`, `tradeRegisterNumber`, `businessType`, `about` and `returnPolicy` are genuinely sparse** — many sellers simply do not publish them, and EU sellers publish more than US ones. Those columns come back null when the seller left them blank. That is data, not a failure, and it is stated here rather than sold as a promise.

`listingCount` is Amazon's own total for the storefront, so you can see when your `maxListingsPerSeller` truncated the answer. It is null when listings are turned off.

Seller phone numbers and email addresses appear on some EU profiles. **This actor does not return them** and has no column for them.

The last row of every run is a summary carrying `requested`, `profiles`, `listings`, `sellerMisses`, `listingMisses`, `chargedRows` and `unchargedRows` — so the invoice reconciles from the dataset itself, without opening the billing tab.

**[Browse the full live example dataset →](https://api.apify.com/v2/datasets/nzqBI3JJz1ZhQALSq/items?clean=true\&format=json)** — one real run of the current code, unedited: the `Electronics Expo (Authorized Dealer)` profile record, one of its live listings with the Sold-by cluster populated, and the run's own `cap_reached` summary row last. Two records delivered, two charged.

### For AI agents & LLMs — copy this block

```
Actor: steadyfetch/amazon-seller-scraper
Input: { "sellers": ["A124O05NL4Z2HN"], "maxListingsPerSeller": 20 }
Output: one row per record; recordType is "profile" or "listing"; charged rows have
        status "ok" and charged true.
Pricing: one priced event ("seller-record"), all-inclusive, no start fee, no add-ons.
        A profile and a listing cost the same flat fee.
Misses: amazon_retail / no_listings / not_found / not_a_product / blocked /
        parse_failed / source_unavailable ship as rows with charged:false.
Notes: omit an optional field or send it as null — both mean "use the default", the
       "marketplace" dropdown included. A store it does not offer is not silently
       swapped for amazon.com: the run returns one uncharged row naming the stores
       that work. "sellers" is the one field that must carry a real value.
       Limits are hard limits.
```

Works over the Apify API, MCP, n8n and Make. Running it with an empty seller list returns uncharged sample rows, so a workflow can be wired up and tested before it costs anything.

### What one record costs

One priced event, `Seller record`, and nothing else. No start fee, no per-seller fee, no per-field fee, no "detail" upcharge. **A seller profile and one of that seller's listings cost exactly the same flat fee.** The store header reads **from $1.50/1,000 seller records**.

| Your Apify plan | Price per seller record | Per 1,000 seller records |
|---|---|---|
| Apify Free plan | $0.006 | $6.00 |
| Bronze | $0.0035 | $3.50 |
| Silver | $0.0022 | $2.20 |
| **Gold, Platinum, Diamond** | **$0.0015** | **$1.50** |

The header shows the Gold price. The whole ladder is printed here because an actor whose promise is billing honesty cannot have an undisclosed tier ladder.

**Work out a run before you start it.** One seller with listings on = 1 profile record + up to `maxListingsPerSeller` listing records. Five sellers at the default 100 listings each is at most 505 records. Set `Max records (whole run)` if you want a hard ceiling, or turn listings off to pay for profiles only.

**What can fail, and what a failure costs you: nothing.** The two misses you will actually see are `amazon_retail` (the id has no seller profile on that marketplace — Amazon's own retail accounts, or a real seller not registered in that country's store) and `no_listings` (a real seller with nothing live on their storefront right now). Both ship as real rows carrying `charged: false`, as do `not_found`, `blocked`, `parse_failed`, `source_unavailable` and `invalid_input`. A row is charged only if it is a record.

### What you give it

| Input | Example |
|---|---|
| `sellers` (one per line) | `A124O05NL4Z2HN`, `https://www.amazon.com/s?me=A124O05NL4Z2HN`, `https://www.amazon.co.uk/sp?seller=…`, or a `/dp/` product link |
| `marketplace` | `amazon.com` (default), `amazon.co.uk`, `amazon.de` — applies to bare IDs only; a link always uses its own store |
| `includeListings` | `true` (default); `false` returns one profile record per seller and makes no storefront request |
| `maxListingsPerSeller` | `100` (default), max `300` |

A **product link** is resolved to its Buy Box seller. That costs one extra lookup, and that lookup is never charged on its own — if the Buy Box turns out to be Amazon itself, you get a guidance row and pay nothing.

**Marketplaces: `amazon.com`, `amazon.co.uk`, `amazon.de`.** Only three because only three are tested end to end; other Amazon domains are refused with a clear message rather than half-working. Amazon runs a separate seller directory per country, so a seller registered in one store can legitimately be absent from another.

### Every way a seller can fail to be a record

| `status` | What happened | Charged? | Worth re-running? |
|---|---|---|---|
| `ok` | A complete record | **yes** | — |
| `amazon_retail` | No seller profile at that ID on that marketplace: either one of Amazon's own retail accounts (what the Buy Box shows when Amazon is the seller) or a real seller not registered in that country's store — the row suggests re-running with the seller's own marketplace | no | not there |
| `no_listings` | The seller has a profile but nothing live on their storefront right now. The profile row is the whole answer | no | no |
| `not_a_product` | A listing on that storefront is one of Amazon's own subscription plans, not a product — no price, no seller, no reviews of its own | no | no |
| `not_found` | No seller page at that ID on that marketplace — wrong ID, or the account is closed there | no | no |
| `blocked` | Amazon asked us to prove we are not a robot, on every route we tried | no | yes |
| `parse_failed` | Amazon served a page in a layout we do not recognise. That one is on us | no | no |
| `source_unavailable` | Amazon dropped or throttled the request | no | yes |
| `invalid_input` | A line was blank, not an Amazon link, or an Amazon link with no ID in it — the row says which | no | no |
| `cap_reached` / `stopped_at_limit` | A limit you set stopped the run; earlier rows were delivered normally | no | see `resumeCursor` |

### Limits are exact

`Max listings per seller`, `Max records (whole run)`, `Max run seconds` and the run's own maximum total charge all stop the run *cleanly*: it still finishes as SUCCEEDED, the summary row names the one setting that stopped it, and `resumeCursor` lists the sellers still to do.

### FAQ

**Where do I find a seller ID?** On any product page, the "Sold by" link in the Buy Box points at `/sp?seller=…` — that value is the ID. Or paste the product link itself and let this actor resolve it.

**Why did my seller ID return `amazon_retail`?** Because that marketplace has no seller profile at that ID. Usually the Buy Box seller is Amazon itself — Amazon's own retail accounts have no storefront to scrape. It is also what a real seller ID returns on a marketplace the seller is not registered in: re-run with the marketplace the seller actually trades on. Nothing was charged either way.

**Can I scrape an Amazon seller without an API key?** Yes — that is what this is. No Amazon account, no SP-API keys, no seller credentials.

**Does it get every listing a seller has?** Up to `maxListingsPerSeller`, in the seller's own storefront order, paging as needed. `listingCount` tells you the seller's true total.

**What does it cost per 1,000 seller records?** From $1.50/1,000 on Gold and above; see the ladder above. Nothing else is billable.

**Why is a price null, or in a currency I did not expect?** Amazon did not print one, or served the page from an unexpected region — `priceNote` says which. The delivery location is pinned to the marketplace's own country to keep this rare.

### Honesty contract

Amazon changes its pages often. When a seller can't be looked up, or a listing can't be fetched or parsed, we return it with an honest status and **never charge for it**.

This actor may fail when the platform changes things — failed items are never charged.

Issues are answered in about three hours during working hours. If a field ever comes back empty that should not be, open an issue with the seller ID and it gets fixed.

### Steadyfetch Amazon suite

One actor per entry point, the same product row underneath. All-inclusive pay per event, no start fee,
charged only on delivery.

| What you paste | Actor |
|---|---|
| ASINs or product URLs | [**Amazon Product Scraper · Flat Fee**](https://apify.com/steadyfetch/amazon-product-scraper) |
| Search keywords | [**Amazon Search Scraper · Flat Fee**](https://apify.com/steadyfetch/amazon-search-scraper) |
| A Best Sellers category | [**Amazon Bestsellers · Flat Fee**](https://apify.com/steadyfetch/amazon-bestsellers-scraper) |
| A seller ID or storefront | **this actor** |

**The rest of the steadyfetch shelf** — same contract everywhere: all-inclusive pay per event,
no start fee, charged only on delivery.

| Family | Actors |
|---|---|
| Ad creative intelligence | [Facebook](https://apify.com/steadyfetch/facebook-ads-transcript-scraper) · [Google Ads video](https://apify.com/steadyfetch/google-ads-video-transcript-scraper) · [TikTok](https://apify.com/steadyfetch/tiktok-ads-transcript-scraper) · [LinkedIn](https://apify.com/steadyfetch/linkedin-ads-transcript-scraper) · [Google Ads text & OCR](https://apify.com/steadyfetch/google-ads-creative-text-scraper) |
| Trends & keywords | [Google Trends](https://apify.com/steadyfetch/google-trends-scraper) · [Trends Now](https://apify.com/steadyfetch/google-trends-now-scraper) · [Breakout keywords](https://apify.com/steadyfetch/breakout-keywords-scraper) · [Autocomplete keywords](https://apify.com/steadyfetch/google-keyword-suggest-scraper) · [Keyword volume & CPC](https://apify.com/steadyfetch/keyword-search-volume-scraper) · [Social trends](https://apify.com/steadyfetch/social-trends-scraper) |
| YouTube transcripts | [YouTube videos](https://apify.com/steadyfetch/youtube-transcript-scraper) · [YouTube channels](https://apify.com/steadyfetch/youtube-channel-transcripts) |
| Instagram | [Reel transcripts](https://apify.com/steadyfetch/instagram-reel-transcript-scraper) · [Profile posts](https://apify.com/steadyfetch/instagram-profile-posts) |
| Jobs | [Indeed](https://apify.com/steadyfetch/indeed-jobs-scraper) · [Career sites by domain](https://apify.com/steadyfetch/company-jobs-by-domain) · [Glassdoor](https://apify.com/steadyfetch/glassdoor-jobs-scraper) · [Multi-board](https://apify.com/steadyfetch/multi-job-board-scraper) · [Google Jobs](https://apify.com/steadyfetch/google-jobs-scraper) |
| **Amazon** | [Products](https://apify.com/steadyfetch/amazon-product-scraper) · [Search](https://apify.com/steadyfetch/amazon-search-scraper) · [Bestsellers](https://apify.com/steadyfetch/amazon-bestsellers-scraper) · [Sellers](https://apify.com/steadyfetch/amazon-seller-scraper) |
| Any media file | [Speech to Text · any link or file](https://apify.com/steadyfetch/media-transcriber) |

### Feedback & support

Open an issue on the actor's Issues tab with the seller ID you used. Fields that come back empty when they should not are treated as bugs, not as expected behaviour.

# Actor input Schema

## `sellers` (type: `array`):

Seller IDs or Amazon links. A product link costs one extra lookup to read its Buy Box seller, and that lookup is never charged on its own. Send the field as a list — leaving it out is fine, but this one field cannot be null. Every optional field below accepts null — the Marketplace dropdown included — and null there simply means "use the default". A dropdown value that is not on its list is answered with one uncharged row naming the values that work, never quietly swapped for the default.

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

Which Amazon store to look the seller up in. Amazon runs a separate seller directory per country, and a seller registered in one is often absent from another. This applies only to bare seller IDs — a link always uses its own store. Null or empty means amazon.com; a store that is not on this list is answered with one uncharged row naming the stores that are.

## `includeListings` (type: `boolean`):

Fetch the seller's storefront and return a full product row for every listing. Off means one record per seller — the profile alone.

## `maxListingsPerSeller` (type: `integer`):

How many listings to return per seller, in the seller's own storefront order. Amazon serves 16 listings per storefront page, so 100 listings is about 7 page loads plus one product lookup each. Sellers with fewer listings simply return fewer.

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

Hard cap on delivered records — profiles and listings together — across all sellers. 0 means no run-wide cap.

## `maxRunSeconds` (type: `integer`):

The run stops cleanly before this and reports what is left, instead of being killed by the platform timeout.

## `includeSpecs` (type: `boolean`):

The product-details table on each listing (brand, model, dimensions, materials and so on). Turn off for a smaller row; the price does not change.

## Actor input object example

```json
{
  "sellers": [
    "A124O05NL4Z2HN"
  ],
  "marketplace": "amazon.com",
  "includeListings": true,
  "maxListingsPerSeller": 100,
  "maxItems": 0,
  "maxRunSeconds": 3600,
  "includeSpecs": true
}
```

# Actor output Schema

## `records` (type: `string`):

One row per record. A profile row carries the seller's name, ID, storefront link, star rating and rating counts for 30 days / 90 days / 12 months / lifetime, positive-feedback percentage, and whatever the seller publishes in their business block — registered name, business type, address, country, and where it exists a VAT or trade-register number. A listing row carries the full product detail for one item on that seller's storefront. Every row carries `charged` and `status`, so the invoice reconciles from the dataset itself.

## `unchargedRows` (type: `string`):

Sellers that could not be delivered and why: an ID that does not exist, an ID with no seller profile on that marketplace (Amazon's own retail accounts included), a seller with no live listings, or a page Amazon blocked. Each says whether re-running is worth it, and none of them were charged.

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

Profiles and listings delivered, sellers that returned no record, listings that could not be fetched, duplicates merged, what stopped the run, and the charged-event totals.

## `errors` (type: `string`):

Present only when Amazon blocked, throttled or dropped a request after every route was tried: the seller or listing and the reason. These are re-runnable, not permanent.

# 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 = {
    "sellers": [
        "A124O05NL4Z2HN"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("steadyfetch/amazon-seller-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 = { "sellers": ["A124O05NL4Z2HN"] }

# Run the Actor and wait for it to finish
run = client.actor("steadyfetch/amazon-seller-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 '{
  "sellers": [
    "A124O05NL4Z2HN"
  ]
}' |
apify call steadyfetch/amazon-seller-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,steadyfetch/amazon-seller-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/wx4jaZoNsmUkVhlo7/builds/n7QQHeF7yqM2QjX3f/openapi.json
