---
title: "Amazon ASIN scraper"
description: "Extract Amazon product records from a list of ASINs: title, brand, UPC, GTIN, model number, sales rank, specs, images and ratings. One API request or MCP."
canonical: https://www.zenrows.com/scrape/amazon-asin
updated: 2026-10-20
---

# Amazon ASIN scraper

The Zenrows Amazon ASIN scraper turns a list of ASINs into full product records as JSON: title, brand, UPC, GTIN, model and part numbers, best sellers rank, feature bullets, specs, image URLs, average rating and rating count. Fetch in Adaptive Stealth Mode opens each product page and Extract returns the fields. Run it from an API call, the CLI or an AI agent.

- Site: amazon.com
- Returns: Identifiers, specs, images, ranks and ratings for each ASIN

## Run it: one ASIN in, a product record out

```json Input
{
  "url": "https://www.amazon.com/dp/B0CRMZHDG8",
  "mode": "auto",
  "extract": "auto"
}
```

```json Output
{
  "product": {
    "asin": "B0CRMZHDG8",
    "title": "STANLEY Quencher H2.0 Flow State Tumbler, 40 oz, Fuchsia",
    "main_image_url": "https://m.media-amazon.com/images/I/51i4FNQRs1L._AC_SL1500_.jpg",
    "product_url": "https://www.amazon.com/clp/B0CRMZHDG8"
  },
  "product_details": [
    { "label": "Brand Name", "value": "STANLEY" },
    { "label": "UPC", "value": "041604394331" },
    { "label": "Global Trade Identification Number", "value": "00041604394331" },
    { "label": "Model Number", "value": "100000003926" },
    { "label": "Manufacturer Part Number", "value": "10-11824-062" },
    { "label": "Best Sellers Rank", "value": "#3 in Kitchen & Dining (See Top 100 in Kitchen & Dining) #1 in Insulated Tumblers" },
    { "label": "Capacity", "value": "40 fluid ounces" },
    { "label": "Material Type", "value": "Stainless Steel" }
  ],
  "ratings": { "average_rating": 4.75, "total_ratings": 206884, "total_reviews": 206884 },
  "images": [
    { "position": null, "url": "https://m.media-amazon.com/images/I/51i4FNQRs1L._AC_SL1500_.jpg", "variant": "MAIN" },
    { "position": 1, "url": "https://m.media-amazon.com/images/I/61y5kBcVvEL._AC_SL1500_.jpg", "variant": "PT01" }
  ]
}
```

Request and output of a live call to an Amazon product page on Oct 20, 2026, trimmed for length. The full record listed 34 product details and six images.

## What data can you get from an Amazon ASIN?

An ASIN is Amazon's ID for one product listing, and `/dp/ASIN` is its page. Extract returns the listing's identity, the global identifiers that join it to other catalogs, its rank and its media. These are the fields product data teams ask for most, with their paths.

| Field | What it holds | Example |
|---|---|---|
| `product.asin` | The ASIN, echoed back so every record carries its key | `B0CRMZHDG8` |
| `product.title` | Full listing title | `STANLEY Quencher H2.0 Flow State Tumbler, 40 oz, Fuchsia` |
| `product.brand` | Brand shown on the listing | `Apple` |
| `product.main_image_url` | The main image at full size | `https://m.media-amazon.com/images/I/51i4FNQRs1L…` |
| `images[]` | Every gallery image with its slot (`MAIN`, `PT01`…) and position | `{ "variant": "PT01", … }` |
| `product_details[]` | The details table as label and value pairs | `{ "label": "Capacity", … }` |
| `product_details[]` UPC | The barcode, to match the ASIN to retail and supplier catalogs | `041604394331` |
| `product_details[]` GTIN | The 14-digit global trade item number | `00041604394331` |
| `product_details[]` Manufacturer Part Number | The maker's part number | `10-11824-062` |
| `product_details[]` Best Sellers Rank | Rank in the main category and subcategory | `#3 in Kitchen & Dining… #1 in Insulated Tumblers` |
| `technical_specs[]` | The specs table on listings that use it, as name and value | `{ "name": "Item model number", … }` |
| `technical_specs[]` Date First Available | When the ASIN was first listed | `April 23, 2024` |
| `feature_bullets[]` | The "About this item" bullets | `YOUR DREAM TUMBLER: …` |
| `ratings.average_rating` | Star rating out of 5 | `4.75` |
| `ratings.total_ratings` | Number of ratings | `206884` |
| `variations[]` | Sibling variants (colors, sizes) with the selected one | `[]` |

