Documentación

Webhooks

Configura tu endpoint

Una URL HTTPS por workspace. Sin events recibes todos. El secreto de firma solo se devuelve al crearlo: guárdalo.

PUT /v1/webhook-endpoint
curl -X PUT "https://api.usecrier.com/v1/webhook-endpoint" \
  -H "Authorization: Bearer $CRIER_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "url": "https://app.acme.com/webhooks/crier",
    "events": [
      "post.published",
      "post.failed",
      "account.disconnected"
    ]
  }'

Eventos

EventoCuándodata
post.scheduledSe programó o entró en la colapost
post.publishedSalió en todas las redespost
post.partialSalió en algunas y falló en otraspost
post.failedNo salió en ningunapost
post.cancelledSe cancelópost
post.removedSe retiró de una redpost
post.rejectedSe rechazó en la revisión y volvió a borradorpost
post.recycledSe creó una copia recicladapost (la copia), recycledFrom
account.connectedSe conectó una cuentaaccount
account.disconnectedSe desconectó o hay que reconectarlaaccount
message.receivedAlguien escribió un mensaje directoaccountId, conversationId, message
comment.receivedAlguien comentó una publicaciónaccountId, postId, comment
review.receivedLlegó una reseña nueva (Google Business)accountId, review
Cuerpo
{
  "id": "evt_9a8s7d",
  "type": "post.published",
  "createdAt": "2026-10-23T10:00:05.000Z",
  "data": {
    "post": {
      "id": "pst_7q1w0e",
      "status": "published",
      "targets": [
        { "accountId": "acc_3k9x2m", "platform": "instagram", "status": "published", "url": "https://www.instagram.com/p/…" }
      ]
    }
  }
}

Verifica la firma

Cada envío lleva Crier-Event, Crier-Event-Id y Crier-Signature: t=<segundos>,v1=<hex>. v1 es el HMAC-SHA256 de <t>.<cuerpo> con tu secreto. Compáralo con el cuerpo sin parsear y rechaza firmas de hace más de 5 minutos.

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

export const verifyCrierSignature = (rawBody, header, secret) => {
  const { t, v1 } = Object.fromEntries(header.split(',').map((part) => part.split('=')));
  if (Math.abs(Date.now() / 1000 - Number(t)) > 300) return false;
  const expected = createHmac('sha256', secret).update(`${t}.${rawBody}`).digest('hex');
  return timingSafeEqual(Buffer.from(expected), Buffer.from(v1));
};
Python
import hmac, hashlib, time

def verify_crier_signature(raw_body: bytes, header: str, secret: str) -> bool:
    parts = dict(part.split("=", 1) for part in header.split(","))
    if abs(time.time() - int(parts["t"])) > 300:
        return False
    expected = hmac.new(secret.encode(), f"{parts['t']}.".encode() + raw_body, hashlib.sha256).hexdigest()
    return hmac.compare_digest(expected, parts["v1"])

Reintentos

🚧 Aún no está listo

Estamos terminando de construirlo

Crier está en acceso anticipado. Déjanos tu email y serás de los primeros en entrar, con condiciones de lanzamiento.

o con tu email

Sin spam. Solo te escribiremos para darte acceso.

¡Estás en la lista!

Te escribiremos en cuanto tu acceso esté listo.