Search docs ⌘K
esc
Type to search across all documentation pages
Delivery

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.

Order lifecycle: pending → assigned → accepted → in_transit → arrived_pickup → picked_up → in_delivery → arrived_dropoff → delivered. Orders can be cancelled from pending/assigned/accepted states, or marked as failed from picked_up/in_delivery/arrived_dropoff.

Create an order

POST
/modules/delivery/orders
delivery:write0.0000053 tokens

Create a new delivery order with optional pickup, dropoff, scheduling, and assignment fields.

curl
curl -X POST https://api.saasignal.saastemly.com/modules/delivery/orders \
  -H "Authorization: Bearer sk_live_..." \
  -H "Content-Type: application/json" \
  -d '{}'
json — 201 Created
{ "status": "ok" }
typescript
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' },
})
  1. Open Delivery and go to Orders
  2. Click Create Order
  3. Fill in customer, pickup and dropoff details, then click Save
Body field
Type
Description
external_id
string
customer_id
string
driver_id
string
zone_id
string
hub_id
string
priority
integer
range ≥-9007199254740991 .. ≤9007199254740991
pickup_address
string
pickup_lat
number
range ≥-90 .. ≤90
pickup_lng
number
range ≥-180 .. ≤180
dropoff_address
string
dropoff_lat
number
range ≥-90 .. ≤90
dropoff_lng
number
range ≥-180 .. ≤180
scheduled_at
string
items
array
max 500 items
amount
number
currency
string
max 3 chars
metadata
object
Error responses
401 Unauthorized
402 Insufficient tokens
429 Rate limited

List orders

GET
/modules/delivery/orders
delivery:read0.0000008 tokens

List delivery orders.

curl
curl https://api.saasignal.saastemly.com/modules/delivery/orders \
  -H "Authorization: Bearer sk_live_..."
json — 200 OK
{ "status": "ok" }
typescript
const orders = await ss.delivery.orders.list()
  1. Open Delivery and go to Orders
  2. Browse or filter the order list
Query param
Type
Description
status
string
driver_id
string
customer_id
string
limit
integer
range ≥1 .. ≤100default 25
cursor
string
Error responses
401 Unauthorized
402 Insufficient tokens
429 Rate limited

Get an order

GET
/modules/delivery/orders/{order_id}
delivery:read0.0000008 tokens

Retrieve a single order.

curl
curl https://api.saasignal.saastemly.com/modules/delivery/orders/{order_id} \
  -H "Authorization: Bearer sk_live_..."
json — 200 OK
{ "status": "ok" }
typescript
const order = await ss.delivery.orders.get('ord_01')
  1. Open Delivery and go to Orders
  2. Click on an order to view its details
Path param
Type
Description
order_id required
string
Error responses
401 Unauthorized
402 Insufficient tokens
404 Not found
429 Rate limited

Update an order

PATCH
/modules/delivery/orders/{order_id}
delivery:write0.0000053 tokens

Update a delivery order.

curl
curl -X PATCH https://api.saasignal.saastemly.com/modules/delivery/orders/{order_id} \
  -H "Authorization: Bearer sk_live_..." \
  -H "Content-Type: application/json" \
  -d '{}'
json — 200 OK
{ "status": "ok" }
typescript
const updated = await ss.delivery.orders.update('ord_01', {
  notes: 'Leave at front desk',
})
  1. Open Delivery and go to Orders
  2. Click on an order, edit the fields, then click Save
Path param
Type
Description
order_id required
string
Body field
Type
Description
external_id
mixed
customer_id
mixed
driver_id
mixed
zone_id
mixed
hub_id
mixed
priority
integer
range ≥-9007199254740991 .. ≤9007199254740991
pickup_address
string
pickup_lat
number
range ≥-90 .. ≤90
pickup_lng
number
range ≥-180 .. ≤180
dropoff_address
string
dropoff_lat
number
range ≥-90 .. ≤90
dropoff_lng
number
range ≥-180 .. ≤180
scheduled_at
mixed
items
array
max 500 items
amount
number
currency
string
max 3 chars
metadata
object
Error responses
401 Unauthorized
402 Insufficient tokens
404 Not found
429 Rate limited

