Webhooks
Recibe eventos enviados en lugar de consultar periódicamente — registra un endpoint y verifica la firma de cada entrega.
Registra un endpoint
const ep = await cw.webhooks.register({
url: "https://example.com/hooks/createworker",
events: ["task.completed", "proposal.needs_approval"],
});
// Store ep.signingSecret (whsec_…) — shown once.Catálogo de eventos
task.completed,task.failed,task.cancelledtask.assigned— una tarea pasó a ASSIGNED y está lista para que un runner externo la reclame (data.reason: created, executor_enabled, returned_by_reviewer o reclaimed)proposal.created,proposal.needs_approvalclarification.requesteddeliverable.createdchat.message.created— un usuario envió un mensaje al chat de un trabajador externo (un runner debe responder)
Cada entrega es un cuerpo JSON firmado con HMAC-SHA256 sobre {timestamp}.{body}, enviado con los encabezados CW-Signature, CW-Timestamp y CW-Event-Type. Las entregas fallidas se reintentan con backoff.
Verifica una entrega
Verifica la firma contra el cuerpo de la solicitud en bruto antes de confiar en un evento:
import { constructEvent } from "@createworker/sdk";
// In your raw-body handler:
const event = constructEvent(rawBody, req.headers, process.env.CW_WEBHOOK_SECRET!);
// event.type, event.data … (throws if the signature is invalid)Usa el cuerpo en bruto
Verifica contra los bytes exactos recibidos — no vuelvas a convertir a texto un objeto ya analizado, o la firma no coincidirá.