ВебхукиЗарегистрировать вебхук

Вебхуки

Зарегистрировать вебхук

Регистрирует URL https, который Sofia вызывает с подписанным JSON-событием, до пяти повторов при сбое. Секрет виден один раз; не больше 10 вебхуков.

POSThttps://api.sofia-post.com/api/v1/webhooks
POSThttps://api.sofia-post.com/api/v1/webhooks

Зарегистрировать вебхук

Регистрирует URL https, который Sofia вызывает с подписанным JSON-событием, до пяти повторов при сбое. Секрет виден один раз; не больше 10 вебхуков.

Авторизации

Authorizationstringобязательно

Ваш личный ключ или токен доступа OAuth, отправляется как Bearer <token>.

Хранится только в этой вкладке и отправляется только на api.sofia-post.com. Получить ключ API

Тело

Этот запрос действует на ваш реальный аккаунт.

Регистрация вебхука

Зарегистрируйте публичный https-адрес и нужные события. Секрет подписи (whsec_…) показывается только в этом ответе. У приложения может быть до 10 вебхуков.

curl -X POST https://api.sofia-post.com/api/v1/webhooks \
  -H "Authorization: Bearer $SOFIA_API_KEY" \
  -H 'Content-Type: application/json' \
  -d '{"url":"https://app.example.com/hooks/sofia","events":["post.published","post.failed"]}'

События

Событиеdata
post.publishedpostId, establishmentId, platform, publishedAt, permalink
post.failedpostId, establishmentId, platform, error
webhook.testwebhookId

Sofia отправляет каждое событие через POST в формате JSON { id, type, createdAt, data } с заголовками Sofia-Event-Id, Sofia-Event-Type и Sofia-Signature. Объявляются только публикации, созданные вашим приложением.

Проверка подписи

Sofia-Signature имеет вид t=<unix time>,v1=<hex>, где v1 — HMAC-SHA256 от <t>.<raw body> с вашим секретом. Проверяйте её по необработанному телу и отклоняйте устаревшую метку времени:

import { createHmac, timingSafeEqual } from 'node:crypto';

const isSignedBySofia = (header, rawBody, secret) => {
  const parts = Object.fromEntries(
    (header ?? '').split(',').map((part) => part.trim().split('=', 2)),
  );
  const timestamp = Number(parts.t);
  if (!Number.isInteger(timestamp) || typeof parts.v1 !== 'string') return false;
  if (Math.abs(Date.now() / 1000 - timestamp) > 300) return false;
  const expected = createHmac('sha256', secret).update(`${timestamp}.${rawBody}`).digest();
  const received = Buffer.from(parts.v1, 'hex');
  return received.length === expected.length && timingSafeEqual(received, expected);
};

Доставка и повторные попытки

  • Ответ 2xx доставляет событие. Любой другой ответ, перенаправление (никогда не отслеживается) или 10 секунд без ответа запускают повторную попытку через 1 минуту, 5 минут, 30 минут и 2 часа, всего до 5 попыток.
  • Одно и то же событие может прийти дважды: дедуплицируйте по Sofia-Event-Id.
  • Отвечайте быстро, а событие обрабатывайте потом.

Авторизации

  • Authorizationstringheaderобязательно

    Ваш личный ключ или токен доступа OAuth, отправляется как Bearer <token>.

Тело

application/json
  • urlstringобязательно

    Адрес https, который вызывает Sofia. Хост, разрешающийся в приватный, loopback или link-local адрес, отклоняется

  • eventsstring[]обязательно

    События для получения

Ответ

Вебхук и его секрет подписи, показанный только один раз.

  • idstringобязательно

    Идентификатор вебхука.

  • urlstringобязательно

    Адрес, который вызывает Sofia

  • eventsstring[]обязательно

    Подписанные события

  • createdAtstring<date-time>обязательно

    Когда вебхук был зарегистрирован

  • secretstringобязательно

    Ключ HMAC-SHA256, которым подписывается каждая доставка (Sofia-Signature). Показывается только один раз

Эта страница была полезной?