The minimal request
shipments:write scope.
There is no quote call to make first, no branch or pickup-location code to look up, no city or address to supply, no carrier to name, and no service level to choose. Sending more than the four fields above does not get you a better shipment — it gets you a rejected request, because the payload is closed.
What DropHub derives
From those two coordinates alone, DropHub resolves address and city context, the route and its distance, whether the lane is covered, the price under your commercial terms, the eligible carrier, the service and its defaults, dispatch, the lifecycle starting state, SAR as the currency with prepaid as the payment mode, and the customer tracking URL. None of these are inputs, and none are configurable through this API.Phone numbers
mobile is a Saudi mobile number. Three shapes are accepted:
Normalization happens on the way in, so you do not need to canonicalize first. Anything that is not one of these three shapes is rejected with
422.
Optional fields
Add these only when the default is wrong for the order.Parcel — when it is not one small box
Parcel — when it is not one small box
The default parcel is one piece, 1 kg, ambient, described as “Parcel”. Override any part of it:
pieces is 1–100. weightKg is greater than zero. description is 1–160 characters.COD — when the driver collects payment
COD — when the driver collects payment
0 is not the way to say “no COD”; leaving the field out is.Saved pickup — when you always collect from the same place
Saved pickup — when you always collect from the same place
If your account has a saved pickup location, use its code instead of a coordinate:
pickup is one or the other — a savedLocationCode, or a latitude/longitude pair. Never both.Pickup window — when collection is time-bound
Pickup window — when collection is time-bound
The response
Deliberately small — it carries what you cannot compute yourself and nothing more.201 carries a Location header and an ETag. trackingUrl is the customer link, minted automatically — see Tracking.
Retries are already safe
reference is the idempotency key. You do not need to send an Idempotency-Key header.
The optional
Idempotency-Key header (16–128 characters) exists for callers who already have a key of their own. An explicit key always wins over the derived one. See Idempotency and ETags.
Read one back
shipments:read, and returns the same shape as the create response with a current status and version.
There is no collection endpoint and no search. Shipments are addressed by the
id you were handed at creation — store it against your order. For progress, use webhooks rather than polling a list.