Amazon: актуальные эндпоинты портала

Публичный префикс Amazon на портале: /amazon/api/v1. Портал проверяет apiToken, тариф и квоту, затем проксирует запрос во внешний сервис amazon_api.

МетодПутьНазначение
GET/amazon/api/v1/item/by-urlОдин товар по URL.
GET/amazon/api/v1/itemОдин товар по ASIN.
POST/amazon/api/v1/itemPOST-вариант товара по ASIN.
GET/amazon/api/v1/searchПоиск по каталогу Amazon.
POST/amazon/api/v1/searchPOST-вариант поиска, включая max_items.
POST/amazon/api/v1/parse/batchСинхронный batch до 100 URL.
POST/amazon/api/v1/tasks/parseСоздать асинхронную batch-задачу.
POST/amazon/api/v1/tasks/parse/fileСоздать задачу из текстового файла URL.
GET/amazon/api/v1/tasks/{task_id}Статус задачи.
GET/amazon/api/v1/tasks/{task_id}/resultJSON-результат завершённой задачи.
Примечание. Внешний сервис amazon_api также сохраняет устаревший алиас POST /v1/parse/single. На портале для этого сценария используйте GET /amazon/api/v1/item/by-url.

Amazon: получить товар по URL

GET /amazon/api/v1/item/by-url

Парсит один товар Amazon по полному URL и возвращает JSON с данными карточки в формате TMAPI.

Параметры запроса

ПараметрТипОбязательныйОписание
url string да URL детальной карточки Amazon: https://www.amazon.com/dp/<ASIN> или https://www.amazon.com/.../dp/<ASIN>/....
site string нет Регион Amazon: com (по умолч.), uk, de, fr, it, es, nl, jp, ca, in, au, mx.

Заголовки

ЗаголовокОбязательныйОписание
X-API-Token да Ваш API‑токен портала. Альтернативно можно использовать query‑параметр apiToken.

Пример запроса

cURL
curl -X GET \
  "https://bhapi.ru/amazon/api/v1/item/by-url?url=https://www.amazon.com/dp/B08LK8ZYJ1&site=com" \
  -H "X-API-Token: ВАШ_API_TOKEN"

Успешный ответ 200 OK

JSON
{
  "status": "ok",
  "data": {
    "code": 200,
    "msg": "success",
    "data": {
      "item_id": "B08LK8ZYJ1",
      "asin": "B08LK8ZYJ1",
      "title": "Patriot Memory Burst Elite SATA 3 240GB SSD",
      "currency": "USD",
      "brand": "Patriot Memory",
      "price_info": {
        "sale_price": "14.99",
        "origin_price": "19.99"
      },
      "main_imgs": [
        "https://m.media-amazon.com/images/I/41bKdMOwhTL._AC_SX679_.jpg"
      ],
      "main_videos": [],
      "category_path": [
        {"name": "Electronics", "url": "https://www.amazon.com/..."},
        {"name": "Internal Solid State Drives", "url": "https://www.amazon.com/..."}
      ],
      "sold_count": "",
      "product_props": [
        {"name": "Brand", "value": "Patriot Memory"},
        {"name": "Digital Storage Capacity", "value": "240 GB"},
        {"name": "Hard Disk Interface", "value": "Solid State"}
      ],
      "shop_info": {
        "shop_name": "Patriot Memory",
        "shop_url": "https://www.amazon.com/stores/PatriotMemory/..."
      },
      "delivery_info": {
        "message": "FREE delivery May 12-16"
      },
      "review_info": {
        "rating_star": "4.5",
        "review_count": 4980
      },
      "highlights": [
        "SATA III 6GB/s interface",
        "Sequential read/write up to 560MB/s"
      ],
      "desc": "Patriot Memory Burst Elite SATA 3 240GB Internal SSD...",
      "sku_props": [
        {"name": "Size", "values": ["240GB", "480GB", "960GB"]}
      ],
      "skus": []
    }
  },
  "saved_path": null
}
Примечание. Парсер работает stateless (без браузеров, без Playwright) — чистый httpx с браузерными заголовками и ротацией прокси. При сетевых ошибках автоматически ретраит (до 2 раз с прокси, затем фоллбэк без прокси). Первый запрос занимает до 30 секунд.