Transition order status

POST
/modules/delivery/orders/{order_id}/transition
delivery:write0.0000106 tokens

Transition an order to a new status.

curl
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"}'
json — 200 OK
{ "status": "ok" }
typescript
await ss.delivery.orders.transition('ord_01', {
  status: 'in_transit',
  driver_id: 'drv_01',
})
  1. Open Delivery and go to Orders
  2. Click on an order and use the Status dropdown to transition it
Path param
Type
Description
order_id required
string
Body field
Type
Description
status required
string
driver_id
string
failed_reason
string
cancelled_reason
string
actor
string
Error responses
401 Unauthorized
402 Insufficient tokens
404 Not found
422 Unprocessable entity
429 Rate limited

List order events

GET
/modules/delivery/orders/{order_id}/events
delivery:read0.0000008 tokens

List events for an order.

curl
curl https://api.saasignal.saastemly.com/modules/delivery/orders/{order_id}/events \
  -H "Authorization: Bearer sk_live_..."
json — 200 OK
{ "status": "ok" }
typescript
const events = await ss.delivery.orders.events('ord_01')
  1. Open Delivery and go to Orders
  2. Click on an order, then open the Events tab
Path param
Type
Description
order_id required
string
Error responses
401 Unauthorized
402 Insufficient tokens
429 Rate limited

Delete an order

DELETE
/modules/delivery/orders/{order_id}
delivery:admin

Permanently remove an order.

curl
curl -X DELETE https://api.saasignal.saastemly.com/modules/delivery/orders/{order_id} \
  -H "Authorization: Bearer sk_live_..."
json — 200 OK
{ "status": "ok" }
typescript
await ss.delivery.orders.delete('ord_01')
  1. Open Delivery and go to Orders
  2. Click on an order, then click Delete
Path param
Type
Description
order_id required
string
Error responses
401 Unauthorized
402 Insufficient tokens
404 Not found
429 Rate limited

Submit delivery proof

POST
/modules/delivery/orders/{order_id}/proof
delivery:track0.0000053 tokens

Submit proof of delivery for an order.

curl
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"}}'
json — 201 Created
{ "status": "ok" }
typescript
await ss.delivery.orders.addProof('ord_01', {
  type: 'signature',
  value: 'data:image/png;base64,iVBORw0KGgo...',
  lat: 40.7128,
  lng: -74.006,
})
  1. Open Delivery and go to Orders
  2. Click on a delivered order, then open Proof of Delivery
  3. Upload a photo or signature
Path param
Type
Description
order_id required
string
Body field
Type
Description
type required
string
values: signature, photo, note, barcode
value required
string
1–500000 chars
stop_id
string
lat
number
range ≥-90 .. ≤90
lng
number
range ≥-180 .. ≤180
Error responses
401 Unauthorized
402 Insufficient tokens
429 Rate limited

Upload photo proof

POST
/modules/delivery/orders/{order_id}/proof/photo
delivery:track0.0000044 tokens

Upload a photo file as delivery proof. Send raw image bytes with appropriate Content-Type header. Max 10 MB.

curl
curl -X POST https://api.saasignal.saastemly.com/modules/delivery/orders/{order_id}/proof/photo \
  -H "Authorization: Bearer sk_live_..."
json — 201 Created
{ "status": "ok" }
typescript
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',
})
  1. Open Delivery and go to Orders
  2. Click an order, go to the Proof tab
  3. Click Upload Photo and select an image file
Path param
Type
Description
order_id required
string
Query param
Type
Description
stop_id
string
lat
number
range ≥-90 .. ≤90
lng
number
range ≥-180 .. ≤180
filename
string
max 255 chars
Error responses
400 Bad request
401 Unauthorized
402 Insufficient tokens
429 Rate limited

List order proofs

GET
/modules/delivery/orders/{order_id}/proof
delivery:read0.0000008 tokens

List all proof records for an order. Photo proofs include signed URLs.

