Record a stop outcome
const url = 'https://example.com/rounds/019205d1-6e7a-7c3b-9f6e-3a2b1c0d9e8f/stops/019205d1-6e7a-7c3b-9f6e-3a2b1c0d9e8f';const options = { method: 'PUT', headers: { cookie: 'bottle.session_token=<bottle.session_token>', 'Content-Type': 'application/json' }, body: '{"outcome":"delivered","reason":"nobody_in","note":"example","proof":{"kind":"signature","signedBy":"example","note":"example","image":"example"},"items":[{"orderLineId":"019205d1-6e7a-7c3b-9f6e-3a2b1c0d9e8f","quantity":1}],"shortfall":"not_on_vehicle","cashTakenPence":1,"empties":[{"productId":"019205d1-6e7a-7c3b-9f6e-3a2b1c0d9e8f","quantity":1}],"issue":"wrong_product","issueNote":"example","extras":[{"productId":"019205d1-6e7a-7c3b-9f6e-3a2b1c0d9e8f","quantity":1}],"occurredAt":"2026-04-15T12:00:00Z"}'};
try { const response = await fetch(url, options); const data = await response.json(); console.log(data);} catch (error) { console.error(error);}curl --request PUT \ --url https://example.com/rounds/019205d1-6e7a-7c3b-9f6e-3a2b1c0d9e8f/stops/019205d1-6e7a-7c3b-9f6e-3a2b1c0d9e8f \ --header 'Content-Type: application/json' \ --cookie bottle.session_token=<bottle.session_token> \ --data '{ "outcome": "delivered", "reason": "nobody_in", "note": "example", "proof": { "kind": "signature", "signedBy": "example", "note": "example", "image": "example" }, "items": [ { "orderLineId": "019205d1-6e7a-7c3b-9f6e-3a2b1c0d9e8f", "quantity": 1 } ], "shortfall": "not_on_vehicle", "cashTakenPence": 1, "empties": [ { "productId": "019205d1-6e7a-7c3b-9f6e-3a2b1c0d9e8f", "quantity": 1 } ], "issue": "wrong_product", "issueNote": "example", "extras": [ { "productId": "019205d1-6e7a-7c3b-9f6e-3a2b1c0d9e8f", "quantity": 1 } ], "occurredAt": "2026-04-15T12:00:00Z" }'Delivered marks the order delivered and records when. Where fewer items went than were ordered, a shortfall reason is required and decides what happens to the rest: not_on_vehicle and damaged leave it owed to be planned again, refused writes it off with a refund recorded, other leaves it for the office. Failed records why on the stop and leaves the order standing. Pending undoes either. Where more went than was ordered, or extras name a product that was not on the order, the order grows to match at the customer’s own rate, and any invoice or payment link standing against the old figure is voided; not on an order already paid. Only on a round that has left, and a driver may only do this on their own round. Not gated on payment: a driver halfway round is not the person to stop.
Authorizations
Section titled “Authorizations”Parameters
Section titled “Parameters”Path Parameters
Section titled “Path Parameters”UUID v7
Example
019205d1-6e7a-7c3b-9f6e-3a2b1c0d9e8fUUID v7
UUID v7
Example
019205d1-6e7a-7c3b-9f6e-3a2b1c0d9e8fUUID v7
Request Bodyrequired
Section titled “Request Bodyrequired”object
object
A PNG or JPEG data URL. Signatures are PNG, photographs JPEG.
object
UUID v7
Example
019205d1-6e7a-7c3b-9f6e-3a2b1c0d9e8fobject
UUID v7
Example
019205d1-6e7a-7c3b-9f6e-3a2b1c0d9e8fobject
UUID v7
Example
019205d1-6e7a-7c3b-9f6e-3a2b1c0d9e8fWhen it happened, by the device’s clock. Left out, now.
Responses
Section titled “Responses”The round as it now stands
object
UUID v7
UUID v7
UUID v7
UUID v7
object
object
object
UUID v7
UUID v7
object
object
object
UUID v7
UUID v7
object
UUID v7
On_account: billed later, nothing to collect. link: a payment link raised in the accounting system. cash: the driver takes it at the door.
Name, address and postcode in one line.
Example
{ "id": "019205d1-6e7a-7c3b-9f6e-3a2b1c0d9e8f", "vehicleId": "019205d1-6e7a-7c3b-9f6e-3a2b1c0d9e8f", "startLocationId": "019205d1-6e7a-7c3b-9f6e-3a2b1c0d9e8f", "endLocationId": "019205d1-6e7a-7c3b-9f6e-3a2b1c0d9e8f", "status": "planned", "departsAt": "07:30", "fit": { "departsAt": "07:30", "backAt": "07:30", "shiftEnd": "07:30", "over": [ "weight" ] }, "stops": [ { "id": "019205d1-6e7a-7c3b-9f6e-3a2b1c0d9e8f", "orderId": "019205d1-6e7a-7c3b-9f6e-3a2b1c0d9e8f", "etaAt": "07:30", "proof": { "kind": "signature" }, "lines": [ { "orderLineId": "019205d1-6e7a-7c3b-9f6e-3a2b1c0d9e8f", "productId": "019205d1-6e7a-7c3b-9f6e-3a2b1c0d9e8f", "productName": "19kg propane" } ], "collect": [ { "productId": "019205d1-6e7a-7c3b-9f6e-3a2b1c0d9e8f", "productName": "19kg propane" } ], "paymentMethod": "on_account", "leaveInstruction": "none", "shortfallReason": "not_on_vehicle", "issue": "wrong_product", "failureReason": "nobody_in", "summary": "3 × 19kg propane", "orderStatus": "placed" } ]}Not signed in
object
Example
{ "error": "not_found", "message": "Customer not found"}Not a member, or without the permission this needs
object
Example
{ "error": "not_found", "message": "Customer not found"}Not found
object
Example
{ "error": "not_found", "message": "Customer not found"}That round has not left yet, or the order is paid and cannot take extras
object
Example
{ "error": "not_found", "message": "Customer not found"}Validation failed
object
object
Example
{ "error": "validation", "issues": [ { "path": "email", "message": "Invalid email" } ]}