Гайд по интеграции с ИИ
Подключите ASINSpotlight Scraping API к Cursor, Claude Code, Continue, ChatGPT — с готовыми промптами, которые генерируют идиоматичный код, учитывающий квоту.
О чём это
Практическое руководство по работе с ASINSpotlight Scraping API через AI-инструменты разработки. API — это REST + JSON с одним заголовком для авторизации — именно та форма, с которой LLM хорошо справляются. Эта страница существует, потому что технически правильный код, сгенерированный ИИ, часто идиоматически неверен: игнорирует сигналы квоты, неправильно пагинирует, путает данные о товаре с данными о продавцах. Промпты и паттерны ниже закрывают этот разрыв.
За формальным контрактом направьте свой AI на OpenAPI-спецификацию:
https://www.asinspotlight.com/scraping-api-docs/openapi.jsonCursor, Claude Code, Continue, Windsurf и ChatGPT — все нативно работают с OpenAPI. Каждый промпт ниже сразу указывает URL спецификации, чтобы ассистент строил реализацию на реальных схемах.
Быстрый старт за 5 минут
Создайте ключ на board.asinspotlight.com/dashboard/api, добавьте его в окружение:
export ASINSPOTLIGHT_API_KEY="sk_live_..."Сделайте один запрос:
curl -H "x-api-key: $ASINSPOTLIGHT_API_KEY" \
"https://api.asinspotlight.com/v1/product?asin=B0B3ZD8QXJ&marketplace=us"Ответ должен выглядеть примерно так:
{
"success": true,
"found": 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",
"language": "en",
"timing_ms": 1842,
"request_url": "https://api.asinspotlight.com/v1/product?asin=B0B3ZD8QXJ&marketplace=us",
"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=… | Органическая выдача поиска с пагинацией через <code>page=N</code>. Каждая запись уже содержит цену, рейтинг, отзывы, спрос за месяц, бейджи акций, ASIN — без дополнительного вызова /product для шорт-листа. |
| Получить всех продавцов | GET /v1/offers?asin=…&marketplace=… | Полная панель Buy Box: каждый продавец, цена, доставка, FBA/FBM, рейтинг, даты доставки. В реальном времени, не из кэша. |
| Получить профиль продавца | GET /v1/seller?sellerId=…&marketplace=… | Витрина продавца по sellerId: имя, рейтинг отзывов за 12 месяцев и % положительных, а также юридическое название компании и адрес из Detailed Seller Information. |
| Скрапить любой URL | POST /v1/scrape | Тело {url, marketplace, language}. Тип страницы определяется автоматически. Используйте для страниц со скидками, нестандартной разметки конкретных маркетплейсов, бестселлеров, страниц категорий. |
Готовые промпты
Каждый промпт можно вставить в Cursor, Claude Code, ChatGPT или любой другой AI-ассистент. Они указывают URL спецификации, переменную окружения и подвох, который AI обычно пропускает.
1. Сравнение цен по маркетплейсам
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. Ежедневный трекер ключевых слов
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
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=...&condition=new
For each ASIN, call /v1/offers with `condition=new` and identify the current Buy Box owner: the seller in `data.product_sellers_info` whose `is_pinned` is `true`. At most one offer per response carries that flag, so read the owner from it directly instead of inferring it from price. If no offer is pinned (Amazon rendered no featured offer for that ASIN), fall back to the lowest `price + shipping_price` among `is_fba: true` sellers.
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 compare used and new offers as interchangeable — each offer carries a `condition`; the Buy Box is a `new` offer, so pass `condition=new` (or filter on `condition`) before picking the lowest price.
- Don't ignore `stock_qty: 0` sellers; filter those out before picking a winner.
- Don't treat the first entry in `product_sellers_info` as the Buy Box owner; array order does not encode it. Use `is_pinned`.
- 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
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:
- Not found (HTTP 200 with `found: false` and `data: null`): mark the entry as `status: gone` and continue. A not-found result still 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. Конвейер поиск → база (с пагинацией)
Build a search-to-database pipeline that captures the 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`).
Endpoint: GET /v1/search?keyword=...&marketplace=...&page=N
Steps:
1. Call GET /v1/search?keyword=...&marketplace=us (page 1 by default). Read `data.last_page_number` to know the upper bound.
2. For pages 2..min(5, last_page_number), call the same endpoint with `page=N`.
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 fetch past `last_page_number`: Amazon returns an empty result set and you'll waste credits.
- Don't run more than 5 requests in parallel; the account has a parallel-request limit.Подвох: запросы за пределами last_page_number. Amazon возвращает пустые страницы, и каждый запрос всё равно стоит кредит, поэтому промпт явно ограничивает обход до min(5, last_page_number).
Подключение к AI-инструментам
Cursor
Добавьте правило проекта со ссылкой на OpenAPI-спецификацию. Создайте .cursor/rules/asinspotlight.md:
---
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, language), /search (keyword, marketplace, page, language), /offers (asin, marketplace, condition, language), /seller (sellerId, marketplace, language), POST /scrape (body: {url, marketplace, language})
- Read `meta.usage.requests_remaining` after every successful response
- A missing entity returns HTTP 200 with `found: false` and `data: null` — branch on `found`, not the status code
- Optional `language` param: `en` (default) or `native` (the marketplace's own language; currently `it`/`fr`/`de`/`es`, unsupported combos return 400 `NATIVE_LANGUAGE_NOT_SUPPORTED`)
- Cap parallelism at 5 unless told otherwise
- For search pagination beyond page 1, pass `page=N` to /search
Claude Code
Передайте URL спецификации в промпте или добавьте в CLAUDE.md в корне проекта. Claude Code загрузит её и будет использовать как контекст. Те же инструкции, что и в правиле для Cursor выше, работают как раздел CLAUDE.md.
Continue.dev
Добавьте спецификацию в ~/.continue/config.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. Не нужно опрашивать отдельный эндпоинт, чтобы решить, продолжать ли — читайте на каждом вызове:
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 спецификации. Необязательный параметр language работает одинаково на всех эндпоинтах: en (по умолчанию) запрашивает английскую версию страницы, native — родной язык маркетплейса (сейчас it, fr, de, es).
Обработка ошибок без расхода кредитов
Большинство ответов с ошибками не расходуют кредиты — и отсутствующая сущность не является ошибкой. Недействительный ASIN или продавец возвращает 200 с found: false и data: null, и с вас всё равно списывается 1 кредит, потому что страница была загружена и распарсена. Учитывайте это: задача обновления, упирающаяся в удалённые ASIN, медленно расходует квоту по 1 кредиту, поэтому помечайте такие записи и переставайте их обновлять.
Пагинация через /scrape
/v1/search по умолчанию возвращает первую страницу. Для страниц 2+ передавайте page=N на тот же эндпоинт и смотрите data.current_page / data.last_page_number, чтобы знать, когда остановиться. Amazon обычно ограничивает поиск по ключевому слову 20 страницами, а число результатов на странице зависит от запроса.
Частые ошибки в коде, сгенерированном ИИ
- Путать
/v1/productс/v1/offers. Product даёт цену Buy Box; offers даёт владельца Buy Box и всех остальных продавцов. Не смешивайте их. - Запрашивать
language=nativeна любом маркетплейсе. Нативный режим включается по-маркетплейсно (сейчасit,fr,de,es); остальные возвращают400 NATIVE_LANGUAGE_NOT_SUPPORTED. Дефолтныйenработает везде. - Опрашивать вместо чтения
meta.usage. Остаток кредитов есть в каждом успешном ответе. Больше ничего вызывать не нужно. - Игнорировать разницу 429 и 503. 429 значит слишком много параллельных запросов или нет кредитов — отступите или остановитесь. 503 с кодом
CAPTCHA_DETECTEDвременна — повторите с экспоненциальной задержкой. - Забывать параметр
marketplace. Без него каждый вызов идёт на amazon.com — тихий UX-баг для европейских и японских воркфлоу. Всегда передавайте его явно. - Считать результат «не найдено» бесплатным. Ответ
found: false(HTTP 200) всё равно стоит 1 кредит (страница была загружена и распарсена). Задачи обновления по устаревшим спискам отслеживания могут тихо расходовать квоту. - Слепо повторять 4xx. Ошибки валидации (400) и авторизации (401) сами не починятся. Повторять стоит только 429, 500 и 503.
Куда дальше
- OpenAPI-спецификация — формальный контракт, машиночитаемый
- Текстовая документация — справочник для людей с формами ответов и примерами
- Создать API-ключ