WebhookRegistrare un webhook

Webhook

Registrare un webhook

Registra un URL https che Sofia chiama con un evento JSON firmato, ritentato fino a cinque volte se fallisce. Secret mostrato una volta; massimo 10 webhook.

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

Registrare un webhook

Registra un URL https che Sofia chiama con un evento JSON firmato, ritentato fino a cinque volte se fallisce. Secret mostrato una volta; massimo 10 webhook.

Autorizzazioni

Authorizationstringobbligatorio

La tua chiave personale o il token di accesso OAuth, inviato come Bearer <token>.

Conservato solo in questa scheda e inviato solo ad api.sofia-post.com. Ottieni una chiave API

Body

Questa richiesta agisce sul tuo account reale.

Registrare un webhook

Registra un indirizzo https pubblico e gli eventi desiderati. Il segreto di firma (whsec_…) viene mostrato solo in questa risposta. Un’applicazione può avere fino a 10 webhook.

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"]}'

Eventi

Eventodata
post.publishedpostId, establishmentId, platform, publishedAt, permalink
post.failedpostId, establishmentId, platform, error
webhook.testwebhookId

Sofia invia ogni evento in POST nel formato JSON { id, type, createdAt, data }, con gli header Sofia-Event-Id, Sofia-Event-Type e Sofia-Signature. Vengono annunciati solo i post creati dalla tua applicazione.

Verificare la firma

Sofia-Signature vale t=<unix time>,v1=<hex>, dove v1 è l’HMAC-SHA256 di <t>.<raw body> con il tuo segreto. Verificala sul corpo grezzo, e rifiuta un timestamp vecchio:

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);
};

Consegna e nuovi tentativi

  • Una risposta 2xx consegna l’evento. Qualsiasi altra risposta, un reindirizzamento (mai seguito) o 10 secondi senza risposta fanno scattare un nuovo tentativo dopo 1 minuto, 5 minuti, 30 minuti e 2 ore, fino a 5 tentativi.
  • Lo stesso evento può arrivare due volte: deduplica su Sofia-Event-Id.
  • Rispondi in fretta e tratta l’evento dopo.

Autorizzazioni

  • Authorizationstringheaderobbligatorio

    La tua chiave personale o il token di accesso OAuth, inviato come Bearer <token>.

Body

application/json
  • urlstringobbligatorio

    L'indirizzo https che Sofia chiama. Un host che risolve a un indirizzo privato, loopback o link-local viene rifiutato

  • eventsstring[]obbligatorio

    Gli eventi da ricevere

Risposta

Il webhook e il suo secret di firma, mostrato una sola volta.

  • idstringobbligatorio

    Identificatore del webhook.

  • urlstringobbligatorio

    Indirizzo chiamato da Sofia

  • eventsstring[]obbligatorio

    Gli eventi sottoscritti

  • createdAtstring<date-time>obbligatorio

    Quando il webhook è stato registrato

  • secretstringobbligatorio

    La chiave HMAC-SHA256 che firma ogni consegna (Sofia-Signature). Mostrata solo questa volta

Questa pagina ti è stata utile?