Register a webhook
urlmust be HTTPS and publicly routableeventsis optional, omit to subscribe to all six event types- Maximum 10 webhooks per project
secret is returned once at registration. Store it. You’ll need it to verify signatures.
Event types
Phases are named
iteration in the API. The event names and the payload field are the stable API identifier and won’t change. The product UI calls the same thing a phase.Payload
iteration instead of node. Rename events include previous_name.
Headers
Verifying signatures
Delivery semantics
At-least-once. Every event is persisted durably before the first attempt, so a receiver that’s briefly down never loses it. We attempt delivery immediately. If your endpoint returns a non-2xx status or doesn’t respond within 5 seconds, we retry with exponential backoff (~2, 4, 8, 16, 32 minutes) up to 6 attempts total, then mark the deliveryfailed.
Because it’s at-least-once, your receiver must be idempotent. The same event can arrive more than once (e.g. you process it but acknowledge past the 5-second window, so we retry). Dedup on X-ProductBrain-Delivery, which is stable across every retry of one event.
Each attempt re-signs the body with your webhook’s current secret, so rotating the secret never breaks an in-flight retry.
- Health monitoring.
GET /api/v1/webhooksreturns the last delivery time and HTTP status per webhook. Poll it to monitor health. - Reconcile failures. A delivery that exhausts all 6 attempts is marked
failedand not retried further. Catch up by readingGET /api/v1/nodes.

