Вебхук-автоматизации
Вебхуки требуют платный план. Basic: 1 вебхук, Pro: 3, Ultra: 10.
Вебхуки позволяют подключить TellDone к любому внешнему сервису. Когда ты создаешь голосовую заметку, TellDone обрабатывает ее и автоматически отправляет извлеченные данные - заметки, задачи, события и отчеты - на указанный тобой URL. Каждая задача и событие отправляются отдельной доставкой, чтобы твой инструмент автоматизации мог обрабатывать их по отдельности.
Что отправлять
У каждой автоматизации свои переключатели payload. Выбери один или любую комбинацию:
- Заметки - обработанная заметка целиком (заголовок, транскрипция, резюме, теги, язык)
- Аудио - на плане Ultra прикладывает к заметке ссылку на аудиофайл, действительную 24 часа
- Задачи - одна доставка на каждую извлеченную задачу
- События - одна доставка на каждое извлеченное событие календаря
- Отчеты - одна доставка на каждый сгенерированный ежедневный, еженедельный, ежемесячный или годовой отчет
Переключатели можно менять в любой момент в настройках автоматизации - изменения применяются только к новым событиям.
Настройка вебхука

- Зайди в Настройки > Интеграции > Webhook Automations
- Нажми Новая автоматизация

- Введи название (например, "Мой вебхук Zapier")
- Вставь URL вебхука из твоего сервиса автоматизации
- Выбери, какие данные отправлять: заметки, задачи, события, отчеты (или любую комбинацию)
- При необходимости добавь auth header - токен, который отправляется в заголовке
Authorizationдля защищенных эндпоинтов - Нажми Сохранить
- Скопируй секрет подписи - он показывается полностью только при первом создании или после ротации. Он понадобится, если захочешь проверять подлинность вебхуков
- Нажми "Test", чтобы отправить тестовый payload на эндпоинт без создания реального события
URL вебхука должен и спользовать HTTPS. HTTP-адреса и IP-адреса частных сетей не принимаются.
Что отправляется
Каждая доставка - это JSON-объект с тремя полями: event (тип события), timestamp и data (содержимое). Вот как выглядит каждый тип события.
Заметки (note.created)
Содержит AI-генерированный заголовок, полную транскрипцию, резюме, тип заметки, теги, приоритет, язык и дату создания.
{
"event": "note.created",
"timestamp": "2026-02-27T14:38:00Z",
"data": {
"note_id": "550e8400-e29b-41d4-a716-446655440000",
"title": "Meeting notes - Project Alpha",
"transcript": "Full transcript text...",
"summary": "Brief AI-generated summary...",
"type": "meeting",
"tags": ["work", "project-alpha"],
"priority": "high",
"language": "en",
"created_at": "2026-02-27T10:00:00Z"
}
}
На плане Ultra доставки заметок могут также включать ссылку на аудиозапись (audio_url, audio_format, duration_seconds). Ссылка действительна 24 часа. Включи это опцией "Note + Audio" при создании автоматизации.
Задачи (task.created)
Одна доставка на задачу. Одна заметка с 3 задачами отправляет 3 отдельных вебхука.
{
"event": "task.created",
"timestamp": "2026-02-27T14:38:01Z",
"data": {
"note_id": "550e8400-...",
"note_title": "Meeting notes - Project Alpha",
"task_id": "660f9511-...",
"title": "Send proposal to client",
"description": "Include pricing for Q2",
"priority": "high",
"due_date": "2026-03-01",
"reminder_at": "2026-02-28T09:00:00Z",
"tags": ["work"],
"status": "todo",
"created_at": "2026-02-27T10:00:00Z"
}
}
События (calendar_event.created)
Одна доставка на событие календаря.
{
"event": "calendar_event.created",
"timestamp": "2026-02-27T14:38:02Z",
"data": {
"note_id": "550e8400-...",
"note_title": "Meeting notes",
"event_id": "770a0622-...",
"title": "Team standup",
"description": "Weekly sync",
"start": "2026-03-03T10:00:00+03:00",
"end": "2026-03-03T10:30:00+03:00",
"location": "Zoom",
"is_all_day": false,
"attendees": ["alice@example.com"],
"tags": ["work"],
"created_at": "2026-02-27T10:00:00Z"
}
}
Отчеты (report.created)
Отправляется при генерации ежедневного, еженедельного, ежемесячного или годового отчета.
{
"event": "report.created",
"timestamp": "2026-02-28T00:05:00Z",
"data": {
"report_id": "880b1733-...",
"report_type": "daily",
"period_start": "2026-02-27",
"period_end": "2026-02-27",
"content_md": "# Daily Report\n\n...",
"content_json": {
"productivity_score": 72,
"day_type": "productive",
"tasks_created": 5,
"tasks_completed": 3
},
"created_at": "2026-02-28T00:05:00Z"
}
}
Безопасность
Каждая доставка подписана HMAC-SHA256 с использованием секрета подписи твоей автоматизации. С каждой доставкой отправляются следующие заголовки:
X-LP-Signature- подпись HMAC-SHA256 (sha256=...)X-LP-Timestamp- временная метка Unix, использованная при подписиX-LP-Event- тип события (note.created,task.created,calendar_event.created,report.created)X-LP-Delivery-Id- уникальный ID доставки (полезен для дедупликации)User-Agent- всегдаTellDone-Webhooks/1.0
Заголовки подписи отправляются с каждой доставкой, независимо от других настроек.
По умолчанию каждая доставка включает секрет подписи автоматизации в заголовке Authorization - поэтому инструменты вроде n8n Header Auth работают из коробки: просто вставь секрет как значение auth. Если ты задаёшь кастомный auth header в настройках, он заменяет этот дефолт. Поддерживаются два формата: Header-Name: value (отправляет указанный заголовок) или просто значение (отправляет его как Authorization: <value>).
У каждой автоматизации свой секрет подписи, поэтому ротация одного не затрагивает другие вебхуки. Секрет показывается полностью только при создании или после ротации. Всё остальное время виден только превью (whsec_...last4). Чтобы заменить его, нажми "Rotate secret" в настройках автоматизации - это сгенерирует новый ключ HMAC, не меняя URL и auth header. Старый секрет перестает работать немедленно.
Принимаются только HTTPS URL. HTTP, IP-адреса и адреса частных сетей отклоняются.
Проверка подписи вебхуков
Каждая доставка содержит заголовок подписи в формате X-LP-Signature: sha256=<hex>. Пример ниже показывает, как проверить подпись на Python.
Каждый вебхук подписан, чтобы ты мог убедиться, что он действительно пришел от TellDone. Подпись вычисляется как:
HMAC-SHA256(signing_secret, timestamp + "." + raw_body)
Результат кодируется в hex и добавляется префикс sha256= в заголовок подписи.
TellDone сериализует JSON с пробелами после разделителей (например, {"event": "note.created"}). Если ты распарсишь и пересериализуешь тело, подпись не совпадет. Всегда проверяй подпись по сырым байтам тела запроса.
Python
import hmac
import hashlib
def verify_signature(raw_body: bytes, signature: str, timestamp: str, secret: str) -> bool:
payload = f"{timestamp}.".encode() + raw_body
expected = "sha256=" + hmac.new(
secret.encode(), payload, hashlib.sha256
).hexdigest()
return hmac.compare_digest(signature, expected)
# Пример с Flask
@app.route("/webhook/telldone", methods=["POST"])
def telldone_webhook():
raw_body = request.get_data() # сырые байты, НЕ request.json
signature = request.headers.get("X-LP-Signature", "")
timestamp = request.headers.get("X-LP-Timestamp", "")
if not verify_signature(raw_body, signature, timestamp, SIGNING_SECRET):
abort(403)
data = request.json
# обработка вебхука...
Node.js
const crypto = require("crypto");
function verifySignature(rawBody, signature, timestamp, secret) {
const payload = `${timestamp}.${rawBody}`;
const expected =
"sha256=" +
crypto.createHmac("sha256", secret).update(payload).digest("hex");
return crypto.timingSafeEqual(
Buffer.from(signature),
Buffer.from(expected)
);
}
// Пример с Express (используй express.raw для получения сырого тела)
app.post("/webhook/telldone", express.raw({ type: "application/json" }), (req, res) => {
const rawBody = req.body.toString();
const signature = req.headers["x-lp-signature"] || "";
const timestamp = req.headers["x-lp-timestamp"] || "";
if (!verifySignature(rawBody, signature, timestamp, SIGNING_SECRET)) {
return res.status(403).send("Invalid signature");
}
const data = JSON.parse(rawBody);
// обработка вебхука...
});