Amazon lays listings out in two ways, so the details come back as `product_details[]` on some products and as `technical_specs[]` with `ratings_summary` on others. Read whichever group is present.

## How to scrape Amazon by ASIN with Zenrows

1. **Create a free Zenrows account** and copy your API key from the dashboard.
2. **Turn each ASIN into a URL.** `https://www.amazon.com/dp/` plus the ASIN is enough; no product slug or `ref=` parameters needed. For other stores, swap the domain.
3. **Send it with the default configuration**: Adaptive Stealth Mode to open the page and Extract to return the fields. Add the country when the record also needs the local price and stock.
4. **Flatten the details table** into one dictionary per ASIN, so `UPC`, `Model Number` and `Best Sellers Rank` become columns.
5. **Send the whole list as one Batch job**, with the ASIN as each task's ID.

```python Python
# pip install requests
import requests

def lookup(asin: str) -> dict:
    params = {
        "apikey": "YOUR_ZENROWS_API_KEY",
        "url": f"https://www.amazon.com/dp/{asin}",
        "mode": "auto",      # Adaptive Stealth Mode
        "extract": "auto",   # structured JSON
    }
    response = requests.get("https://api.zenrows.com/v1/", params=params, timeout=180)
    response.raise_for_status()
    parsed = response.json()["parsed"]
    # The details table comes as product_details (label/value) or technical_specs (name/value)
    rows = parsed.get("product_details") or []
    details = {r["label"]: r["value"] for r in rows}
    details.update({s["name"]: s["value"].lstrip("‎") for s in parsed.get("technical_specs") or []})
    return {"asin": asin, "title": parsed["product"]["title"], **details}

record = lookup("B0CRMZHDG8")
print(record["title"], record.get("UPC"), record.get("Best Sellers Rank"))
```

```javascript Node.js
// Node 18+ (built-in fetch)
const asins = ["B0CRMZHDG8", "B0D1XD1ZV3"];

for (const asin of asins) {
  const params = new URLSearchParams({
    apikey: "YOUR_ZENROWS_API_KEY",
    url: `https://www.amazon.com/dp/${asin}`,
    mode: "auto",
    extract: "auto",
  });
  const response = await fetch(`https://api.zenrows.com/v1/?${params}`, {
    signal: AbortSignal.timeout(180_000),
  });
  if (!response.ok) throw new Error(`${asin} ${response.status}: ${await response.text()}`);

  const { parsed } = await response.json();
  const details = Object.fromEntries((parsed.product_details ?? []).map((d) => [d.label, d.value]));
  console.log(asin, parsed.product.title, details.UPC ?? null);
}
```

```bash cURL
curl "https://api.zenrows.com/v1/?apikey=YOUR_ZENROWS_API_KEY&url=https%3A%2F%2Fwww.amazon.com%2Fdp%2FB0CRMZHDG8&mode=auto&extract=auto"

# Identity, details table and ratings only
curl "https://api.zenrows.com/v1/?apikey=YOUR_ZENROWS_API_KEY&url=https%3A%2F%2Fwww.amazon.com%2Fdp%2FB0CRMZHDG8&mode=auto&extract=auto&extract_fields=product.asin%2Cproduct.title%2Cproduct_details%2Cratings"
```

```go Go
package main

import (
    "context"
    "fmt"
    "log"

    scraperapi "github.com/zenrows/zenrows-go-sdk/service/api"
)

func main() {
    client := scraperapi.NewClient(scraperapi.WithAPIKey("YOUR_ZENROWS_API_KEY"))

    response, err := client.Get(context.Background(), "https://www.amazon.com/dp/B0CRMZHDG8", &scraperapi.RequestParameters{
        Mode:    scraperapi.ModeAuto,
        Extract: scraperapi.ExtractModeAuto,
    })
    if err != nil {
        log.Fatal(err)
    }
    fmt.Println(response.String())
}
```

## Input

The input is a list of ASINs, each sent as its product page URL. Every task in a Batch job takes the same settings, so a catalog of any size is one list and one configuration.

| Parameter | Type | Default | Description |
|---|---|---|---|
| `url` | string | required | The product page, `https://www.amazon.com/dp/ASIN`, or the same path on amazon.co.uk, amazon.de or another Amazon domain |
| `mode` | string | `auto` | Adaptive Stealth Mode: starts with the lightest setup and adds rendering and protected-site handling only when the page needs them |
| `extract` | string | `auto` | Returns the product record as JSON in `parsed`, next to the raw `html` |
| `extract_fields` | string | all fields | Paths to keep, such as `product.title,product_details,ratings` |
| `proxy_country` | string | any | Two-letter country code. Needed when the record should carry the price, stock and delivery of a given store |
| `wait_for` | string | none | A CSS selector to wait for before the page is read |