Amazon: получить товар по ASIN

GET /amazon/api/v1/item

Парсит один товар Amazon по ASIN (идентификатору) и возвращает JSON с данными карточки. Ответ по структуре полностью идентичен /amazon/api/v1/item/by-url.

Параметры запроса

ПараметрТипОбязательныйОписание
id string да ASIN товара: B08HN37XC1, B08LK8ZYJ1 и т.д.
site string нет Регион Amazon: com (по умолч.), uk, de, fr, it, es, nl, jp, ca, in, au, mx.

Пример запроса

cURL
curl -X GET \
  "https://bhapi.ru/amazon/api/v1/item?id=B08HN37XC1&site=com" \
  -H "X-API-Token: ВАШ_API_TOKEN"
Примечание. Результат полностью совпадает с /amazon/api/v1/item/by-url. Под капотом ASIN преобразуется в полный URL (https://www.amazon.com/dp/{ASIN}), и дальнейшая логика идентична.

POST‑вариант

POST /amazon/api/v1/item

Принимает JSON-тело с идентификатором товара и регионом.

ПолеТипОбязательноеОписание
id string да ASIN товара: B08HN37XC1.
site string нет Регион Amazon, по умолчанию com.

Пример POST-запроса

cURL
curl -X POST "https://bhapi.ru/amazon/api/v1/item" \
  -H "Content-Type: application/json" \
  -H "X-API-Token: ВАШ_API_TOKEN" \
  -d '{"id":"B08HN37XC1","site":"com"}'

Amazon: пакетный парсинг (до 100 URL)

POST /amazon/api/v1/parse/batch

Массовый парсинг товаров Amazon — до 100 URL за один запрос. Результаты возвращаются массивом в том же порядке, что и входной список URL.

Параметры запроса

ПолеТипОбязательноеОписание
urls string[] да Список URL товаров Amazon (минимум 1, до 100). Каждый URL должен содержать /dp/<ASIN>.
site string нет Регион Amazon, по умолчанию com.

Пример запроса

cURL
curl -X POST "https://bhapi.ru/amazon/api/v1/parse/batch" \
  -H "Content-Type: application/json" \
  -H "X-API-Token: ВАШ_API_TOKEN" \
  -d '{
    "urls": [
      "https://www.amazon.com/dp/B08LK8ZYJ1",
      "https://www.amazon.com/dp/B08GTYFC37",
      "https://www.amazon.com/dp/B0C5JQ68FY"
    ],
    "site": "com"
  }'

Пример ответа

JSON
{
  "status": "ok",
  "data": [
    {
      "code": 200,
      "msg": "success",
      "data": { "... карточка товара B08LK8ZYJ1 ..." }
    },
    {
      "code": 200,
      "msg": "success",
      "data": { "... карточка товара B08GTYFC37 ..." }
    },
    {
      "code": 404,
      "msg": "error",
      "data": {
        "item_id": null,
        "product_url": "https://www.amazon.com/dp/B0C5JQ68FY",
        "error": "Product not found (404)",
        "reason_type": "http_404"
      }
    }
  ],
  "saved_path": null
}
Примечание. При превышении лимита в 100 URL внешний сервис возвращает ошибку 429 для ссылок сверх лимита, остальные обрабатываются штатно. Рекомендуется делать паузу 2–3 секунды между батч-запросами.

Python: пакетный парсинг

Python
import requests

BATCH_URL = "https://bhapi.ru/amazon/api/v1/parse/batch"
TOKEN = "ВАШ_API_TOKEN"

urls = [
    "https://www.amazon.com/dp/B08LK8ZYJ1",
    "https://www.amazon.com/dp/B08GTYFC37",
]

response = requests.post(
    BATCH_URL,
    json={"urls": urls, "site": "com"},
    headers={"X-API-Token": TOKEN},
    timeout=300,
)

