ASINSpotlight

Гайд по интеграции с ИИ

Подключите ASINSpotlight Scraping API к Cursor, Claude Code, Continue, ChatGPT — с готовыми промптами, которые генерируют идиоматичный код, учитывающий квоту.

О чём это

Практическое руководство по работе с ASINSpotlight Scraping API через AI-инструменты разработки. API — это REST + JSON с одним заголовком для авторизации — именно та форма, с которой LLM хорошо справляются. Эта страница существует, потому что технически правильный AI-сгенерированный код часто идиоматически неверен: игнорирует сигналы квоты, неправильно пагинирует, путает данные о товаре с данными о продавцах. Промпты и паттерны ниже закрывают этот разрыв.

За формальным контрактом направьте свой AI на OpenAPI-спецификацию:

url
https://www.asinspotlight.com/scraping-api-docs/openapi.json

Cursor, Claude Code, Continue, Windsurf и ChatGPT — все нативно работают с OpenAPI. Каждый промпт ниже сразу указывает URL спецификации, чтобы ассистент строил реализацию на реальных схемах.

Быстрый старт за 5 минут

Создайте ключ на board.asinspotlight.com/dashboard/api, добавьте его в окружение:

bash
export ASINSPOTLIGHT_API_KEY="sk_live_..."

Сделайте один запрос:

bash
curl -H "x-api-key: $ASINSPOTLIGHT_API_KEY" \
  "https://api.asinspotlight.com/v1/product?asin=B0B3ZD8QXJ&marketplace=us"

Ответ должен выглядеть примерно так:

json
{
  "success": true,
  "page_type": "product",
  "data": {
    "asin": "B0B3ZD8QXJ",
    "title": "Soundcore Q20i Headphones",
    "bb_price": 39.99,
    "rating": 4.6,
    "reviews": 58800,
    "bsr": 12,
    "in_stock": true,
    "bought_past_month": 20000
  },
  "meta": {
    "marketplace": "us",
    "timing_ms": 1842,
    "request_url": "https://www.amazon.com/dp/B0B3ZD8QXJ",
    "timestamp": "2026-05-03T10:14:22.318Z",
    "request_id": "550e8400-e29b-41d4-a716-446655440000",
    "usage": {"requests_consumed": 1, "requests_remaining": 49999}
  }
}

Это и есть контракт. В каждом успешном ответе есть meta.usage.requests_remaining — читайте его на каждом вызове, чтобы код учитывал квоту без отдельной проверки.

Эндпоинты — обзор

ЗадачаПутьДля чего
Получить детали товараGET /v1/product?asin=…&marketplace=…Название, цена Buy Box, BSR, рейтинг, отзывы, бренд, категория, спрос за месяц. Менее секунды на типичных PDP.
Поиск по ключевому словуGET /v1/search?keyword=…&marketplace=…Первая страница органического поиска. Каждая запись уже содержит цену, рейтинг, отзывы, спрос за месяц, ASIN — без дополнительного вызова /product для шорт-листа.
Получить всех продавцовGET /v1/offers?asin=…&marketplace=…Полная панель Buy Box: каждый продавец, цена, доставка, FBA/FBM, рейтинг. В реальном времени, не из кэша.
Скрапить любой URLPOST /v1/scrapeapiDocs.ai.endpoints.row4UseFor

Готовые промпты

Каждый промпт можно вставить в Cursor, Claude Code, ChatGPT или любой другой AI-ассистент. Они указывают URL спецификации, переменную окружения и подвох, который AI обычно пропускает.

1. Сравнение цен по маркетплейсам

prompt
Build a script that compares prices for a list of ASINs across multiple Amazon marketplaces using the ASINSpotlight Scraping API.

OpenAPI spec: https://www.asinspotlight.com/scraping-api-docs/openapi.json
API base URL: https://api.asinspotlight.com (note: api., not www.)
Auth: API key in the `x-api-key` header (read from env var `ASINSPOTLIGHT_API_KEY`).
Endpoint: GET /v1/product?asin=...&marketplace=...

