Skip to content

Books a delivery against a quote.

POST
/v1/jobs
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 }'
Media typeapplication/json

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
quote_id
required

The quote to book against, from POST /v1/quotes.

string
pickup
required

Who the courier is collecting from, and how to reach them.

object
latitude
required
number | string format: double
/^-?(?:0|[1-9]\d*)(?:\.\d+)?(?:[eE][+-]?\d+)?$/
longitude
required
number | string format: double
/^-?(?:0|[1-9]\d*)(?:\.\d+)?(?:[eE][+-]?\d+)?$/
address
required
string
contact_name
required
string
contact_phone
required
string
postcode
null | string
notes
null | string
dropoff
required

Who the courier is delivering to.

object
latitude
required
number | string format: double
/^-?(?:0|[1-9]\d*)(?:\.\d+)?(?:[eE][+-]?\d+)?$/
longitude
required
number | string format: double
/^-?(?:0|[1-9]\d*)(?:\.\d+)?(?:[eE][+-]?\d+)?$/
address
required
string
contact_name
required
string
contact_phone
required
string
postcode
null | string
notes
null | string
scheduled_for

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.

null | string format: date-time
items

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.

Array<object> | null

One line of the order: what, how much each, how many.

object
name
required

What it is, as it appears on the receipt. Required.

string
unit_price_minor
required

What one costs, in minor units of the quote’s currency. Zero is allowed.

integer | string format: int64
/^-?(?:0|[1-9]\d*)$/
quantity
required

How many. A whole number, at least one.

integer | string format: int32
/^-?(?:0|[1-9]\d*)$/
discount_minor

Optional. Money off the items, in minor units. Omitted means none. Cannot exceed what the items come to.

null | integer | string format: int64
/^-?(?:0|[1-9]\d*)$/
items_total_minor

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.

null | integer | string format: int64
/^-?(?:0|[1-9]\d*)$/
notify_customer

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.

null | boolean

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
}

Created

Media typeapplication/json

A booked delivery.

object
id
required
string
reference
required
string
status
required
string
currency
required
string
price_amount_minor
required
integer | string format: int64
/^-?(?:0|[1-9]\d*)$/
vehicle
required
string
tracking_url
required
string
booked_at
required
string format: date-time
scheduled_for
required
null | string format: date-time

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

Media typeapplication/json

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
code
required
string
message
required
string

Example generated

{
"code": "example",
"message": "example"
}

Unprocessable Entity

Media typeapplication/json

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
code
required
string
message
required
string

Example generated

{
"code": "example",
"message": "example"
}