Skip to main content
Sublay can call your server when things happen in your project. Project webhooks deliver broadcast and validation events for the project as a whole, configured once in the project dashboard. They use HTTP POST with HMAC-SHA256 signatures.

Configuration

Webhooks are configured per project in the dashboard. You need to set:
  • Webhook URL — the endpoint on your server that Sublay will call
  • Webhook secret — a shared secret used to sign outgoing requests and verify incoming responses
  • Subscribed events — the specific event types you want to receive (you only get called for events you opt into)

Event Types

Broadcast Events (Non-blocking)

These fire after an operation completes. Your server is notified but the original operation is not affected by your response. The notification.created event is the primary mechanism for bridging Sublay’s in-app notification system to push notifications, email, or any other delivery channel your app uses.

Validation Events (Blocking)

These fire before an operation is committed. Sublay waits for your response. If you respond with { "valid": true }, the operation proceeds. Any other response (or no response) causes the operation to be rejected.
If no webhook is configured for your project, or if an event type is not in your subscribed list, all validation webhooks pass automatically — your server does not need to be present for your project to function.
Validation webhooks are synchronous. A slow or unavailable webhook endpoint will block the operation and cause it to fail. Ensure your webhook handler is fast and reliable.

Payload Format

All webhook deliveries use the same envelope:

Signature Verification

Every webhook request includes two headers that allow you to verify the request came from Sublay and has not been tampered with. To verify on your server:
1

Read the headers

Extract X-Signature and X-Timestamp from the incoming request.
2

Recompute the expected signature

Compute: HMAC-SHA256(webhookSecret, "{timestamp}.{JSON.stringify(body)}") as a hex string, where timestamp is the value from X-Timestamp and body is the raw JSON body.
3

Compare using a constant-time comparison

Compare the expected signature to the received X-Signature. Use a constant-time comparison function to prevent timing attacks.
4

Reject if the signatures do not match

Return a non-2xx response. Do not process the request.

Responding to Validation Events

For validation webhooks, your server must respond with a signed JSON body indicating whether the operation should proceed. To allow the operation:
To reject the operation:
Your response must include an X-Response-Signature header:
If the response signature is missing or invalid, Sublay treats the validation as failed and rejects the operation — even if the body contained { "valid": true }.

Common Use Cases

Push Notification Bridge

Subscribe to notification.created. When your webhook receives it, forward the notification to your push provider (FCM, APNs, Expo, OneSignal, etc.) for the target user. The data field contains the notification parameters including the recipient user ID, notification type, and any associated entity or comment.

Content Moderation Gate

Subscribe to comment.created or entity.created (validation events). In your handler, check the content against a blocklist or moderation API. Return { "valid": false } to reject content that fails your rules before it is ever stored.

Audit Logging

Subscribe to broadcast complete events (user.created.complete, entity.created.complete, etc.) to maintain an external audit log or pipe activity into an analytics system or data warehouse.