Skip to content

Webhooks

Zaptime can send outbound webhooks when reservations are prepared or made. Use a Webhook Integration and attach it to a Workflow step with the Send webhook action.

Configure

  • Create an Integration of type Webhook with:
    • name: any label
    • url: destination endpoint
    • method: GET, POST, PUT, PATCH, DELETE (default: POST)
    • headers: optional key-value map added to the request
    • secret: optional string to enable request signing
  • Create or edit a Workflow and set:
    • action: Send webhook
    • trigger: Reservation prepared or Reservation made
    • integration: select the Webhook Integration to use

Delivery

  • Headers
    • Accept: application/json
    • Custom headers you configure
    • When secret is set: X-Zaptime-Signature: HMAC-SHA256 over the payload (see Security)
  • Body/params
    • POST/PUT/PATCH/DELETE: JSON body
    • GET: query string parameters (signature is still computed over the JSON representation of the same payload data)

Payloads

Reservation prepared

json
{
  "resource": "reservation",
  "action": "prepared",
  "reservationUuid": "...",
  "eventTypeUuid": "...",
  "start": "2025-01-01T10:00:00+00:00",
  "end": "2025-01-01T10:30:00+00:00",
  "email": "guest@example.com",
  "name": "Ada Lovelace",
  "firstName": "Ada",
  "lastName": "Lovelace",
  "userEmail": "owner@example.com",
  "userName": "Account Owner",
  "meetLink": ""
}

Reservation made

json
{
  "resource": "reservation",
  "action": "made",
  "reservationUuid": "...",
  "eventTypeUuid": "...",
  "start": "2025-01-01T10:00:00+00:00",
  "end": "2025-01-01T10:30:00+00:00",
  "email": "guest@example.com",
  "name": "Ada Lovelace",
  "firstName": "Ada",
  "lastName": "Lovelace",
  "userEmail": "owner@example.com",
  "userName": "Account Owner",
  "meetLink": "https://meet.google.com/..."
}

Security (signature)

If you set a secret on the Webhook Integration, each request includes an HMAC-SHA256 signature in the X-Zaptime-Signature header. The signature is computed as:

  • HMAC_SHA256(secret, json_encode(payload)) for non-GET requests (use the raw body you received).
  • For GET requests, the signature is computed over the JSON representation of the same payload data sent as query parameters.

Example verification (Node.js/TypeScript, non-GET)

ts
import crypto from "crypto";

const body = await getRawBody(req); // raw bytes
const signature = req.header("X-Zaptime-Signature") ?? "";
const calc = crypto.createHmac("sha256", secret).update(body).digest("hex");
const valid = crypto.timingSafeEqual(Buffer.from(signature), Buffer.from(calc));

Retries and timeouts

  • No automatic retries are performed; responses are not inspected.