Register a URL to receive tracking updates.

Register a URL once; from then on tracking changes for freight you booked through POST /dispatching/jobs are POSTed to it as JSON. Each delivery's details.tracking is the TrackingResult that GET /tracking/timelines/{resource_id} returns under data, with the whole timeline in one document rather than paged, so you don't need to call back to fetch the remaining movements. The event payloads are documented under Webhooks in this reference.

Field Required Notes
url Yes HTTPS only, resolving to a public address
event_names No tracking.updated (the default) and/or documents.updated, which must be enabled for your company
error_contact_email Yes Who Shipwell contacts about delivery problems
custom_data No Any JSON object up to 4 KB, echoed back in every delivery

Every delivery carries the full current snapshot: replace your copy rather than reconstructing it from differences. A tracking.updated event carries the shipment's tracking. A documents.updated event, if you subscribe to it, carries the shipment's document collection, each file usually with a content.url download link to fetch right away, and each document with a base64_link that returns its files inline through the API.

Call POST /tracking/webhooks/{webhook_id}/test right after creating the webhook to check your endpoint receives and acknowledges a delivery.

Store the secret from the response now; it is returned only once. To verify a delivery, compute hex HMAC-SHA256 of "{X-Shipwell-Timestamp};{raw request body}" keyed with it and compare to X-Shipwell-Signature, the same scheme as Shipwell's other webhooks.

Answer with any 2xx within 10 seconds. Timeouts, network errors, 408, 429 and 5xx are retried 9 more times over about 47 hours; any other 4xx is not retried, and 410 disables the webhook. Deliveries are at least once. The same event id is sent on every retry, and sequence increases per resource_id and event: ignore an id you have seen and anything below the highest sequence you have applied for that resource_id and event_name. A documents.updated retry carries fresh download links, so match retries by id, never by body.

SecurityAPIKeyHeader
Request
header Parameters
X-Shipwell-Version
string (X-Shipwell-Version)

Pins this request to the API as it behaved on the given ISO date, e.g. 2026-08-25. Omitted or unparseable means the oldest behaviour, so a client that never sends it keeps the behaviour it was written against.

Request Body schema: application/json
required
url
required
string (Url) <= 2048 characters

Where Shipwell POSTs each event. HTTPS only, and it must resolve to a public address.

event_names
Array of strings (Event Names) non-empty

Which events to receive. tracking.updated is sent whenever a shipment's tracking changes and carries the full tracking snapshot. documents.updated is sent whenever the documents retrieved for a shipment change and carries the document collection without file content; it must be enabled for your company. Defaults to tracking.updated.

Items Enum: "tracking.updated" "documents.updated"
error_contact_email
required
string <email> (Error Contact Email)

Who Shipwell contacts about problems delivering to this webhook.

Custom Data (object) or Custom Data (null) (Custom Data)

Any JSON object, echoed back as custom_data in every delivery. At most 4 KB.

Responses
201

Successful Response

Response Schema: application/json
required
object (CreatedTrackingWebhook)
400

Validation Error

403

Tracking webhooks are not enabled for your company (webhooks_not_enabled), or event_names includes documents.updated and it is not enabled for your company (documents_webhooks_not_enabled).

409

Your company already has a tracking webhook. Change its URL instead.

500

An unknown internal server issue occured while processing a request. A report is created and logged.

503

Tracking webhooks are not enabled in this environment yet.

post/tracking/webhooks
Request samples
application/json
{}
Response samples
application/json
{}
Copyright © Shipwell 2025. All right reserved.