Открыть dashboard

API v1 · Public beta

Создайте временный inbox, отправьте на него письмо и получите результат через REST API. Все запросы и ответы используют JSON, кроме скачивания MIME и вложений.

Beta сохраняет URL и контракт alpha. Опциональные поля и методы могут добавляться в v1; breaking changes требуют новой major-версии API или пакета.

Base URLhttps://api.tstly.ru

Быстрый старт

1. Выпустите API key

Войдите в dashboard, откройте «Ключи API» и сохраните secret: он показывается только один раз.

2. Создайте inbox

curl -X POST https://api.tstly.ru/v1/inboxes \
  -H "Authorization: Bearer $TSTLY_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"localPart":"signup","retentionSeconds":86400}'
201 Created
{
  "id": "019…",
  "tenantId": "019…",
  "localPart": "signup",
  "address": "signup@acme.tstly.ru",
  "retentionSeconds": 86400,
  "createdAt": "2026-08-01T12:00:00Z"
}

3. Отправьте письмо

Укажите возвращённый address как получателя в SMTP-клиенте вашего приложения.

Аутентификация

Передавайте API key как Bearer token. Ключ привязан к tenant и не даёт доступ к чужим inbox.

Authorization: Bearer $TSTLY_API_KEY
Не помещайте key в URL.

Храните его как secret CI/CD и отзывайте в dashboard, если он мог быть раскрыт.

Получение писем

Сначала получите текущий список, затем используйте latestCursor как afterCursor в long polling. Без cursor запрос ждёт первое доступное сообщение.

curl "https://api.tstly.ru/v1/inboxes/$INBOX_ID/messages/wait?timeoutSeconds=30" \
  -H "Authorization: Bearer $TSTLY_API_KEY"

Ответ 204 No Content означает, что за выбранные 30 секунд нового письма не появилось. Повторите запрос; это нормальный результат, не ошибка.

TypeScript SDK и CLI

Официальный ESM-пакет @tstly/sdk работает в Node.js 22.12+. Клиент типизирует inbox, сообщения, вложения, usage и webhooks, поддерживает AbortSignal, timeout и безопасный retry чтения с учётом Retry-After.

Beta artifacts

Версии 0.1.0 доступны как проверяемые tarball ниже. Публикация scope @tstly в npm registry ожидает внешней авторизации; обычная команда из registry пока не сработает.

curl -fLO https://tstly.ru/downloads/tstly-sdk-0.1.0.tgz
npm install ./tstly-sdk-0.1.0.tgz

import { Tstly } from "@tstly/sdk";

const tstly = new Tstly({ apiKey: process.env.TSTLY_API_KEY! });
const inbox = await tstly.inboxes.create({ retentionSeconds: 3600 });
const message = await tstly.messages.wait(inbox.id, {
  subject: "Confirm account",
  timeoutSeconds: 30,
});

CLI для CI

Передавайте ключ только через TSTLY_API_KEY. JSON-данные пишутся в stdout, диагностика — в stderr. Timeout ожидания завершает команду с кодом 3.

export TSTLY_API_KEY='…'
tstly inbox create --local-part ci --retention 3600
tstly message wait "$INBOX_ID" --subject "Confirm account" --timeout 30

Playwright и Cypress

Готовые адаптеры создают отдельный inbox на каждую попытку теста, изолируют параллельные workers и гарантируют cleanup. API key остаётся в Node-процессе и не передаётся странице или browser context.

Playwright fixture

curl -fLO https://tstly.ru/downloads/tstly-sdk-0.1.0.tgz
curl -fLO https://tstly.ru/downloads/tstly-playwright-0.1.0.tgz
npm install -D ./tstly-sdk-0.1.0.tgz ./tstly-playwright-0.1.0.tgz @playwright/test

import { test, expect } from "@tstly/playwright";
test("signup", async ({ page, tstly }) => {
  await page.getByLabel("Email").fill(tstly.inbox.address);
  expect(await tstly.wait({ subject: "Confirm account" })).not.toBeNull();
});

