# Amazon EAN to ASIN & Offers | $1/1K (`pricepirate/amazon-ean-to-asin-offers`) Actor

$1 per 1,000 lookups, up to 100 per run. Turn EANs, UPCs, GTINs, ISBNs or ASINs into Amazon's matching ASIN with its buy box and seller offers: price, shipping, FBA, stock and seller rating. 23 marketplaces.

- **URL**: https://apify.com/pricepirate/amazon-ean-to-asin-offers.md
- **Developed by:** [PricePirate](https://apify.com/pricepirate) (community)
- **Stats:** 3 total users, 2 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.00 / 1,000 ean / asin lookups

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

## Amazon EAN to ASIN, Price & Offers | $1/1K

Turn a list of barcodes into Amazon data. For every EAN, UPC, GTIN, ISBN or
JAN you give it, this Actor finds the product on Amazon and returns its
**ASIN**, its **buy box**, and the **seller offers** on the first page of
Amazon's offer list: price, shipping, total, condition, FBA, Prime, stock and
seller rating. If you already have ASINs, you get their offers directly.

**$1 per 1,000 lookups** on every Apify plan, 23 Amazon marketplaces, up to
100 identifiers per run.

Built by [PricePirate](https://pricepirate.com), a
[UCX Media](https://gaponik.com) product. Developer documentation lives at
[pricepirate.com/docs](https://pricepirate.com/docs).

Good for catalogue matching (EAN → ASIN), price monitoring and
[repricing](https://pricepirate.com/docs/en/solutions/dynamic-pricing),
arbitrage and sourcing research, marketplace onboarding, and checking who
holds the buy box on your own products.

### ✓ What you get

- **EAN → ASIN** for EAN-8, EAN-13, UPC-12, GTIN-14, ISBN-13 and JAN barcodes
- **Offers by ASIN**: give an ASIN (or a book's ISBN-10) and the search is skipped
- **Buy box**: seller, price, shipping and total of the offer that wins it
- **Up to about 10 offers per product**, each with seller name, seller ID and
  seller-page link, seller rating, condition, price, shipping, total, delivery
  estimate, FBA, Prime, stock and a buy-box flag
- **Offer count** across all pages, with a flag when page 1 does not show them all
- **Product details** (optional): brand, description, bullet points, images,
  categories with browse-node IDs, technical details, the GTIN when Amazon prints
  one, stock, Amazon's Choice and Best Seller flags

Mixed input is fine: the Actor detects each value's type, checks barcodes
against their check digit, and removes duplicates (a UPC-12 and the same code
as an EAN-13 with a leading zero count once).

### 💻 Input

```json
{
  "identifiers": ["4006381333931", "9120018350599", "B001AXLDDO"],
  "marketplace": "de",
  "zipcode": "80331",
  "includeDetail": false
}
```

- **`identifiers`** (required): 1 to 100 values, one per line. Split longer lists
  into several runs.
- **`marketplace`** (default `de`): one of `de`, `us`, `gb`, `fr`, `it`, `es`,
  `nl`, `be`, `pl`, `se`, `ie`, `tr`, `ca`, `mx`, `br`, `jp`, `in`, `au`, `sg`,
  `ae`, `sa`, `eg`, `za`. One marketplace per run.
- **`zipcode`** (optional): the delivery location that prices, shipping and
  offers are shown for. The default is the capital (10115 Berlin on amazon.de,
  75001 Paris, SW1A 1AA London, …). Only marketplaces that localize by ZIP code
  take one: `de`, `us`, `gb`, `fr`, `it`, `es`, `ca`, `jp`, `in`, `ie`, `za`.
  The format is checked before the run starts.
- **`includeDetail`** (default `false`): also fetch the product page of every
  match. Charged separately, see [Pricing](#-pricing).

### 💻 Output

One dataset item per input value:

```json
{
  "query": "9120018350599",
  "operation": "search-by-gtin",
  "country": "de",
  "status": "found",
  "result": {
    "asin": "B001AXLDDO",
    "name": "Träumeland T014301 - Babymatratze Regenbogen 60 x 120 cm",
    "url": "https://www.amazon.de/dp/B001AXLDDO",
    "image": "https://m.media-amazon.com/images/I/41iYiseYxWL.jpg",
    "rating": 4.6,
    "rating_count": 92,
    "buy_box": { "position": 1, "shop_name": "tiSsi Kindermöbel", "price": 69.95, "shipping": 0, "total": 69.95, "…": "…" },
    "offers_count": 5,
    "offers_truncated": false,
    "offers": [
      {
        "position": 1,
        "seller_id": "ACQ8QTNHIZQJ8",
        "shop_name": "tiSsi Kindermöbel",
        "shop_url": "https://www.amazon.de/sp?seller=ACQ8QTNHIZQJ8",
        "shop_review_rating": 3.5,
        "shop_review_count": 7,
        "condition": "new",
        "condition_text": "Neu",
        "currency": "EUR",
        "price": 69.95,
        "list_price": null,
        "shipping": 0,
        "total": 69.95,
        "shipping_note": "für qualifizierte Erstbestellung",
        "availability_text": "6. - 7. Oktober",
        "delivery_min_hours": 24,
        "delivery_max_hours": 72,
        "ships_from": "tiSsi Kindermöbel",
        "is_fba": false,
        "is_prime": false,
        "is_buy_box": true,
        "stock": 25
      }
    ],
    "detail": null
  }
}
```

- **`operation`**: `search-by-gtin` (the barcode was searched on Amazon) or
  `offers-by-asin` (you gave the ASIN).
- **`offers_count`** is Amazon's count across all offer pages. When it is
  larger than the number of rows in `offers`, `offers_truncated` is `true`.
- **`shipping`** is the shipping charge Amazon shows for the delivery location.
  `shipping_note` keeps Amazon's condition text, because free shipping is often
  conditional ("for qualifying first orders").
- **`stock`** is the quantity Amazon lets a buyer add to the cart. Amazon may
  cap it, so treat it as "at least", not as the seller's full inventory.

The **Overview** table in the Console shows query, status, ASIN, name, buy-box
price and offer count; the **Offers** table has one row per offer.

### 💻 Statuses & errors

| `status` | Meaning | Charged |
|---|---|---|
| `found` | A product matched; `result` has its offers | yes |
| `not_found` | Amazon's search had no organic result for the barcode, or the ASIN does not exist on this marketplace | yes |
| `invalid` | Not a valid barcode (wrong check digit or length) or ASIN; nothing was looked up | no |
| `error` | The lookup failed; see `errorCode` | no |

A product with no sellers right now is `found` with `offers: []` and
`buy_box: null`.

| `errorCode` | `statusCode` | Meaning |
|---|---|---|
| `invalid_input` | 400 | On `invalid` items: why the value was rejected |
| `free_limit_reached` | 402 | The free plan's 50 runs are used up |
| `charge_limit_reached` | 402 | The run hit the maximum cost per run you set; the value was not looked up |
| `timeout` | 408 | Amazon did not answer in time |
| `internal_error` | 500 | Amazon could not be fetched for this value right now |

Errors are never charged. Run the failed values again later.

### 💰 Pricing

Pay per event, **the same price on every Apify plan**:

| Event | Price | When |
|---|---|---|
| `ean-lookup` | $1.00 per 1,000 | each `found` or `not_found` item |
| `detail` | $1.00 per 1,000 | each item that includes product details (`includeDetail`) |

`invalid` and `error` items are free, and so is a value that was never looked
up because the run reached your maximum cost per run. There are no separate
platform usage charges.

**Example:** 100 barcodes, of which 60 are found, 38 are not found, 1 is
invalid and 1 times out: you pay for 98 lookups, **$0.098**. With
`includeDetail` you also pay for the 60 details, **$0.158** in total.

**Free Apify plans get 50 runs.** A run counts once its first lookup is done.
After 50 runs, the Actor returns `free_limit_reached`; the price per lookup is
the same on a paid plan.

### 📚 Documentation & guides

- [PricePirate documentation](https://pricepirate.com/docs)
- [Total price: why price + shipping decides the ranking](https://pricepirate.com/docs/en/guide/concepts/total-price)
- Comparing Amazon with other channels? Look up the same EANs on Idealo
  with our [Idealo Scraper & Price Data API](https://apify.com/pricepirate/idealo-price-data-api)
  and on Google Shopping with our
  [Google Shopping EAN/GTIN Price Data API](https://apify.com/pricepirate/google-shopping-ean-gtin-price-data-api).

### 📬 Contact & support

For higher volumes, other marketplaces or custom fields, reach out via
[pricepirate.com](https://pricepirate.com/en/get-started/?utm_source=apify\&utm_medium=docs\&utm_campaign=amazon-ean)
or <support@pricepirate.com>.

Need a deeper build, like custom pricing automation, data pipelines, or a
tailored e-commerce integration? That's what we do at
[UCX Media](https://gaponik.com), the software studio behind PricePirate.

# Actor input Schema

## `identifiers` (type: `array`):

One barcode or ASIN per line, mixed freely: EAN-8, EAN-13, UPC-12, GTIN-14, ISBN-13, JAN, ISBN-10 or ASIN. The type is detected automatically, barcodes are checked against their check digit, and duplicates are removed. Invalid values come back as free `invalid` items. Up to 100 per run.

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

The Amazon storefront to look up. One marketplace per run.

## `zipcode` (type: `string`):

Delivery location for prices, shipping and offers. Leave empty for the capital (e.g. 10115 Berlin on amazon.de). Only for marketplaces that localize by ZIP code: de, us, gb, fr, it, es, ca, jp, in, ie, za. Checked against the country's format before the run starts.

## `includeDetail` (type: `boolean`):

Also fetch the product page for every match: brand, description, bullet points, images, categories, technical details (including the GTIN when Amazon prints one), stock and Amazon's Choice / Best Seller flags. Charged as a separate `detail` event ($1 per 1,000) on each item that gets details.

## Actor input object example

```json
{
  "identifiers": [
    "4006381333931",
    "9120018350599",
    "B001AXLDDO"
  ],
  "marketplace": "de",
  "includeDetail": false
}
```

# Actor output Schema

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

All items in the default dataset, one per input value.

## `overview` (type: `string`):

The overview table: query, status, ASIN, name, buy box price and offer count.

# 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 = {
    "identifiers": [
        "4006381333931",
        "9120018350599",
        "B001AXLDDO"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("pricepirate/amazon-ean-to-asin-offers").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 = { "identifiers": [
        "4006381333931",
        "9120018350599",
        "B001AXLDDO",
    ] }

# Run the Actor and wait for it to finish
run = client.actor("pricepirate/amazon-ean-to-asin-offers").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 '{
  "identifiers": [
    "4006381333931",
    "9120018350599",
    "B001AXLDDO"
  ]
}' |
apify call pricepirate/amazon-ean-to-asin-offers --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,pricepirate/amazon-ean-to-asin-offers"
        }
    }
}
```

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/Nv9O45BHtMq7b2J6y/builds/JrZCXe34jSx1uxWH7/openapi.json