```json Batch input
{
  "type": "regular",
  "status": "closed",
  "zenrows_params": {
    "mode": "auto",
    "extract": "auto",
    "proxy_country": "us"
  },
  "tasks": [
    { "url": "https://www.amazon.com/dp/B0CRMZHDG8", "external_id": "B0CRMZHDG8" },
    { "url": "https://www.amazon.com/dp/B0D1XD1ZV3", "external_id": "B0D1XD1ZV3" },
    { "url": "https://www.amazon.com/dp/B09B8V1LZ3", "external_id": "B09B8V1LZ3" }
  ]
}
```

## Output

Every response returns `html`, the page as Amazon served it, and `parsed`, the product record. The two samples below show both listing layouts, each a trimmed output of a live request on Oct 20, 2026.

```json Listing with a details table
{
  "product": {
    "asin": "B0CRMZHDG8",
    "title": "STANLEY Quencher H2.0 Flow State Tumbler, 40 oz, Fuchsia",
    "brand": null,
    "brand_store_url": null,
    "main_image_url": "https://m.media-amazon.com/images/I/51i4FNQRs1L._AC_SL1500_.jpg",
    "product_url": "https://www.amazon.com/clp/B0CRMZHDG8"
  },
  "feature_bullets": [
    { "text": "EARTH-FRIENDLY DURABILITY: Constructed of 90% recycled BPA free stainless steel for sustainable sipping…" }
  ],
  "product_details": [
    { "label": "Manufacturer", "value": "Stanley" },
    { "label": "Item Type Name", "value": "Tumbler" },
    { "label": "Manufacturer Warranty Description", "value": "Lifetime Warranty" },
    { "label": "Color", "value": "Fuchsia" },
    { "label": "Item Weight", "value": "1.4 pounds" },
    { "label": "Item Dimensions W x H", "value": "10\"W x 13.25\"H" }
  ],
  "ratings": { "average_rating": 4.75, "total_ratings": 206884, "total_reviews": 206884 },
  "variations": []
}
```

```json Listing with a specs table
{
  "product": {
    "asin": "B0D1XD1ZV3",
    "brand": "Apple",
    "title": "Apple AirPods Pro 2 Wireless Earbuds, Active Noise Cancellation, Hearing Aid Feature, Bluetooth Headphones, Transparency, Personalized Spatial Audio, High-Fidelity Sound, H2 Chip, USB-C Charging",
    "canonical_url": "https://www.amazon.com/clp/B0D1XD1ZV3",
    "main_image": "https://m.media-amazon.com/images/I/61SUj2aKoEL._AC_SL1500_.jpg",
    "gallery_images": [
      "https://m.media-amazon.com/images/I/611pEx7220L._AC_SL1500_.jpg",
      "https://m.media-amazon.com/images/I/81Zg3Ev2M5L._AC_SL1500_.jpg"
    ]
  },
  "technical_specs": [
    { "name": "Manufacturer", "value": "Apple" },
    { "name": "Item model number", "value": "MTJV3LL/A" },
    { "name": "Date First Available", "value": "April 23, 2024" },
    { "name": "Product Dimensions", "value": "0.94 x 0.86 x 1.22 inches" }
  ],
  "ratings_summary": {
    "average_rating": 4.6,
    "total_ratings": 46988,
    "five_star_percent": 84,
    "four_star_percent": 8,
    "three_star_percent": 3,
    "one_star_percent": 4
  }
}
```

Fields the page does not show come back as `null`, as `brand` did on the tumbler listing while the details table still carried `Brand Name`. Flatten each record with `pd.json_normalize(...)` for a CSV, or ask for Markdown when the record is going to an LLM.

## Look up ASINs from your coding agent

Claude Code, Cursor, Codex and any MCP client can look up a list of ASINs from a prompt and return a clean table.

The agent sends one Fetch and Extract request per ASIN, the same request as the code above, and reads the record from `parsed`. Connect the Zenrows MCP server once, or install the CLI and let the agent run it in the terminal.

```bash Connect the MCP server (Claude Code)
claude mcp add zenrows -e ZENROWS_API_KEY=YOUR_ZENROWS_API_KEY -- npx -y @zenrows/mcp
```

```json MCP config (Cursor, Claude Desktop, Windsurf)
{
  "mcpServers": {
    "zenrows": {
      "command": "npx",
      "args": ["-y", "@zenrows/mcp"],
      "env": { "ZENROWS_API_KEY": "YOUR_ZENROWS_API_KEY" }
    }
  }
}
```