curl
curl https://api.saasignal.saastemly.com/modules/delivery/orders/{order_id}/proof \
  -H "Authorization: Bearer sk_live_..."
json — 200 OK
{ "status": "ok" }
typescript
const { proofs } = await ss.delivery.orders.listProofs('ord_01')
for (const p of proofs) {
  console.log(p.type, p.url)
}
  1. Open Delivery and go to Orders
  2. Click an order, go to the Proof tab to see all proof records
Path param
Type
Description
order_id required
string
Error responses
401 Unauthorized
402 Insufficient tokens
429 Rate limited

Get a proof record

GET
/modules/delivery/orders/{order_id}/proof/{proof_id}
delivery:read0.0000008 tokens

Retrieve a single proof record. Photo proofs include a signed URL.

curl
curl https://api.saasignal.saastemly.com/modules/delivery/orders/{order_id}/proof/{proof_id} \
  -H "Authorization: Bearer sk_live_..."
json — 200 OK
{ "status": "ok" }
typescript
const proof = await ss.delivery.orders.getProof('ord_01', 'dprf_01')
  1. Open Delivery and go to Orders
  2. Click an order, go to the Proof tab
  3. The proof details and photo preview are displayed inline
Path param
Type
Description
order_id required
string
proof_id required
string
Error responses
401 Unauthorized
402 Insufficient tokens
404 Not found
429 Rate limited

Delete a proof record

DELETE
/modules/delivery/orders/{order_id}/proof/{proof_id}
delivery:write0.0000053 tokens

Delete a proof record and its associated file.

curl
curl -X DELETE https://api.saasignal.saastemly.com/modules/delivery/orders/{order_id}/proof/{proof_id} \
  -H "Authorization: Bearer sk_live_..."
typescript
await ss.delivery.orders.deleteProof('ord_01', 'dprf_01')
  1. Open Delivery and go to Orders
  2. Click an order, go to the Proof tab
  3. Click the delete icon next to a proof record
Path param
Type
Description
order_id required
string
proof_id required
string
Error responses
401 Unauthorized
402 Insufficient tokens
404 Not found
429 Rate limited

Stops

Manage pickup, dropoff, and waypoint stops within an order.

Create a stop

POST
/modules/delivery/orders/{order_id}/stops
delivery:write0.0000053 tokens

Add a stop to an order.

curl
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"}'
json — 201 Created
{ "status": "ok" }
typescript
const stop = await ss.delivery.stops.create('ord_01', {
  type: 'dropoff',
  lat: 40.73,
  lng: -73.98,
  address: '23 Park Ave',
})
  1. Open Delivery and go to Orders
  2. Click on an order, then click Add Stop
  3. Fill in stop details and click Save
Path param
Type
Description
order_id required
string
Body field
Type
Description
sequence required
integer
range ≥-9007199254740991 .. ≤9007199254740991
type required
string
values: pickup, dropoff, waypoint
address
string
lat
number
range ≥-90 .. ≤90
lng
number
range ≥-180 .. ≤180
contact_name
string
contact_phone
string
notes
string
metadata
object
Error responses
401 Unauthorized
402 Insufficient tokens
404 Not found
429 Rate limited

List stops for an order

GET
/modules/delivery/orders/{order_id}/stops
delivery:read0.0000008 tokens

List all stops for an order.

curl
curl https://api.saasignal.saastemly.com/modules/delivery/orders/{order_id}/stops \
  -H "Authorization: Bearer sk_live_..."
json — 200 OK
{ "status": "ok" }
typescript
const stops = await ss.delivery.stops.list('ord_01')
  1. Open Delivery and go to Orders
  2. Click on an order to see its stops
Path param
Type
Description
order_id required
string
Error responses
401 Unauthorized
402 Insufficient tokens
429 Rate limited

Get a stop

GET
/modules/delivery/stops/{stop_id}
delivery:read0.0000008 tokens

Retrieve a single stop.

curl
curl https://api.saasignal.saastemly.com/modules/delivery/stops/{stop_id} \
  -H "Authorization: Bearer sk_live_..."
