Цена и наличие товара по ссылке — одним запросом
Передайте ссылку на страницу товара любого интернет-магазина — получите цену, валюту, наличие и название в JSON. Без парсеров под каждый сайт, без прокси и капчи на вашей стороне.
$ curl -G https://priceapi.ru/v1/price \ -H "Authorization: Bearer pa_••••" \ --data-urlencode "url=https://shop.example.ru/product/12345" { "price": 12990.00, "currency": "RUB", "in_stock": true, "title": "Смартфон …", "source": "jsonld", "checked_at": "2026-10-31T20:15:04Z", "cached": false }
Как это работает
Загружаем страницу
Страница открывается настоящим браузером — так, как её видит покупатель, с ценами, которые рисует JavaScript.
Находим цену
Сначала разметка schema.org, microdata и meta-теги. Нет разметки — цену читает модель компьютерного зрения по скриншоту, и ответ сверяется с текстом страницы.
Отдаём JSON
Цена, валюта ISO 4217, наличие, название и источник. Свежий ответ по той же ссылке приходит мгновенно из кеша — вы сами задаёте допустимый возраст.
Любые магазины
Маркетплейсы, сети электроники, небольшие магазины на CMS — одна ссылка, один формат ответа.
Платите за результат
В лимит тарифа засчитываются только ответы с ценой или с «нет в наличии». Ошибки и ожидание — бесплатно.
Статистика
Запросы по дням, журнал ответов и остаток лимита в кабинете и в /v1/account.
Несколько ключей
Отдельный ключ на каждый проект или сервер, отзыв ключа в один клик.
Тарифы
Оплата помесячно картой или через СБП, автопродление можно отключить в любой момент. Неиспользованные запросы на следующий месяц не переносятся.
- 5 000 ответов в месяц
- до 30 запросов в минуту
- до 3 ключей API
- статистика и журнал запросов
- 50 000 ответов в месяц
- до 120 запросов в минуту
- до 10 ключей API
- статистика и журнал запросов
- 250 000 ответов в месяц
- до 600 запросов в минуту
- до 50 ключей API
- статистика и журнал запросов
Нужно больше запросов или постоплата по договору для юрлица — напишите нам, подберём условия.
Примеры
curl -G "https://priceapi.ru/v1/price" \ -H "Authorization: Bearer pa_ваш_ключ" \ --data-urlencode "url=https://shop.example.ru/product/12345"
import time
import requests
def get_price(url):
while True:
r = requests.get("https://priceapi.ru/v1/price",
params={"url": url},
headers={"Authorization": "Bearer pa_ваш_ключ"},
timeout=130)
if r.status_code == 202: # страница ещё загружается
time.sleep(int(r.headers.get("Retry-After", 10)))
continue
return r.status_code, r.json()
status, data = get_price("https://shop.example.ru/product/12345")
if status == 200:
print(data["price"], data["currency"], data["in_stock"])
else:
print(data["error"]["code"], data["error"]["message"])// Node.js 18+ или браузер (ключ не стоит отдавать в браузер пользователям)
async function getPrice(url) {
const api = new URL("https://priceapi.ru/v1/price");
api.searchParams.set("url", url);
for (;;) {
const r = await fetch(api, { headers: { Authorization: "Bearer pa_ваш_ключ" } });
if (r.status === 202) {
await new Promise(ok => setTimeout(ok, 10_000));
continue;
}
return { status: r.status, data: await r.json() };
}
}
const { status, data } = await getPrice("https://shop.example.ru/product/12345");
console.log(status, data.price, data.currency, data.in_stock);<?php
function getPrice(string $url): array {
$api = "https://priceapi.ru/v1/price?" . http_build_query(["url" => $url]);
do {
$ch = curl_init($api);
curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_TIMEOUT => 130,
CURLOPT_HTTPHEADER => ["Authorization: Bearer pa_ваш_ключ"],
]);
$body = curl_exec($ch);
$status = curl_getinfo($ch, CURLINFO_RESPONSE_CODE);
curl_close($ch);
if ($status == 202) sleep(10);
} while ($status == 202);
return [$status, json_decode($body, true)];
}
[$status, $data] = getPrice("https://shop.example.ru/product/12345");
if ($status == 200) echo $data["price"], " ", $data["currency"];using System.Net.Http.Headers;
using System.Net.Http.Json;
using System.Text.Json;
var http = new HttpClient { Timeout = TimeSpan.FromSeconds(130) };
http.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", "pa_ваш_ключ");
var api = "https://priceapi.ru/v1/price?url=" + Uri.EscapeDataString("https://shop.example.ru/product/12345");
HttpResponseMessage r;
while ((r = await http.GetAsync(api)).StatusCode == System.Net.HttpStatusCode.Accepted)
await Task.Delay(TimeSpan.FromSeconds(10));
var data = await r.Content.ReadFromJsonAsync<JsonElement>();
if (r.IsSuccessStatusCode)
Console.WriteLine($"{data.GetProperty("price")} {data.GetProperty("currency")}");Ссылка = "https://shop.example.ru/product/12345";
Соединение = Новый HTTPСоединение("priceapi.ru", 443, , , , 130,
Новый ЗащищенноеСоединениеOpenSSL);
// wait=120: ждать загрузки страницы до двух минут
Запрос = Новый HTTPЗапрос("/v1/price?wait=120&url=" + КодироватьСтроку(Ссылка, СпособКодированияСтроки.КодировкаURL));
Запрос.Заголовки.Вставить("Authorization", "Bearer pa_ваш_ключ");
Ответ = Соединение.Получить(Запрос);
Чтение = Новый ЧтениеJSON;
Чтение.УстановитьСтроку(Ответ.ПолучитьТелоКакСтроку());
Данные = ПрочитатьJSON(Чтение);
Если Ответ.КодСостояния = 200 Тогда
Сообщить("Цена: " + Данные.price + " " + Данные.currency);
ИначеЕсли Ответ.КодСостояния = 202 Тогда
Сообщить("Страница ещё загружается, повторите запрос через минуту");
Иначе
Сообщить(Данные.error.message);
КонецЕсли;Вопросы
- Сколько ждать ответа?
- Если ссылку уже запрашивали недавно — мгновенно. Новая страница загружается обычно за 10–40 секунд; API ждёт до 60 секунд (параметр
wait, до 120), а если не успел — отвечает 202, и повторный запрос через несколько секунд вернёт результат. - Что если цену найти не удалось?
- Ответ 422 с кодом причины: страница не загрузилась, на странице нет цены, магазин показал защиту от ботов. Такие ответы в лимит не засчитываются.
- Есть ли бесплатный период?
- Нет, но тариф «Старт» стоит меньше тысячи рублей, а автопродление отключается в кабинете.
- Можно ли работать по договору со счётом?
- Да, для юридических лиц — напишите на почту внизу страницы.