Delivery Orders
Create, track, and manage delivery orders through their full lifecycle. Orders support multi-stop routes, driver assignment, status transitions, proof of delivery, and event logging. All routes live under /modules/delivery/* and require a token with delivery:read or delivery:write scope.
Create an order
Create a new delivery order with optional pickup, dropoff, scheduling, and assignment fields.
curl -X POST https://api.saasignal.saastemly.com/modules/delivery/orders \
-H "Authorization: Bearer sk_live_..." \
-H "Content-Type: application/json" \
-d '{}'
{ "status": "ok" }
const order = await ss.delivery.orders.create({
customer_id: 'cust_01',
pickup: { lat: 40.75, lng: -73.99, address: '350 Fifth Ave' },
dropoff: { lat: 40.73, lng: -73.98, address: '23 Park Ave' },
})
- Open Delivery and go to Orders
- Click Create Order
- Fill in customer, pickup and dropoff details, then click Save
external_idcustomer_iddriver_idzone_idhub_idprioritypickup_addresspickup_latpickup_lngdropoff_addressdropoff_latdropoff_lngscheduled_atitemsamountcurrencymetadataList orders
List delivery orders.
curl https://api.saasignal.saastemly.com/modules/delivery/orders \
-H "Authorization: Bearer sk_live_..."
{ "status": "ok" }
const orders = await ss.delivery.orders.list()
- Open Delivery and go to Orders
- Browse or filter the order list
statusdriver_idcustomer_idlimit25cursorGet an order
Retrieve a single order.
curl https://api.saasignal.saastemly.com/modules/delivery/orders/{order_id} \
-H "Authorization: Bearer sk_live_..."
{ "status": "ok" }
const order = await ss.delivery.orders.get('ord_01')
- Open Delivery and go to Orders
- Click on an order to view its details
order_id requiredUpdate an order
Update a delivery order.
curl -X PATCH https://api.saasignal.saastemly.com/modules/delivery/orders/{order_id} \
-H "Authorization: Bearer sk_live_..." \
-H "Content-Type: application/json" \
-d '{}'
{ "status": "ok" }
const updated = await ss.delivery.orders.update('ord_01', {
notes: 'Leave at front desk',
})
- Open Delivery and go to Orders
- Click on an order, edit the fields, then click Save
order_id requiredexternal_idcustomer_iddriver_idzone_idhub_idprioritypickup_addresspickup_latpickup_lngdropoff_addressdropoff_latdropoff_lngscheduled_atitemsamountcurrencymetadataTransition order status
Transition an order to a new status.
curl -X POST https://api.saasignal.saastemly.com/modules/delivery/orders/{order_id}/transition \
-H "Authorization: Bearer sk_live_..." \
-H "Content-Type: application/json" \
-d '{"status":"completed"}'
{ "status": "ok" }
await ss.delivery.orders.transition('ord_01', {
status: 'in_transit',
driver_id: 'drv_01',
})
- Open Delivery and go to Orders
- Click on an order and use the Status dropdown to transition it
order_id requiredstatus requireddriver_idfailed_reasoncancelled_reasonactorList order events
List events for an order.
curl https://api.saasignal.saastemly.com/modules/delivery/orders/{order_id}/events \
-H "Authorization: Bearer sk_live_..."
{ "status": "ok" }
const events = await ss.delivery.orders.events('ord_01')
- Open Delivery and go to Orders
- Click on an order, then open the Events tab
order_id requiredDelete an order
Permanently remove an order.
curl -X DELETE https://api.saasignal.saastemly.com/modules/delivery/orders/{order_id} \
-H "Authorization: Bearer sk_live_..."
{ "status": "ok" }
await ss.delivery.orders.delete('ord_01')
- Open Delivery and go to Orders
- Click on an order, then click Delete
order_id requiredSubmit delivery proof
Submit proof of delivery for an order.
curl -X POST https://api.saasignal.saastemly.com/modules/delivery/orders/{order_id}/proof \
-H "Authorization: Bearer sk_live_..." \
-H "Content-Type: application/json" \
-d '{"type":"driver","value":{"example":"data"}}'
{ "status": "ok" }
await ss.delivery.orders.addProof('ord_01', {
type: 'signature',
value: 'data:image/png;base64,iVBORw0KGgo...',
lat: 40.7128,
lng: -74.006,
})
- Open Delivery and go to Orders
- Click on a delivered order, then open Proof of Delivery
- Upload a photo or signature
order_id requiredtype requiredsignature, photo, note, barcodevalue requiredstop_idlatlngUpload photo proof
Upload a photo file as delivery proof. Send raw image bytes with appropriate Content-Type header. Max 10 MB.
curl -X POST https://api.saasignal.saastemly.com/modules/delivery/orders/{order_id}/proof/photo \
-H "Authorization: Bearer sk_live_..."
{ "status": "ok" }
const photo = await fs.readFile('./proof.jpg')
await ss.delivery.orders.uploadPhotoProof('ord_01', photo, 'image/jpeg', {
lat: 40.7128,
lng: -74.006,
filename: 'proof.jpg',
})
- Open Delivery and go to Orders
- Click an order, go to the Proof tab
- Click Upload Photo and select an image file
order_id requiredstop_idlatlngfilenameList order proofs
List all proof records for an order. Photo proofs include signed URLs.
curl https://api.saasignal.saastemly.com/modules/delivery/orders/{order_id}/proof \
-H "Authorization: Bearer sk_live_..."
{ "status": "ok" }
const { proofs } = await ss.delivery.orders.listProofs('ord_01')
for (const p of proofs) {
console.log(p.type, p.url)
}
- Open Delivery and go to Orders
- Click an order, go to the Proof tab to see all proof records
order_id requiredGet a proof record
Retrieve a single proof record. Photo proofs include a signed URL.
curl https://api.saasignal.saastemly.com/modules/delivery/orders/{order_id}/proof/{proof_id} \
-H "Authorization: Bearer sk_live_..."
{ "status": "ok" }
const proof = await ss.delivery.orders.getProof('ord_01', 'dprf_01')
- Open Delivery and go to Orders
- Click an order, go to the Proof tab
- The proof details and photo preview are displayed inline
order_id requiredproof_id requiredDelete a proof record
Delete a proof record and its associated file.
curl -X DELETE https://api.saasignal.saastemly.com/modules/delivery/orders/{order_id}/proof/{proof_id} \
-H "Authorization: Bearer sk_live_..."
await ss.delivery.orders.deleteProof('ord_01', 'dprf_01')
- Open Delivery and go to Orders
- Click an order, go to the Proof tab
- Click the delete icon next to a proof record
order_id requiredproof_id requiredStops
Manage pickup, dropoff, and waypoint stops within an order.
Create a stop
Add a stop to an order.
curl -X POST https://api.saasignal.saastemly.com/modules/delivery/orders/{order_id}/stops \
-H "Authorization: Bearer sk_live_..." \
-H "Content-Type: application/json" \
-d '{"sequence":1,"type":"driver"}'
{ "status": "ok" }
const stop = await ss.delivery.stops.create('ord_01', {
type: 'dropoff',
lat: 40.73,
lng: -73.98,
address: '23 Park Ave',
})
- Open Delivery and go to Orders
- Click on an order, then click Add Stop
- Fill in stop details and click Save
order_id requiredsequence requiredtype requiredpickup, dropoff, waypointaddresslatlngcontact_namecontact_phonenotesmetadataList stops for an order
List all stops for an order.
curl https://api.saasignal.saastemly.com/modules/delivery/orders/{order_id}/stops \
-H "Authorization: Bearer sk_live_..."
{ "status": "ok" }
const stops = await ss.delivery.stops.list('ord_01')
- Open Delivery and go to Orders
- Click on an order to see its stops
order_id requiredGet a stop
Retrieve a single stop.
curl https://api.saasignal.saastemly.com/modules/delivery/stops/{stop_id} \
-H "Authorization: Bearer sk_live_..."
{ "status": "ok" }
const stop = await ss.delivery.stops.get('stop_01')
- Open Delivery and go to Orders
- Click on an order, then click a stop to view its details
stop_id requiredUpdate a stop
Update a delivery stop.
curl -X PATCH https://api.saasignal.saastemly.com/modules/delivery/stops/{stop_id} \
-H "Authorization: Bearer sk_live_..." \
-H "Content-Type: application/json" \
-d '{}'
{ "status": "ok" }
const updated = await ss.delivery.stops.update('stop_01', {
notes: 'Ring doorbell',
})
- Open Delivery and go to Orders
- Click on an order, click a stop, edit the fields, then click Save
stop_id requiredsequencetypepickup, dropoff, waypointaddresslatlngcontact_namecontact_phonenotesmetadataMark stop arrived
Mark a stop as arrived.
curl -X POST https://api.saasignal.saastemly.com/modules/delivery/stops/{stop_id}/arrive \
-H "Authorization: Bearer sk_live_..."
{ "status": "ok" }
await ss.delivery.stops.arrive('stop_01')
- Open Delivery and go to Orders
- Click on an order, click a stop, then click Arrive
stop_id requiredComplete a stop
Mark a stop as completed.
curl -X POST https://api.saasignal.saastemly.com/modules/delivery/stops/{stop_id}/complete \
-H "Authorization: Bearer sk_live_..."
{ "status": "ok" }
await ss.delivery.stops.complete('stop_01')
- Open Delivery and go to Orders
- Click on an order, click a stop, then click Complete
stop_id requiredSkip a stop
Skip a stop.
curl -X POST https://api.saasignal.saastemly.com/modules/delivery/stops/{stop_id}/skip \
-H "Authorization: Bearer sk_live_..."
{ "status": "ok" }
await ss.delivery.stops.skip('stop_01')
- Open Delivery and go to Orders
- Click on an order, click a stop, then click Skip
stop_id requiredDelete a stop
Permanently remove a stop.
curl -X DELETE https://api.saasignal.saastemly.com/modules/delivery/stops/{stop_id} \
-H "Authorization: Bearer sk_live_..."
{ "status": "ok" }
await ss.delivery.stops.delete('stop_01')
- Open Delivery and go to Orders
- Click on an order, click a stop, then click Delete
stop_id required