json — 200 OK
{ "status": "ok" }
typescript
const stop = await ss.delivery.stops.get('stop_01')
  1. Open Delivery and go to Orders
  2. Click on an order, then click a stop to view its details
Path param
Type
Description
stop_id required
string
Error responses
401 Unauthorized
402 Insufficient tokens
404 Not found
429 Rate limited

Update a stop

PATCH
/modules/delivery/stops/{stop_id}
delivery:write0.0000053 tokens

Update a delivery stop.

curl
curl -X PATCH https://api.saasignal.saastemly.com/modules/delivery/stops/{stop_id} \
  -H "Authorization: Bearer sk_live_..." \
  -H "Content-Type: application/json" \
  -d '{}'
json — 200 OK
{ "status": "ok" }
typescript
const updated = await ss.delivery.stops.update('stop_01', {
  notes: 'Ring doorbell',
})
  1. Open Delivery and go to Orders
  2. Click on an order, click a stop, edit the fields, then click Save
Path param
Type
Description
stop_id required
string
Body field
Type
Description
sequence
integer
range ≥-9007199254740991 .. ≤9007199254740991
type
string
values: pickup, dropoff, waypoint
address
string
lat
number
range ≥-90 .. ≤90
lng
number
range ≥-180 .. ≤180
contact_name
string
contact_phone
string
notes
string
metadata
object
Error responses
401 Unauthorized
402 Insufficient tokens
404 Not found
429 Rate limited

Mark stop arrived

POST
/modules/delivery/stops/{stop_id}/arrive
delivery:track0.0000053 tokens

Mark a stop as arrived.

curl
curl -X POST https://api.saasignal.saastemly.com/modules/delivery/stops/{stop_id}/arrive \
  -H "Authorization: Bearer sk_live_..."
json — 200 OK
{ "status": "ok" }
typescript
await ss.delivery.stops.arrive('stop_01')
  1. Open Delivery and go to Orders
  2. Click on an order, click a stop, then click Arrive
Path param
Type
Description
stop_id required
string
Error responses
401 Unauthorized
402 Insufficient tokens
404 Not found
429 Rate limited

Complete a stop

POST
/modules/delivery/stops/{stop_id}/complete
delivery:track0.0000053 tokens

Mark a stop as completed.

curl
curl -X POST https://api.saasignal.saastemly.com/modules/delivery/stops/{stop_id}/complete \
  -H "Authorization: Bearer sk_live_..."
json — 200 OK
{ "status": "ok" }
typescript
await ss.delivery.stops.complete('stop_01')
  1. Open Delivery and go to Orders
  2. Click on an order, click a stop, then click Complete
Path param
Type
Description
stop_id required
string
Error responses
401 Unauthorized
402 Insufficient tokens
404 Not found
429 Rate limited

Skip a stop

POST
/modules/delivery/stops/{stop_id}/skip
delivery:track0.0000053 tokens

Skip a stop.

curl
curl -X POST https://api.saasignal.saastemly.com/modules/delivery/stops/{stop_id}/skip \
  -H "Authorization: Bearer sk_live_..."
json — 200 OK
{ "status": "ok" }
typescript
await ss.delivery.stops.skip('stop_01')
  1. Open Delivery and go to Orders
  2. Click on an order, click a stop, then click Skip
Path param
Type
Description
stop_id required
string
Error responses
401 Unauthorized
402 Insufficient tokens
404 Not found
429 Rate limited

Delete a stop

DELETE
/modules/delivery/stops/{stop_id}
delivery:write

Permanently remove a stop.

curl
curl -X DELETE https://api.saasignal.saastemly.com/modules/delivery/stops/{stop_id} \
  -H "Authorization: Bearer sk_live_..."
json — 200 OK
{ "status": "ok" }
typescript
await ss.delivery.stops.delete('stop_01')
  1. Open Delivery and go to Orders
  2. Click on an order, click a stop, then click Delete
Path param
Type
Description
stop_id required
string
Error responses
401 Unauthorized
402 Insufficient tokens
404 Not found
429 Rate limited