payload = response.json()
for result in payload["data"]:
    if result["code"] == 200:
        item = result["data"]
        print(f"✓ {item['asin']}: {item['title'][:60]}")
    else:
        error_info = result["data"]
        print(f"✗ {error_info.get('product_url', '?')} — {error_info.get('reason_type')}")

Amazon: асинхронные задачи

Для массового парсинга больших списков URL (до 100) доступен асинхронный режим: вы создаёте задачу, отслеживаете её статус и скачиваете результат по готовности. Результат хранится на сервере в течение времени, заданного в настройках внешнего сервиса.

Создание задачи из списка URL

POST /amazon/api/v1/tasks/parse
ПолеТипОбязательноеОписание
urls string[] да Список URL товаров Amazon (до 100).
site string нет Регион Amazon, по умолчанию com.

Создание задачи из файла

POST /amazon/api/v1/tasks/parse/file

Принимает текстовый файл (multipart/form-data) с URL (по одному на строку). Параметр site передаётся в query string.

ПараметрТипОбязательныйОписание
urls_file file да Текстовый файл с URL (по одному на строку).
site string нет Регион Amazon, по умолчанию com. Query-параметр, например ?site=com.

Пример загрузки файла

cURL
curl -X POST "https://bhapi.ru/amazon/api/v1/tasks/parse/file?site=com" \
  -H "X-API-Token: ВАШ_API_TOKEN" \
  -F "urls_file=@urls.txt"

Статус задачи

GET /amazon/api/v1/tasks/{task_id}

Возвращает текущий статус задачи и прогресс выполнения.

Поле ответаТипОписание
task_idstringИдентификатор задачи.
statusstringpending | running | completed | failed.
totalintegerВсего URL в задаче.
doneintegerОбработано URL.
percentfloatПроцент выполнения (0–100).
created_atstring | nullВремя создания задачи (ISO).
errorstring | nullСообщение об ошибке (для failed).

Результат задачи

GET /amazon/api/v1/tasks/{task_id}/result

Скачивает JSON-результат завершённой задачи. Для выполняющихся задач возвращает статус 202.

Пример: полный цикл задачи

Python — асинхронная задача
import time
import requests

BASE_URL = "https://bhapi.ru"
TOKEN = "ВАШ_API_TOKEN"
HEADERS = {"X-API-Token": TOKEN}

# Шаг 1: создать задачу
resp = requests.post(
    f"{BASE_URL}/amazon/api/v1/tasks/parse",
    json={
        "urls": [
            "https://www.amazon.com/dp/B08LK8ZYJ1",
            "https://www.amazon.com/dp/B08GTYFC37",
        ],
        "site": "com",
    },
    headers=HEADERS,
    timeout=30,
)
task = resp.json()
task_id = task["task_id"]
print(f"Задача создана: {task_id}")

# Шаг 2: ждать завершения
while True:
    st = requests.get(
        f"{BASE_URL}/amazon/api/v1/tasks/{task_id}",
        headers=HEADERS,
        timeout=30,
    ).json()
    print(f"Статус: {st['status']} — {st['done']}/{st['total']} ({st['percent']}%)")
    if st["status"] in ("completed", "failed"):
        break
    time.sleep(5)

# Шаг 3: получить результат
if st["status"] == "completed":
    result = requests.get(
        f"{BASE_URL}/amazon/api/v1/tasks/{task_id}/result",
        headers=HEADERS,
        timeout=30,
    ).json()
    print(f"Успешно: {result['summary']['success']}, ошибок: {result['summary']['errors']}")
    for item in result["results"]:
        if item["code"] == 200:
            print(f"  ✓ {item['data'].get('asin', '?')}")
else:
    print(f"Задача завершилась с ошибкой: {st.get('error')}")
Важно. Асинхронные задачи выполняются на стороне внешнего сервиса Amazon API. Результаты хранятся ограниченное время (зависит от настроек сервиса). Не забывайте скачивать результат сразу после завершения задачи.

Обёртка ответа парсера Amazon

Парсер Amazon возвращает данные в двух уровнях: внешний уровень портала BHAPI и внутренний уровень самого парсера.

