Оновлюйте прайс зі своєї облікової системи та забирайте замовлення без ручної роботи. Токен — у кабінеті: Налаштування → Seller API.
Кожен запит — із заголовком Authorization: Bearer dx_…. Ліміт: 120 запитів на годину. Відповіді — JSON.
POST /api/v1/offers/batch — до 1000 позицій за запит. Позиції матчаться за артикулом+брендом і станом: існуючі оновлюються, нові створюються в межах ліміту тарифу. qty: 0 знімає позицію з продажу.
curl -X POST https://detalix.net/api/v1/offers/batch \
-H "Authorization: Bearer dx_ВАШ_ТОКЕН" \
-H "Content-Type: application/json" \
-d '{
"items": [
{ "article": "GDB1550", "brand": "TRW",
"name": "Колодки гальмівні передні",
"price_uah": 1490, "b2b_price_uah": 1290, "qty": 8,
"condition": "new", "delivery_days": 1 }
]
}'
// → { "created": 1, "updated": 0, "errors": [], "limitHit": false }GET /api/v1/orders?status=NEW — ваші замовлення (статуси: NEW, CONFIRMED, SHIPPED, DONE, CANCELLED; без параметра — всі, останні 100).
curl "https://detalix.net/api/v1/orders?status=NEW" \
-H "Authorization: Bearer dx_ВАШ_ТОКЕН"
// → { "orders": [ { "id": "…", "number": 12, "status": "NEW",
// "total_uah": 1490, "customer": { "name": "…", "phone": "…",
// "city": "Київ", "np_office": "12" },
// "items": [ { "article": "GDB1550", "qty": 1, … } ] } ] }POST /api/v1/orders/{id}/status. Дозволені переходи: NEW→CONFIRMED/CANCELLED, CONFIRMED→SHIPPED/CANCELLED, SHIPPED→DONE. Для SHIPPED передайте ttn.
curl -X POST https://detalix.net/api/v1/orders/ORDER_ID/status \
-H "Authorization: Bearer dx_ВАШ_ТОКЕН" \
-H "Content-Type: application/json" \
-d '{ "status": "SHIPPED", "ttn": "20450012345678" }'Щоб не опитувати замовлення за розкладом, увімкніть вебхук у кабінеті: Налаштування → Вебхуки. Ми надсилаємо POST з JSON на вашу адресу: order.created (нове замовлення) і order.status (зміна статусу).
Відповідайте 2xx. Якщо ні — повторимо шість разів зі зростаючою паузою (близько півгодини), кожна спроба видна в кабінеті. Тіло замовлення — як у GET /api/v1/orders, але суми в копійках: total_kop, price_kop замість total_uah, price_uah. Додатково є pay_method, pay_status і offer_id позицій; коментаря й назви деталі немає.
POST /ваш/шлях
x-detalix-event: order.created
x-detalix-delivery: <id доставки>
x-detalix-timestamp: 1790000000
x-detalix-signature: sha256=<підпис>
{ "event": "order.created", "sent_at": "…",
"order": { "id": "…", "number": 128, "status": "NEW", "total_kop": 149000,
"pay_method": "COD", "pay_status": null, "ttn": null,
"customer": { "name": "…", "phone": "…", "city": "…", "np_office": "…" },
"items": [ { "offer_id": "…", "article": "GDB1550", "brand": "TRW",
"qty": 1, "price_kop": 149000 } ] } }Підпис рахується на вашому секреті від рядка «мітка часу.тіло» — так само, як у Stripe. Перевіряйте його і відкидайте запити, старші за 5 хвилин: інакше перехоплений запит можна повторювати нескінченно.
// Node.js
const raw = await req.text(); // тіло БЕЗ переформатування
const ts = req.headers.get("x-detalix-timestamp") ?? "";
const mine = Buffer.from(crypto.createHmac("sha256", WHSEC).update(ts + "." + raw).digest("hex"));
const theirs = Buffer.from((req.headers.get("x-detalix-signature") ?? "").replace("sha256=", ""));
// timingSafeEqual падає на буферах різної довжини — спершу порівняйте довжину
const ok = mine.length === theirs.length && crypto.timingSafeEqual(mine, theirs);
if (!ok || Math.abs(Date.now() / 1000 - Number(ts)) > 300) return new Response("bad signature", { status: 400 });401 — невірний токен · 400 — невалідна схема · 404 — не ваше замовлення · 409 — недозволений перехід статусу · 429 — перевищено ліміт запитів. Тіло: { "error": "опис" }.