Инструкция · Данные
События продукта через Events API
События продукта сообщают Sendalto, что люди делают в вашем продукте: зарегистрировались, начали пользоваться, пробный период заканчивается. Сценарии запускаются по событию и останавливаются, когда приходит целевое событие.
Сверено с Sendalto
1. Создайте серверный API-ключ
В разделе «Настройки → API и приватность» создайте ключ с правом events:write. Секрет начинается с snd_live_ и показывается один раз — сохраните его в хранилище секретов вашего сервера. Ключи создают владелец и администраторы после включения двухфакторного входа.
Ключ действует в пределах своих прав и перестаёт работать, если его отозвали или его создатель ушёл из пространства либо потерял право управлять API-ключами.
2. Отправьте событие
POST https://sendalto.com/api/events с заголовком Authorization: Bearer <ключ> и телом в JSON. Неизвестные поля отклоняются.
| Поле | Правила |
|---|---|
externalId | Обязательно. 1–200 символов. Ваш постоянный ID этого случая — по нему отбрасываются дубли. |
name | Обязательно. Начинается с буквы; до 100 латинских букв, цифр и знаков _ . : -, например trial_started. |
email | Обязательно. Адрес человека; по нему событие связывается с контактом. |
properties | Необязательный объект, до 32 КБ в JSON. |
occurredAt | Необязательное время ISO 8601 с часовым поясом, например 2026-10-06T09:30:00Z; не дальше 5 минут в будущем. По умолчанию — время получения. |
curl https://sendalto.com/api/events \
-H "Authorization: Bearer $SENDALTO_EVENTS_KEY" \
-H "Content-Type: application/json" \
-d '{
"externalId": "trial_started:user_8f2c1d",
"name": "trial_started",
"email": "[email protected]",
"properties": { "plan": "team", "seats": 5 },
"occurredAt": "2026-10-06T09:30:00Z"
}'// Server-side only (Node.js 18+). The key never reaches a browser.
export async function trackEvent({ externalId, name, email, properties = {}, occurredAt }) {
const response = await fetch('https://sendalto.com/api/events', {
method: 'POST',
headers: {
Authorization: `Bearer ${process.env.SENDALTO_EVENTS_KEY}`,
'Content-Type': 'application/json',
},
body: JSON.stringify({ externalId, name, email, properties, occurredAt }),
});
const result = await response.json();
if (response.ok) return result.data; // { id, duplicate }
// 429 and 5xx: retry later with the same externalId. Other errors need a fix.
throw Object.assign(new Error(result.error), { status: response.status, code: result.code });
}
await trackEvent({
externalId: `trial_started:${user.id}`,
name: 'trial_started',
email: user.email,
properties: { plan: user.plan },
});3. Ответы, повторы и лимиты
HTTP/1.1 201 Created
{ "data": { "id": "6c7e1d3a-…", "duplicate": false } }
HTTP/1.1 200 OK (same externalId sent again)
{ "data": { "id": "6c7e1d3a-…", "duplicate": true } }
HTTP/1.1 429 Too Many Requests
{ "error": "Event rate limit reached. Retry after one minute.", "code": "RATE_LIMIT" }- Защита от дублей. Тот же
externalIdс тем же названием, адресом и свойствами вернёт200с"duplicate": trueи ничего не изменит. Тот жеexternalIdдля другого события вернёт409 EVENT_ID_REUSED. Если запрос не дождался ответа или получил429либо5xx, повторите его с тем жеexternalId. - Лимит. 600 событий в минуту на пространство; сверх него —
429 RATE_LIMIT. Тело запроса — до 40 КБ. - Ошибки приходят в JSON с полями
error(понятное сообщение) иcode— они перечислены ниже.
| Код | HTTP | Что означает |
|---|---|---|
API_KEY_REQUIRED | 401 | Нет заголовка Authorization: Bearer <ключ>. |
API_KEY_INVALID | 401 | Это не ключ Sendalto (snd_live_…). |
BACKEND_KEY_ONLY | 403 | Запрос пришёл из браузера (в нём есть заголовок Origin). |
API_SCOPE | 403 | Ключ отозван, у него нет права events:write, или его создатель ушёл из пространства либо у него больше нет подтверждённого адреса. |
API_ISSUER | 403 | У создателя ключа больше нет роли, которой разрешено управлять API-ключами. |
KEY_REVOKED, KEY_PERMISSION_REVOKED | 403 | Ключ или доступ его создателя изменились, пока запрос обрабатывался. |
BODY_REQUIRED | 400 | У запроса нет тела. |
TOO_LARGE | 413 | Тело больше 40 КБ. |
VALIDATION | 400 / 422 | Тело не в формате JSON (400) или не соответствует полям выше (422). |
EVENT_TOO_LARGE | 422 | properties больше 32 КБ. |
EVENT_IN_FUTURE | 422 | occurredAt больше чем на 5 минут в будущем. |
EVENT_ID_REUSED | 409 | Этот externalId уже использован для другого события. |
RATE_LIMIT | 429 | Больше 600 событий за последнюю минуту. Повторите позже с тем же externalId. |
Что происходит с событием
- Оно сохраняется в пространстве и появляется в списке известных событий в конструкторе сценариев.
- Если есть контакт с таким адресом, для него запускаются активные сценарии с этим событием-триггером (с учётом правила повторного входа каждого сценария), а запуски, для которых это событие — цель, останавливаются.
- Подписки на вебхуки с этим названием события пересылают его на ваш адрес — см. Вебхуки.
- Событие не создаёт контакт и не даёт права писать. Согласие записывается у контактов.