ПолеТипОписание
status string Статус верхнего уровня портала: обычно "ok" или "error".
data object Полезная нагрузка. Для одиночного товара содержит поля code, msg, data.
saved_path string | null Если парсер сохраняет результат на диск, здесь может быть путь к файлу (чаще null).

Во внутреннем объекте data для одиночного товара структура такая:

ПолеТипОписание
codeintegerКод результата парсера (200 — успех, другие — ошибки на стороне Amazon/парсера).
msgstringТекстовое описание результата ("success" или сообщение об ошибке).
dataobjectКарточка товара Amazon (см. раздел «Карточка товара» ниже). При ошибке — объект с полями error и reason_type.

Карточка товара Amazon

Ниже приведена структура объекта data для одиночного товара. Формат совместим с TMAPI.

ПолеТипОписание
item_idstringASIN товара Amazon, одновременно является идентификатором.
asinstringДублирует item_id — ASIN товара.
titlestringНазвание товара.
currencystringКод валюты: USD, EUR, GBP, JPY и т.д.
brandstringБренд товара (может быть пустым).
price_infoobjectЦены: sale_price (текущая), origin_price (исходная, может отсутствовать).
main_imgsstring[]Массив URL основных изображений товара.
main_videosstring[]Видео товара (обычно пустой массив).
category_pathobject[]Цепочка категорий: массив объектов {"name": "...", "url": "..."}.
sold_countstringКоличество продаж (часто пустая строка — Amazon не показывает это явно).
product_propsobject[]Характеристики товара: массив объектов {"name": "...", "value": "..."}.
shop_infoobjectИнформация о продавце (см. ниже).
delivery_infoobjectИнформация о доставке: поле message.
review_infoobjectИнформация об отзывах: rating_star и review_count.
highlightsstring[]Ключевые особенности товара (маркированный список из карточки).
descstringТекстовое описание товара.
sku_propsobject[]Варианты товара: массив объектов {"name": "...", "values": ["...", "..."]}.
skusobject[]Детальные SKU (часто пустой массив).

ShopInfo — информация о продавце

ПолеТипОписание
shop_namestringОтображаемое название магазина/бренда.
shop_urlstringURL страницы магазина на Amazon.

Структура результата поиска

Объект data в ответе на /amazon/api/v1/search детализированно описан ниже.

ПолеТипОписание
keywordsstringИсходный поисковый запрос.
sitestringРегион поиска.
currencystringВалюта ответа внешнего сервиса, обычно USD.
pageintegerНомер текущей страницы.
totalintegerОценочное число товаров (может варьироваться между запросами).
linksstring[]Массив URL карточек товаров на текущей странице.
countintegerКоличество элементов в массиве links.
productsobject[]Массив кратких описаний товаров.

Элемент products[i]

ПолеТипОписание
asinstringASIN товара Amazon.
linkstringURL детальной карточки товара.
titlestringКраткое название товара.
pricestring | nullТекущая цена (может быть null).
ratingstring | nullРейтинг по отзывам (текстовый).
feedbacksinteger | nullКоличество отзывов/оценок.
Примечание. total — оценочное значение, которое Amazon показывает на странице выдачи. Фактическое количество может варьироваться между запросами. Поиск не кэшируется.

Коды ошибок

Типичные коды ошибок при работе с парсером Amazon через портал BHAPI:

КодHTTPОписаниеЧто делать
401 Unauthorized Токен не передан или невалиден. Проверьте заголовок X-API-Token или параметр apiToken, при необходимости создайте новый токен.
403 Forbidden Нет активной подписки на парсер Amazon или токен деактивирован. Проверьте тарифы и статус токена в личном кабинете.
404 Not Found Товар не найден (удалён, скрыт или неверный URL/ASIN). Убедитесь, что URL ведёт на существующую карточку Amazon и содержит корректный ASIN.
422 Unprocessable Entity Ошибка валидации параметров запроса. Проверьте обязательные параметры (url или keywords) и формат значений.
429 Too Many Requests Превышен лимит запросов по тарифу или ограничение скорости. Уменьшите частоту запросов, используйте кэширование и проверьте лимиты в кабинете.
500 Internal Server Error Внутренняя ошибка сервиса. Повторите запрос позже, при постоянной проблеме свяжитесь с поддержкой.
503 Service Unavailable Сервис Amazon недоступен или капча. Подождите 30–60 секунд и повторите запрос. При регулярных ошибках — сообщите поддержке.

