Desarrolladores
Webhooks
Recibe notificaciones firmadas cuando terminan las generaciones, cambian los créditos o se completan los pagos, y verifica cada entrega.
Los webhooks envían un POST HTTPS a tu servidor cuando ocurre algo en tu cuenta, para que no tengas que consultar una y otra vez. Los endpoints se gestionan en Cuenta › Webhooks o con la API REST.
Eventos
| Evento | Se envía cuando | Campos de data |
|---|---|---|
generation.queued | Empieza una generación | job_id, creation_id, status, model_id |
generation.completed | Una generación termina correctamente | job_id, creation_id, status, model_id |
generation.failed | Una generación falla | job_id, creation_id, status, model_id, failure_code |
credits.updated | Cambia tu saldo de créditos | balance, credit_sequence |
billing.payment_succeeded | Se completa un pago | invoice_no, amount (unidades menores), currency, purchase_kind |
subscription.updated | Cambia tu suscripción | subscription_no, status, plan_id, current_period_end |
support_request.updated | Se actualiza una solicitud de soporte | request_id, kind, status |
Las cargas solo contienen identificadores y estados, nunca prompts, URLs de archivos ni datos de contacto. Obtén el recurso completo con la API cuando lo necesites, por ejemplo GET /creations/{creationId} después de generation.completed.
Todas las entregas tienen el mismo envoltorio:
{
"event_id": "…",
"type": "generation.completed",
"created_at": "2026-11-13T10:24:05.000Z",
"schema_version": 1,
"data": {
"job_id": "…",
"creation_id": "…",
"status": "succeeded",
"model_id": "seedream-5-5"
}
}Añade un endpoint
Registra la URL
En Cuenta › Webhooks, selecciona Añadir endpoint, escribe la URL del endpoint y elige los Eventos que enviar. La URL debe ser una dirección https pública.
Guarda el secreto de firma
El secreto de firma del endpoint (whsec_…) se muestra una sola vez, en Copia tu secreto de firma. Guárdalo con los secretos de tu servidor.
Verifica el endpoint
Un endpoint nuevo aparece como Sin verificar y no recibe nada hasta que lo verificas. Selecciona Verificar ahora: enviamos un evento firmado webhook.verification cuyo data contiene un challenge. Tu endpoint debe responder con un estado 2xx y el mismo valor en JSON:
{ "challenge": "<the value you received>" }El desafío caduca a los pocos minutos. Si sale bien, el endpoint muestra Verificado y empieza a recibir eventos.
Verifica las firmas
Las entregas siguen la especificación Standard Webhooks. Cada petición lleva tres cabeceras:
webhook-id: elevent_iddel evento;webhook-timestamp: cuándo se firmó este intento, en segundos Unix;webhook-signature: la firma del cuerpo en bruto con el secreto de tu endpoint.
Verifica cada entrega sobre el cuerpo en bruto de la petición antes de confiar en ella. Cualquier biblioteca de Standard Webhooks lo hace y además rechaza las marcas de tiempo antiguas:
import { Webhook } from 'standardwebhooks';
const webhook = new Webhook(process.env.WEBHOOK_SECRET); // whsec_…
export async function handleWebhook(request: Request) {
const body = await request.text();
const event = webhook.verify(body, {
'webhook-id': request.headers.get('webhook-id') ?? '',
'webhook-timestamp': request.headers.get('webhook-timestamp') ?? '',
'webhook-signature': request.headers.get('webhook-signature') ?? '',
}); // lanza un error si la firma no es válida
if (event.type === 'webhook.verification') {
return Response.json({ challenge: event.data.challenge });
}
// Procesa el evento y responde rápido.
return new Response(null, { status: 204 });
}Comportamiento de entrega
- Responder con estado
2xxrápidamente: cualquier código 4xx/5xx, redirección, tiempo de espera o fallo de red se computa como entrega fallida. Traslada tareas pesadas a colas asíncronas en segundo plano tras enviar la respuesta HTTP. - Reintentos programados: las entregas fallidas se reintentan con intervalos exponenciales (~5s, 5m, 30m, 2h, 5h, 10h). Si el último intento falla, el estado pasa a Fallido.
- Entrega at-least-once: un mismo evento puede recibirse más de una vez con idéntico
event_id. Almacena losevent_idprocesados para garantizar idempotencia y descartar duplicados. - Orden de llegada: el orden de recepción no está estrictamente garantizado. Utiliza la marca temporal
created_aty, encredits.updated, la secuencia monótonacredit_sequencepara descartar actualizaciones obsoletas.
Supervisa y corrige las entregas
Cada endpoint muestra sus Entregas recientes: En cola, Enviando, Entregado, Reintentando o Fallido, con el número de intento, el último estado HTTP y la hora del siguiente intento.
Las entregas fallidas no se vuelven a enviar. Después de una caída, concilia los datos con la API, por ejemplo con GET /generations o GET /credits/history.
Desde el endpoint también puedes:
- Editar eventos para cambiar lo que recibe;
- Rotar secreto para sustituir el secreto de firma: a partir de ese momento las entregas se firman con el nuevo, así que actualiza antes tu servidor;
- Eliminar el endpoint, lo que detiene las entregas y borra su historial.