Cypress tasks

// cypress.config.ts — Node process
import { setupTstly } from "@tstly/cypress/node";
// support/e2e.ts — browser commands, no API key
import { installTstlyCommands } from "@tstly/cypress/commands";

При падении Playwright по умолчанию прикладывает только metadata. Режим artifactMode: "full" добавляет raw MIME и вложения — включайте его только для защищённых CI artifacts с ограниченным retention.

Webhooks

Подписка получает событие message.received как at-least-once доставку. Secret возвращается один раз. Проверяйте HMAC в X-Tstly-Signature, дедуплицируйте поX-Tstly-Event-Id и отвечайте 2xx.

curl -X POST https://api.tstly.ru/v1/webhooks \
  -H "Authorization: Bearer $TSTLY_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"url":"https://example.test/tstly","description":"CI events"}'

История delivery, ротация secret и ручной redelivery доступны в API и dashboard. Redirect и private-network targets отклоняются.

OpenAPI reference

Встроенный контракт

Интерфейс загружает операции из production OpenAPI. Машиночитаемый JSON доступен отдельно.

Скачать OpenAPI JSON
POST/v1/inboxes

Создать временный inbox

GET/v1/inboxes

Получить список inbox

GET/v1/inboxes/{id}

Получить inbox

PATCH/v1/inboxes/{id}

Изменить retention

DELETE/v1/inboxes/{id}

Удалить inbox

GET/v1/inboxes/{inboxId}/messages

Получить письма

GET/v1/inboxes/{inboxId}/messages/wait

Дождаться нового письма

GET/v1/inboxes/{inboxId}/messages/{messageId}

Получить письмо

GET/v1/inboxes/{inboxId}/messages/{messageId}/raw

Скачать raw MIME

Ошибки

Ошибка возвращается в едином JSON-формате с кодом, сообщением, request ID и ошибками полей.

{
  "code": "VALIDATION_ERROR",
  "message": "Request validation failed",
  "requestId": "…",
  "fieldErrors": []
}
400Некорректные параметры или JSON
401Key отсутствует, неверен или отозван
404Ресурс не найден в текущем tenant
409Конфликт состояния или лимит активных inbox
429Превышен rate/concurrency limit

Лимиты beta

Размер MIME10 MiB
Retention1 час — 7 дней
Активные inbox100 на tenant
Запросы API120/мин на key
Ожидания10 на tenant, до 30 сек.

Матрица совместимости

REST APIv1 beta · HTTPS/JSON
@tstly/sdk0.1.x · Node.js ≥22.12 · ESM
@tstly/playwright0.1.x · Playwright 1.50–1.x
@tstly/cypress0.1.x · Cypress 13–15
Beta artifactsSDK · Playwright · Cypress

Миграция alpha → beta

Смена base URL, API key и inbox address не требуется. Зафиксируйте пакеты на ^0.1.0, храните key только в Node/CI secret, обрабатывайте 204 long-poll timeout и 429с Retry-After. Для webhooks добавьте HMAC-проверку и идемпотентность event ID. HTML писем по-прежнему считается недоверенным содержимым.

Beta release notes

В beta входят quota/usage, cursor filters и long polling, подписанные webhooks, TypeScript SDK/CLI, Playwright и Cypress adapters, workspace roles/audit, operator abuse controls и external SMTP reliability monitoring.

Известные ограничения

Вход только через Яндекс; custom domains и IMAP отсутствуют; framework packages рассчитаны на Node.js ESM; webhook delivery at-least-once; npm scope ещё ожидает публикации, поэтому beta packages устанавливаются из versioned tarballs; сервис предназначен только для тестовых данных.

Безопасность, support и feedback

Не отправляйте реальные персональные или production-данные. Удаляйте inbox после теста и выбирайте минимальный retention. Уязвимости сообщайте приватно на security@tstly.ru, вопросы и feedback — на support@tstly.ru. Не прикладывайте API keys, raw MIME или содержимое писем.