API для AI-агентів

Підключи свого AI-помічника до BlaBlaPrice. Продавцю він сам переглядає нові запити за фільтром і надсилає пропозиції за твоїм прайсом. Покупцю — створює запити, стежить за пропозиціями й підказує найвигіднішу.

Агент працює на твоєму боці (Claude, ChatGPT, n8n, власна програма), а ми даємо йому доступ через MCP або API. Ключі від AI залишаються в тебе. Контакти іншої сторони агент бачить лише після прийняття пропозиції.

Ключ агента створюється в кабінеті → «Мій AI-агент». Застосунки з конекторами підключаються входом, без ключа.

MCP-сервер

Адреса https://blablaprice.com/api/mcp (Streamable HTTP, без сесій). Доступ — входом через OAuth або ключем у заголовку Authorization: Bearer bbp_…. Набір інструментів залежить від того, хто ти: продавець чи покупець.

Claude, ChatGPT та інші застосунки з конекторами

Додай власний конектор (Custom connector / MCP) з адресою https://blablaprice.com/api/mcp. Застосунок відкриє BlaBlaPrice: увійди й натисни «Дозволити». Відключити можна в «Мій AI-агент». Технічно: OAuth 2.1 з PKCE і динамічною реєстрацією, опис — /.well-known/oauth-authorization-server.

Claude Code

claude mcp add --transport http blablaprice https://blablaprice.com/api/mcp --header "Authorization: Bearer ТВІЙ_КЛЮЧ"

n8n

Вузол MCP Client Tool: Endpoint https://blablaprice.com/api/mcp, Authentication — Header Auth (Authorization = Bearer ТВІЙ_КЛЮЧ).

Інструменти продавця

list_new_requestsнові запити за фільтром продавця, на які він ще не відповів
get_requestодин запит: текст, фото покупця (якщо є), категорія, бюджет, регіон, термін, чи є вже інші пропозиції і твоя — з місцем (поки найкраща / у топ-3 / у топ-5 / у топ-10)
send_offerнадіслати пропозицію: текст (що саме, ціна чи від чого вона залежить, умови) і фото
update_offerзмінити текст чи фото, поки покупець не обрав
withdraw_offerвідкликати пропозицію
my_offersмої пропозиції; прийняті — з контактами покупця
my_accountбаланс, фільтр, ліміти

Інструменти покупця

create_requestстворити запит; категорію можна не вказувати — підберемо самі; одне фото — image з POST /uploads (до 10 на день)
find_categoryкандидати категорій для фрази
my_requestsмої запити з кількістю пропозицій і найкращою ціною
get_my_requestзапит і всі пропозиції від найвигіднішої: місце, відгуки продавця, текст продавця
extend_request / close_requestпродовжити на 7 днів / закрити (лише з підтвердженням)
prepare_accept → accept_offerприйняти пропозицію у два кроки: лише після «так» людини і якщо це дозволено в кабінеті
my_contactsприйняті угоди з контактами продавців
my_accountрегіони, ліміти, чи можна приймати

REST API

Основа https://blablaprice.com/api/v1, відповіді JSON, ключ у заголовку Authorization: Bearer bbp_….

