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/item | POST-вариант товара по ASIN. |
GET | /amazon/api/v1/search | Поиск по каталогу Amazon. |
POST | /amazon/api/v1/search | POST-вариант поиска, включая 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}/result | JSON-результат завершённой задачи. |
amazon_api также сохраняет устаревший
алиас POST /v1/parse/single. На портале для этого сценария используйте
GET /amazon/api/v1/item/by-url.
Amazon: получить товар по URL
/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 -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
{
"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
}
Amazon: получить товар по ASIN
/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 -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‑вариант
/amazon/api/v1/item
Принимает JSON-тело с идентификатором товара и регионом.
| Поле | Тип | Обязательное | Описание |
|---|---|---|---|
id |
string | да | ASIN товара: B08HN37XC1. |
site |
string | нет | Регион Amazon, по умолчанию com. |
Пример POST-запроса
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: поиск по каталогу
/amazon/api/v1/search
Поиск по каталогу Amazon с возможностью выбора региона и сортировки.
Параметры запроса
| Параметр | Тип | Обязательный | Описание |
|---|---|---|---|
q |
string | да | Поисковый запрос (строка). |
site |
string | нет | Регион Amazon, по умолчанию com. |
page |
integer | нет | Номер страницы, по умолчанию 1. |
sort |
string | нет | Сортировка: default, sales/best_sellers, price_asc, price_desc, reviews, newest. |
Структура ответа
| Поле | Описание |
|---|---|
keywords | Исходный поисковый запрос. |
site | Регион поиска. |
currency | Валюта, которую вернул внешний сервис Amazon API. |
page | Номер страницы. |
total | Оценочное число товаров по запросу (может варьироваться). |
links | Массив URL детальных карточек товаров. |
count | Количество ссылок в links. |
products | Список объектов с краткой информацией по каждому товару. |
Пример ответа
{
"status": "ok",
"data": {
"keywords": "ssd disk",
"site": "com",
"currency": "USD",
"page": 1,
"total": 442,
"count": 16,
"links": [
"https://www.amazon.com/SanDisk-1TB-Portable-SSD/dp/B0C5JQ68FY/...",
"https://www.amazon.com/SAMSUNG-Portable-SSD-1TB/dp/B08GTYFC37/...",
"... другие ссылки ..."
],
"products": [
{
"asin": "B0C5JQ68FY",
"link": "https://www.amazon.com/SanDisk-1TB-Portable-SSD/dp/B0C5JQ68FY/...",
"title": "SanDisk 1TB Portable SSD",
"price": "79.99",
"rating": "4.6",
"feedbacks": 5841
},
{
"asin": "B08GTYFC37",
"link": "https://www.amazon.com/SAMSUNG-Portable-SSD-1TB/dp/B08GTYFC37/...",
"title": "SAMSUNG T7 Portable SSD 1TB",
"price": "89.99",
"rating": "4.8",
"feedbacks": 12450
}
// ... остальные товары ...
]
},
"saved_path": null
}
POST‑вариант
/amazon/api/v1/search
JSON-вариант поиска, совместимый с внешним сервисом Amazon API по основным полям.
| Поле | Тип | Обязательное | Описание |
|---|---|---|---|
keywords |
string | да | Поисковый запрос. |
site |
string | нет | Регион Amazon, по умолчанию com. |
page |
integer | нет | Номер страницы, по умолчанию 1. |
sort |
string | нет | Сортировка: default, sales/best_sellers, price_asc, price_desc, reviews, newest. |
max_items |
integer | null | нет | Максимум товаров в ответе (≤ 500). |
Пример POST-запроса
curl -X POST "https://bhapi.ru/amazon/api/v1/search" \
-H "Content-Type: application/json" \
-H "X-API-Token: ВАШ_API_TOKEN" \
-d '{"keywords":"ssd disk","site":"com","page":1,"sort":"reviews","max_items":50}'
Amazon: пакетный парсинг (до 100 URL)
/amazon/api/v1/parse/batch
Массовый парсинг товаров Amazon — до 100 URL за один запрос. Результаты возвращаются массивом в том же порядке, что и входной список URL.
Параметры запроса
| Поле | Тип | Обязательное | Описание |
|---|---|---|---|
urls |
string[] | да | Список URL товаров Amazon (минимум 1, до 100). Каждый URL должен содержать /dp/<ASIN>. |
site |
string | нет | Регион Amazon, по умолчанию com. |
Пример запроса
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"
}'
Пример ответа
{
"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
}
429
для ссылок сверх лимита, остальные обрабатываются штатно. Рекомендуется делать паузу 2–3 секунды между
батч-запросами.
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
/amazon/api/v1/tasks/parse
| Поле | Тип | Обязательное | Описание |
|---|---|---|---|
urls |
string[] | да | Список URL товаров Amazon (до 100). |
site |
string | нет | Регион Amazon, по умолчанию com. |
Создание задачи из файла
/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 -X POST "https://bhapi.ru/amazon/api/v1/tasks/parse/file?site=com" \
-H "X-API-Token: ВАШ_API_TOKEN" \
-F "urls_file=@urls.txt"
Статус задачи
/amazon/api/v1/tasks/{task_id}
Возвращает текущий статус задачи и прогресс выполнения.
| Поле ответа | Тип | Описание |
|---|---|---|
task_id | string | Идентификатор задачи. |
status | string | pending | running | completed | failed. |
total | integer | Всего URL в задаче. |
done | integer | Обработано URL. |
percent | float | Процент выполнения (0–100). |
created_at | string | null | Время создания задачи (ISO). |
error | string | null | Сообщение об ошибке (для failed). |
Результат задачи
/amazon/api/v1/tasks/{task_id}/result
Скачивает JSON-результат завершённой задачи. Для выполняющихся задач возвращает статус 202.
Пример: полный цикл задачи
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
Парсер Amazon возвращает данные в двух уровнях: внешний уровень портала BHAPI и внутренний уровень самого парсера.
| Поле | Тип | Описание |
|---|---|---|
status |
string | Статус верхнего уровня портала: обычно "ok" или "error". |
data |
object | Полезная нагрузка. Для одиночного товара содержит поля code, msg, data. |
saved_path |
string | null | Если парсер сохраняет результат на диск, здесь может быть путь к файлу (чаще null). |
Во внутреннем объекте data для одиночного товара структура такая:
| Поле | Тип | Описание |
|---|---|---|
code | integer | Код результата парсера (200 — успех, другие — ошибки на стороне Amazon/парсера). |
msg | string | Текстовое описание результата ("success" или сообщение об ошибке). |
data | object | Карточка товара Amazon (см. раздел «Карточка товара» ниже). При ошибке — объект с полями error и reason_type. |
Карточка товара Amazon
Ниже приведена структура объекта data для одиночного товара. Формат совместим с TMAPI.
| Поле | Тип | Описание |
|---|---|---|
item_id | string | ASIN товара Amazon, одновременно является идентификатором. |
asin | string | Дублирует item_id — ASIN товара. |
title | string | Название товара. |
currency | string | Код валюты: USD, EUR, GBP, JPY и т.д. |
brand | string | Бренд товара (может быть пустым). |
price_info | object | Цены: sale_price (текущая), origin_price (исходная, может отсутствовать). |
main_imgs | string[] | Массив URL основных изображений товара. |
main_videos | string[] | Видео товара (обычно пустой массив). |
category_path | object[] | Цепочка категорий: массив объектов {"name": "...", "url": "..."}. |
sold_count | string | Количество продаж (часто пустая строка — Amazon не показывает это явно). |
product_props | object[] | Характеристики товара: массив объектов {"name": "...", "value": "..."}. |
shop_info | object | Информация о продавце (см. ниже). |
delivery_info | object | Информация о доставке: поле message. |
review_info | object | Информация об отзывах: rating_star и review_count. |
highlights | string[] | Ключевые особенности товара (маркированный список из карточки). |
desc | string | Текстовое описание товара. |
sku_props | object[] | Варианты товара: массив объектов {"name": "...", "values": ["...", "..."]}. |
skus | object[] | Детальные SKU (часто пустой массив). |
ShopInfo — информация о продавце
| Поле | Тип | Описание |
|---|---|---|
shop_name | string | Отображаемое название магазина/бренда. |
shop_url | string | URL страницы магазина на Amazon. |
Структура результата поиска
Объект data в ответе на /amazon/api/v1/search детализированно описан ниже.
| Поле | Тип | Описание |
|---|---|---|
keywords | string | Исходный поисковый запрос. |
site | string | Регион поиска. |
currency | string | Валюта ответа внешнего сервиса, обычно USD. |
page | integer | Номер текущей страницы. |
total | integer | Оценочное число товаров (может варьироваться между запросами). |
links | string[] | Массив URL карточек товаров на текущей странице. |
count | integer | Количество элементов в массиве links. |
products | object[] | Массив кратких описаний товаров. |
Элемент products[i]
| Поле | Тип | Описание |
|---|---|---|
asin | string | ASIN товара Amazon. |
link | string | URL детальной карточки товара. |
title | string | Краткое название товара. |
price | string | null | Текущая цена (может быть null). |
rating | string | null | Рейтинг по отзывам (текстовый). |
feedbacks | integer | 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_404 | Amazon вернул 404 — товар не найден. |
http_5xx | Amazon вернул ошибку сервера — временный сбой. |
captcha | Amazon запросил капчу — сессия заблокирована. |
rate_limit | Превышен лимит запросов к Amazon. |
network | Сетевая ошибка (таймаут, разрыв соединения). |
auth | Проблема с авторизацией на Amazon. |
parse | Ошибка парсинга HTML — изменилась вёрстка. |
invalid_url | Некорректный URL или не удалось извлечь ASIN. |
unknown | Неизвестная ошибка. |
Лимиты и квоты
Парсер Amazon использует общую систему лимитов портала BHAPI. У каждого токена есть дневной и общий лимит, а также защита от слишком частых запросов.
| Тип лимита | Описание | Сброс / поведение |
|---|---|---|
| Дневной лимит | Максимальное количество запросов к парсеру Amazon в сутки. | Сбрасывается ежедневно по UTC. После исчерпания возвращается ошибка 429. |
| Общий лимит | Суммарное количество запросов за всё время жизни токена. | Не сбрасывается. При достижении лимита необходимо создать новый токен или изменить тариф. |
| Rate limit | Защита от слишком частых запросов подряд (ограничение скорости). | Рекомендуется делать паузу 1–2 секунды между запросами, особенно при массовом парсинге. |
Примеры: Python
Получить один товар по URL
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)
Поиск по каталогу и вывод топа
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
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
# 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"
Поиск по каталогу
# Базовый поиск 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}'
Поиск в других регионах
# 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+)
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)
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
$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.
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.
См. полный пример в разделе «Асинхронные задачи» выше.
Поиск + парсинг найденных товаров
Классический сценарий: поиск по каталогу с последующим получением деталей.
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)}")