A generation finished with its outputs.

POSTed as JSON to every endpoint registered with POST /v1/webhook-endpoints, for every generation on the account (web, API, MCP, CLI; data.origin says which) started after the endpoint was created. Endpoints are managed with an API key only: an app connected through sign-in (OAuth) gets 403 api_key_required. Headers: Lumeta-Event-Id (evt_..., also body.id), Lumeta-Event-Type, Lumeta-Signature: t=<unix seconds>,v1=<hex>, where the hex is the HMAC-SHA256 of "<t>.<raw body>" keyed with the endpoint secret. Verify the signature over the raw bytes and refuse a t older than 5 minutes. Answer any 2xx within 5 seconds; anything else (a redirect, a timeout, a 4xx or 5xx) is retried after 1 min, 5 min, 30 min, 2 h and 12 h, with the same event id. An event goes out a few seconds after its generation finishes (within about a minute for one that ran longer than two hours), not necessarily in order; a retry carries the generation as it is then.

postWebhookgeneration.succeeded

Payload

idstring required

evt_...: the same for every attempt and every endpoint of one event (also in Lumeta-Event-Id). Deduplicate on it.

object'event'
type'generation.succeeded' | 'generation.failed' | 'webhook.test' required
created_atstring
attemptinteger

1 for the first delivery, then 2 to 6 for the retries.

Response

Received. The body is ignored (only the first 4 KB are read).

Changes

Webhooks have no change history: a webhook is keyed by its event name rather than a path and method, so no recorded change can name it.