REST API
REST API позволяет отправлять события в Metriox с любого языка программирования.
Базовый endpoint
POST https://api.metriox.com/v1/events
Аутентификация
Используйте Authorization заголовок с API ключом:
Authorization: Bearer YOUR_API_KEY
Получение API ключа
API ключ можно найти в настройках проекта в приложении Metriox.
Отправка события
Request
curl -X POST https://api.metriox.com/v1/events \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"event_name": "button_click",
"platform_user_id": "123456789",
"props": {
"button_name": "checkout",
"price": 299,
"currency": "RUB"
}
}'
Структура события
{
"event_name": "string", // Название события (обязательное)
"platform_user_id": "string", // ID пользователя в Telegram (обязательное)
"session_id": "string", // ID сессии (опционально)
"body": "string", // Текстовое содержимое (опционально)
"props": {
// Дополнительные свойства (опционально)
"key1": "value1",
"key2": 123,
"key3": true,
"key4": "2026-03-02T10:00:00Z"
}
}
Response
Успешная отправка (200 OK):
{
"event_id": "550e8400-e29b-41d4-a716-446655440000",
"status": "ok"
}
Ошибка (400 Bad Request):
{
"error": "Invalid event_name",
"details": "event_name is required"
}
Примеры
JavaScript/Node.js
const apiKey = "YOUR_API_KEY";
async function sendEvent(event) {
const response = await fetch("https://api.metriox.com/v1/events", {
method: "POST",
headers: {
Authorization: `Bearer ${apiKey}`,
"Content-Type": "application/json",
},
body: JSON.stringify(event),
});
const result = await response.json();
return result;
}
// Использование
sendEvent({
event_name: "purchase_completed",
platform_user_id: "123456789",
props: {
amount: 299,
currency: "RUB",
},
});
Python
import requests
import json
API_KEY = "YOUR_API_KEY"
url = "https://api.metriox.com/v1/events"
event = {
"event_name": "purchase_completed",
"platform_user_id": "123456789",
"props": {
"amount": 299,
"currency": "RUB"
}
}
headers = {
"Authorization": f"Bearer {API_KEY}",
"Content-Type": "application/json"
}
response = requests.post(url, json=event, headers=headers)
result = response.json()
print(result)
C#
using System.Net.Http;
using System.Text;
using Newtonsoft.Json;
var apiKey = "YOUR_API_KEY";
var client = new HttpClient();
var eventData = new
{
event_name = "purchase_completed",
platform_user_id = "123456789",
props = new
{
amount = 299,
currency = "RUB"
}
};
var json = JsonConvert.SerializeObject(eventData);
var content = new StringContent(json, Encoding.UTF8, "application/json");
client.DefaultRequestHeaders.Add("Authorization", $"Bearer {apiKey}");
var response = await client.PostAsync("https://api.metriox.com/v1/events", content);
var result = await response.Content.ReadAsStringAsync();
Console.WriteLine(result);
Ограничения
- Максимальный размер события: 10 KB
- Rate limit: 10,000 событий в минуту
- Timeout: 30 секунд
Коды ошибок
| Код | Описание | Решение |
|---|---|---|
| 200 | OK | Событие принято |
| 400 | Bad Request | Проверьте структуру события |
| 401 | Unauthorized | Неверный API ключ |
| 403 | Forbidden | Доступ запрещен |
| 429 | Too Many Requests | Превышен rate limit |
| 500 | Server Error | Попробуйте позже |
Лучшие практики
Батчинг (пакетная отправка)
При большом количестве событий отправляйте их пакетами для оптимизации:
async function sendEventsBatch(events) {
for (let i = 0; i < events.length; i += 100) {
const batch = events.slice(i, i + 100);
await Promise.all(batch.map((event) => sendEvent(event)));
}
}
Обработка ошибок
Всегда обрабатывайте ошибки и повторяйте отправку при необходимости:
async function sendEventWithRetry(event, maxRetries = 3) {
for (let attempt = 1; attempt <= maxRetries; attempt++) {
try {
return await sendEvent(event);
} catch (error) {
if (attempt === maxRetries) throw error;
await new Promise((resolve) => setTimeout(resolve, 1000 * Math.pow(2, attempt)));
}
}
}
Что дальше?
- SDK документация — более удобный способ
- События — как структурировать события
- Типы данных — какие типы использовать в props