Orders Endpoint
https://devserver.tw1.ru/api/orders/track
Integration Guide
На этой странице описан полный процесс интеграции двух endpoint'ов: POST /api/orders/track и POST /api/events/track. Здесь есть подготовка проекта, доменов и ключей, структуры запросов, примеры и диагностика ошибок.
Orders Endpoint
https://devserver.tw1.ru/api/orders/track
Events Endpoint
https://devserver.tw1.ru/api/events/track
Для обоих endpoint'ов отправляйте заголовки ниже.
Content-Type: application/json X-API-KEY: <your_api_key>
Домен проверяется по заголовку Origin и должен быть заранее добавлен в проект как активный.
Важно: если вы отправляете запрос не из браузера (например, серверным скриптом), передавайте заголовок Origin вручную, иначе API вернет 403 Invalid Origin header.
Endpoint: POST https://devserver.tw1.ru/api/orders/track
| Поле | Тип | Обязательно | Описание |
|---|---|---|---|
id |
string | Да | Уникальный ID заказа в рамках проекта (дубликаты отклоняются). |
total |
integer | Да | Сумма заказа целым числом в minor units. |
currency |
string | Нет | Код валюты ISO 4217. По умолчанию используется RUB. |
phone |
string | Нет | Телефон клиента. |
email |
Нет | Email клиента (валидный формат). | |
username |
string | Рекомендуется | Имя/логин клиента. |
products |
array | Нет | Массив товаров заказа. |
products[].name |
string | Да (если есть products) | Название товара. |
products[].price |
integer | Да (если есть products) | Цена единицы товара. |
products[].count |
integer | Да (если есть products) | Количество товара. |
products[].image |
url | Да (если есть products) | Полная ссылка на изображение товара. |
data |
array | Нет | Дополнительные данные заказа в формате массива объектов { name, value }. |
data[].name |
string | Да (если есть data) | Название дополнительного поля, например "Телефон". |
data[].value |
string | Да (если есть data) | Значение дополнительного поля, например "+998888214888". |
Пример fetch (браузер)
await fetch('https://devserver.tw1.ru/api/orders/track', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
'X-API-KEY': 'YOUR_API_KEY'
},
body: JSON.stringify({
id: 'order-100234',
total: 99000,
currency: 'RUB',
username: 'john_doe',
email: 'john@example.com',
phone: '+998901112233',
data: [
{ name: 'Имя', value: 'John Doe' },
{ name: 'Телефон', value: '+998901112233' }
],
products: [
{
name: 'Sneakers X',
price: 99000,
count: 1,
image: 'https://example.com/images/sneakers-x.jpg'
}
]
})
});
Пример cURL (сервер)
curl -X POST 'https://devserver.tw1.ru/api/orders/track' \\
-H 'Content-Type: application/json' \\
-H 'X-API-KEY: YOUR_API_KEY' \\
-H 'Origin: https://example.com' \\
-d '{
"id": "order-100234",
"total": 99000,
"currency": "RUB",
"username": "john_doe",
"email": "john@example.com",
"phone": "+998901112233",
"data": [
{ "name": "Имя", "value": "John Doe" },
{ "name": "Телефон", "value": "+998901112233" }
],
"products": [
{
"name": "Sneakers X",
"price": 99000,
"count": 1,
"image": "https://example.com/images/sneakers-x.jpg"
}
]
}'
Endpoint: POST https://devserver.tw1.ru/api/events/track
Событие принимается только если API key валиден, домен разрешен, event key существует в проекте и событие активно.
| Поле | Тип | Обязательно | Описание |
|---|---|---|---|
event |
string | Да | Ключ события из раздела Events (например: cfsdfsfds). |
data |
array | Да | Массив объектов, например [{"name":"Имя","value":"Ruslan Garapov"}]. |
Пример fetch (браузер)
await fetch('https://devserver.tw1.ru/api/events/track', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
'X-API-KEY': 'YOUR_API_KEY'
},
body: JSON.stringify({
event: 'cfsdfsfds',
data: [
{ name: 'Имя', value: 'Ruslan Garapov' },
{ name: 'Телефон', value: '+998888214888' }
]
})
});
Пример cURL (сервер)
curl -X POST 'https://devserver.tw1.ru/api/events/track' \\
-H 'Content-Type: application/json' \\
-H 'X-API-KEY: YOUR_API_KEY' \\
-H 'Origin: https://example.com' \\
-d '{
"event": "cfsdfsfds",
"data": [
{ "name": "Имя", "value": "Ruslan Garapov" },
{ "name": "Телефон", "value": "+998888214888" }
]
}'
Этот helper можно добавить в front-end код сайта для отправки orders/events из одного места.
const OR_API_BASE = 'https://devserver.tw1.ru';
const OR_API_KEY = 'YOUR_API_KEY';
async function sendOrder(payload) {
return sendToOrderReport('/api/orders/track', payload);
}
async function sendEvent(payload) {
return sendToOrderReport('/api/events/track', payload);
}
async function sendToOrderReport(path, payload) {
const res = await fetch(`${OR_API_BASE}${path}`, {
method: 'POST',
headers: {
'Content-Type': 'application/json',
'X-API-KEY': OR_API_KEY
},
body: JSON.stringify(payload)
});
const body = await res.json().catch(() => ({}));
if (!res.ok) {
throw new Error(`OrderReport API error: ${res.status} ${body.message || 'Unknown error'}`);
}
return body;
}
// Example:
// await sendOrder({
// id: 'order-1',
// total: 50000,
// currency: 'RUB',
// username: 'user_1',
// email: 'user1@example.com',
// phone: '+998901112233',
// data: [
// { name: 'Имя', value: 'User One' },
// { name: 'Телефон', value: '+998901112233' }
// ],
// products: [
// {
// name: 'T-Shirt Basic',
// price: 20000,
// count: 1,
// image: 'https://example.com/images/tshirt-basic.jpg'
// },
// {
// name: 'Cap Black',
// price: 30000,
// count: 1,
// image: 'https://example.com/images/cap-black.jpg'
// }
// ]
// });
// await sendEvent({
// event: 'cfsdfsfds',
// data: [
// { name: 'Имя', value: 'Ruslan Garapov' },
// { name: 'Телефон', value: '+998888214888' }
// ]
// });
| HTTP код | message | Причина | Что делать |
|---|---|---|---|
| 401 | API key missing / Invalid API key | Нет API key или он неверный/неактивный. | Проверьте X-API-KEY и статус ключа. |
| 403 | Invalid Origin header / Domain not allowed | Нет Origin или домен не привязан к проекту. | Добавьте домен в проект и включите его. |
| 401 | Invalid event key / Event is not active | Неверный ключ события или событие выключено. | Проверьте поле event и активность события. |
| 422 | Validation error / Invalid data payload | Неверная структура запроса. | Сверьте payload с таблицей полей. |
| 402 | Monthly order limit reached for this account. | Достигнут лимит заказов текущего тарифа. | Обновите тариф или дождитесь нового периода. |