Receive a Kivly outbound webhook

Kivly sends this request to the webhook URL configured for a location when a subscribed event occurs. Delivery uses a 30 second timeout, up to 3 retries, and a minimum 60 second retry delay (queue scheduling can add latency). Deliveries are persisted before sending; the event id and body remain stable on retries. Duplicates and out-of-order deliveries are possible. Deduplicate by payload.id after durable receipt and return any 2xx. Use HTTPS on port 443; redirects and private IPs are rejected. Verify X-Kivly-Signature-V2 as hex HMAC-SHA256 of timestamp + '.' + raw UTF-8 request body with webhook_token. Compare in constant time and reject timestamps more than 300 seconds from your clock. The legacy X-Kivly-Signature signs only the raw body and remains available for existing receivers.

Payload

Payload sent by Kivly to the configured webhook URL.

uuid
required
string
enum
required

Outbound webhook event name.

date-time
required
data
object
required

Sanitized entity payload. Events in invoice, campaign, automatic_notification, gift_card and survey carry resource_id and location_id. Child events also carry gift_card_id, survey_id or notification_id. Invoice events include available lifecycle_status, submission_status, fiscal_effect_status, kind and replacement/rectification links. Fetch the current resource via REST; event delivery order is not guaranteed. automatic_notification.delivery_recorded indicates a recorded send attempt, not provider-confirmed delivery. See x-kivly-resource-event-data.

string
required

Kivly owner user ID.

string | null

Location that emitted the event; null for a test event.

string | null

Customer ID when the event is customer-scoped.

metadata
object | null

Additional sanitized metadata about the event.

Headers
string
enum
required

Outbound webhook event name.

string
required
string
required
string
required
uuid
required
Responses
200

Return any 2xx response to acknowledge successful receipt.

400

The receiver rejected the webhook payload.

500

The receiver failed to process the webhook.

LoadingLoading…