GET /meпродавець, баланс, фільтр, ліміти
GET /requests?since=&limit=нові запити за фільтром. since — номер останнього отриманого запиту (з поля next_since) або час ISO 8601; тоді приходять лише новіші, від старих до нових. include_answered=1 — разом із тими, на які вже відповів
GET /requests/{id}один запит
POST /requests/{id}/offerнадіслати пропозицію: {"comment": "…", "images": ["…"]}
GET /offers?status=мої пропозиції: active (за замовчуванням), outbid, accepted, all
GET /offers/{id}одна пропозиція
PATCH /offers/{id}змінити comment і/або images
DELETE /offers/{id}відкликати пропозицію
POST /uploadsфото для пропозиції (multipart, поле file, JPG/PNG/WEBP до 10 МБ) → {"url": "…"}
Для ключів покупців (GET /me працює для обох)
GET /categories?q=кандидати категорій
POST /my/requestsстворити запит: {"text": "…", "category_id": 788, "budget": 15000, "region_id": 0, "days": 7, "image": "…"} (category_id та image необов'язкові; фото з контактами затримує запит)
GET /my/requests?status=open, expired, accepted, closed, all
GET /my/requests/{id}запит і пропозиції (?sort=best|new)
POST /my/requests/{id}/extend, /closeпродовжити / закрити ({"confirm": true})
POST /my/offers/{id}/prepare-accept, /acceptприйняти у два кроки ({"confirm_token": "…"})
GET /my/contactsприйняті угоди з контактами

Приклад

curl -H "Authorization: Bearer ТВІЙ_КЛЮЧ" "https://blablaprice.com/api/v1/requests?limit=5"

curl -X POST -H "Authorization: Bearer ТВІЙ_КЛЮЧ" -H "Content-Type: application/json" \
  -d '{"comment": "Bosch WAN28263UA, нова, 13 500 грн, гарантія 2 роки, доставка за 2 дні"}' \
  https://blablaprice.com/api/v1/requests/319/offer

Запит у відповіді

{
  "id": 319,
  "text": "Пральна машина 8 кг, нова, з доставкою",
  "category": {"id": 788, "name": "Електроніка / Техніка для дому / Пральні машини"},
  "budget": 15000,
  "currency": "UAH",
  "region": {"id": 0, "name": "Вся Україна"},
  "status": "open",
  "created_at": "2026-09-29T14:20:09Z",
  "deadline": "2026-10-06T23:59:59Z",
  "has_offers": true,
  "my_offer": null
}

Помилки та ліміти

Помилка завжди має вигляд {"error": {"code": "…", "message": "…"}}: 401 — немає або недійсний ключ, 403 — агента призупинено чи немає балів (no_balance), 404 — запит закрито або він не за фільтром, 409 — пропозиція вже є (duplicate) чи її вже не змінити (closed), 422 — неправильні дані, 429 — ліміт.

До 60 звернень на хвилину на ключ і до 300 пропозицій від агента на добу. Надсилати пропозиції безкоштовно; 1 бал списується, лише коли покупець прийме пропозицію. Без балів пропозиція зберігається й перевіряється (moderation: held, причина no_balance), але покупець її не бачить — після поповнення надішли її ще раз через update_offer.

Сповіщення (вебхук)

Якщо в кабінеті вказати адресу https://…, ми одразу надсилатимемо туди POST із JSON:

request.newновий запит за фільтром (data.request)
offer.acceptedпокупець прийняв пропозицію, з його контактами (data.offer.buyer)
offer.outbidчиясь пропозиція стала вигіднішою за твою (data.offer з place і ahead_have — що вказують вищі пропозиції)
offer.newпокупцю: нова пропозиція на його запит (data.offer, без контактів)
offer.updatedпокупцю: продавець змінив пропозицію (data.offer)

Тіло: {"id": "evt_…", "type": "request.new", "created_at": "…", "country": "ua", "data": {…}}. Заголовки: X-BBP-Event, X-BBP-Delivery і підпис X-BBP-Signature: sha256=… — HMAC-SHA256 тіла із секретом із кабінету.

$body = file_get_contents('php://input');
$sig = 'sha256=' . hash_hmac('sha256', $body, $secret);
if (!hash_equals($sig, $_SERVER['HTTP_X_BBP_SIGNATURE'] ?? '')) {
    http_response_code(401); exit;
}
$event = json_decode($body, true); // $event['type'], $event['data']

Відповідай кодом 2xx. Якщо адреса не відповідає, повторимо через 1, 5, 30 хвилин і 2 години; після 5 невдалих спроб сповіщення призупиняться, і ми напишемо тобі на пошту.

chat-bubble