The authoritative list of valid event-type strings for your account is returned by Get event types (
GET /api/p/v1/webhooks/event-types).
Payload
Tender events use the standard Alvys webhook envelope, with one difference from load and trip events: the envelopeversion is v2 rather than v1. As on every event, etag identifies the version of the tender the payload was built from.
Every tender payload carries data.tenderId and a data.tender object holding a full tender snapshot — the same shape Get tender returns. Event-specific fields sit alongside it.
timestamp is the moment the underlying business event occurred. For the three stop events it is when Alvys recorded the update, which can be later than the arrival, departure, or ETA the payload itself reports — use data.arrivedAt, data.departedAt, or data.estimatedAt when you need the operational time.
tender.created
Fires when a new inbound tender is received, before any review or acceptance. data carries tenderId and the tender snapshot.
This event also fires when a change tender cannot be matched to an existing shipment and Alvys creates a new tender for it. A
data.tender.shipmentId you have already seen can therefore arrive a second time under a different tenderId — key your own records on tenderId, not on the shipment identifier.tender.created fires on every inbound tender rather than only on tenders someone has acted on, it delivers at a substantially higher rate than the other tender events. Size your endpoint accordingly.
tender.change.created
Fires when a change tender is received, whether or not the tender has a linked load. data.queuedForReview tells the two cases apart, and it decides how to read the rest of the payload.
changeCount: 0 and changeTypes: []. Use the zero count to skip it.
changeTypes
changeTypes lists the distinct categories of change proposed, in the order they appear on the tender. changeCount counts every queued update, so the two can disagree — a change tender can carry several updates of one category, and a category Alvys does not publish is counted without being named. Do not treat changeTypes.length as an upper bound on changeCount.
The published vocabulary is:
Notes
- Delivery is at-least-once — deduplicate on
X-Alvys-Event-Id. See Event Delivery & Reliability. - Tender events are not scoped to a subsidiary. Unlike load and trip events, a tender event reaches every webhook subscription in the tenant regardless of the subsidiary the subscription was created against. Filter on the tender snapshot if you need narrower routing.
- Tender events do not carry a
data.diffnode. The only action available on a queued change is to accept it in full, sochangeTypesis the granularity you can act on. - Events for the same tender are dispatched in order; ordering across different tenders is not guaranteed.