PartyFlow

Quickstart: webhook за 5 минут#

Задача — принять первое сообщение от внешнего сервиса в канал PartyFlow. Получится:

  • Webhook, привязанный к каналу.
  • URL для POST.
  • HMAC signing secret (или token-only, если для начала хочется без подписи).
  • Первое сообщение, пришедшее curl-запросом.

Для этого гайда вам нужны admin-права в space. Если их нет — попросите админа команды.


Шаг 1. Создать webhook#

В PartyFlow откройте настройки space → IntegrationsIncoming webhooksNew webhook.

Заполните:

Поле Значение
Name quickstart-demo
Channel выберите канал, куда будут приходить сообщения
Require signature Off для самого быстрого теста. В продакшне — On.

Нажмите Create. Появится диалог с:

  • Webhook URL — скопируйте. Пример: https://api.partyflow.ru/api/v1/webhooks/incoming/whk_1j3k...
  • Signing secret — скопируйте, если Require signature = On. Показывается один раз.

Если вы потеряете signing secret, его надо ротировать (старый перестанет работать). URL при этом не меняется.


Шаг 2. Отправить первое сообщение#

Token-only (без подписи)#

WEBHOOK_URL='https://api.partyflow.ru/api/v1/webhooks/incoming/whk_1j3k...'
 
curl -X POST "$WEBHOOK_URL" \
  -H 'Content-Type: application/json' \
  -d '{"text":"Hello from quickstart!"}'

Ожидаемый ответ — HTTP 200. Откройте канал в PartyFlow — сообщение должно появиться в течение секунды.

С подписью (рекомендовано для прода)#

Используем PartyFlow-native схему (похожа на Stripe/Linear):

WEBHOOK_URL='https://api.partyflow.ru/api/v1/webhooks/incoming/whk_1j3k...'
SECRET='whsec_секрет_из_Шага_1'
BODY='{"text":"Hello with signature"}'
 
TS=$(date +%s)
SIG="sha256=$(printf '%s.%s' "$TS" "$BODY" | openssl dgst -sha256 -hmac "$SECRET" | awk '{print $2}')"
 
curl -X POST "$WEBHOOK_URL" \
  -H 'Content-Type: application/json' \
  -H "X-PartyFlow-Timestamp: $TS" \
  -H "X-PartyFlow-Signature: $SIG" \
  -d "$BODY"

Python-эквивалент — см. guides/verify-signatures.md.


Шаг 3. Попробовать структурированный payload#

Plain text — это скучно. PartyFlow понимает Slack-совместимый формат:

curl -X POST "$WEBHOOK_URL" \
  -H 'Content-Type: application/json' \
  -d '{
    "text": "Deploy finished",
    "attachments": [{
      "color": "good",
      "title": "Release v2.14.0",
      "title_link": "https://github.com/acme/app/releases/tag/v2.14.0",
      "fields": [
        {"title": "Environment", "value": "production", "short": true},
        {"title": "Duration", "value": "4m 12s", "short": true}
      ]
    }]
  }'

В канале появится сообщение с цветной полоской и grid'ом полей. Полный список поддерживаемых полей — reference/message-format.md.


Шаг 4. Триггерить push-уведомления только там, где это критично#

По умолчанию webhook-сообщения не шлют push (чтобы Grafana не разбудила команду ночью скучным deploy'ем). Push срабатывает только при @mention:

{
  "text": "Prod DB down @oncall",
  "severity": "critical",
  "mentions": ["<user-id-oncall-инженера>"]
}
Поле Что делает
severity: "critical" Пробить quiet hours / DND получателя.
severity: "info" Никогда не триггерить push, даже при @mention.
silent: true Жёсткий kill-switch push'а.
mentions: ["user-id"] Адресаты push'а.

Подробно — concepts/webhooks.md и reference/http-webhook-endpoint.md.


Что дальше#


Частые ошибки#

Симптом Причина Что делать
HTTP 401 signature missing Webhook создан с Require signature = On, но заголовки не присланы. Либо прислать подпись, либо создать webhook с Require signature = Off.
HTTP 401 signature invalid Неверный secret или тело запроса отличается от подписанного (пробелы, reorder keys). Подписывайте сырой bytes тела, не reserialized JSON.
HTTP 400 Неизвестный формат payload (нет text/attachments/blocks/message.content). Проверьте минимум — должно быть хотя бы одно из этих полей.
HTTP 413 Тело > 256 KB. Урезать payload; вынести детали в title_link.
HTTP 429 Retry-After: 1 Превышен rate limit (5–30 msg/sec в зависимости от тарифа). Подождать секунду, повторить.
HTTP 410 Webhook был автоматически отключён после 100 подряд ошибок. Admin должен вручную включить в UI.