Цена и наличие товара по ссылке — одним запросом

Передайте ссылку на страницу товара любого интернет-магазина — получите цену, валюту, наличие и название в 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
}

Как это работает

1

Загружаем страницу

Страница открывается настоящим браузером — так, как её видит покупатель, с ценами, которые рисует JavaScript.

2

Находим цену

Сначала разметка schema.org, microdata и meta-теги. Нет разметки — цену читает модель компьютерного зрения по скриншоту, и ответ сверяется с текстом страницы.

3

Отдаём JSON

Цена, валюта ISO 4217, наличие, название и источник. Свежий ответ по той же ссылке приходит мгновенно из кеша — вы сами задаёте допустимый возраст.

Любые магазины

Маркетплейсы, сети электроники, небольшие магазины на CMS — одна ссылка, один формат ответа.

Платите за результат

В лимит тарифа засчитываются только ответы с ценой или с «нет в наличии». Ошибки и ожидание — бесплатно.

Статистика

Запросы по дням, журнал ответов и остаток лимита в кабинете и в /v1/account.

Несколько ключей

Отдельный ключ на каждый проект или сервер, отзыв ключа в один клик.

Тарифы

Оплата помесячно картой или через СБП, автопродление можно отключить в любой момент. Неиспользованные запросы на следующий месяц не переносятся.

Старт
990 ₽ / месяц
198 ₽ за 1000 ответов
  • 5 000 ответов в месяц
  • до 30 запросов в минуту
  • до 3 ключей API
  • статистика и журнал запросов
Выбрать
Про
14 900 ₽ / месяц
59.6 ₽ за 1000 ответов
  • 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 с кодом причины: страница не загрузилась, на странице нет цены, магазин показал защиту от ботов. Такие ответы в лимит не засчитываются.
Есть ли бесплатный период?
Нет, но тариф «Старт» стоит меньше тысячи рублей, а автопродление отключается в кабинете.
Можно ли работать по договору со счётом?
Да, для юридических лиц — напишите на почту внизу страницы.