Books a delivery against a quote.
const url = 'https://courierapi.itdlogisoft.co.uk/v1/jobs';const options = { method: 'POST', headers: {Authorization: 'Basic <credentials>', 'Content-Type': 'application/json'}, body: '{"quote_id":"example","pickup":{"latitude":1,"longitude":1,"address":"example","contact_name":"example","contact_phone":"example","postcode":"example","notes":"example"},"dropoff":{"latitude":1,"longitude":1,"address":"example","contact_name":"example","contact_phone":"example","postcode":"example","notes":"example"},"scheduled_for":"2026-04-15T12:00:00Z","items":[{"name":"example","unit_price_minor":1,"quantity":1}],"discount_minor":1,"items_total_minor":1,"notify_customer":true}'};
try { const response = await fetch(url, options); const data = await response.json(); console.log(data);} catch (error) { console.error(error);}curl --request POST \ --url https://courierapi.itdlogisoft.co.uk/v1/jobs \ --header 'Authorization: Basic <credentials>' \ --header 'Content-Type: application/json' \ --data '{ "quote_id": "example", "pickup": { "latitude": 1, "longitude": 1, "address": "example", "contact_name": "example", "contact_phone": "example", "postcode": "example", "notes": "example" }, "dropoff": { "latitude": 1, "longitude": 1, "address": "example", "contact_name": "example", "contact_phone": "example", "postcode": "example", "notes": "example" }, "scheduled_for": "2026-04-15T12:00:00Z", "items": [ { "name": "example", "unit_price_minor": 1, "quantity": 1 } ], "discount_minor": 1, "items_total_minor": 1, "notify_customer": true }'Authorizations
Section titled “Authorizations”Request Bodyrequired
Section titled “Request Bodyrequired”The shape of POST /v1/jobs.
A job is booked against a quote rather than re-describing the journey, which is why there are no coordinates here. The price was agreed when the quote was issued and cannot drift between agreeing it and booking it — and the quote can only be spent once, so a retried booking cannot become two deliveries.
object
The quote to book against, from POST /v1/quotes.
Who the courier is collecting from, and how to reach them.
object
Who the courier is delivering to.
object
Optional. When the job should happen; must match what the quote was priced for. Omitted means now,
and the job starts looking for a courier immediately. A later time leaves the job pending
until twenty minutes before it, when the search opens on its own; a time that has already passed
is refused with job.scheduled_in_past.
Optional. What is in the bag, line by line, in the order it appears on the customer’s receipt. The courier reads this at the counter and the customer’s door; omit it for a parcel that has no itemised order. Every amount is in the quote’s currency, in minor units.
One line of the order: what, how much each, how many.
object
What it is, as it appears on the receipt. Required.
What one costs, in minor units of the quote’s currency. Zero is allowed.
How many. A whole number, at least one.
Optional. Money off the items, in minor units. Omitted means none. Cannot exceed what the items come to.
Optional. What the customer was billed for the goods, in minor units. Omitted means the items less the discount. When sent it is kept as sent — your bill may carry a service charge we know nothing about — so the number the customer saw is the number the courier and our support see.
None of these figures is what you are charged. That is price_amount_minor, fixed by the quote.
Optional. Whether the person at the drop-off is texted the tracking link when the courier collects.
Omitted means what your account is set to; send false for a customer with no mobile, or
true for one who asked. Only numbers in the countries we operate in are texted.
Example generated
{ "quote_id": "example", "pickup": { "latitude": 1, "longitude": 1, "address": "example", "contact_name": "example", "contact_phone": "example", "postcode": "example", "notes": "example" }, "dropoff": { "latitude": 1, "longitude": 1, "address": "example", "contact_name": "example", "contact_phone": "example", "postcode": "example", "notes": "example" }, "scheduled_for": "2026-04-15T12:00:00Z", "items": [ { "name": "example", "unit_price_minor": 1, "quantity": 1 } ], "discount_minor": 1, "items_total_minor": 1, "notify_customer": true}Responses
Section titled “Responses”Created
A booked delivery.
object
Example generated
{ "id": "example", "reference": "example", "status": "example", "currency": "example", "price_amount_minor": 1, "vehicle": "example", "tracking_url": "example", "booked_at": "2026-04-15T12:00:00Z", "scheduled_for": "2026-04-15T12:00:00Z"}Unauthorized
Conflict
The shape of every refusal from this API.
string ApiError.Code is stable and machine-readable; string ApiError.Message is for a human reading a log and may change without notice. Integrators are told to branch on the code.
object
Example generated
{ "code": "example", "message": "example"}Unprocessable Entity
The shape of every refusal from this API.
string ApiError.Code is stable and machine-readable; string ApiError.Message is for a human reading a log and may change without notice. Integrators are told to branch on the code.
object
Example generated
{ "code": "example", "message": "example"}