Webhook envelopes and raw delivery
The default HTTP request body is a JSON envelope withtype: "notification",
message_id, topic_crn, topic_name, subscription_id, message,
timestamp, and unsubscribe_url. Subject and attributes appear when supplied.
The message remains a string, even when your application uses JSON in it.
With raw_message_delivery: true, the request body is the selected message
payload. Webhook metadata remains in the X-Basaltic-Notification-Type,
X-Basaltic-Message-Id, X-Basaltic-Subscription-Id, X-Basaltic-Topic-Crn,
X-Basaltic-Unsubscribe-Url, and X-Basaltic-Delivery-Attempt headers.
The request content type remains application/json; choose a suitable payload.
Queue subscriptions always receive the envelope. Their queue message attributes
also include notification identifiers. When delivering to a FIFO queue,
Notifications supplies a group ID derived from the topic CRN and a deduplication
ID derived from the published message ID. FIFO ordering applies within the
queue; asynchronous notification fan-out does not guarantee publication order.
Verify webhook signatures
Every signed webhook request carries:subscription_confirmation handshake.
After verification, the endpoint owner can follow its confirm_url to consent.
Returning a success status to the handshake only acknowledges its receipt.
Store the secret outside logs. Reading and rotating it require separate
permissions. Rotation replaces the key, so coordinate it with the endpoint
operator. A subscription description or list never returns the secret.
Retry policy
Subscription settings override topic settings field by field. Unspecified
values use platform defaults. Backoff doubles between retries and includes
jitter, so these are scheduling bounds and defaults, not exact delivery times.
When both delays are supplied, the maximum must not be less than the minimum.
For webhooks, HTTP
2xx succeeds. Timeouts, connection failures, HTTP 408,
429, and 5xx can be retried. Other 4xx and all 3xx responses are terminal;
redirects are not followed. A destination that resolves to a blocked private
address is also a terminal failure. HTTP success does not confirm that an
application completed its business operation.
Dead-letter queues
Setredrive_policy.dead_letter_queue on a subscription to retain an envelope
when a delivery ends in terminal failure. The queue can be a standard or FIFO
queue in the same account and region. Setting it requires queue:SendMessage.
The failure envelope contains the original notification, subscription and
delivery identifiers, attempts, failure time, and last error. The delivery
record remains failed after redrive. A full, deleted, or unavailable destination
can prevent the envelope from being stored, so monitor both delivery failures
and the dead-letter queue rather than treating it as a second delivery guarantee.
This handles a failure to deliver a notification to its endpoint. To handle a
consumer that receives but cannot process an already enqueued message, configure
that destination queue’s redrive policy.
Diagnose a missing notification
- Confirm the publication was accepted and inspect its fan-out state.
- Check that the subscription is confirmed.
- Compare the published attributes against the entire filter policy.
- Find the delivery record and inspect its attempts and last error.
- For webhooks, check the registered URL, signature handling, and HTTP status.
- For queues, check destination availability, encryption key state, and consumer leases.