Inputs:
  - List of ASINs (e.g., ["B0B3ZD8QXJ", "B0CQXMXJC5"])
  - List of marketplace codes (e.g., ["us", "uk", "de"])

For each (asin, marketplace) pair, fetch product details and collect: asin, marketplace, title, bb_price, in_stock, rating.

Output: CSV with columns asin, marketplace, title, bb_price, in_stock, rating.

Constraints:
  - Stop early and surface the error if a request returns 401, 429, or 5xx.
  - After each successful response, read `meta.usage.requests_remaining` and abort if it drops below 50.
  - Don't run more than 5 requests in parallel — the account has a parallel-request limit.

Что AI обычно делает правильно: цикл запросов, авторизация через env-var, парсинг JSON.
Что обычно упускает: чтение meta.usage, ограничение параллелизма. Оба пункта явно прописаны в промпте именно поэтому.

2. Ежедневный трекер ключевых слов

prompt
Build a daily keyword tracker that records the top 10 ASINs for a list of keywords using the ASINSpotlight Scraping API.

OpenAPI spec: https://www.asinspotlight.com/scraping-api-docs/openapi.json
API base URL: https://api.asinspotlight.com (note: api., not www.)
Auth: API key in the `x-api-key` header (env var `ASINSPOTLIGHT_API_KEY`).
Endpoint: GET /v1/search?keyword=...&marketplace=...

For each keyword, fetch the search results page, take the first 10 entries from `data.shallow_parts`, and write one row per (keyword, rank, asin, title, price, rating, reviews, bought_past_month, captured_at).

Storage: append to a SQLite table `keyword_rankings` keyed on (keyword, marketplace, captured_at, rank).

Run cadence: once per day, intended to be invoked by cron.

Don't:
  - Don't try to "follow up" with a /v1/product call for each search result — `shallow_parts` already contains everything we need.
  - Don't paginate past page 1; we only care about the top 10.
  - Don't retry on 4xx errors; only on 5xx and `CAPTCHA_DETECTED` (with backoff).

Подвох: AI часто генерирует follow-up вызов /v1/product для каждого результата поиска, удваивая расход кредитов. shallow_parts уже содержит всё, что нужно ежедневному трекеру.

3. Мониторинг владельца Buy Box

prompt
Build a Buy Box ownership monitor for a watchlist of ASINs using the ASINSpotlight Scraping API.

OpenAPI spec: https://www.asinspotlight.com/scraping-api-docs/openapi.json
API base URL: https://api.asinspotlight.com (note: api., not www.)
Auth: API key in the `x-api-key` header (env var `ASINSPOTLIGHT_API_KEY`).
Endpoint: GET /v1/offers?asin=...&marketplace=...

For each ASIN, call /v1/offers and identify the current Buy Box owner — the seller in `data.product_sellers_info` whose price equals the lowest `price + shipping_price` and who has `is_fba: true` (the typical Amazon Buy Box rule).

Compare against the previously recorded owner stored in a JSON file `buybox_state.json` keyed by asin. When the owner changes, log a line to stdout with: timestamp, asin, previous owner, new owner, new price.

Run as a loop with a 10-minute interval between full sweeps.

Don't:
  - Don't conflate /v1/product and /v1/offers — `/v1/product` returns the Buy Box price but not the full seller list. You need /v1/offers for ownership.
  - Don't ignore `stock_qty: 0` sellers; filter those out before picking a winner.
  - Don't run all watchlist requests at once; respect the parallel limit (default ~5).

Подвох: ассистенты часто берут buybox / bb_price из /v1/product и называют это владельцем Buy Box. Это поле говорит, что цена является Buy Box, а не кто им владеет. Данные о владельце живут только в /v1/offers.

4. Пакетное обновление списка ASIN

prompt
Build an ASIN-list batch refresh that updates cached product data using the ASINSpotlight Scraping API.

