EasyTransfer Transport® · Developer Webhooks

API v1 · base https://api.easy-transfers.ch · auth X-Api-Key

1. Overview

Webhooks let your system react in real time to events in the EasyTransfer Transport® platform. When a subscribed event occurs, we send an HTTP POST with a JSON body to your endpoint, signed with HMAC-SHA256.

One subscription per partner. Configure it once in the Partner Console → Webhook configuration (URL, events, secret). Leave the secret blank to have one generated; it is shown once.

2. Events

EventWhen it fires
Booking lifecycle
booking.createdA booking is created for your account
booking.confirmedBooking is confirmed
booking.amendedBooking details are changed
booking.cancelledBooking cancelled
booking.completedTransfer completed
booking.no_showNo-show recorded (still billable)
booking.flight_updatedTracked flight changed status (delayed, landed, diverted)
booking.driver_assignedA chauffeur was assigned to the booking
booking.driver_reassignedA different chauffeur replaced the assigned one
booking.sla_warningLegal waiting period at pickup elapsed; a no-show may follow
Chauffeur lifecycle
booking.driver_acceptedChauffeur accepted the job
booking.driver_startedChauffeur started the run
booking.driver_en_routeChauffeur en route to pickup
booking.driver_arrivedChauffeur arrived at pickup
booking.photos_addedChauffeur added pickup photos
booking.passenger_onboardPassenger on board, transfer underway
Billing
invoice.createdIncoming invoice issued to you (NET terms)
invoice.paidAn invoice is marked paid (includes Stripe payments)
booking.documents_readyInvoice, booking and GPS-evidence PDFs are ready; payload carries each URL (fetch with your API key)
Notifications
booking.sms_deliveredThe tracking SMS reached the recipient (Twilio confirmed delivery)
booking.sms_failedThe tracking SMS failed or was undelivered; payload carries the error code

Subscribe with exact names or wildcards, e.g. booking.*,invoice.* or all.

Every booking.* payload automatically includes a live tracking_link (https://drivers.easy-transfers.ch/livetracking?t=...) whenever a tracking token exists, so you can show your customer real-time vehicle tracking.

3. Delivery & headers

Each delivery is a POST with Content-Type: application/json and:

HeaderValue
X-ET-EventThe event name, e.g. booking.completed
X-ET-SignatureHMAC-SHA256 of the raw request body, keyed with your secret (hex)
X-ET-RetryPresent on retries; the attempt number

Payload

{
  "event": "booking.completed",
  "data": {
    "ref": "ET-000352",
    "status": "COMPLETED",
    "client": "Samantha Aeschbach",
    "price": 90.02
  },
  "timestamp": "2026-06-30T16:33:00+02:00"
}

4. Verifying the signature

Compute HMAC-SHA256 over the raw body with your secret and compare (constant-time) to X-ET-Signature.

# PHP
$expected = hash_hmac('sha256', $rawBody, $yourSecret);
if (!hash_equals($expected, $_SERVER['HTTP_X_ET_SIGNATURE'] ?? '')) { http_response_code(401); exit; }

# Node
const exp = crypto.createHmac('sha256', secret).update(rawBody).digest('hex');
if (!crypto.timingSafeEqual(Buffer.from(exp), Buffer.from(req.header('X-ET-Signature')||''))) return res.sendStatus(401);

5. Responses, timeouts & retries

ItemBehaviour
SuccessRespond 2xx within the timeout
Timeout5s on first delivery, 8s on retries
RetriesExponential backoff: 2, 4, 8, 16, 32 min · up to 6 attempts
Auto-disableAfter 10 consecutive failures the subscription is paused
Delivery logEvery attempt is recorded (event, URL, HTTP code, attempts, response)
Treat deliveries as at-least-once: the same event may arrive more than once. Make your handler idempotent (e.g. dedupe on data.ref + event).

6. Configuration & test

EndpointPurpose
partner.webhook.configPOST to save URL + events + secret · GET to read current config
partner.webhook.testSends a signed test POST to your configured URL · returns the HTTP code
partner.webhook.deliveriesRecent delivery log for your account
curl -X POST "https://api.easy-transfers.ch/?action=partner.webhook.config" \
  -H "X-Api-Key: etk_partner_..." -H "Content-Type: application/json" \
  -d '{"url":"https://your-domain.com/webhook","events":["booking.created","invoice.paid"]}'

7. Versioning

This is v1. New event types and additional fields may be added; your handler must ignore unknown fields/events. Breaking changes would ship as v2.

EasyTransfer Transport® · CEO Ricardo Correia · Chemin du midi 15d, 1260 Nyon, Switzerland · info@easy-transfers.ch