Skip to main content
A payment clears, an issue moves, or a user finishes connecting an account. The generated SDK receives all of these through one durable event receiver. The event source determines how it is registered:
  1. A provider webhook uses a kind: webhook config for ingress. The SDK attaches to it and selects the provider events it wants.
  2. A Fused auth lifecycle event is included automatically when the SDK’s selected auth path uses connected OAuth or OIDC. It needs no webhook config or attachment.
Both arrive through FusedWebhooks. Creating an SDK client does not start a listener; your application registers handlers when it is ready to consume events.
MCP servers can also select provider webhooks as event resources. SDK receivers offer durable ack/nack delivery; MCP offers live update notifications and a read of the latest retained occurrence. Fused auth lifecycle events described here remain an SDK receiver surface.

Register provider ingress

For a Managed service with event support, create a local relay.source receiver instead of storing a signing secret. Fused verifies requests at its broker, and your Engine pulls authorized events into this same delivery path. Use the following direct-ingress setup when you own the provider application and signing secret. A kind: webhook config is a named, team-owned bundle that can span several services, with its own plan and apply lifecycle.
Plan validates the local webhook config before contacting the Engine. Use webhook validate separately only for an offline-only check. Apply prints each registration’s URL, which is what you give the provider:
To look one up later without re-running apply:
Its SIGNATURE column reads set or none — never the secret itself.

About name and secret

name is this config’s identity. The pair (service, name) must be globally unique per account: a second config trying to claim a pair another config already owns is a plan-time conflict, never a silent takeover. name: default is reserved. Its registrations get a predictable URL — /webhook/svc/<service> — and must therefore be signature-verified: a default config whose service declares no inbound webhook signature is rejected at plan time, and an unsigned delivery to a default URL is rejected at ingress. services.<slug>.secret is the signing secret used to verify inbound deliveries. It takes a bucket reference — either `${bucket.<name>.secret.<key>}` or the shorthand `${bucket.secret.<key>}` against the default bucket. Omit it entirely for a provider that does not sign its webhooks.
The bucket segment is mandatory here, unlike SDK and MCP injections. Webhook verification has no dispatch-selected bucket to fall back on, so it cannot infer one. The reference must also be the entire field value — no surrounding text.
Removing a service from the map, or deleting the file, is an ordinary apply-time diff. There is no imperative delete command.

Attach an SDK and pick provider events

webhook_attachment is top-level, a sibling of name and bucket — not nested under services, because one webhook config can span services the SDK also uses. Manage the event list from the CLI if you prefer:
sdk webhook add accepts --interactive when you would rather pick from a list than remember event IDs.

Fused auth lifecycle events

An SDK whose selected operation auth path uses connected OAuth or OIDC gets these generated event types automatically: Use the enum generated for your service. Its wire value includes the service identity before the event suffix, which keeps events from different services distinct. You do not add these names under services.<slug>.webhooks. They need no kind: webhook, provider callback URL, signing secret, or webhook_attachment. A service merely offering an unused OAuth alternative does not enable them. The implicit subscription is scoped to the SDK family and service. A later SDK version in the same family can continue receiving its connection events, but another SDK sharing the bucket cannot. Connections started directly from the CLI are not routed into an SDK receiver.

Handle them in your code

The generated package ships the receiver. Your process dials out to the Engine and events stream back down that connection, so there is no public endpoint to host, no ingress to open, and no signature to verify yourself — this works unchanged on a laptop, in a private VPC, or on a serverless container.
The receiver name is yours. on takes one event or a list, and only events you registered a handler for are dispatched. The token is the SDK family’s execution token, not a CLI control key or provider credential. Once an event reaches the durable receiver, delivery is at least once. Fused auth lifecycle payloads include an id for idempotency and omit app provenance, provider payloads, scopes, URLs, and token material. Call nack() when work fails and receiver.close() on shutdown. Python also exposes SyncFusedWebhooks when your process has no event loop.
Auth state commits do not wait for lifecycle publication. Until Fused uses a transactional outbox for this boundary, a broker outage immediately after the commit can prevent that lifecycle event from being emitted.

The rules that bite

That last one is checked by the Engine rather than the CLI, so a name that was never applied passes validate and fails at plan. webhooks_select_all: true takes every event a service offers. It is independent of select_all for operations — you can take all events and only some operations, or the reverse. Two registrations for the same service and event never cross-deliver: an SDK only receives from the config it attached to.

Verification headers

Where a service’s imported contract declares verification_headers, treat that list as the complete reviewed header set. Source order and spelling are preserved; Fused drops blank and case-insensitive duplicate names. Only when a signature_header list is absent does OpenAPI import infer one from required header parameters on webhook operations. Do not add guessed provider headers.

Flags

webhook plan

webhook apply

Permissions

A registration with no secret reference carries no bucket permission requirement at all.

Store the signing secret

The reference resolves at verification time. The secret must be in the bucket before then.