Типы ошибок в поле reason_type

При ошибке парсинга внутри data.data возвращается объект с полями error, reason_type и опционально attempts:

reason_typeОписание
http_404Amazon вернул 404 — товар не найден.
http_5xxAmazon вернул ошибку сервера — временный сбой.
captchaAmazon запросил капчу — сессия заблокирована.
rate_limitПревышен лимит запросов к Amazon.
networkСетевая ошибка (таймаут, разрыв соединения).
authПроблема с авторизацией на Amazon.
parseОшибка парсинга HTML — изменилась вёрстка.
invalid_urlНекорректный URL или не удалось извлечь ASIN.
unknownНеизвестная ошибка.

Лимиты и квоты

Парсер Amazon использует общую систему лимитов портала BHAPI. У каждого токена есть дневной и общий лимит, а также защита от слишком частых запросов.

Тип лимитаОписаниеСброс / поведение
Дневной лимит Максимальное количество запросов к парсеру Amazon в сутки. Сбрасывается ежедневно по UTC. После исчерпания возвращается ошибка 429.
Общий лимит Суммарное количество запросов за всё время жизни токена. Не сбрасывается. При достижении лимита необходимо создать новый токен или изменить тариф.
Rate limit Защита от слишком частых запросов подряд (ограничение скорости). Рекомендуется делать паузу 1–2 секунды между запросами, особенно при массовом парсинге.
Особенность Amazon. Парсер работает stateless (без браузеров, без Playwright) — чистый httpx. При сетевых ошибках автоматически ретраит (до 2 раз с прокси, затем фоллбэк без прокси). Рекомендуется таймаут не менее 60 секунд на запрос.

Примеры: Python

Получить один товар по URL

Python — requests
import requests

API_URL = "https://bhapi.ru/amazon/api/v1/item/by-url"
TOKEN = "ВАШ_API_TOKEN"

params = {
    "url": "https://www.amazon.com/dp/B08LK8ZYJ1",
    "site": "com",
}

response = requests.get(API_URL, params=params, headers={"X-API-Token": TOKEN}, timeout=60)
payload = response.json()

if payload["status"] == "ok" and payload["data"]["code"] == 200:
    item = payload["data"]["data"]
    print("ASIN:", item["asin"])
    print("Название:", item["title"])
    print("Бренд:", item["brand"])
    print("Цена:", item["price_info"].get("sale_price"))
    print("Рейтинг:", item["review_info"].get("rating_star"))
else:
    print("Ошибка:", payload)

Поиск по каталогу и вывод топа

Python — поиск
import requests

SEARCH_URL = "https://bhapi.ru/amazon/api/v1/search"
TOKEN = "ВАШ_API_TOKEN"

params = {
    "q": "ssd disk 1tb",
    "site": "com",
    "page": 1,
}

response = requests.get(SEARCH_URL, params=params, headers={"X-API-Token": TOKEN}, timeout=60)
payload = response.json()

data = payload["data"]
print(f"Запрос: {data['keywords']}")
print(f"Регион: {data['site']}")
print(f"Найдено товаров (оценка): {data['total']}")

for product in data["products"]:
    print(
        f"  {product['asin']}: {product['title'][:60]} "
        f"— {product.get('price', 'N/A')}, "
        f"рейтинг {product.get('rating')}, отзывов {product.get('feedbacks')}"
    )

Поиск по каталогу через POST

Python — POST-поиск
import requests

SEARCH_URL = "https://bhapi.ru/amazon/api/v1/search"
TOKEN = "ВАШ_API_TOKEN"

body = {
    "keywords": "wireless headphones",
    "site": "com",
    "page": 1,
    "sort": "reviews",
    "max_items": 25,
}