```bash Or run the CLI
npx -y @zenrows/cli init
zenrows extract "https://www.amazon.com/dp/B0CRMZHDG8"
```

```text Then ask your agent
Use Zenrows to look up these Amazon ASINs and return one row per ASIN with
title, brand, UPC, model number, best sellers rank, average rating and the
main image URL. Leave a cell empty when the listing does not show the value:
B0CRMZHDG8, B0D1XD1ZV3, B09B8V1LZ3
```

## Look up ASINs at scale with Batch and Crawl

**Batch** is the natural fit for an ASIN list: one job, one task per ASIN, the ASIN as the `external_id`, and every record back in parallel. A job accepts more than 10,000 URLs inline or as a CSV, so a full catalog refresh is one request plus a results call.

**Crawl** finds ASINs you do not have yet. Start it on one product page and keep links that contain `/dp/`: it follows the related and sponsored products on that page and returns each product page it reaches. Read the ASIN from each URL and add the new ones to your Batch list.

```bash Batch (cURL)
curl -X POST "https://async.api.zenrows.com/v1/jobs" \
  -H "X-API-Key: YOUR_ZENROWS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "type": "regular",
    "status": "closed",
    "zenrows_params": { "mode": "auto", "extract": "auto" },
    "tasks": [
      { "url": "https://www.amazon.com/dp/B0CRMZHDG8", "external_id": "B0CRMZHDG8" },
      { "url": "https://www.amazon.com/dp/B0D1XD1ZV3", "external_id": "B0D1XD1ZV3" }
    ]
  }'

# Read the results when the job finishes
curl "https://async.api.zenrows.com/v1/jobs/JOB_ID/results?status=successful" \
  -H "X-API-Key: YOUR_ZENROWS_API_KEY"
```

```bash Batch (CLI)
# asins.jsonl: one {"url": "https://www.amazon.com/dp/ASIN", "external_id": "ASIN", "extract": "auto"} per line
zenrows batch create asins.jsonl --wait
zenrows batch results <job-id> --out asin-records.jsonl
```

```bash Crawl (cURL)
curl -X POST "https://api.zenrows.com/v1/crawls" \
  -H "X-API-Key: YOUR_ZENROWS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "url": "https://www.amazon.com/dp/B0CRMZHDG8",
    "depth": 1,
    "max_pages": 100,
    "include_patterns": ["/dp/"]
  }'
```

**Scheduled jobs** run the same Batch job on a timetable, on Zenrows' side: every few hours, once a day, at set times on chosen days, or once at a future date. Each run keeps its own results, a webhook can tell your app when a run finishes, and you can pause or resume the schedule at any time, with no cron server to keep alive.

```bash Scheduled job (cURL)
# Runs every day on Zenrows' side; each run keeps its own results
curl -X POST "https://async.api.zenrows.com/v1/jobs" \
  -H "X-API-Key: YOUR_ZENROWS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
      "type": "scheduled",
      "status": "closed",
      "schedule": {
        "rate": {
          "every": 1,
          "unit": "day"
        }
      },
      "zenrows_params": {
        "mode": "auto",
        "extract": "auto"
      },
      "tasks": [
        {
          "url": "https://www.amazon.com/dp/B0CRMZHDG8",
          "external_id": "amazon-asin"
        }
      ]
    }'

# Or at set times: "schedule": { "calendar": { "times_of_day": ["09:00"],
#   "cadence": { "weekly": { "days": ["mon", "thu"] } } }, "timezone": "Europe/Madrid" }
```

## What teams do with ASIN data

| Use case | Data they pull | Who runs it |
|---|---|---|
| Catalog enrichment | Title, bullets, specs, images and identifiers for each ASIN in a feed | Ecommerce, PIM and marketplace teams |
| UPC and ASIN matching | UPC, GTIN, model and part numbers to join Amazon to other retailers | Price comparison and analytics teams |
| Listing compliance audits | Title, images, bullets and brand against the brand's approved content | Brand and channel managers |
| Category rank tracking | Best Sellers Rank per ASIN, day over day | Sellers, agencies and investors |
| Product research | Date first available, rating count and rank for new ASINs in a niche | Private label sellers and analysts |
| Product knowledge for AI | The full record per ASIN as JSON, or the page as Markdown | AI and data teams |

## Tips for scraping Amazon ASINs

