Перейти к основному содержимому

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 секунд

Коды ошибок

КодОписаниеРешение
200OKСобытие принято
400Bad RequestПроверьте структуру события
401UnauthorizedНеверный API ключ
403ForbiddenДоступ запрещен
429Too Many RequestsПревышен rate limit
500Server 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)));
}
}
}

Что дальше?