API для разработчиков

Подключите расчёт ценовой позиции к своему сайту или CRM: передайте данные клиента — получите конкурентов, коридоры цен и ИЦП.

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

  1. Ваш сайт отправляет POST /api/v1/projects с данными клиента — в ответ приходит id замера.
  2. Ядро ищет конкурентов, собирает и сопоставляет цены — обычно 3–10 минут.
  3. Готовность узнаётся опросом GET /api/v1/projects/{id} (статус done) или вебхуком на ваш адрес.
  4. Результат — GET /api/v1/projects/{id}/result (JSON) или готовый HTML-отчёт.

Авторизация: заголовок X-API-Key: ваш_ключ (или Authorization: Bearer ваш_ключ). Ключ выдаёт администратор. Вызывайте API с сервера, а не из браузера — иначе ключ увидят посетители.

Базовый адрес: http://201-24-49-32.sslip.io

Методы

POST/api/v1/projects — создать замер
{
  "company": "Лингва-Центр",                 // обязательно
  "site": "lingva-center.ru",                // чтобы не считать клиента своим конкурентом
  "sphere": "языковая школа",                // обязательно: как клиента ищут в Яндексе
  "city": "Люберцы",                         // обязательно
  "metro": "Котельники",                     // станция метро или район
  "address": "Октябрьский пр-т, 10",
  "services": [                              // обязательно, 1–15 позиций
    {"name": "Английский для взрослых, группа", "price": 750, "unit": "за 1 академический час (45 мин)"},
    {"name": "Индивидуальное занятие", "price": 1800, "unit": "за 1 занятие", "duration": 60}
  ],
  "auto_confirm": true,      // true (по умолчанию) — конкуренты выбираются автоматически, сразу считаем
                             // false — остановиться на статусе review, вы подтверждаете список сами
  "max_competitors": 7,      // сколько лучших по поиску брать при auto_confirm (1–15)
  "webhook_url": "https://ваш-сайт.ru/radar-hook",   // куда сообщить о готовности
  "external_id": "deal-1234" // ваш идентификатор — вернётся в ответах и вебхуке
}

Единица unit — свободный текст; типовые: за 1 занятие, за 1 академический час (45 мин), за 1 час, за месяц, за услугу, за курс, за 1 посещение, за 1 м².

Ответ 201: объект замера (как в методе ниже) со статусом preparing или measuring.

GET/api/v1/projects/{id} — статус замера

Статусы: preparing (ищем конкурентов) → review (ждём подтверждения, только при auto_confirm: false) → measuring → done. При сбое — error и поле error. В статусах review/done есть список competitors.

POST/api/v1/projects/{id}/confirm — подтвердить конкурентов и запустить замер
{"enabled": ["lingva-lub.ru", "smartkids.ru"],   // оставить только эти (необязательно)
 "add": ["https://new-school.ru/ceny"]}           // добавить своих (необязательно)
POST/api/v1/projects/{id}/measure — повторный замер

Тот же список конкурентов, новые цены. В результате появятся events — кто и на сколько изменил цену.

GET/api/v1/projects/{id}/result — результат в JSON
{
  "id": "lingva-centr-3f9a1c2b7d10", "status": "done", "measured_at": "2026-10-08_141303",
  "icp": 104.2,                     // индекс ценовой позиции: 100 = в медиане рынка
  "icp_positions": 3,               // по скольким позициям посчитан
  "coverage": {"cells": 18, "matched": 11, "collected_pct": 67},
  "positions": [{
    "id": "s1", "name": "Английский для взрослых, группа", "unit": "за 1 академический час (45 мин)",
    "our_price": 750, "market": {"min": 400, "median": 720, "max": 900, "n": 4},
    "ratio_to_median_pct": 104.2, "percentile": 63, "in_index": true,
    "competitors": [{"name": "English Center", "domain": "engcenter.ru", "price": 750,
                     "confidence": "high", "calculation": "750 ₽ за ак. час — указано прямо",
                     "source_url": "https://engcenter.ru/price"}],
    "not_priced": [{"name": "Premium Studio", "status": "hidden", "reason": ""}]
  }],
  "events": [{"type": "down", "name": "English Center", "position": "...", "old": 900, "new": 800, "delta_pct": -11.1}],
  "report_url": "http://201-24-49-32.sslip.io/p/.../report"
}
GET/api/v1/projects/{id}/report — готовый HTML-отчёт (с ключом API)
GET/api/v1/projects — список ваших замеров
GET/api/v1/health — проверка, что ядро живо (без ключа)

Вебхук

Если указан webhook_url, ядро отправит туда POST с JSON на каждом этапе: measure.review (список конкурентов готов), measure.done (в теле — весь result), measure.error.

{"event": "measure.done", "id": "...", "status": "done", "external_id": "deal-1234",
 "status_url": "...", "report_url": "...", "result": { ... как в /result ... }}

Чтобы убедиться, что запрос пришёл от ядра, проверяйте заголовок X-Radar-Secret — он равен секрету, который задаёт администратор.

Примеры

curl

curl -X POST http://201-24-49-32.sslip.io/api/v1/projects \
  -H "X-API-Key: ВАШ_КЛЮЧ" -H "Content-Type: application/json" \
  -d '{"company":"Лингва-Центр","sphere":"языковая школа","city":"Люберцы","metro":"Котельники",
       "services":[{"name":"Английский для взрослых, группа","price":750,"unit":"за 1 академический час (45 мин)"}]}'

curl -H "X-API-Key: ВАШ_КЛЮЧ" http://201-24-49-32.sslip.io/api/v1/projects/ID/result

Python

import requests, time
H = {"X-API-Key": "ВАШ_КЛЮЧ"}
p = requests.post("http://201-24-49-32.sslip.io/api/v1/projects", headers=H, json={...}).json()
while p["status"] not in ("done", "error"):
    time.sleep(15)
    p = requests.get(p["links"]["self"], headers=H).json()
print(requests.get(p["links"]["result"], headers=H).json()["icp"])

PHP (например, сайт на Битрикс или WordPress)

$ch = curl_init("http://201-24-49-32.sslip.io/api/v1/projects");
curl_setopt_array($ch, [CURLOPT_POST => true, CURLOPT_RETURNTRANSFER => true,
  CURLOPT_HTTPHEADER => ["X-API-Key: ВАШ_КЛЮЧ", "Content-Type: application/json"],
  CURLOPT_POSTFIELDS => json_encode($data, JSON_UNESCAPED_UNICODE)]);
$project = json_decode(curl_exec($ch), true);   // $project["id"]

Коды ошибок: 401 — нет/неверный ключ; 404 — замер не найден или не ваш; 409 — ещё не готово или уже идёт; 422 — ошибка в данных (список в message); 429 — дневной лимит.