- **Validate the ASIN before you request it.** ASINs are 10 characters, capital letters and digits, and product ASINs outside books start with `B`. Book ASINs are usually the 10-digit ISBN.
- **Join catalogs on UPC or GTIN, not title.** The details table carries the barcode on many listings, and it is the reliable key to match an Amazon product to the same item at another retailer.
- **Handle both layouts.** Read `product_details[]` (label and value) when present, otherwise `technical_specs[]` (name and value), and map both into one schema.
- **Strip invisible characters from spec values.** Values in `technical_specs[]` can start with an invisible left-to-right mark (`‎`), which breaks exact matches until you remove it.
- **Parse the Best Sellers Rank into numbers.** The value holds the main category rank and one or more subcategory ranks in one string, such as `#3 in Kitchen & Dining… #1 in Insulated Tumblers`.
- **Treat each variant as its own ASIN.** A tumbler in eight colors is eight ASINs, each with its own UPC and rank. Request every variant you track.
- **The same product can have a different ASIN in another store.** Look the product up on each Amazon domain you sell on, and keep the domain with the ASIN. For prices across stores, see the [Amazon price scraper](/scrape/amazon-prices).

## Frequently asked questions

### Is it legal to scrape Amazon product data by ASIN?

Product details, identifiers, images and ratings on a public Amazon page are shown to every visitor, and collecting them for catalog work and market research is common practice. Product images and descriptions can be protected by copyright, so check how you reuse them, and personal data falls under laws such as the GDPR and the CCPA. Check Amazon's terms for your use case and ask your lawyer if you are unsure.

### Is there an official Amazon API for ASIN lookups?

Amazon has two. The Product Advertising API's GetItems call looks up a handful of ASINs per request for approved Amazon Associates with recent qualifying sales. The Selling Partner API's Catalog Items API returns catalog data to registered sellers. Teams outside those programs, or who need the page as shoppers see it, read the product page instead.

### What is an ASIN and where do I find it?

The Amazon Standard Identification Number is a 10-character ID Amazon gives each product listing. It is in the product URL after /dp/ , in the details table on the page, and in product.asin of every record this scraper returns.

### Can I convert a UPC or EAN to an ASIN?

Search Amazon for the barcode, such as https://www.amazon.com/s?k=041604394331 , and read the ASIN of the matching result from the search output. A barcode search usually returns the listing that carries it. Then request that ASIN's product page to confirm the UPC in its details table.

### How many ASINs can I look up?

One per request, or a whole list as a Batch job that runs them in parallel and keeps the ASIN on each result. One Batch job accepts more than 10,000 URLs, sent inline or as a CSV file.

### How do I scrape Amazon ASINs with Python?

Build https://www.amazon.com/dp/ plus the ASIN, send it to https://api.zenrows.com/v1/ with Adaptive Stealth Mode and Extract, and read parsed . The Python example above wraps this in a lookup() function that also flattens the details table.

### Do ASIN lookups work on other Amazon stores?

Yes. Use the /dp/ASIN path on the store's own domain, such as amazon.co.uk or amazon.de, and set the matching country if you also want the local price and stock. Labels in the details table come back in the store's language.

### Can AI agents look up Amazon ASINs with Zenrows?

Yes. Connect the Zenrows MCP server to Claude, Cursor, Codex or any MCP client, or give your agent the Zenrows CLI. Paste a list of ASINs, name the fields you want, and the agent calls Fetch and Extract for each one.

### Can I scrape Amazon on a schedule?

Yes. Create a scheduled Batch job with your Amazon URLs and the same settings as a single request, and Zenrows runs it on its side: every few hours, once a day, at set times on chosen days, or once at a future date. Each run keeps its own results, a webhook can notify your app when a run finishes, and the schedule can be paused or resumed at any time.

### Which integrations work with the Amazon ASIN scraper?

Zenrows works with n8n, Make, Zapier, Clay, Dify, LangChain, LlamaIndex, CrewAI and Mastra, plus the Python, Node.js and Go SDKs and any HTTP client. A Clay table or a Google Sheet of ASINs can call Zenrows per row and fill in the details. See the integrations page for the full list.

### What format does the data come in?

JSON by default, with the product record in parsed and the original page in html . You can also ask for the page as Markdown or plain text.

### How is this different from the main Amazon scraper?

The Amazon scraper covers product, search and best sellers pages for any task. This page is about turning a known list of ASINs into catalog records with identifiers and specs. For reviews, use the Amazon reviews scraper .

## More Amazon scrapers

- [Amazon scraper](https://www.zenrows.com/scrape/amazon.md)
- [Amazon reviews scraper](https://www.zenrows.com/scrape/amazon-reviews.md)
- [Amazon price scraper](https://www.zenrows.com/scrape/amazon-prices.md)

All scrapers: https://www.zenrows.com/scrape. Start free: https://app.zenrows.com/register. Docs: https://docs.zenrows.com