response = requests.post(
    SEARCH_URL,
    json=body,
    headers={"X-API-Token": TOKEN},
    timeout=60,
)
payload = response.json()
print(f"Найдено: {payload['data']['count']} товаров на странице")

Примеры: cURL

Получить товар по URL

cURL
# GET: получение товара по URL (с указанием региона)
curl "https://bhapi.ru/amazon/api/v1/item/by-url?url=https://www.amazon.com/dp/B08LK8ZYJ1&site=com" \
  -H "X-API-Token: ВАШ_API_TOKEN"

# GET: получение товара по ASIN
curl "https://bhapi.ru/amazon/api/v1/item?id=B08HN37XC1&site=com" \
  -H "X-API-Token: ВАШ_API_TOKEN"

Поиск по каталогу

cURL
# Базовый поиск GET
curl "https://bhapi.ru/amazon/api/v1/search?q=ssd%20disk&site=com&apiToken=ВАШ_API_TOKEN"

# Страница 2 с сортировкой по лучшим продажам
curl "https://bhapi.ru/amazon/api/v1/search?q=wireless%20earbuds&page=2&sort=sales&apiToken=ВАШ_API_TOKEN"

# POST-вариант с фильтром max_items
curl -X POST "https://bhapi.ru/amazon/api/v1/search" \
  -H "Content-Type: application/json" \
  -H "X-API-Token: ВАШ_API_TOKEN" \
  -d '{"keywords":"gaming mouse","site":"com","sort":"price_asc","max_items":20}'

Поиск в других регионах

cURL
# Amazon UK
curl "https://bhapi.ru/amazon/api/v1/search?q=ssd%20disk&site=uk&apiToken=ВАШ_API_TOKEN"

# Amazon DE (Германия)
curl "https://bhapi.ru/amazon/api/v1/search?q=ssd%20festplatte&site=de&apiToken=ВАШ_API_TOKEN"

# Amazon JP (Япония)
curl "https://bhapi.ru/amazon/api/v1/search?q=SSD&site=jp&apiToken=ВАШ_API_TOKEN"

Примеры: JavaScript

Fetch API (браузер / Node.js 18+)

JavaScript
const TOKEN = "ВАШ_API_TOKEN";
const BASE_URL = "https://bhapi.ru";

async function getAmazonItem(productUrl, site = "com") {
  const params = new URLSearchParams({ url: productUrl, site });

  const response = await fetch(`${BASE_URL}/amazon/api/v1/item/by-url?${params}`, {
    method: "GET",
    headers: { "X-API-Token": TOKEN },
  });

  const payload = await response.json();

  if (payload.status === "ok" && payload.data.code === 200) {
    return payload.data.data;
  }

  console.error("Ошибка Amazon:", payload);
  return null;
}

getAmazonItem("https://www.amazon.com/dp/B08LK8ZYJ1")
  .then((item) => {
    if (!item) return;
    console.log("Название:", item.title);
    console.log("ASIN:", item.asin);
    console.log("Цена:", item.price_info.sale_price, item.currency);
    console.log("Рейтинг:", item.review_info.rating_star,
                `(${item.review_info.review_count} отзывов)`);
  });

Поиск (POST)

JavaScript — поиск
async function searchAmazon(keywords, site = "com") {
  const response = await fetch(`${BASE_URL}/amazon/api/v1/search`, {
    method: "POST",
    headers: {
      "Content-Type": "application/json",
      "X-API-Token": TOKEN,
    },
    body: JSON.stringify({ keywords, site, max_items: 50 }),
  });

  const payload = await response.json();
  console.log(`Найдено: ${payload.data.total} товаров`);
  return payload.data.products;
}

searchAmazon("wireless keyboard", "com")
  .then((products) => {
    products.forEach((p) => {
      console.log(`${p.asin}: ${p.title} — ${p.price}`);
    });
  });

Примеры: PHP

Получить товар по URL (PHP + cURL)

PHP
<?php

$apiUrl = "https://bhapi.ru/amazon/api/v1/item/by-url";
$token  = "ВАШ_API_TOKEN";

$productUrl = "https://www.amazon.com/dp/B08LK8ZYJ1";