OpenAPI spec: https://www.asinspotlight.com/scraping-api-docs/openapi.json
API base URL: https://api.asinspotlight.com (note: api., not www.)
Auth: API key in the `x-api-key` header (env var `ASINSPOTLIGHT_API_KEY`).
Endpoint: GET /v1/product?asin=...&marketplace=...

Inputs: a JSON file `watchlist.json` of `{asin, marketplace, last_refreshed_at}` records.

Refresh strategy:
  1. Sort the list by `last_refreshed_at` ascending (oldest first).
  2. For each entry, call /v1/product. On a successful 200, write the response data and the new timestamp back to the file.
  3. After every response, read `meta.usage.requests_remaining`. If it would dip below the configured floor (default 1000), stop the run and log how many entries were skipped.
  4. Run requests in batches of 5 in parallel.

Error handling:
  - `PAGE_NOT_FOUND` (404): mark the entry as `status: gone` and continue. PAGE_NOT_FOUND consumes 1 credit — that's expected.
  - `CAPTCHA_DETECTED` (503): retry up to 3 times with exponential backoff.
  - `RATE_LIMIT_EXCEEDED` (429): wait 30 seconds and retry the same entry.
  - Any other error: log and stop.

Подвох: наивные batch-задачи игнорируют лимит параллелизма и порог квоты. Оба сигналят чётко через 429 и meta.usage — промпт говорит AI их учитывать.

5. Конвейер поиск → база (с пагинацией)

prompt
Build a search-to-database pipeline that captures the full first 5 pages of results for a keyword using the ASINSpotlight Scraping API.

OpenAPI spec: https://www.asinspotlight.com/scraping-api-docs/openapi.json
API base URL: https://api.asinspotlight.com (note: api., not www.)
Auth: API key in the `x-api-key` header (env var `ASINSPOTLIGHT_API_KEY`).

The /v1/search endpoint returns page 1 by default. To walk further pages, use POST /v1/scrape with an explicit Amazon search URL containing `&page=N`:

  POST /v1/scrape
  Body: {"url": "https://www.amazon.com/s?k=wireless+headphones&page=2", "marketplace": "us"}

Steps:
  1. Call GET /v1/search?keyword=...&marketplace=us — this is page 1. Read `data.last_page_number` to know the upper bound.
  2. For pages 2..min(5, last_page_number), call POST /v1/scrape with the page-N URL.
  3. Append every entry to a Postgres table `search_results` with columns (keyword, marketplace, page, rank, asin, title, price, rating, reviews, captured_at).

Don't:
  - Don't try `?page=2` on the typed /v1/search endpoint — that endpoint doesn't accept a `page` parameter.
  - Don't fetch past `last_page_number` — Amazon will return an empty result set and you'll waste credits.

Подвох: AI пробует /v1/search?keyword=...&page=2, потому что это очевидная форма. Типизированный поисковый эндпоинт не принимает page. Чтобы пройти по страницам, используйте POST /v1/scrape с явным URL Amazon — промпт делает эту замену явной.

Подключение к AI-инструментам

Cursor

Добавьте правило проекта со ссылкой на OpenAPI-спецификацию. Создайте .cursor/rules/asinspotlight.md:

markdown
---
description: ASINSpotlight Amazon Scraping API
globs: ["**/*.py", "**/*.ts", "**/*.js"]
alwaysApply: false
---

When working with the ASINSpotlight Scraping API:

- Spec: https://www.asinspotlight.com/scraping-api-docs/openapi.json
- Auth: `x-api-key` header, value from env var `ASINSPOTLIGHT_API_KEY`
- Base URL: https://api.asinspotlight.com/v1
- Endpoints: /product (asin, marketplace), /search (keyword, marketplace), /offers (asin, marketplace), POST /scrape (body: {url, marketplace})
- Read `meta.usage.requests_remaining` after every successful response
- Cap parallelism at 5 unless told otherwise
- For search pagination beyond page 1, use POST /scrape with an explicit Amazon URL containing `&page=N`

