Webhooks
The platform captures upstream activity events and exposes them as a polling API, so you do not stand up your own receiver.
You do not register a callback URL. Instead you query the latest known state of a product, product-type, or booking. Send SessionId as a query parameter.
Read the latest event
GET/Activity/v2/webhook-events/{event}/{uuid}
Access requires the permission activity_webhook_events
Pass the event name and the entity uuid. You get the most recent event of that type for that entity.
Event types
| Event | Fires when |
|---|---|
product_available | A product becomes available. |
product_updated | A product's content changes. |
product_type_available | A variant becomes available. |
product_type_not_available | A variant becomes unavailable. |
product_type_content_updated | A variant's content changes. |
product_type_pricing_updated | A variant's price changes. |
product_type_availability_updated | A variant's availability changes. |
booking_status_updated | A booking's status changes. |
booking_data_updated | A booking's data changes. |
booking_tickets_updated | A booking's tickets change. |
Query parameters
| Name | Type | Required | Default | Description |
|---|---|---|---|---|
history | boolean | No | false | Return a list of past events instead of the latest one. |
limit | integer | No | 20 | History size, 1 to 50. Presence of limit turns on history mode. |
curl "https://api.hermeseus.com/api/Activity/v2/webhook-events/booking_status_updated/1d59a17e-9726-4283-a5b7-bab7886e4709?SessionId=8f3c81d2-4a5b-4c6d-9e0f-1a2b3c4d5e6f"
const uuid = "1d59a17e-9726-4283-a5b7-bab7886e4709";
const res = await fetch(`https://api.hermeseus.com/api/Activity/v2/webhook-events/booking_status_updated/${uuid}?SessionId=8f3c81d2-4a5b-4c6d-9e0f-1a2b3c4d5e6f`);
const data = await res.json();import requests
uuid = "1d59a17e-9726-4283-a5b7-bab7886e4709"
res = requests.get(
f"https://api.hermeseus.com/api/Activity/v2/webhook-events/booking_status_updated/{uuid}",
params={"SessionId": "8f3c81d2-4a5b-4c6d-9e0f-1a2b3c4d5e6f"},
)
data = res.json()Response
Latest mode returns the newest event, or found: false when there is none.
{
"event": "booking_status_updated",
"primaryUuid": "1d59a17e-9726-4283-a5b7-bab7886e4709",
"found": true,
"id": 55213,
"receivedAt": "2026-10-14T11:02:03.000+08:00",
"eventTimestamp": "2026-10-14T11:02:00.000+08:00",
"payload": { "currentStatus": "APPROVED" }
}History mode returns count and an items array of the same objects.
Do not poll in a tight loop.
Poll on a sensible interval, or check the event right after an action that would change it. For booking issuance, read
booking_status_updated instead of re-fetching the booking repeatedly.