$ch = curl_init();
curl_setopt_array($ch, [
    CURLOPT_URL            => $apiUrl . "?" . http_build_query([
        "url" => $productUrl,
        "site" => "com",
    ]),
    CURLOPT_HTTPHEADER     => ["X-API-Token: " . $token],
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_TIMEOUT        => 60,
]);

$response = curl_exec($ch);
curl_close($ch);

$payload = json_decode($response, true);

if ($payload["status"] === "ok" && $payload["data"]["code"] === 200) {
    $item = $payload["data"]["data"];
    echo "Товар: " . $item["title"] . PHP_EOL;
    echo "ASIN: " . $item["asin"] . PHP_EOL;
    echo "Цена: " . ($item["price_info"]["sale_price"] ?? "N/A") . " " . $item["currency"] . PHP_EOL;
} else {
    var_dump($payload);
}

Пакетная обработка (пример скрипта)

Ниже примеры Python‑скриптов для массового парсинга: синхронный batch (все результаты сразу) и асинхронный режим с отслеживанием прогресса.

Синхронный batch-парсинг

Используйте POST /amazon/api/v1/parse/batch для получения результатов сразу. Подходит для списков до 100 URL.

Python — batch
import requests

BATCH_URL = "https://bhapi.ru/amazon/api/v1/parse/batch"
TOKEN = "ВАШ_API_TOKEN"

urls = [
    "https://www.amazon.com/dp/B08LK8ZYJ1",
    "https://www.amazon.com/dp/B08GTYFC37",
    "https://www.amazon.com/dp/B0C5JQ68FY",
]

response = requests.post(
    BATCH_URL,
    json={"urls": urls, "site": "com"},
    headers={"X-API-Token": TOKEN},
    timeout=300,
)

results = response.json()["data"]
for r in results:
    if r["code"] == 200:
        item = r["data"]
        print(
            f"✓ {item['asin']}: {item['title'][:60]} — "
            f"{item.get('price_info', {}).get('sale_price', 'N/A')}"
        )
    else:
        err = r["data"]
        print(f"✗ {err.get('product_url', '?')} — {err.get('reason_type')}")

Асинхронные задачи

Для больших объёмов используйте асинхронный режим: создайте задачу через POST /amazon/api/v1/tasks/parse, отслеживайте прогресс через GET /amazon/api/v1/tasks/{task_id} и скачайте результат через GET /amazon/api/v1/tasks/{task_id}/result. См. полный пример в разделе «Асинхронные задачи» выше.

Поиск + парсинг найденных товаров

Классический сценарий: поиск по каталогу с последующим получением деталей.

Python — поиск + детали
import time
import requests

BASE_URL = "https://bhapi.ru"
TOKEN = "ВАШ_API_TOKEN"

def search(query: str, site: str = "com", page: int = 1):
    resp = requests.get(
        f"{BASE_URL}/amazon/api/v1/search",
        params={"q": query, "site": site, "page": page, "apiToken": TOKEN},
        timeout=60,
    )
    return resp.json()["data"]

def get_item(url: str, site: str = "com"):
    resp = requests.get(
        f"{BASE_URL}/amazon/api/v1/item/by-url",
        params={"url": url, "site": site},
        headers={"X-API-Token": TOKEN},
        timeout=60,
    )
    payload = resp.json()
    if payload["status"] == "ok" and payload["data"]["code"] == 200:
        return payload["data"]["data"]
    return None

data = search("wireless headphones", site="com", page=1)

items = []
for link in data["links"][:5]:
    print("Парсим:", link)
    item = get_item(link)
    if item:
        items.append(item)
        print(
            f"  ✓ {item['title'][:60]} — "
            f"{item.get('price_info', {}).get('sale_price', 'N/A')} "
            f"{item.get('currency', '')}"
        )
    else:
        print("  ✗ не удалось получить данные")
    time.sleep(2)

print(f"Всего подробно получено товаров: {len(items)}")
Совет. При пакетной обработке используйте таймаут не менее 150 секунд для массовых запросов. Для одиночных запросов достаточно 30–60 секунд.