Claude Code

Передайте URL спецификации в промпте или добавьте в CLAUDE.md в корне проекта. Claude Code загрузит её и будет использовать как контекст. Те же инструкции, что и в правиле для Cursor выше, работают как раздел CLAUDE.md.

Continue.dev

Добавьте спецификацию в ~/.continue/config.json как источник документации:

json
{
  "docs": [
    {
      "title": "ASINSpotlight Scraping API",
      "startUrl": "https://www.asinspotlight.com/scraping-api-docs/openapi.json",
      "rootUrl": "https://www.asinspotlight.com/scraping-api-docs/openapi.json"
    }
  ]
}

Затем ссылайтесь на неё в чате через @docs ASINSpotlight Scraping API.

ChatGPT (web)

Вставьте URL OpenAPI в чат и попросите ChatGPT её загрузить. С включённым браузингом он подгружает спецификацию и использует её как контракт для любого кода, который пишет. Работает так же в Claude (claude.ai) и Gemini.

Другие инструменты (Windsurf, Cline, codex CLI, …)

Любой агент, который умеет загружать URL или принимать OpenAPI-документ, интегрируется так же: укажите ему https://www.asinspotlight.com/scraping-api-docs/openapi.json и используйте промпты выше.

Паттерны для имитации

Это идиомы, которые отличают продакшен-код, учитывающий квоту, от наивных скриптов.

Циклы с учётом квоты

Каждый успешный ответ содержит meta.usage.requests_remaining. Не нужно опрашивать отдельный эндпоинт, чтобы решить, продолжать ли — читайте на каждом вызове:

typescript
for (const asin of asins) {
  const res = await fetchProduct(asin);
  if (!res.success) handleError(res.error.code);
  if (res.meta.usage.requests_remaining < FLOOR) break;
  store(res.data);
}

Переключение маркетплейсов

marketplace — единственный параметр, который определяет, какую витрину Amazon запрашивать. Передавайте его явно на каждом вызове — не полагайтесь на дефолт us, если только это не намеренно. Допустимые коды есть в схеме Marketplace спецификации.

Обработка ошибок без расхода кредитов

Большинство ошибок не расходуют кредиты. Исключение — PAGE_NOT_FOUND (404) — он биллится, потому что парсер всё-таки отработал. Учитывайте: задача обновления, упирающаяся в удалённые ASIN, медленно расходует квоту по 1 кредиту, поэтому помечайте такие записи и переставайте обновлять.

Пагинация через /scrape

/v1/search возвращает первую страницу. Для страниц 2+ используйте POST /v1/scrape с явным URL Amazon https://www.amazon.com/s?k=…&page=N. Форма ответа совпадает с SearchData.

Частые ошибки в AI-сгенерированном коде

  • Путать /v1/product с /v1/offers. Product даёт цену Buy Box; offers даёт владельца Buy Box и всех остальных продавцов. Не смешивайте их.
  • Пробовать ?page=N на /v1/search. Типизированный поисковый эндпоинт принимает только keyword и marketplace. Для дальнейших страниц используйте /scrape.
  • Опрашивать вместо чтения meta.usage. Остаток кредитов есть в каждом успешном ответе. Больше ничего вызывать не нужно.
  • Игнорировать разницу 429 и 503. 429 значит слишком много параллельных запросов или нет кредитов — отступите или остановитесь. 503 с кодом CAPTCHA_DETECTED временна — повторите с экспоненциальной задержкой.
  • Забывать параметр marketplace. Без него каждый вызов идёт на amazon.com — тихий UX-баг для европейских и японских воркфлоу. Всегда передавайте его явно.
  • Считать PAGE_NOT_FOUND бесплатным. Это 1 кредит (парсер отработал). Задачи обновления по устаревшим спискам тихо расходуют квоту.
  • Слепо повторять 4xx. Ошибки валидации (400) и авторизации (401) сами не починятся. Повторять стоит только 429, 502 и 503.

Куда дальше