This is the complete catalogue. What is not here cannot be recorded and cannot be delivered: the
same list feeds the hash chain, the filters on your webhook endpoint and the OpenAPI document.
Subscribe an endpoint to individual names, to a family wildcard (shipment.*) or to *.
Every delivery has the same outside. The type decides what sits in data; mode says whether
the event came from the sandbox or from live, so one receiver can handle both.
A shipment was created, as a draft or issued straight away. It has a shp_ id and a first version, but nothing is frozen yet.
shipment.issued
The consignment note was issued. Parties, goods and addresses are frozen from now on, the first PDF is available and the shipment is ready to be signed.
shipment.updated
A change to the mutable fields created a new version. changed_paths names exactly which fields moved, so you can update selectively.
shipment.cancelled
The shipment was cancelled. No further signatures or deliveries will follow; the chain stays verifiable.
shipment.pickup_signed
The carrier signed at pickup. The shipment is in transit — the moment to move your own transport status to in_transit.
shipment.delivered
The consignee signed at delivery. The ePOD is available; has_remarks tells you whether a reservation was recorded that needs a human look.
shipment.completed
The shipment was closed administratively: the proof of delivery was accepted and nothing more follows. This is the moment to invoice and archive the file.
signature.completed
A signature or seal was recorded, for any role. trust_level and method say how much that signature weighs in a dispute.
document.created
A document was stored: a PDF version, an attachment, a photo or a signature image. The sha256 belongs to the bytes in storage.
remark.added
A reservation was recorded at pickup or at delivery. This is the event a damage process should start on.
inspection.viewed
Someone opened the inspection link. The IP itself is never stored; ip_hash makes a repeat visit recognisable without identifying the visitor.
provider.sync_failed
Synchronising with the eCMR provider failed. will_retry says whether Cargofollow will try again by itself, or whether something on your side is needed.
efti.uil_issued
The eFTI Unique Identifier Link was issued. This is the reference an enforcement authority can request from 9 July 2027.
efti.authority_access
A competent authority pulled this consignment through a national eFTI gate. gate_id says which gate, subsets on which legal ground; who the officer is, the platform is never told.
efti.combined_transport_stamped
A railway or port authority stamped a completed non-road leg of this combined transport (Directive 92/106/EEC Art. 3). The stamp creates no new version, so signatures stay valid.
ping
Test event from the console or POST /v1/webhook-endpoints/{id}/test. It does not belong to a shipment and therefore never enters a hash chain.
Every event except ping belongs to a shipment and forms the hash chain there. ping belongs to
a webhook endpoint and therefore never appears in a chain.
The fields below sit in data. A field marked optional may be absent — never read it without
checking. New optional fields may appear without notice, so ignore what you do not know instead of
failing.
The “Meaning” column is taken verbatim from the schemas in @freightapi/core, which is why it
matches the OpenAPI document word for word: one vocabulary covers the reference,
the SDKs and this page.