Before You Start
- Use a sandbox API key while developing and a production API key for live bookings.
- Create endpoints separately in each environment. Sandbox events are never delivered to production endpoints, or vice versa.
- Your destination must be a public HTTPS URL. URLs containing credentials, fragments, or private/internal hosts are rejected.
- Return a
2xxresponse within 10 seconds. Process longer-running work asynchronously after acknowledging the request.
1. Create an Endpoint
signing_secret. Store it in your secret manager when
it is returned; it cannot be retrieved later.
2. Verify Every Request
Unifystays signs the exact request body with HMAC-SHA256. Verify the signature before parsing or processing the event, and reject stale timestamps to reduce replay risk. Implement signature verification3. Send a Test Event
ACTIVE. The API returns 202 Accepted with an event_id
and delivery_id. Use the delivery ID to inspect the receiver’s HTTP response.
Event Types
Subscribe to individual event names or use
booking.* for every booking event.
Test deliveries use webhook.test and are sent only when you explicitly request
a test.
Event Payload
booking.cancellation_failed, data.cancellation_error contains the
failure message. Treat payloads as forward-compatible: ignore fields you do not
recognize and use schema_version when introducing version-specific handling.
Delivery Guarantees
Webhook delivery is at least once. A successful request may be delivered again, and events can arrive out of order.- Deduplicate using the top-level event
id. - For booking state, apply only a payload whose
data.object.versionis newer than the version you have already processed. - Return any
2xxstatus after safely persisting or enqueueing the event. - Do not depend on delivery order.
Retries and Automatic Disabling
Failed deliveries are attempted up to eight times. Default delays after each failure are 1 minute, 5 minutes, 30 minutes, 2 hours, 8 hours, 24 hours, and 48 hours. A validRetry-After response header is honored, capped at 48 hours.
Re-activate a disabled endpoint by updating its status to
ACTIVE, then replay
any delivery you still need.
Logs and Retention
Delivery attempts record status, duration, safe response headers, an error, and up to 16 KiB of response body. Response headers and bodies are cleared after 30 days. Completed events and deliveries are retained for 90 days. Use List Webhook Deliveries for filtering and Get Webhook Delivery for the complete attempt history.Cancellation-based review
booking.created carries PROCESSING when the accepted offer is within free
cancellation and supplier booking is queued immediately. Non-refundable offers,
expired free windows and unclear terms carry AWAITING_REVIEW. Neither means
the supplier has reserved anything. Approval is followed by the existing
booking.confirmed or booking.failed outcome events. Review rejection and
session expiry emit booking.failed with BOOKING_REVIEW_REJECTED and
BOOKING_REVIEW_EXPIRED, respectively. Clients can poll the status endpoint to
observe the intermediate PROCESSING state after approval or a move to
AWAITING_REVIEW if free cancellation ends before supplier submission.