Deliveries and tracking links
Deliveries (tasks) from creation to drop-off, with live arrival times, editing, your pickup places and customers, and the tracking links you send customers.
On this page
- The task's proof of delivery (photos, signatures) and the rider's note
- A proof's image (JPEG, PNG or WebP), kept as long as its task
- List tasks, newest first
- Create a delivery
- Get a task with its live ETA
- Edit a delivery
- Assign (or reassign) a vehicle — created|assigned → assigned; event task.assigned
- Mark picked up — assigned → picked_up
- Mark delivered — assigned|picked_up|arriving → completed; event task.completed
- Mark failed — any open status → failed; event task.failed
- Cancel — any open status → cancelled
- Send the customer's delivery PIN to their email
- Whether a delivery PIN can go to a number on WhatsApp
- Set or clear a delivery's own area
- List your pickup places (the default first)
- Add a pickup place (up to 200)
- Get a pickup place
- Edit a pickup place
- Delete a pickup place
- List your customers, most recent delivery first
- Get a customer
- Forget a customer and their addresses
- List a customer's addresses, last used first
- The recipient's tracking link (a new one if it expired; none once the task ended)
Send your key as key=YOUR_API_KEY on the address, or in the X-NWays-Api-Key header. API keys
Base address: https://nways.ng/maps/v1/fleet
The task's proof of delivery (photos, signatures) and the rider's note
GET https://nways.ng/maps/v1/fleet/tasks/{id}/proofs
Parameters
| Name | In | Type | Description |
|---|---|---|---|
id | path | string | Required. |
curl "https://nways.ng/maps/v1/fleet/tasks/string/proofs" \
-H "X-NWays-Api-Key: YOUR_API_KEY"const res = await fetch('https://nways.ng/maps/v1/fleet/tasks/string/proofs', {
headers: { 'X-NWays-Api-Key': process.env.NWAYS_API_KEY },
})
const data = await res.json()import os
import requests
res = requests.get(
"https://nways.ng/maps/v1/fleet/tasks/string/proofs",
headers={"X-NWays-Api-Key": os.environ["NWAYS_API_KEY"]},
timeout=10,
)
data = res.json()Response
Proofs
| Field | Type | Description |
|---|---|---|
taskId | string | Required. |
proofs | Proof[] | Required. |
proofs[].id | string | Required. |
proofs[].kind | string | Required. One of: photo, signature. |
proofs[].contentType | string | Required. One of: image/jpeg, image/png, image/webp. |
proofs[].bytes | integer | Required. |
proofs[].lat | number | null | Required. |
proofs[].lng | number | null | Required. |
proofs[].by | string | Required. The rider's name. |
proofs[].createdAt | string (date-time) | Required. |
endNote | string | Required. What the rider wrote when finishing. |
{
"taskId": "string",
"proofs": [
{
"id": "string",
"kind": "photo",
"contentType": "image/jpeg",
"bytes": 0,
"lat": 0,
"lng": 0,
"by": "string",
"createdAt": "2026-10-15T09:00:00+01:00"
}
],
"endNote": "string"
}Errors
defaultError
A proof's image (JPEG, PNG or WebP), kept as long as its task
GET https://nways.ng/maps/v1/fleet/proofs/{proofId}
Parameters
| Name | In | Type | Description |
|---|---|---|---|
proofId | path | string | Required. |
curl "https://nways.ng/maps/v1/fleet/proofs/string" \
-H "X-NWays-Api-Key: YOUR_API_KEY"const res = await fetch('https://nways.ng/maps/v1/fleet/proofs/string', {
headers: { 'X-NWays-Api-Key': process.env.NWAYS_API_KEY },
})
const data = await res.json()import os
import requests
res = requests.get(
"https://nways.ng/maps/v1/fleet/proofs/string",
headers={"X-NWays-Api-Key": os.environ["NWAYS_API_KEY"]},
timeout=10,
)
data = res.json()Response
The image
Errors
defaultError
List tasks, newest first
GET https://nways.ng/maps/v1/fleet/tasks
Parameters
| Name | In | Type | Description |
|---|---|---|---|
status | query | string | active = assigned, picked_up or arriving. One of: created, assigned, picked_up, arriving, completed, failed, cancelled, active. |
vehicleId | query | string | |
limit | query | integer | Default: 100. ≥ 1, ≤ 500. |
pageToken | query | string | nextPageToken from the previous page. |
curl "https://nways.ng/maps/v1/fleet/tasks" \
-H "X-NWays-Api-Key: YOUR_API_KEY"const res = await fetch('https://nways.ng/maps/v1/fleet/tasks', {
headers: { 'X-NWays-Api-Key': process.env.NWAYS_API_KEY },
})
const data = await res.json()import os
import requests
res = requests.get(
"https://nways.ng/maps/v1/fleet/tasks",
headers={"X-NWays-Api-Key": os.environ["NWAYS_API_KEY"]},
timeout=10,
)
data = res.json()Response
Tasks
| Field | Type | Description |
|---|---|---|
tasks | Task[] | Required. |
tasks[].id | string | Required. |
tasks[].ref | string | Required. The delivery's short number in the project, given by N-Ways ("1042", shown #1042): for people, in alerts and lists. |
tasks[].status | string | Required. One of: created, assigned, picked_up, arriving, completed, failed, cancelled. |
tasks[].vehicleId | string | null | Required. |
tasks[].pickup | Stop | null | Required. |
tasks[].dropoff | Stop | Required. |
tasks[].dropoff.lat | number | Required. |
tasks[].dropoff.lng | number | Required. |
tasks[].dropoff.name | string | Up to 120 characters. |
tasks[].dropoff.address | string | Up to 300 characters. |
tasks[].recipientName | string | Required. |
tasks[].recipientPhone | string | |
tasks[].notes | string | Required. |
tasks[].lang | string | Required. One of: en, fr, pt. |
tasks[].arrivingS | integer | Required. |
tasks[].eta | ETA | null | Required. Null until a fresh position is in, and once the task ends. |
tasks[].dueAt | string (date-time) | null | Required. |
tasks[].late | boolean | Required. Open and past dueAt, or expected after it. |
tasks[].trackingUrl | string (uri) | null | Required. Null once expired. |
tasks[].trackingExpiresAt | string (date-time) | null | Required. |
tasks[].failureReason | string | |
tasks[].createdAt | string (date-time) | Required. |
tasks[].assignedAt | string (date-time) | null | Required. |
tasks[].pickedUpAt | string (date-time) | null | Required. |
tasks[].arrivingAt | string (date-time) | null | Required. |
tasks[].endedAt | string (date-time) | null | Required. |
tasks[].area | Area | null | The delivery's own area: leaving it raises asset.geofence_exit. |
tasks[].proofs | Proof[] | Only in GET /tasks/{id}: the rider's photos and signatures (N-Ways Business). |
tasks[].proofs[].id | string | Required. |
tasks[].proofs[].kind | string | Required. One of: photo, signature. |
tasks[].proofs[].contentType | string | Required. One of: image/jpeg, image/png, image/webp. |
tasks[].proofs[].bytes | integer | Required. |
tasks[].proofs[].lat | number | null | Required. |
tasks[].proofs[].lng | number | null | Required. |
tasks[].proofs[].by | string | Required. The rider's name. |
tasks[].proofs[].createdAt | string (date-time) | Required. |
tasks[].endNote | string | Only in GET /tasks/{id}: what the rider wrote when finishing. |
tasks[].recipientEmail | string | |
tasks[].proofRequired | string[] | The delivery's own, else your settings'. |
tasks[].proofRequiredOverride | string[] | null | |
tasks[].packageSize | string | null | One of: small, medium, large, null. |
tasks[].itemDescription | string | |
tasks[].reference | string | |
tasks[].scheduledAt | string (date-time) | null | |
tasks[].connectionId | string | null | The N-Ways driver's connection that accepted it. |
tasks[].acceptedAt | string (date-time) | null | |
tasks[].startedAt | string (date-time) | null | |
tasks[].editable | string | What PATCH /tasks/{id} may change now: everything, only notes and dueAt (picked up or started), or nothing (ended). One of: all, limited, none. |
tasks[].editedAt | string (date-time) | null | The last edit. |
tasks[].editedFields | string[] | What the last edit changed. |
tasks[].pinDelivery | PinDelivery | How the delivery PIN is reaching the customer, when the delivery asks for one and PINs go on WhatsApp. Never the PIN itself. |
tasks[].pinDelivery.channel | string | Required. One of: whatsapp, email, none. |
tasks[].pinDelivery.state | string | Required. One of: sending, sent, delivered, read, failed. |
tasks[].pinDelivery.whatsappErrorCode | integer | null | Required. WhatsApp's failure (131026: not on WhatsApp), kept after the PIN went by email. |
tasks[].pinDelivery.needsEmail | boolean | Required. The customer hasn't got the PIN: send it with POST /tasks/{id}/pin-email. |
tasks[].pinDelivery.updatedAt | string (date-time) | Required. |
nextPageToken | string |
{
"tasks": [
{
"id": "string",
"ref": "string",
"status": "created",
"vehicleId": "string",
"pickup": {
"lat": 0,
"lng": 0,
"name": "string",
"address": "string"
},
"dropoff": {
"lat": 0,
"lng": 0,
"name": "string",
"address": "string"
},
"recipientName": "string",
"recipientPhone": "string",
"notes": "string",
"lang": "en",
"arrivingS": 0,
"eta": {
"at": "2026-10-15T09:00:00+01:00",
"durationS": 0,
"distanceM": 0,
"trafficDelayS": 0,
"pickupAt": "2026-10-15T09:00:00+01:00",
"updatedAt": "2026-10-15T09:00:00+01:00"
},
"dueAt": "2026-10-15T09:00:00+01:00",
"late": true,
"trackingUrl": "string",
"trackingExpiresAt": "2026-10-15T09:00:00+01:00",
"failureReason": "string",
"createdAt": "2026-10-15T09:00:00+01:00",
"assignedAt": "2026-10-15T09:00:00+01:00",
"pickedUpAt": "2026-10-15T09:00:00+01:00",
"arrivingAt": "2026-10-15T09:00:00+01:00",
"endedAt": "2026-10-15T09:00:00+01:00",
"area": {
"type": "circle",
"lat": 6.48,
"lng": 3.43,
"radiusM": 2500
},
"proofs": [
{
"id": "string",
"kind": "photo",
"contentType": "image/jpeg",
"bytes": 0,
"lat": 0,
"lng": 0,
"by": "string",
"createdAt": "2026-10-15T09:00:00+01:00"
}
],
"endNote": "string",
"recipientEmail": "string",
"proofRequired": [
"photo"
],
"proofRequiredOverride": [
"string"
],
"packageSize": "small",
"itemDescription": "string",
"reference": "string",
"scheduledAt": "2026-10-15T09:00:00+01:00",
"connectionId": "string",
"acceptedAt": "2026-10-15T09:00:00+01:00",
"startedAt": "2026-10-15T09:00:00+01:00",
"editable": "all",
"editedAt": "2026-10-15T09:00:00+01:00",
"editedFields": [
"string"
],
"pinDelivery": {
"channel": "whatsapp",
"state": "sending",
"whatsappErrorCode": 0,
"needsEmail": true,
"updatedAt": "2026-10-15T09:00:00+01:00"
}
}
],
"nextPageToken": "string"
}Errors
defaultError
Create a delivery
POST https://nways.ng/maps/v1/fleet/tasks
A task has an optional pickup and a drop-off. Give vehicleId to assign it at once. The answer has the recipient's trackingUrl (valid 72 hours, or until an hour after the task ends). Events: task.created (and task.assigned).
Request body
| Field | Type | Description |
|---|---|---|
id | string | Your id for it; N-Ways makes one (job_…) when you leave it out. |
pickup | Stop | |
pickup.lat | number | Required. |
pickup.lng | number | Required. |
pickup.name | string | Up to 120 characters. |
pickup.address | string | Up to 300 characters. |
pickupPlaceId | string | One of your pickup places as the pickup (its name, address and position are copied in), instead of pickup. |
dropoff | Stop | Required. |
dropoff.lat | number | Required. |
dropoff.lng | number | Required. |
dropoff.name | string | Up to 120 characters. |
dropoff.address | string | Up to 300 characters. |
recipientName | string | For your records; never shown on the tracking page. Up to 100 characters. |
recipientPhone | string | So the rider can call the customer from N-Ways Business; never shown on the tracking page. Up to 32 characters. |
notes | string | Up to 500 characters. |
lang | string | The tracking page's language. One of: en, fr, pt. Default: en. |
arrivingS | integer | Seconds before arrival at which the task becomes arriving. Default: 180. ≥ 30, ≤ 1800. |
vehicleId | string | |
dueAt | string (date-time) | The deadline: past it (or expected after it) the task is late. |
area | Area | A circle (lat, lng, radiusM 50–100000) or a polygon (coordinates: 3–500 [lng, lat] points). |
area.type | string | Required. One of: circle, polygon. |
area.lat | number | |
area.lng | number | |
area.radiusM | number | ≥ 50, ≤ 100000. |
area.coordinates | number[][] | |
recipientEmail | string (email) | N-Ways emails the customer its news (on its way, arriving, delivered) with the tracking link. |
proofRequired | string[] | What the driver must give to deliver; leave out for your settings' proofRequired. |
packageSize | string | One of: small, medium, large. |
itemDescription | string | Up to 200 characters. |
reference | string | Your own reference (an invoice or order number). Up to 64 characters. |
scheduledAt | string (date-time) | A pickup later (up to 60 days ahead): the driver is reminded before it. |
curl -X POST "https://nways.ng/maps/v1/fleet/tasks" \
-H "X-NWays-Api-Key: YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{"id":"order-88412","pickup":{"lat":6.5095,"lng":3.3711,"name":"Mama Put","Yaba":null,"address":"12 Herbert Macaulay Way"},"dropoff":{"lat":6.4969,"lng":3.3539,"name":"Home","address":"4 Adeniran Ogunsanya St"},"lang":"en","vehicleId":"bike-17"}'const res = await fetch('https://nways.ng/maps/v1/fleet/tasks', {
method: 'POST',
headers: { 'X-NWays-Api-Key': process.env.NWAYS_API_KEY, 'Content-Type': 'application/json' },
body: JSON.stringify({
"id": "order-88412",
"pickup": {
"lat": 6.5095,
"lng": 3.3711,
"name": "Mama Put",
"Yaba": null,
"address": "12 Herbert Macaulay Way"
},
"dropoff": {
"lat": 6.4969,
"lng": 3.3539,
"name": "Home",
"address": "4 Adeniran Ogunsanya St"
},
"lang": "en",
"vehicleId": "bike-17"
}),
})
const data = await res.json()import os
import requests
res = requests.post(
"https://nways.ng/maps/v1/fleet/tasks",
headers={"X-NWays-Api-Key": os.environ["NWAYS_API_KEY"]},
json={"id": "order-88412", "pickup": {"lat": 6.5095, "lng": 3.3711, "name": "Mama Put", "Yaba": None, "address": "12 Herbert Macaulay Way"}, "dropoff": {"lat": 6.4969, "lng": 3.3539, "name": "Home", "address": "4 Adeniran Ogunsanya St"}, "lang": "en", "vehicleId": "bike-17"},
timeout=10,
)
data = res.json()Response
Created
| Field | Type | Description |
|---|---|---|
id | string | Required. |
ref | string | Required. The delivery's short number in the project, given by N-Ways ("1042", shown #1042): for people, in alerts and lists. |
status | string | Required. One of: created, assigned, picked_up, arriving, completed, failed, cancelled. |
vehicleId | string | null | Required. |
pickup | Stop | null | Required. |
dropoff | Stop | Required. |
dropoff.lat | number | Required. |
dropoff.lng | number | Required. |
dropoff.name | string | Up to 120 characters. |
dropoff.address | string | Up to 300 characters. |
recipientName | string | Required. |
recipientPhone | string | |
notes | string | Required. |
lang | string | Required. One of: en, fr, pt. |
arrivingS | integer | Required. |
eta | ETA | null | Required. Null until a fresh position is in, and once the task ends. |
dueAt | string (date-time) | null | Required. |
late | boolean | Required. Open and past dueAt, or expected after it. |
trackingUrl | string (uri) | null | Required. Null once expired. |
trackingExpiresAt | string (date-time) | null | Required. |
failureReason | string | |
createdAt | string (date-time) | Required. |
assignedAt | string (date-time) | null | Required. |
pickedUpAt | string (date-time) | null | Required. |
arrivingAt | string (date-time) | null | Required. |
endedAt | string (date-time) | null | Required. |
area | Area | null | The delivery's own area: leaving it raises asset.geofence_exit. |
proofs | Proof[] | Only in GET /tasks/{id}: the rider's photos and signatures (N-Ways Business). |
proofs[].id | string | Required. |
proofs[].kind | string | Required. One of: photo, signature. |
proofs[].contentType | string | Required. One of: image/jpeg, image/png, image/webp. |
proofs[].bytes | integer | Required. |
proofs[].lat | number | null | Required. |
proofs[].lng | number | null | Required. |
proofs[].by | string | Required. The rider's name. |
proofs[].createdAt | string (date-time) | Required. |
endNote | string | Only in GET /tasks/{id}: what the rider wrote when finishing. |
recipientEmail | string | |
proofRequired | string[] | The delivery's own, else your settings'. |
proofRequiredOverride | string[] | null | |
packageSize | string | null | One of: small, medium, large, null. |
itemDescription | string | |
reference | string | |
scheduledAt | string (date-time) | null | |
connectionId | string | null | The N-Ways driver's connection that accepted it. |
acceptedAt | string (date-time) | null | |
startedAt | string (date-time) | null | |
editable | string | What PATCH /tasks/{id} may change now: everything, only notes and dueAt (picked up or started), or nothing (ended). One of: all, limited, none. |
editedAt | string (date-time) | null | The last edit. |
editedFields | string[] | What the last edit changed. |
pinDelivery | PinDelivery | How the delivery PIN is reaching the customer, when the delivery asks for one and PINs go on WhatsApp. Never the PIN itself. |
pinDelivery.channel | string | Required. One of: whatsapp, email, none. |
pinDelivery.state | string | Required. One of: sending, sent, delivered, read, failed. |
pinDelivery.whatsappErrorCode | integer | null | Required. WhatsApp's failure (131026: not on WhatsApp), kept after the PIN went by email. |
pinDelivery.needsEmail | boolean | Required. The customer hasn't got the PIN: send it with POST /tasks/{id}/pin-email. |
pinDelivery.updatedAt | string (date-time) | Required. |
{
"id": "string",
"ref": "string",
"status": "created",
"vehicleId": "string",
"pickup": {
"lat": 0,
"lng": 0,
"name": "string",
"address": "string"
},
"dropoff": {
"lat": 0,
"lng": 0,
"name": "string",
"address": "string"
},
"recipientName": "string",
"recipientPhone": "string",
"notes": "string",
"lang": "en",
"arrivingS": 0,
"eta": {
"at": "2026-10-15T09:00:00+01:00",
"durationS": 0,
"distanceM": 0,
"trafficDelayS": 0,
"pickupAt": "2026-10-15T09:00:00+01:00",
"updatedAt": "2026-10-15T09:00:00+01:00"
},
"dueAt": "2026-10-15T09:00:00+01:00",
"late": true,
"trackingUrl": "string",
"trackingExpiresAt": "2026-10-15T09:00:00+01:00",
"failureReason": "string",
"createdAt": "2026-10-15T09:00:00+01:00",
"assignedAt": "2026-10-15T09:00:00+01:00",
"pickedUpAt": "2026-10-15T09:00:00+01:00",
"arrivingAt": "2026-10-15T09:00:00+01:00",
"endedAt": "2026-10-15T09:00:00+01:00",
"area": {
"type": "circle",
"lat": 6.48,
"lng": 3.43,
"radiusM": 2500
},
"proofs": [
{
"id": "string",
"kind": "photo",
"contentType": "image/jpeg",
"bytes": 0,
"lat": 0,
"lng": 0,
"by": "string",
"createdAt": "2026-10-15T09:00:00+01:00"
}
],
"endNote": "string",
"recipientEmail": "string",
"proofRequired": [
"photo"
],
"proofRequiredOverride": [
"string"
],
"packageSize": "small",
"itemDescription": "string",
"reference": "string",
"scheduledAt": "2026-10-15T09:00:00+01:00",
"connectionId": "string",
"acceptedAt": "2026-10-15T09:00:00+01:00",
"startedAt": "2026-10-15T09:00:00+01:00",
"editable": "all",
"editedAt": "2026-10-15T09:00:00+01:00",
"editedFields": [
"string"
],
"pinDelivery": {
"channel": "whatsapp",
"state": "sending",
"whatsappErrorCode": 0,
"needsEmail": true,
"updatedAt": "2026-10-15T09:00:00+01:00"
}
}Errors
403DELIVERIES_OFF (N-Ways turned new deliveries off for your organisation) or ORGANISATION_SUSPENDED; the message says why.defaultError
Get a task with its live ETA
GET https://nways.ng/maps/v1/fleet/tasks/{id}
Parameters
| Name | In | Type | Description |
|---|---|---|---|
id | path | string | Required. |
curl "https://nways.ng/maps/v1/fleet/tasks/string" \
-H "X-NWays-Api-Key: YOUR_API_KEY"const res = await fetch('https://nways.ng/maps/v1/fleet/tasks/string', {
headers: { 'X-NWays-Api-Key': process.env.NWAYS_API_KEY },
})
const data = await res.json()import os
import requests
res = requests.get(
"https://nways.ng/maps/v1/fleet/tasks/string",
headers={"X-NWays-Api-Key": os.environ["NWAYS_API_KEY"]},
timeout=10,
)
data = res.json()Response
Task
| Field | Type | Description |
|---|---|---|
id | string | Required. |
ref | string | Required. The delivery's short number in the project, given by N-Ways ("1042", shown #1042): for people, in alerts and lists. |
status | string | Required. One of: created, assigned, picked_up, arriving, completed, failed, cancelled. |
vehicleId | string | null | Required. |
pickup | Stop | null | Required. |
dropoff | Stop | Required. |
dropoff.lat | number | Required. |
dropoff.lng | number | Required. |
dropoff.name | string | Up to 120 characters. |
dropoff.address | string | Up to 300 characters. |
recipientName | string | Required. |
recipientPhone | string | |
notes | string | Required. |
lang | string | Required. One of: en, fr, pt. |
arrivingS | integer | Required. |
eta | ETA | null | Required. Null until a fresh position is in, and once the task ends. |
dueAt | string (date-time) | null | Required. |
late | boolean | Required. Open and past dueAt, or expected after it. |
trackingUrl | string (uri) | null | Required. Null once expired. |
trackingExpiresAt | string (date-time) | null | Required. |
failureReason | string | |
createdAt | string (date-time) | Required. |
assignedAt | string (date-time) | null | Required. |
pickedUpAt | string (date-time) | null | Required. |
arrivingAt | string (date-time) | null | Required. |
endedAt | string (date-time) | null | Required. |
area | Area | null | The delivery's own area: leaving it raises asset.geofence_exit. |
proofs | Proof[] | Only in GET /tasks/{id}: the rider's photos and signatures (N-Ways Business). |
proofs[].id | string | Required. |
proofs[].kind | string | Required. One of: photo, signature. |
proofs[].contentType | string | Required. One of: image/jpeg, image/png, image/webp. |
proofs[].bytes | integer | Required. |
proofs[].lat | number | null | Required. |
proofs[].lng | number | null | Required. |
proofs[].by | string | Required. The rider's name. |
proofs[].createdAt | string (date-time) | Required. |
endNote | string | Only in GET /tasks/{id}: what the rider wrote when finishing. |
recipientEmail | string | |
proofRequired | string[] | The delivery's own, else your settings'. |
proofRequiredOverride | string[] | null | |
packageSize | string | null | One of: small, medium, large, null. |
itemDescription | string | |
reference | string | |
scheduledAt | string (date-time) | null | |
connectionId | string | null | The N-Ways driver's connection that accepted it. |
acceptedAt | string (date-time) | null | |
startedAt | string (date-time) | null | |
editable | string | What PATCH /tasks/{id} may change now: everything, only notes and dueAt (picked up or started), or nothing (ended). One of: all, limited, none. |
editedAt | string (date-time) | null | The last edit. |
editedFields | string[] | What the last edit changed. |
pinDelivery | PinDelivery | How the delivery PIN is reaching the customer, when the delivery asks for one and PINs go on WhatsApp. Never the PIN itself. |
pinDelivery.channel | string | Required. One of: whatsapp, email, none. |
pinDelivery.state | string | Required. One of: sending, sent, delivered, read, failed. |
pinDelivery.whatsappErrorCode | integer | null | Required. WhatsApp's failure (131026: not on WhatsApp), kept after the PIN went by email. |
pinDelivery.needsEmail | boolean | Required. The customer hasn't got the PIN: send it with POST /tasks/{id}/pin-email. |
pinDelivery.updatedAt | string (date-time) | Required. |
{
"id": "string",
"ref": "string",
"status": "created",
"vehicleId": "string",
"pickup": {
"lat": 0,
"lng": 0,
"name": "string",
"address": "string"
},
"dropoff": {
"lat": 0,
"lng": 0,
"name": "string",
"address": "string"
},
"recipientName": "string",
"recipientPhone": "string",
"notes": "string",
"lang": "en",
"arrivingS": 0,
"eta": {
"at": "2026-10-15T09:00:00+01:00",
"durationS": 0,
"distanceM": 0,
"trafficDelayS": 0,
"pickupAt": "2026-10-15T09:00:00+01:00",
"updatedAt": "2026-10-15T09:00:00+01:00"
},
"dueAt": "2026-10-15T09:00:00+01:00",
"late": true,
"trackingUrl": "string",
"trackingExpiresAt": "2026-10-15T09:00:00+01:00",
"failureReason": "string",
"createdAt": "2026-10-15T09:00:00+01:00",
"assignedAt": "2026-10-15T09:00:00+01:00",
"pickedUpAt": "2026-10-15T09:00:00+01:00",
"arrivingAt": "2026-10-15T09:00:00+01:00",
"endedAt": "2026-10-15T09:00:00+01:00",
"area": {
"type": "circle",
"lat": 6.48,
"lng": 3.43,
"radiusM": 2500
},
"proofs": [
{
"id": "string",
"kind": "photo",
"contentType": "image/jpeg",
"bytes": 0,
"lat": 0,
"lng": 0,
"by": "string",
"createdAt": "2026-10-15T09:00:00+01:00"
}
],
"endNote": "string",
"recipientEmail": "string",
"proofRequired": [
"photo"
],
"proofRequiredOverride": [
"string"
],
"packageSize": "small",
"itemDescription": "string",
"reference": "string",
"scheduledAt": "2026-10-15T09:00:00+01:00",
"connectionId": "string",
"acceptedAt": "2026-10-15T09:00:00+01:00",
"startedAt": "2026-10-15T09:00:00+01:00",
"editable": "all",
"editedAt": "2026-10-15T09:00:00+01:00",
"editedFields": [
"string"
],
"pinDelivery": {
"channel": "whatsapp",
"state": "sending",
"whatsappErrorCode": 0,
"needsEmail": true,
"updatedAt": "2026-10-15T09:00:00+01:00"
}
}Errors
defaultError
Edit a delivery
PATCH https://nways.ng/maps/v1/fleet/tasks/{id}
Changes any of the fields below, checked as creating a task checks them; leave out what stays, send null to clear an optional field. Answers the task, with the changed fields in editedFields and the X-NWays-Changed header (nothing changed: no event).
When. Everything can change until the delivery is picked up (editable: all): it's created, or assigned with no pickedUpAt (and, for an N-Ways driver, before they start it: their request may be waiting or accepted). Then only notes and dueAt until it ends (editable: limited); other fields answer 409 TASK_UNDER_WAY, an ended task 409 TASK_ENDED. Who has it changes with POST /tasks/{id}/assign or /dispatch, never here.
Afterwards. The ETA is worked out again and the tracking link stays the same. Event task.updated (data.task, data.changed). A request still waiting for an N-Ways driver stays the same request with the new details (and at least a minute left to answer); the driver is told when the pickup, drop-off or times changed. A driver who accepted it (N-Ways or N-Ways Business) is told what changed. A customer N-Ways already emailed gets an "updated" email when the drop-off or a time changed, at most one every 10 minutes.
Parameters
| Name | In | Type | Description |
|---|---|---|---|
id | path | string | Required. |
Request body
| Field | Type | Description |
|---|---|---|
pickup | Stop | null | null removes it (not for a delivery sent to an N-Ways driver). |
pickupPlaceId | string | One of your pickup places as the new pickup, instead of pickup. |
dropoff | Stop | |
dropoff.lat | number | Required. |
dropoff.lng | number | Required. |
dropoff.name | string | Up to 120 characters. |
dropoff.address | string | Up to 300 characters. |
recipientName | string | Up to 100 characters. |
recipientPhone | string | Up to 32 characters. |
recipientEmail | string | An email address, or "" for none. |
notes | string | Up to 500 characters. |
itemDescription | string | Up to 200 characters. |
packageSize | string | null | One of: small, medium, large, null. |
reference | string | Up to 64 characters. |
dueAt | string (date-time) | null | |
scheduledAt | string (date-time) | null | Now to 60 days ahead. |
proofRequired | string[] | null | null: your settings' proofRequired. |
area | Area | null | |
lang | string | One of: en, fr, pt. |
arrivingS | integer | ≥ 30, ≤ 1800. |
curl -X PATCH "https://nways.ng/maps/v1/fleet/tasks/string" \
-H "X-NWays-Api-Key: YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{"dropoff":{"lat":6.4549,"lng":3.4246,"name":"Office","address":"2 Kingsway Rd","Ikoyi":null},"dueAt":"2026-10-17T15:00:00Z","notes":"Call on arrival"}'const res = await fetch('https://nways.ng/maps/v1/fleet/tasks/string', {
method: 'PATCH',
headers: { 'X-NWays-Api-Key': process.env.NWAYS_API_KEY, 'Content-Type': 'application/json' },
body: JSON.stringify({
"dropoff": {
"lat": 6.4549,
"lng": 3.4246,
"name": "Office",
"address": "2 Kingsway Rd",
"Ikoyi": null
},
"dueAt": "2026-10-17T15:00:00Z",
"notes": "Call on arrival"
}),
})
const data = await res.json()import os
import requests
res = requests.patch(
"https://nways.ng/maps/v1/fleet/tasks/string",
headers={"X-NWays-Api-Key": os.environ["NWAYS_API_KEY"]},
json={"dropoff": {"lat": 6.4549, "lng": 3.4246, "name": "Office", "address": "2 Kingsway Rd", "Ikoyi": None}, "dueAt": "2026-10-17T15:00:00Z", "notes": "Call on arrival"},
timeout=10,
)
data = res.json()Response
The task as it is now
| Field | Type | Description |
|---|---|---|
id | string | Required. |
ref | string | Required. The delivery's short number in the project, given by N-Ways ("1042", shown #1042): for people, in alerts and lists. |
status | string | Required. One of: created, assigned, picked_up, arriving, completed, failed, cancelled. |
vehicleId | string | null | Required. |
pickup | Stop | null | Required. |
dropoff | Stop | Required. |
dropoff.lat | number | Required. |
dropoff.lng | number | Required. |
dropoff.name | string | Up to 120 characters. |
dropoff.address | string | Up to 300 characters. |
recipientName | string | Required. |
recipientPhone | string | |
notes | string | Required. |
lang | string | Required. One of: en, fr, pt. |
arrivingS | integer | Required. |
eta | ETA | null | Required. Null until a fresh position is in, and once the task ends. |
dueAt | string (date-time) | null | Required. |
late | boolean | Required. Open and past dueAt, or expected after it. |
trackingUrl | string (uri) | null | Required. Null once expired. |
trackingExpiresAt | string (date-time) | null | Required. |
failureReason | string | |
createdAt | string (date-time) | Required. |
assignedAt | string (date-time) | null | Required. |
pickedUpAt | string (date-time) | null | Required. |
arrivingAt | string (date-time) | null | Required. |
endedAt | string (date-time) | null | Required. |
area | Area | null | The delivery's own area: leaving it raises asset.geofence_exit. |
proofs | Proof[] | Only in GET /tasks/{id}: the rider's photos and signatures (N-Ways Business). |
proofs[].id | string | Required. |
proofs[].kind | string | Required. One of: photo, signature. |
proofs[].contentType | string | Required. One of: image/jpeg, image/png, image/webp. |
proofs[].bytes | integer | Required. |
proofs[].lat | number | null | Required. |
proofs[].lng | number | null | Required. |
proofs[].by | string | Required. The rider's name. |
proofs[].createdAt | string (date-time) | Required. |
endNote | string | Only in GET /tasks/{id}: what the rider wrote when finishing. |
recipientEmail | string | |
proofRequired | string[] | The delivery's own, else your settings'. |
proofRequiredOverride | string[] | null | |
packageSize | string | null | One of: small, medium, large, null. |
itemDescription | string | |
reference | string | |
scheduledAt | string (date-time) | null | |
connectionId | string | null | The N-Ways driver's connection that accepted it. |
acceptedAt | string (date-time) | null | |
startedAt | string (date-time) | null | |
editable | string | What PATCH /tasks/{id} may change now: everything, only notes and dueAt (picked up or started), or nothing (ended). One of: all, limited, none. |
editedAt | string (date-time) | null | The last edit. |
editedFields | string[] | What the last edit changed. |
pinDelivery | PinDelivery | How the delivery PIN is reaching the customer, when the delivery asks for one and PINs go on WhatsApp. Never the PIN itself. |
pinDelivery.channel | string | Required. One of: whatsapp, email, none. |
pinDelivery.state | string | Required. One of: sending, sent, delivered, read, failed. |
pinDelivery.whatsappErrorCode | integer | null | Required. WhatsApp's failure (131026: not on WhatsApp), kept after the PIN went by email. |
pinDelivery.needsEmail | boolean | Required. The customer hasn't got the PIN: send it with POST /tasks/{id}/pin-email. |
pinDelivery.updatedAt | string (date-time) | Required. |
{
"id": "string",
"ref": "string",
"status": "created",
"vehicleId": "string",
"pickup": {
"lat": 0,
"lng": 0,
"name": "string",
"address": "string"
},
"dropoff": {
"lat": 0,
"lng": 0,
"name": "string",
"address": "string"
},
"recipientName": "string",
"recipientPhone": "string",
"notes": "string",
"lang": "en",
"arrivingS": 0,
"eta": {
"at": "2026-10-15T09:00:00+01:00",
"durationS": 0,
"distanceM": 0,
"trafficDelayS": 0,
"pickupAt": "2026-10-15T09:00:00+01:00",
"updatedAt": "2026-10-15T09:00:00+01:00"
},
"dueAt": "2026-10-15T09:00:00+01:00",
"late": true,
"trackingUrl": "string",
"trackingExpiresAt": "2026-10-15T09:00:00+01:00",
"failureReason": "string",
"createdAt": "2026-10-15T09:00:00+01:00",
"assignedAt": "2026-10-15T09:00:00+01:00",
"pickedUpAt": "2026-10-15T09:00:00+01:00",
"arrivingAt": "2026-10-15T09:00:00+01:00",
"endedAt": "2026-10-15T09:00:00+01:00",
"area": {
"type": "circle",
"lat": 6.48,
"lng": 3.43,
"radiusM": 2500
},
"proofs": [
{
"id": "string",
"kind": "photo",
"contentType": "image/jpeg",
"bytes": 0,
"lat": 0,
"lng": 0,
"by": "string",
"createdAt": "2026-10-15T09:00:00+01:00"
}
],
"endNote": "string",
"recipientEmail": "string",
"proofRequired": [
"photo"
],
"proofRequiredOverride": [
"string"
],
"packageSize": "small",
"itemDescription": "string",
"reference": "string",
"scheduledAt": "2026-10-15T09:00:00+01:00",
"connectionId": "string",
"acceptedAt": "2026-10-15T09:00:00+01:00",
"startedAt": "2026-10-15T09:00:00+01:00",
"editable": "all",
"editedAt": "2026-10-15T09:00:00+01:00",
"editedFields": [
"string"
],
"pinDelivery": {
"channel": "whatsapp",
"state": "sending",
"whatsappErrorCode": 0,
"needsEmail": true,
"updatedAt": "2026-10-15T09:00:00+01:00"
}
}Errors
409TASK_UNDER_WAY (only notes and dueAt can change now) or TASK_ENDED.defaultError
Assign (or reassign) a vehicle — created|assigned → assigned; event task.assigned
POST https://nways.ng/maps/v1/fleet/tasks/{id}/assign
Parameters
| Name | In | Type | Description |
|---|---|---|---|
id | path | string | Required. |
Request body
| Field | Type | Description |
|---|---|---|
vehicleId | string | Required. |
curl -X POST "https://nways.ng/maps/v1/fleet/tasks/string/assign" \
-H "X-NWays-Api-Key: YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{"vehicleId":"string"}'const res = await fetch('https://nways.ng/maps/v1/fleet/tasks/string/assign', {
method: 'POST',
headers: { 'X-NWays-Api-Key': process.env.NWAYS_API_KEY, 'Content-Type': 'application/json' },
body: JSON.stringify({
"vehicleId": "string"
}),
})
const data = await res.json()import os
import requests
res = requests.post(
"https://nways.ng/maps/v1/fleet/tasks/string/assign",
headers={"X-NWays-Api-Key": os.environ["NWAYS_API_KEY"]},
json={"vehicleId": "string"},
timeout=10,
)
data = res.json()Response
Task
| Field | Type | Description |
|---|---|---|
id | string | Required. |
ref | string | Required. The delivery's short number in the project, given by N-Ways ("1042", shown #1042): for people, in alerts and lists. |
status | string | Required. One of: created, assigned, picked_up, arriving, completed, failed, cancelled. |
vehicleId | string | null | Required. |
pickup | Stop | null | Required. |
dropoff | Stop | Required. |
dropoff.lat | number | Required. |
dropoff.lng | number | Required. |
dropoff.name | string | Up to 120 characters. |
dropoff.address | string | Up to 300 characters. |
recipientName | string | Required. |
recipientPhone | string | |
notes | string | Required. |
lang | string | Required. One of: en, fr, pt. |
arrivingS | integer | Required. |
eta | ETA | null | Required. Null until a fresh position is in, and once the task ends. |
dueAt | string (date-time) | null | Required. |
late | boolean | Required. Open and past dueAt, or expected after it. |
trackingUrl | string (uri) | null | Required. Null once expired. |
trackingExpiresAt | string (date-time) | null | Required. |
failureReason | string | |
createdAt | string (date-time) | Required. |
assignedAt | string (date-time) | null | Required. |
pickedUpAt | string (date-time) | null | Required. |
arrivingAt | string (date-time) | null | Required. |
endedAt | string (date-time) | null | Required. |
area | Area | null | The delivery's own area: leaving it raises asset.geofence_exit. |
proofs | Proof[] | Only in GET /tasks/{id}: the rider's photos and signatures (N-Ways Business). |
proofs[].id | string | Required. |
proofs[].kind | string | Required. One of: photo, signature. |
proofs[].contentType | string | Required. One of: image/jpeg, image/png, image/webp. |
proofs[].bytes | integer | Required. |
proofs[].lat | number | null | Required. |
proofs[].lng | number | null | Required. |
proofs[].by | string | Required. The rider's name. |
proofs[].createdAt | string (date-time) | Required. |
endNote | string | Only in GET /tasks/{id}: what the rider wrote when finishing. |
recipientEmail | string | |
proofRequired | string[] | The delivery's own, else your settings'. |
proofRequiredOverride | string[] | null | |
packageSize | string | null | One of: small, medium, large, null. |
itemDescription | string | |
reference | string | |
scheduledAt | string (date-time) | null | |
connectionId | string | null | The N-Ways driver's connection that accepted it. |
acceptedAt | string (date-time) | null | |
startedAt | string (date-time) | null | |
editable | string | What PATCH /tasks/{id} may change now: everything, only notes and dueAt (picked up or started), or nothing (ended). One of: all, limited, none. |
editedAt | string (date-time) | null | The last edit. |
editedFields | string[] | What the last edit changed. |
pinDelivery | PinDelivery | How the delivery PIN is reaching the customer, when the delivery asks for one and PINs go on WhatsApp. Never the PIN itself. |
pinDelivery.channel | string | Required. One of: whatsapp, email, none. |
pinDelivery.state | string | Required. One of: sending, sent, delivered, read, failed. |
pinDelivery.whatsappErrorCode | integer | null | Required. WhatsApp's failure (131026: not on WhatsApp), kept after the PIN went by email. |
pinDelivery.needsEmail | boolean | Required. The customer hasn't got the PIN: send it with POST /tasks/{id}/pin-email. |
pinDelivery.updatedAt | string (date-time) | Required. |
{
"id": "string",
"ref": "string",
"status": "created",
"vehicleId": "string",
"pickup": {
"lat": 0,
"lng": 0,
"name": "string",
"address": "string"
},
"dropoff": {
"lat": 0,
"lng": 0,
"name": "string",
"address": "string"
},
"recipientName": "string",
"recipientPhone": "string",
"notes": "string",
"lang": "en",
"arrivingS": 0,
"eta": {
"at": "2026-10-15T09:00:00+01:00",
"durationS": 0,
"distanceM": 0,
"trafficDelayS": 0,
"pickupAt": "2026-10-15T09:00:00+01:00",
"updatedAt": "2026-10-15T09:00:00+01:00"
},
"dueAt": "2026-10-15T09:00:00+01:00",
"late": true,
"trackingUrl": "string",
"trackingExpiresAt": "2026-10-15T09:00:00+01:00",
"failureReason": "string",
"createdAt": "2026-10-15T09:00:00+01:00",
"assignedAt": "2026-10-15T09:00:00+01:00",
"pickedUpAt": "2026-10-15T09:00:00+01:00",
"arrivingAt": "2026-10-15T09:00:00+01:00",
"endedAt": "2026-10-15T09:00:00+01:00",
"area": {
"type": "circle",
"lat": 6.48,
"lng": 3.43,
"radiusM": 2500
},
"proofs": [
{
"id": "string",
"kind": "photo",
"contentType": "image/jpeg",
"bytes": 0,
"lat": 0,
"lng": 0,
"by": "string",
"createdAt": "2026-10-15T09:00:00+01:00"
}
],
"endNote": "string",
"recipientEmail": "string",
"proofRequired": [
"photo"
],
"proofRequiredOverride": [
"string"
],
"packageSize": "small",
"itemDescription": "string",
"reference": "string",
"scheduledAt": "2026-10-15T09:00:00+01:00",
"connectionId": "string",
"acceptedAt": "2026-10-15T09:00:00+01:00",
"startedAt": "2026-10-15T09:00:00+01:00",
"editable": "all",
"editedAt": "2026-10-15T09:00:00+01:00",
"editedFields": [
"string"
],
"pinDelivery": {
"channel": "whatsapp",
"state": "sending",
"whatsappErrorCode": 0,
"needsEmail": true,
"updatedAt": "2026-10-15T09:00:00+01:00"
}
}Errors
defaultError
Mark picked up — assigned → picked_up
POST https://nways.ng/maps/v1/fleet/tasks/{id}/pickup
Parameters
| Name | In | Type | Description |
|---|---|---|---|
id | path | string | Required. |
curl -X POST "https://nways.ng/maps/v1/fleet/tasks/string/pickup" \
-H "X-NWays-Api-Key: YOUR_API_KEY"const res = await fetch('https://nways.ng/maps/v1/fleet/tasks/string/pickup', {
method: 'POST',
headers: { 'X-NWays-Api-Key': process.env.NWAYS_API_KEY },
})
const data = await res.json()import os
import requests
res = requests.post(
"https://nways.ng/maps/v1/fleet/tasks/string/pickup",
headers={"X-NWays-Api-Key": os.environ["NWAYS_API_KEY"]},
timeout=10,
)
data = res.json()Response
Task
| Field | Type | Description |
|---|---|---|
id | string | Required. |
ref | string | Required. The delivery's short number in the project, given by N-Ways ("1042", shown #1042): for people, in alerts and lists. |
status | string | Required. One of: created, assigned, picked_up, arriving, completed, failed, cancelled. |
vehicleId | string | null | Required. |
pickup | Stop | null | Required. |
dropoff | Stop | Required. |
dropoff.lat | number | Required. |
dropoff.lng | number | Required. |
dropoff.name | string | Up to 120 characters. |
dropoff.address | string | Up to 300 characters. |
recipientName | string | Required. |
recipientPhone | string | |
notes | string | Required. |
lang | string | Required. One of: en, fr, pt. |
arrivingS | integer | Required. |
eta | ETA | null | Required. Null until a fresh position is in, and once the task ends. |
dueAt | string (date-time) | null | Required. |
late | boolean | Required. Open and past dueAt, or expected after it. |
trackingUrl | string (uri) | null | Required. Null once expired. |
trackingExpiresAt | string (date-time) | null | Required. |
failureReason | string | |
createdAt | string (date-time) | Required. |
assignedAt | string (date-time) | null | Required. |
pickedUpAt | string (date-time) | null | Required. |
arrivingAt | string (date-time) | null | Required. |
endedAt | string (date-time) | null | Required. |
area | Area | null | The delivery's own area: leaving it raises asset.geofence_exit. |
proofs | Proof[] | Only in GET /tasks/{id}: the rider's photos and signatures (N-Ways Business). |
proofs[].id | string | Required. |
proofs[].kind | string | Required. One of: photo, signature. |
proofs[].contentType | string | Required. One of: image/jpeg, image/png, image/webp. |
proofs[].bytes | integer | Required. |
proofs[].lat | number | null | Required. |
proofs[].lng | number | null | Required. |
proofs[].by | string | Required. The rider's name. |
proofs[].createdAt | string (date-time) | Required. |
endNote | string | Only in GET /tasks/{id}: what the rider wrote when finishing. |
recipientEmail | string | |
proofRequired | string[] | The delivery's own, else your settings'. |
proofRequiredOverride | string[] | null | |
packageSize | string | null | One of: small, medium, large, null. |
itemDescription | string | |
reference | string | |
scheduledAt | string (date-time) | null | |
connectionId | string | null | The N-Ways driver's connection that accepted it. |
acceptedAt | string (date-time) | null | |
startedAt | string (date-time) | null | |
editable | string | What PATCH /tasks/{id} may change now: everything, only notes and dueAt (picked up or started), or nothing (ended). One of: all, limited, none. |
editedAt | string (date-time) | null | The last edit. |
editedFields | string[] | What the last edit changed. |
pinDelivery | PinDelivery | How the delivery PIN is reaching the customer, when the delivery asks for one and PINs go on WhatsApp. Never the PIN itself. |
pinDelivery.channel | string | Required. One of: whatsapp, email, none. |
pinDelivery.state | string | Required. One of: sending, sent, delivered, read, failed. |
pinDelivery.whatsappErrorCode | integer | null | Required. WhatsApp's failure (131026: not on WhatsApp), kept after the PIN went by email. |
pinDelivery.needsEmail | boolean | Required. The customer hasn't got the PIN: send it with POST /tasks/{id}/pin-email. |
pinDelivery.updatedAt | string (date-time) | Required. |
{
"id": "string",
"ref": "string",
"status": "created",
"vehicleId": "string",
"pickup": {
"lat": 0,
"lng": 0,
"name": "string",
"address": "string"
},
"dropoff": {
"lat": 0,
"lng": 0,
"name": "string",
"address": "string"
},
"recipientName": "string",
"recipientPhone": "string",
"notes": "string",
"lang": "en",
"arrivingS": 0,
"eta": {
"at": "2026-10-15T09:00:00+01:00",
"durationS": 0,
"distanceM": 0,
"trafficDelayS": 0,
"pickupAt": "2026-10-15T09:00:00+01:00",
"updatedAt": "2026-10-15T09:00:00+01:00"
},
"dueAt": "2026-10-15T09:00:00+01:00",
"late": true,
"trackingUrl": "string",
"trackingExpiresAt": "2026-10-15T09:00:00+01:00",
"failureReason": "string",
"createdAt": "2026-10-15T09:00:00+01:00",
"assignedAt": "2026-10-15T09:00:00+01:00",
"pickedUpAt": "2026-10-15T09:00:00+01:00",
"arrivingAt": "2026-10-15T09:00:00+01:00",
"endedAt": "2026-10-15T09:00:00+01:00",
"area": {
"type": "circle",
"lat": 6.48,
"lng": 3.43,
"radiusM": 2500
},
"proofs": [
{
"id": "string",
"kind": "photo",
"contentType": "image/jpeg",
"bytes": 0,
"lat": 0,
"lng": 0,
"by": "string",
"createdAt": "2026-10-15T09:00:00+01:00"
}
],
"endNote": "string",
"recipientEmail": "string",
"proofRequired": [
"photo"
],
"proofRequiredOverride": [
"string"
],
"packageSize": "small",
"itemDescription": "string",
"reference": "string",
"scheduledAt": "2026-10-15T09:00:00+01:00",
"connectionId": "string",
"acceptedAt": "2026-10-15T09:00:00+01:00",
"startedAt": "2026-10-15T09:00:00+01:00",
"editable": "all",
"editedAt": "2026-10-15T09:00:00+01:00",
"editedFields": [
"string"
],
"pinDelivery": {
"channel": "whatsapp",
"state": "sending",
"whatsappErrorCode": 0,
"needsEmail": true,
"updatedAt": "2026-10-15T09:00:00+01:00"
}
}Errors
defaultError
Mark delivered — assigned|picked_up|arriving → completed; event task.completed
POST https://nways.ng/maps/v1/fleet/tasks/{id}/complete
Parameters
| Name | In | Type | Description |
|---|---|---|---|
id | path | string | Required. |
curl -X POST "https://nways.ng/maps/v1/fleet/tasks/string/complete" \
-H "X-NWays-Api-Key: YOUR_API_KEY"const res = await fetch('https://nways.ng/maps/v1/fleet/tasks/string/complete', {
method: 'POST',
headers: { 'X-NWays-Api-Key': process.env.NWAYS_API_KEY },
})
const data = await res.json()import os
import requests
res = requests.post(
"https://nways.ng/maps/v1/fleet/tasks/string/complete",
headers={"X-NWays-Api-Key": os.environ["NWAYS_API_KEY"]},
timeout=10,
)
data = res.json()Response
Task
| Field | Type | Description |
|---|---|---|
id | string | Required. |
ref | string | Required. The delivery's short number in the project, given by N-Ways ("1042", shown #1042): for people, in alerts and lists. |
status | string | Required. One of: created, assigned, picked_up, arriving, completed, failed, cancelled. |
vehicleId | string | null | Required. |
pickup | Stop | null | Required. |
dropoff | Stop | Required. |
dropoff.lat | number | Required. |
dropoff.lng | number | Required. |
dropoff.name | string | Up to 120 characters. |
dropoff.address | string | Up to 300 characters. |
recipientName | string | Required. |
recipientPhone | string | |
notes | string | Required. |
lang | string | Required. One of: en, fr, pt. |
arrivingS | integer | Required. |
eta | ETA | null | Required. Null until a fresh position is in, and once the task ends. |
dueAt | string (date-time) | null | Required. |
late | boolean | Required. Open and past dueAt, or expected after it. |
trackingUrl | string (uri) | null | Required. Null once expired. |
trackingExpiresAt | string (date-time) | null | Required. |
failureReason | string | |
createdAt | string (date-time) | Required. |
assignedAt | string (date-time) | null | Required. |
pickedUpAt | string (date-time) | null | Required. |
arrivingAt | string (date-time) | null | Required. |
endedAt | string (date-time) | null | Required. |
area | Area | null | The delivery's own area: leaving it raises asset.geofence_exit. |
proofs | Proof[] | Only in GET /tasks/{id}: the rider's photos and signatures (N-Ways Business). |
proofs[].id | string | Required. |
proofs[].kind | string | Required. One of: photo, signature. |
proofs[].contentType | string | Required. One of: image/jpeg, image/png, image/webp. |
proofs[].bytes | integer | Required. |
proofs[].lat | number | null | Required. |
proofs[].lng | number | null | Required. |
proofs[].by | string | Required. The rider's name. |
proofs[].createdAt | string (date-time) | Required. |
endNote | string | Only in GET /tasks/{id}: what the rider wrote when finishing. |
recipientEmail | string | |
proofRequired | string[] | The delivery's own, else your settings'. |
proofRequiredOverride | string[] | null | |
packageSize | string | null | One of: small, medium, large, null. |
itemDescription | string | |
reference | string | |
scheduledAt | string (date-time) | null | |
connectionId | string | null | The N-Ways driver's connection that accepted it. |
acceptedAt | string (date-time) | null | |
startedAt | string (date-time) | null | |
editable | string | What PATCH /tasks/{id} may change now: everything, only notes and dueAt (picked up or started), or nothing (ended). One of: all, limited, none. |
editedAt | string (date-time) | null | The last edit. |
editedFields | string[] | What the last edit changed. |
pinDelivery | PinDelivery | How the delivery PIN is reaching the customer, when the delivery asks for one and PINs go on WhatsApp. Never the PIN itself. |
pinDelivery.channel | string | Required. One of: whatsapp, email, none. |
pinDelivery.state | string | Required. One of: sending, sent, delivered, read, failed. |
pinDelivery.whatsappErrorCode | integer | null | Required. WhatsApp's failure (131026: not on WhatsApp), kept after the PIN went by email. |
pinDelivery.needsEmail | boolean | Required. The customer hasn't got the PIN: send it with POST /tasks/{id}/pin-email. |
pinDelivery.updatedAt | string (date-time) | Required. |
{
"id": "string",
"ref": "string",
"status": "created",
"vehicleId": "string",
"pickup": {
"lat": 0,
"lng": 0,
"name": "string",
"address": "string"
},
"dropoff": {
"lat": 0,
"lng": 0,
"name": "string",
"address": "string"
},
"recipientName": "string",
"recipientPhone": "string",
"notes": "string",
"lang": "en",
"arrivingS": 0,
"eta": {
"at": "2026-10-15T09:00:00+01:00",
"durationS": 0,
"distanceM": 0,
"trafficDelayS": 0,
"pickupAt": "2026-10-15T09:00:00+01:00",
"updatedAt": "2026-10-15T09:00:00+01:00"
},
"dueAt": "2026-10-15T09:00:00+01:00",
"late": true,
"trackingUrl": "string",
"trackingExpiresAt": "2026-10-15T09:00:00+01:00",
"failureReason": "string",
"createdAt": "2026-10-15T09:00:00+01:00",
"assignedAt": "2026-10-15T09:00:00+01:00",
"pickedUpAt": "2026-10-15T09:00:00+01:00",
"arrivingAt": "2026-10-15T09:00:00+01:00",
"endedAt": "2026-10-15T09:00:00+01:00",
"area": {
"type": "circle",
"lat": 6.48,
"lng": 3.43,
"radiusM": 2500
},
"proofs": [
{
"id": "string",
"kind": "photo",
"contentType": "image/jpeg",
"bytes": 0,
"lat": 0,
"lng": 0,
"by": "string",
"createdAt": "2026-10-15T09:00:00+01:00"
}
],
"endNote": "string",
"recipientEmail": "string",
"proofRequired": [
"photo"
],
"proofRequiredOverride": [
"string"
],
"packageSize": "small",
"itemDescription": "string",
"reference": "string",
"scheduledAt": "2026-10-15T09:00:00+01:00",
"connectionId": "string",
"acceptedAt": "2026-10-15T09:00:00+01:00",
"startedAt": "2026-10-15T09:00:00+01:00",
"editable": "all",
"editedAt": "2026-10-15T09:00:00+01:00",
"editedFields": [
"string"
],
"pinDelivery": {
"channel": "whatsapp",
"state": "sending",
"whatsappErrorCode": 0,
"needsEmail": true,
"updatedAt": "2026-10-15T09:00:00+01:00"
}
}Errors
defaultError
Mark failed — any open status → failed; event task.failed
POST https://nways.ng/maps/v1/fleet/tasks/{id}/fail
Parameters
| Name | In | Type | Description |
|---|---|---|---|
id | path | string | Required. |
Request body
| Field | Type | Description |
|---|---|---|
reason | string | Up to 200 characters. |
curl -X POST "https://nways.ng/maps/v1/fleet/tasks/string/fail" \
-H "X-NWays-Api-Key: YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{"reason":"string"}'const res = await fetch('https://nways.ng/maps/v1/fleet/tasks/string/fail', {
method: 'POST',
headers: { 'X-NWays-Api-Key': process.env.NWAYS_API_KEY, 'Content-Type': 'application/json' },
body: JSON.stringify({
"reason": "string"
}),
})
const data = await res.json()import os
import requests
res = requests.post(
"https://nways.ng/maps/v1/fleet/tasks/string/fail",
headers={"X-NWays-Api-Key": os.environ["NWAYS_API_KEY"]},
json={"reason": "string"},
timeout=10,
)
data = res.json()Response
Task
| Field | Type | Description |
|---|---|---|
id | string | Required. |
ref | string | Required. The delivery's short number in the project, given by N-Ways ("1042", shown #1042): for people, in alerts and lists. |
status | string | Required. One of: created, assigned, picked_up, arriving, completed, failed, cancelled. |
vehicleId | string | null | Required. |
pickup | Stop | null | Required. |
dropoff | Stop | Required. |
dropoff.lat | number | Required. |
dropoff.lng | number | Required. |
dropoff.name | string | Up to 120 characters. |
dropoff.address | string | Up to 300 characters. |
recipientName | string | Required. |
recipientPhone | string | |
notes | string | Required. |
lang | string | Required. One of: en, fr, pt. |
arrivingS | integer | Required. |
eta | ETA | null | Required. Null until a fresh position is in, and once the task ends. |
dueAt | string (date-time) | null | Required. |
late | boolean | Required. Open and past dueAt, or expected after it. |
trackingUrl | string (uri) | null | Required. Null once expired. |
trackingExpiresAt | string (date-time) | null | Required. |
failureReason | string | |
createdAt | string (date-time) | Required. |
assignedAt | string (date-time) | null | Required. |
pickedUpAt | string (date-time) | null | Required. |
arrivingAt | string (date-time) | null | Required. |
endedAt | string (date-time) | null | Required. |
area | Area | null | The delivery's own area: leaving it raises asset.geofence_exit. |
proofs | Proof[] | Only in GET /tasks/{id}: the rider's photos and signatures (N-Ways Business). |
proofs[].id | string | Required. |
proofs[].kind | string | Required. One of: photo, signature. |
proofs[].contentType | string | Required. One of: image/jpeg, image/png, image/webp. |
proofs[].bytes | integer | Required. |
proofs[].lat | number | null | Required. |
proofs[].lng | number | null | Required. |
proofs[].by | string | Required. The rider's name. |
proofs[].createdAt | string (date-time) | Required. |
endNote | string | Only in GET /tasks/{id}: what the rider wrote when finishing. |
recipientEmail | string | |
proofRequired | string[] | The delivery's own, else your settings'. |
proofRequiredOverride | string[] | null | |
packageSize | string | null | One of: small, medium, large, null. |
itemDescription | string | |
reference | string | |
scheduledAt | string (date-time) | null | |
connectionId | string | null | The N-Ways driver's connection that accepted it. |
acceptedAt | string (date-time) | null | |
startedAt | string (date-time) | null | |
editable | string | What PATCH /tasks/{id} may change now: everything, only notes and dueAt (picked up or started), or nothing (ended). One of: all, limited, none. |
editedAt | string (date-time) | null | The last edit. |
editedFields | string[] | What the last edit changed. |
pinDelivery | PinDelivery | How the delivery PIN is reaching the customer, when the delivery asks for one and PINs go on WhatsApp. Never the PIN itself. |
pinDelivery.channel | string | Required. One of: whatsapp, email, none. |
pinDelivery.state | string | Required. One of: sending, sent, delivered, read, failed. |
pinDelivery.whatsappErrorCode | integer | null | Required. WhatsApp's failure (131026: not on WhatsApp), kept after the PIN went by email. |
pinDelivery.needsEmail | boolean | Required. The customer hasn't got the PIN: send it with POST /tasks/{id}/pin-email. |
pinDelivery.updatedAt | string (date-time) | Required. |
{
"id": "string",
"ref": "string",
"status": "created",
"vehicleId": "string",
"pickup": {
"lat": 0,
"lng": 0,
"name": "string",
"address": "string"
},
"dropoff": {
"lat": 0,
"lng": 0,
"name": "string",
"address": "string"
},
"recipientName": "string",
"recipientPhone": "string",
"notes": "string",
"lang": "en",
"arrivingS": 0,
"eta": {
"at": "2026-10-15T09:00:00+01:00",
"durationS": 0,
"distanceM": 0,
"trafficDelayS": 0,
"pickupAt": "2026-10-15T09:00:00+01:00",
"updatedAt": "2026-10-15T09:00:00+01:00"
},
"dueAt": "2026-10-15T09:00:00+01:00",
"late": true,
"trackingUrl": "string",
"trackingExpiresAt": "2026-10-15T09:00:00+01:00",
"failureReason": "string",
"createdAt": "2026-10-15T09:00:00+01:00",
"assignedAt": "2026-10-15T09:00:00+01:00",
"pickedUpAt": "2026-10-15T09:00:00+01:00",
"arrivingAt": "2026-10-15T09:00:00+01:00",
"endedAt": "2026-10-15T09:00:00+01:00",
"area": {
"type": "circle",
"lat": 6.48,
"lng": 3.43,
"radiusM": 2500
},
"proofs": [
{
"id": "string",
"kind": "photo",
"contentType": "image/jpeg",
"bytes": 0,
"lat": 0,
"lng": 0,
"by": "string",
"createdAt": "2026-10-15T09:00:00+01:00"
}
],
"endNote": "string",
"recipientEmail": "string",
"proofRequired": [
"photo"
],
"proofRequiredOverride": [
"string"
],
"packageSize": "small",
"itemDescription": "string",
"reference": "string",
"scheduledAt": "2026-10-15T09:00:00+01:00",
"connectionId": "string",
"acceptedAt": "2026-10-15T09:00:00+01:00",
"startedAt": "2026-10-15T09:00:00+01:00",
"editable": "all",
"editedAt": "2026-10-15T09:00:00+01:00",
"editedFields": [
"string"
],
"pinDelivery": {
"channel": "whatsapp",
"state": "sending",
"whatsappErrorCode": 0,
"needsEmail": true,
"updatedAt": "2026-10-15T09:00:00+01:00"
}
}Errors
defaultError
Cancel — any open status → cancelled
POST https://nways.ng/maps/v1/fleet/tasks/{id}/cancel
Parameters
| Name | In | Type | Description |
|---|---|---|---|
id | path | string | Required. |
curl -X POST "https://nways.ng/maps/v1/fleet/tasks/string/cancel" \
-H "X-NWays-Api-Key: YOUR_API_KEY"const res = await fetch('https://nways.ng/maps/v1/fleet/tasks/string/cancel', {
method: 'POST',
headers: { 'X-NWays-Api-Key': process.env.NWAYS_API_KEY },
})
const data = await res.json()import os
import requests
res = requests.post(
"https://nways.ng/maps/v1/fleet/tasks/string/cancel",
headers={"X-NWays-Api-Key": os.environ["NWAYS_API_KEY"]},
timeout=10,
)
data = res.json()Response
Task
| Field | Type | Description |
|---|---|---|
id | string | Required. |
ref | string | Required. The delivery's short number in the project, given by N-Ways ("1042", shown #1042): for people, in alerts and lists. |
status | string | Required. One of: created, assigned, picked_up, arriving, completed, failed, cancelled. |
vehicleId | string | null | Required. |
pickup | Stop | null | Required. |
dropoff | Stop | Required. |
dropoff.lat | number | Required. |
dropoff.lng | number | Required. |
dropoff.name | string | Up to 120 characters. |
dropoff.address | string | Up to 300 characters. |
recipientName | string | Required. |
recipientPhone | string | |
notes | string | Required. |
lang | string | Required. One of: en, fr, pt. |
arrivingS | integer | Required. |
eta | ETA | null | Required. Null until a fresh position is in, and once the task ends. |
dueAt | string (date-time) | null | Required. |
late | boolean | Required. Open and past dueAt, or expected after it. |
trackingUrl | string (uri) | null | Required. Null once expired. |
trackingExpiresAt | string (date-time) | null | Required. |
failureReason | string | |
createdAt | string (date-time) | Required. |
assignedAt | string (date-time) | null | Required. |
pickedUpAt | string (date-time) | null | Required. |
arrivingAt | string (date-time) | null | Required. |
endedAt | string (date-time) | null | Required. |
area | Area | null | The delivery's own area: leaving it raises asset.geofence_exit. |
proofs | Proof[] | Only in GET /tasks/{id}: the rider's photos and signatures (N-Ways Business). |
proofs[].id | string | Required. |
proofs[].kind | string | Required. One of: photo, signature. |
proofs[].contentType | string | Required. One of: image/jpeg, image/png, image/webp. |
proofs[].bytes | integer | Required. |
proofs[].lat | number | null | Required. |
proofs[].lng | number | null | Required. |
proofs[].by | string | Required. The rider's name. |
proofs[].createdAt | string (date-time) | Required. |
endNote | string | Only in GET /tasks/{id}: what the rider wrote when finishing. |
recipientEmail | string | |
proofRequired | string[] | The delivery's own, else your settings'. |
proofRequiredOverride | string[] | null | |
packageSize | string | null | One of: small, medium, large, null. |
itemDescription | string | |
reference | string | |
scheduledAt | string (date-time) | null | |
connectionId | string | null | The N-Ways driver's connection that accepted it. |
acceptedAt | string (date-time) | null | |
startedAt | string (date-time) | null | |
editable | string | What PATCH /tasks/{id} may change now: everything, only notes and dueAt (picked up or started), or nothing (ended). One of: all, limited, none. |
editedAt | string (date-time) | null | The last edit. |
editedFields | string[] | What the last edit changed. |
pinDelivery | PinDelivery | How the delivery PIN is reaching the customer, when the delivery asks for one and PINs go on WhatsApp. Never the PIN itself. |
pinDelivery.channel | string | Required. One of: whatsapp, email, none. |
pinDelivery.state | string | Required. One of: sending, sent, delivered, read, failed. |
pinDelivery.whatsappErrorCode | integer | null | Required. WhatsApp's failure (131026: not on WhatsApp), kept after the PIN went by email. |
pinDelivery.needsEmail | boolean | Required. The customer hasn't got the PIN: send it with POST /tasks/{id}/pin-email. |
pinDelivery.updatedAt | string (date-time) | Required. |
{
"id": "string",
"ref": "string",
"status": "created",
"vehicleId": "string",
"pickup": {
"lat": 0,
"lng": 0,
"name": "string",
"address": "string"
},
"dropoff": {
"lat": 0,
"lng": 0,
"name": "string",
"address": "string"
},
"recipientName": "string",
"recipientPhone": "string",
"notes": "string",
"lang": "en",
"arrivingS": 0,
"eta": {
"at": "2026-10-15T09:00:00+01:00",
"durationS": 0,
"distanceM": 0,
"trafficDelayS": 0,
"pickupAt": "2026-10-15T09:00:00+01:00",
"updatedAt": "2026-10-15T09:00:00+01:00"
},
"dueAt": "2026-10-15T09:00:00+01:00",
"late": true,
"trackingUrl": "string",
"trackingExpiresAt": "2026-10-15T09:00:00+01:00",
"failureReason": "string",
"createdAt": "2026-10-15T09:00:00+01:00",
"assignedAt": "2026-10-15T09:00:00+01:00",
"pickedUpAt": "2026-10-15T09:00:00+01:00",
"arrivingAt": "2026-10-15T09:00:00+01:00",
"endedAt": "2026-10-15T09:00:00+01:00",
"area": {
"type": "circle",
"lat": 6.48,
"lng": 3.43,
"radiusM": 2500
},
"proofs": [
{
"id": "string",
"kind": "photo",
"contentType": "image/jpeg",
"bytes": 0,
"lat": 0,
"lng": 0,
"by": "string",
"createdAt": "2026-10-15T09:00:00+01:00"
}
],
"endNote": "string",
"recipientEmail": "string",
"proofRequired": [
"photo"
],
"proofRequiredOverride": [
"string"
],
"packageSize": "small",
"itemDescription": "string",
"reference": "string",
"scheduledAt": "2026-10-15T09:00:00+01:00",
"connectionId": "string",
"acceptedAt": "2026-10-15T09:00:00+01:00",
"startedAt": "2026-10-15T09:00:00+01:00",
"editable": "all",
"editedAt": "2026-10-15T09:00:00+01:00",
"editedFields": [
"string"
],
"pinDelivery": {
"channel": "whatsapp",
"state": "sending",
"whatsappErrorCode": 0,
"needsEmail": true,
"updatedAt": "2026-10-15T09:00:00+01:00"
}
}Errors
defaultError
Send the customer's delivery PIN to their email
POST https://nways.ng/maps/v1/fleet/tasks/{id}/pin-email
For a delivery that asks for a PIN, until it ends: keeps the email on the delivery and sends the PIN to it (the fix when pinDelivery.needsEmail is true). You never see the PIN.
Parameters
| Name | In | Type | Description |
|---|---|---|---|
id | path | string | Required. |
Request body
| Field | Type | Description |
|---|---|---|
email | string (email) | Required. |
curl -X POST "https://nways.ng/maps/v1/fleet/tasks/string/pin-email" \
-H "X-NWays-Api-Key: YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{"email":"ngozi@example.com"}'const res = await fetch('https://nways.ng/maps/v1/fleet/tasks/string/pin-email', {
method: 'POST',
headers: { 'X-NWays-Api-Key': process.env.NWAYS_API_KEY, 'Content-Type': 'application/json' },
body: JSON.stringify({
"email": "ngozi@example.com"
}),
})
const data = await res.json()import os
import requests
res = requests.post(
"https://nways.ng/maps/v1/fleet/tasks/string/pin-email",
headers={"X-NWays-Api-Key": os.environ["NWAYS_API_KEY"]},
json={"email": "ngozi@example.com"},
timeout=10,
)
data = res.json()Response
The delivery
| Field | Type | Description |
|---|---|---|
id | string | Required. |
ref | string | Required. The delivery's short number in the project, given by N-Ways ("1042", shown #1042): for people, in alerts and lists. |
status | string | Required. One of: created, assigned, picked_up, arriving, completed, failed, cancelled. |
vehicleId | string | null | Required. |
pickup | Stop | null | Required. |
dropoff | Stop | Required. |
dropoff.lat | number | Required. |
dropoff.lng | number | Required. |
dropoff.name | string | Up to 120 characters. |
dropoff.address | string | Up to 300 characters. |
recipientName | string | Required. |
recipientPhone | string | |
notes | string | Required. |
lang | string | Required. One of: en, fr, pt. |
arrivingS | integer | Required. |
eta | ETA | null | Required. Null until a fresh position is in, and once the task ends. |
dueAt | string (date-time) | null | Required. |
late | boolean | Required. Open and past dueAt, or expected after it. |
trackingUrl | string (uri) | null | Required. Null once expired. |
trackingExpiresAt | string (date-time) | null | Required. |
failureReason | string | |
createdAt | string (date-time) | Required. |
assignedAt | string (date-time) | null | Required. |
pickedUpAt | string (date-time) | null | Required. |
arrivingAt | string (date-time) | null | Required. |
endedAt | string (date-time) | null | Required. |
area | Area | null | The delivery's own area: leaving it raises asset.geofence_exit. |
proofs | Proof[] | Only in GET /tasks/{id}: the rider's photos and signatures (N-Ways Business). |
proofs[].id | string | Required. |
proofs[].kind | string | Required. One of: photo, signature. |
proofs[].contentType | string | Required. One of: image/jpeg, image/png, image/webp. |
proofs[].bytes | integer | Required. |
proofs[].lat | number | null | Required. |
proofs[].lng | number | null | Required. |
proofs[].by | string | Required. The rider's name. |
proofs[].createdAt | string (date-time) | Required. |
endNote | string | Only in GET /tasks/{id}: what the rider wrote when finishing. |
recipientEmail | string | |
proofRequired | string[] | The delivery's own, else your settings'. |
proofRequiredOverride | string[] | null | |
packageSize | string | null | One of: small, medium, large, null. |
itemDescription | string | |
reference | string | |
scheduledAt | string (date-time) | null | |
connectionId | string | null | The N-Ways driver's connection that accepted it. |
acceptedAt | string (date-time) | null | |
startedAt | string (date-time) | null | |
editable | string | What PATCH /tasks/{id} may change now: everything, only notes and dueAt (picked up or started), or nothing (ended). One of: all, limited, none. |
editedAt | string (date-time) | null | The last edit. |
editedFields | string[] | What the last edit changed. |
pinDelivery | PinDelivery | How the delivery PIN is reaching the customer, when the delivery asks for one and PINs go on WhatsApp. Never the PIN itself. |
pinDelivery.channel | string | Required. One of: whatsapp, email, none. |
pinDelivery.state | string | Required. One of: sending, sent, delivered, read, failed. |
pinDelivery.whatsappErrorCode | integer | null | Required. WhatsApp's failure (131026: not on WhatsApp), kept after the PIN went by email. |
pinDelivery.needsEmail | boolean | Required. The customer hasn't got the PIN: send it with POST /tasks/{id}/pin-email. |
pinDelivery.updatedAt | string (date-time) | Required. |
{
"id": "string",
"ref": "string",
"status": "created",
"vehicleId": "string",
"pickup": {
"lat": 0,
"lng": 0,
"name": "string",
"address": "string"
},
"dropoff": {
"lat": 0,
"lng": 0,
"name": "string",
"address": "string"
},
"recipientName": "string",
"recipientPhone": "string",
"notes": "string",
"lang": "en",
"arrivingS": 0,
"eta": {
"at": "2026-10-15T09:00:00+01:00",
"durationS": 0,
"distanceM": 0,
"trafficDelayS": 0,
"pickupAt": "2026-10-15T09:00:00+01:00",
"updatedAt": "2026-10-15T09:00:00+01:00"
},
"dueAt": "2026-10-15T09:00:00+01:00",
"late": true,
"trackingUrl": "string",
"trackingExpiresAt": "2026-10-15T09:00:00+01:00",
"failureReason": "string",
"createdAt": "2026-10-15T09:00:00+01:00",
"assignedAt": "2026-10-15T09:00:00+01:00",
"pickedUpAt": "2026-10-15T09:00:00+01:00",
"arrivingAt": "2026-10-15T09:00:00+01:00",
"endedAt": "2026-10-15T09:00:00+01:00",
"area": {
"type": "circle",
"lat": 6.48,
"lng": 3.43,
"radiusM": 2500
},
"proofs": [
{
"id": "string",
"kind": "photo",
"contentType": "image/jpeg",
"bytes": 0,
"lat": 0,
"lng": 0,
"by": "string",
"createdAt": "2026-10-15T09:00:00+01:00"
}
],
"endNote": "string",
"recipientEmail": "string",
"proofRequired": [
"photo"
],
"proofRequiredOverride": [
"string"
],
"packageSize": "small",
"itemDescription": "string",
"reference": "string",
"scheduledAt": "2026-10-15T09:00:00+01:00",
"connectionId": "string",
"acceptedAt": "2026-10-15T09:00:00+01:00",
"startedAt": "2026-10-15T09:00:00+01:00",
"editable": "all",
"editedAt": "2026-10-15T09:00:00+01:00",
"editedFields": [
"string"
],
"pinDelivery": {
"channel": "whatsapp",
"state": "sending",
"whatsappErrorCode": 0,
"needsEmail": true,
"updatedAt": "2026-10-15T09:00:00+01:00"
}
}Errors
defaultError
Whether a delivery PIN can go to a number on WhatsApp
GET https://nways.ng/maps/v1/fleet/whatsapp/number
WhatsApp can't say ahead whether a number is on WhatsApp: known is a number your customer got a PIN on before, unreachable one WhatsApp couldn't reach lately (a delivery asking for a PIN then needs recipientEmail).
Parameters
| Name | In | Type | Description |
|---|---|---|---|
phone | query | string | As typed: +234…, or the local way for your country. Up to 32 characters. |
curl "https://nways.ng/maps/v1/fleet/whatsapp/number" \
-H "X-NWays-Api-Key: YOUR_API_KEY"const res = await fetch('https://nways.ng/maps/v1/fleet/whatsapp/number', {
headers: { 'X-NWays-Api-Key': process.env.NWAYS_API_KEY },
})
const data = await res.json()import os
import requests
res = requests.get(
"https://nways.ng/maps/v1/fleet/whatsapp/number",
headers={"X-NWays-Api-Key": os.environ["NWAYS_API_KEY"]},
timeout=10,
)
data = res.json()Response
The number's reach
| Field | Type | Description |
|---|---|---|
enabled | boolean | Required. PINs go on WhatsApp. When false, they go by email and push. |
phone | string | Required. The number in E.164 ("" when it isn't one). |
valid | boolean | Required. |
known | boolean | Required. |
unreachable | boolean | Required. |
{
"enabled": true,
"phone": "+2348031234567",
"valid": true,
"known": true,
"unreachable": true
}Errors
defaultError
Set or clear a delivery's own area
POST https://nways.ng/maps/v1/fleet/tasks/{id}/area
Leaving it raises asset.geofence_exit (through your geofence_exit rules with area dispatch, or a default one).
Parameters
| Name | In | Type | Description |
|---|---|---|---|
id | path | string | Required. |
Request body
| Field | Type | Description |
|---|---|---|
area | Area | null | Required. |
curl -X POST "https://nways.ng/maps/v1/fleet/tasks/string/area" \
-H "X-NWays-Api-Key: YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{"area":{"type":"circle","lat":6.48,"lng":3.43,"radiusM":2500}}'const res = await fetch('https://nways.ng/maps/v1/fleet/tasks/string/area', {
method: 'POST',
headers: { 'X-NWays-Api-Key': process.env.NWAYS_API_KEY, 'Content-Type': 'application/json' },
body: JSON.stringify({
"area": {
"type": "circle",
"lat": 6.48,
"lng": 3.43,
"radiusM": 2500
}
}),
})
const data = await res.json()import os
import requests
res = requests.post(
"https://nways.ng/maps/v1/fleet/tasks/string/area",
headers={"X-NWays-Api-Key": os.environ["NWAYS_API_KEY"]},
json={"area": {"type": "circle", "lat": 6.48, "lng": 3.43, "radiusM": 2500}},
timeout=10,
)
data = res.json()Response
The task
| Field | Type | Description |
|---|---|---|
id | string | Required. |
ref | string | Required. The delivery's short number in the project, given by N-Ways ("1042", shown #1042): for people, in alerts and lists. |
status | string | Required. One of: created, assigned, picked_up, arriving, completed, failed, cancelled. |
vehicleId | string | null | Required. |
pickup | Stop | null | Required. |
dropoff | Stop | Required. |
dropoff.lat | number | Required. |
dropoff.lng | number | Required. |
dropoff.name | string | Up to 120 characters. |
dropoff.address | string | Up to 300 characters. |
recipientName | string | Required. |
recipientPhone | string | |
notes | string | Required. |
lang | string | Required. One of: en, fr, pt. |
arrivingS | integer | Required. |
eta | ETA | null | Required. Null until a fresh position is in, and once the task ends. |
dueAt | string (date-time) | null | Required. |
late | boolean | Required. Open and past dueAt, or expected after it. |
trackingUrl | string (uri) | null | Required. Null once expired. |
trackingExpiresAt | string (date-time) | null | Required. |
failureReason | string | |
createdAt | string (date-time) | Required. |
assignedAt | string (date-time) | null | Required. |
pickedUpAt | string (date-time) | null | Required. |
arrivingAt | string (date-time) | null | Required. |
endedAt | string (date-time) | null | Required. |
area | Area | null | The delivery's own area: leaving it raises asset.geofence_exit. |
proofs | Proof[] | Only in GET /tasks/{id}: the rider's photos and signatures (N-Ways Business). |
proofs[].id | string | Required. |
proofs[].kind | string | Required. One of: photo, signature. |
proofs[].contentType | string | Required. One of: image/jpeg, image/png, image/webp. |
proofs[].bytes | integer | Required. |
proofs[].lat | number | null | Required. |
proofs[].lng | number | null | Required. |
proofs[].by | string | Required. The rider's name. |
proofs[].createdAt | string (date-time) | Required. |
endNote | string | Only in GET /tasks/{id}: what the rider wrote when finishing. |
recipientEmail | string | |
proofRequired | string[] | The delivery's own, else your settings'. |
proofRequiredOverride | string[] | null | |
packageSize | string | null | One of: small, medium, large, null. |
itemDescription | string | |
reference | string | |
scheduledAt | string (date-time) | null | |
connectionId | string | null | The N-Ways driver's connection that accepted it. |
acceptedAt | string (date-time) | null | |
startedAt | string (date-time) | null | |
editable | string | What PATCH /tasks/{id} may change now: everything, only notes and dueAt (picked up or started), or nothing (ended). One of: all, limited, none. |
editedAt | string (date-time) | null | The last edit. |
editedFields | string[] | What the last edit changed. |
pinDelivery | PinDelivery | How the delivery PIN is reaching the customer, when the delivery asks for one and PINs go on WhatsApp. Never the PIN itself. |
pinDelivery.channel | string | Required. One of: whatsapp, email, none. |
pinDelivery.state | string | Required. One of: sending, sent, delivered, read, failed. |
pinDelivery.whatsappErrorCode | integer | null | Required. WhatsApp's failure (131026: not on WhatsApp), kept after the PIN went by email. |
pinDelivery.needsEmail | boolean | Required. The customer hasn't got the PIN: send it with POST /tasks/{id}/pin-email. |
pinDelivery.updatedAt | string (date-time) | Required. |
{
"id": "string",
"ref": "string",
"status": "created",
"vehicleId": "string",
"pickup": {
"lat": 0,
"lng": 0,
"name": "string",
"address": "string"
},
"dropoff": {
"lat": 0,
"lng": 0,
"name": "string",
"address": "string"
},
"recipientName": "string",
"recipientPhone": "string",
"notes": "string",
"lang": "en",
"arrivingS": 0,
"eta": {
"at": "2026-10-15T09:00:00+01:00",
"durationS": 0,
"distanceM": 0,
"trafficDelayS": 0,
"pickupAt": "2026-10-15T09:00:00+01:00",
"updatedAt": "2026-10-15T09:00:00+01:00"
},
"dueAt": "2026-10-15T09:00:00+01:00",
"late": true,
"trackingUrl": "string",
"trackingExpiresAt": "2026-10-15T09:00:00+01:00",
"failureReason": "string",
"createdAt": "2026-10-15T09:00:00+01:00",
"assignedAt": "2026-10-15T09:00:00+01:00",
"pickedUpAt": "2026-10-15T09:00:00+01:00",
"arrivingAt": "2026-10-15T09:00:00+01:00",
"endedAt": "2026-10-15T09:00:00+01:00",
"area": {
"type": "circle",
"lat": 6.48,
"lng": 3.43,
"radiusM": 2500
},
"proofs": [
{
"id": "string",
"kind": "photo",
"contentType": "image/jpeg",
"bytes": 0,
"lat": 0,
"lng": 0,
"by": "string",
"createdAt": "2026-10-15T09:00:00+01:00"
}
],
"endNote": "string",
"recipientEmail": "string",
"proofRequired": [
"photo"
],
"proofRequiredOverride": [
"string"
],
"packageSize": "small",
"itemDescription": "string",
"reference": "string",
"scheduledAt": "2026-10-15T09:00:00+01:00",
"connectionId": "string",
"acceptedAt": "2026-10-15T09:00:00+01:00",
"startedAt": "2026-10-15T09:00:00+01:00",
"editable": "all",
"editedAt": "2026-10-15T09:00:00+01:00",
"editedFields": [
"string"
],
"pinDelivery": {
"channel": "whatsapp",
"state": "sending",
"whatsappErrorCode": 0,
"needsEmail": true,
"updatedAt": "2026-10-15T09:00:00+01:00"
}
}Errors
defaultError
List your pickup places (the default first)
GET https://nways.ng/maps/v1/fleet/places
Parameters
| Name | In | Type | Description |
|---|---|---|---|
q | query | string | Finds a name, address or door code. |
curl "https://nways.ng/maps/v1/fleet/places" \
-H "X-NWays-Api-Key: YOUR_API_KEY"const res = await fetch('https://nways.ng/maps/v1/fleet/places', {
headers: { 'X-NWays-Api-Key': process.env.NWAYS_API_KEY },
})
const data = await res.json()import os
import requests
res = requests.get(
"https://nways.ng/maps/v1/fleet/places",
headers={"X-NWays-Api-Key": os.environ["NWAYS_API_KEY"]},
timeout=10,
)
data = res.json()Response
Places
| Field | Type | Description |
|---|---|---|
places | Place[] | Required. |
places[].id | string | Required. |
places[].name | string | Required. |
places[].doorCode | string | Required. The NIPOST or GhanaPost door code it was found by ("" for none). |
places[].address | string | Required. |
places[].lat | number | Required. |
places[].lng | number | Required. |
places[].phone | string | Required. |
places[].hours | string | Required. |
places[].default | boolean | Required. New deliveries in the console start from it. |
places[].createdAt | string (date-time) | Required. |
places[].updatedAt | string (date-time) | Required. |
{
"places": [
{
"id": "plc_4fQ9xLm2Za",
"name": "Yaba warehouse",
"doorCode": "string",
"address": "string",
"lat": 0,
"lng": 0,
"phone": "string",
"hours": "Mon–Sat 8:00–18:00",
"default": true,
"createdAt": "2026-10-15T09:00:00+01:00",
"updatedAt": "2026-10-15T09:00:00+01:00"
}
]
}Errors
defaultError
Add a pickup place (up to 200)
POST https://nways.ng/maps/v1/fleet/places
Your first place is the default unless you say otherwise; making one the default unsets the others.
Request body
name, lat and lng are required to add one.
| Field | Type | Description |
|---|---|---|
name | string | Up to 100 characters. |
doorCode | string | Up to 32 characters. |
address | string | Up to 300 characters. |
lat | number | |
lng | number | |
phone | string | Up to 32 characters. |
hours | string | Up to 200 characters. |
default | boolean |
curl -X POST "https://nways.ng/maps/v1/fleet/places" \
-H "X-NWays-Api-Key: YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{"name":"Yaba warehouse","doorCode":"LA14A18BE13","address":"12 Herbert Macaulay Way","lat":6.5095,"lng":3.3711,"phone":"+234 803 000 0000","hours":"Mon–Sat 8:00–18:00"}'const res = await fetch('https://nways.ng/maps/v1/fleet/places', {
method: 'POST',
headers: { 'X-NWays-Api-Key': process.env.NWAYS_API_KEY, 'Content-Type': 'application/json' },
body: JSON.stringify({
"name": "Yaba warehouse",
"doorCode": "LA14A18BE13",
"address": "12 Herbert Macaulay Way",
"lat": 6.5095,
"lng": 3.3711,
"phone": "+234 803 000 0000",
"hours": "Mon–Sat 8:00–18:00"
}),
})
const data = await res.json()import os
import requests
res = requests.post(
"https://nways.ng/maps/v1/fleet/places",
headers={"X-NWays-Api-Key": os.environ["NWAYS_API_KEY"]},
json={"name": "Yaba warehouse", "doorCode": "LA14A18BE13", "address": "12 Herbert Macaulay Way", "lat": 6.5095, "lng": 3.3711, "phone": "+234 803 000 0000", "hours": "Mon–Sat 8:00–18:00"},
timeout=10,
)
data = res.json()Response
Created
| Field | Type | Description |
|---|---|---|
id | string | Required. |
name | string | Required. |
doorCode | string | Required. The NIPOST or GhanaPost door code it was found by ("" for none). |
address | string | Required. |
lat | number | Required. |
lng | number | Required. |
phone | string | Required. |
hours | string | Required. |
default | boolean | Required. New deliveries in the console start from it. |
createdAt | string (date-time) | Required. |
updatedAt | string (date-time) | Required. |
{
"id": "plc_4fQ9xLm2Za",
"name": "Yaba warehouse",
"doorCode": "string",
"address": "string",
"lat": 0,
"lng": 0,
"phone": "string",
"hours": "Mon–Sat 8:00–18:00",
"default": true,
"createdAt": "2026-10-15T09:00:00+01:00",
"updatedAt": "2026-10-15T09:00:00+01:00"
}Errors
defaultError
Get a pickup place
GET https://nways.ng/maps/v1/fleet/places/{placeId}
Parameters
| Name | In | Type | Description |
|---|---|---|---|
placeId | path | string | Required. |
curl "https://nways.ng/maps/v1/fleet/places/plc_4fQ9xLm2Za" \
-H "X-NWays-Api-Key: YOUR_API_KEY"const res = await fetch('https://nways.ng/maps/v1/fleet/places/plc_4fQ9xLm2Za', {
headers: { 'X-NWays-Api-Key': process.env.NWAYS_API_KEY },
})
const data = await res.json()import os
import requests
res = requests.get(
"https://nways.ng/maps/v1/fleet/places/plc_4fQ9xLm2Za",
headers={"X-NWays-Api-Key": os.environ["NWAYS_API_KEY"]},
timeout=10,
)
data = res.json()Response
Place
| Field | Type | Description |
|---|---|---|
id | string | Required. |
name | string | Required. |
doorCode | string | Required. The NIPOST or GhanaPost door code it was found by ("" for none). |
address | string | Required. |
lat | number | Required. |
lng | number | Required. |
phone | string | Required. |
hours | string | Required. |
default | boolean | Required. New deliveries in the console start from it. |
createdAt | string (date-time) | Required. |
updatedAt | string (date-time) | Required. |
{
"id": "plc_4fQ9xLm2Za",
"name": "Yaba warehouse",
"doorCode": "string",
"address": "string",
"lat": 0,
"lng": 0,
"phone": "string",
"hours": "Mon–Sat 8:00–18:00",
"default": true,
"createdAt": "2026-10-15T09:00:00+01:00",
"updatedAt": "2026-10-15T09:00:00+01:00"
}Errors
defaultError
Edit a pickup place
PATCH https://nways.ng/maps/v1/fleet/places/{placeId}
Deliveries already made from it keep the pickup they were given.
Parameters
| Name | In | Type | Description |
|---|---|---|---|
placeId | path | string | Required. |
Request body
name, lat and lng are required to add one.
| Field | Type | Description |
|---|---|---|
name | string | Up to 100 characters. |
doorCode | string | Up to 32 characters. |
address | string | Up to 300 characters. |
lat | number | |
lng | number | |
phone | string | Up to 32 characters. |
hours | string | Up to 200 characters. |
default | boolean |
curl -X PATCH "https://nways.ng/maps/v1/fleet/places/plc_4fQ9xLm2Za" \
-H "X-NWays-Api-Key: YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{"name":"string","doorCode":"string","address":"string","lat":0,"lng":0,"phone":"string","hours":"string","default":true}'const res = await fetch('https://nways.ng/maps/v1/fleet/places/plc_4fQ9xLm2Za', {
method: 'PATCH',
headers: { 'X-NWays-Api-Key': process.env.NWAYS_API_KEY, 'Content-Type': 'application/json' },
body: JSON.stringify({
"name": "string",
"doorCode": "string",
"address": "string",
"lat": 0,
"lng": 0,
"phone": "string",
"hours": "string",
"default": true
}),
})
const data = await res.json()import os
import requests
res = requests.patch(
"https://nways.ng/maps/v1/fleet/places/plc_4fQ9xLm2Za",
headers={"X-NWays-Api-Key": os.environ["NWAYS_API_KEY"]},
json={"name": "string", "doorCode": "string", "address": "string", "lat": 0, "lng": 0, "phone": "string", "hours": "string", "default": True},
timeout=10,
)
data = res.json()Response
Place
| Field | Type | Description |
|---|---|---|
id | string | Required. |
name | string | Required. |
doorCode | string | Required. The NIPOST or GhanaPost door code it was found by ("" for none). |
address | string | Required. |
lat | number | Required. |
lng | number | Required. |
phone | string | Required. |
hours | string | Required. |
default | boolean | Required. New deliveries in the console start from it. |
createdAt | string (date-time) | Required. |
updatedAt | string (date-time) | Required. |
{
"id": "plc_4fQ9xLm2Za",
"name": "Yaba warehouse",
"doorCode": "string",
"address": "string",
"lat": 0,
"lng": 0,
"phone": "string",
"hours": "Mon–Sat 8:00–18:00",
"default": true,
"createdAt": "2026-10-15T09:00:00+01:00",
"updatedAt": "2026-10-15T09:00:00+01:00"
}Errors
defaultError
Delete a pickup place
DELETE https://nways.ng/maps/v1/fleet/places/{placeId}
Parameters
| Name | In | Type | Description |
|---|---|---|---|
placeId | path | string | Required. |
curl -X DELETE "https://nways.ng/maps/v1/fleet/places/plc_4fQ9xLm2Za" \
-H "X-NWays-Api-Key: YOUR_API_KEY"const res = await fetch('https://nways.ng/maps/v1/fleet/places/plc_4fQ9xLm2Za', {
method: 'DELETE',
headers: { 'X-NWays-Api-Key': process.env.NWAYS_API_KEY },
})
const data = await res.json()import os
import requests
res = requests.delete(
"https://nways.ng/maps/v1/fleet/places/plc_4fQ9xLm2Za",
headers={"X-NWays-Api-Key": os.environ["NWAYS_API_KEY"]},
timeout=10,
)
data = res.json()Response
Deleted
No content.
Errors
defaultError
List your customers, most recent delivery first
GET https://nways.ng/maps/v1/fleet/customers
A customer is everyone your deliveries went to with the same phone (however it was written), else the same email, else the same name. Kept from your deliveries as they're made and edited, a year after their last delivery.
Parameters
| Name | In | Type | Description |
|---|---|---|---|
q | query | string | Finds a name, an email, or any part of a phone number. |
limit | query | integer | Default: 25. ≥ 1, ≤ 100. |
pageToken | query | string | nextPageToken (or prevPageToken) from another page. |
curl "https://nways.ng/maps/v1/fleet/customers" \
-H "X-NWays-Api-Key: YOUR_API_KEY"const res = await fetch('https://nways.ng/maps/v1/fleet/customers', {
headers: { 'X-NWays-Api-Key': process.env.NWAYS_API_KEY },
})
const data = await res.json()import os
import requests
res = requests.get(
"https://nways.ng/maps/v1/fleet/customers",
headers={"X-NWays-Api-Key": os.environ["NWAYS_API_KEY"]},
timeout=10,
)
data = res.json()Response
Customers
| Field | Type | Description |
|---|---|---|
customers | Customer[] | Required. |
customers[].id | string | Required. |
customers[].name | string | Required. As the latest delivery named them. |
customers[].phone | string | Required. |
customers[].email | string | Required. |
customers[].deliveries | integer | Required. |
customers[].addresses | integer | Required. |
customers[].lastDeliveryAt | string (date-time) | Required. |
customers[].lastAddress | Address | null | Required. Where the latest delivery went. |
nextPageToken | string | |
prevPageToken | string | |
offset | integer | Required. |
{
"customers": [
{
"id": "cus_4fQ9xLm2Za",
"name": "string",
"phone": "string",
"email": "string",
"deliveries": 0,
"addresses": 0,
"lastDeliveryAt": "2026-10-15T09:00:00+01:00",
"lastAddress": {
"id": "adr_8KwP2nVd5T",
"name": "string",
"address": "string",
"doorCode": "string",
"lat": 0,
"lng": 0,
"uses": 0,
"lastUsedAt": "2026-10-15T09:00:00+01:00"
}
}
],
"nextPageToken": "string",
"prevPageToken": "string",
"offset": 0
}Errors
defaultError
Get a customer
GET https://nways.ng/maps/v1/fleet/customers/{customerId}
Parameters
| Name | In | Type | Description |
|---|---|---|---|
customerId | path | string | Required. |
curl "https://nways.ng/maps/v1/fleet/customers/cus_4fQ9xLm2Za" \
-H "X-NWays-Api-Key: YOUR_API_KEY"const res = await fetch('https://nways.ng/maps/v1/fleet/customers/cus_4fQ9xLm2Za', {
headers: { 'X-NWays-Api-Key': process.env.NWAYS_API_KEY },
})
const data = await res.json()import os
import requests
res = requests.get(
"https://nways.ng/maps/v1/fleet/customers/cus_4fQ9xLm2Za",
headers={"X-NWays-Api-Key": os.environ["NWAYS_API_KEY"]},
timeout=10,
)
data = res.json()Response
Customer
| Field | Type | Description |
|---|---|---|
id | string | Required. |
name | string | Required. As the latest delivery named them. |
phone | string | Required. |
email | string | Required. |
deliveries | integer | Required. |
addresses | integer | Required. |
lastDeliveryAt | string (date-time) | Required. |
lastAddress | Address | null | Required. Where the latest delivery went. |
{
"id": "cus_4fQ9xLm2Za",
"name": "string",
"phone": "string",
"email": "string",
"deliveries": 0,
"addresses": 0,
"lastDeliveryAt": "2026-10-15T09:00:00+01:00",
"lastAddress": {
"id": "adr_8KwP2nVd5T",
"name": "string",
"address": "string",
"doorCode": "string",
"lat": 0,
"lng": 0,
"uses": 0,
"lastUsedAt": "2026-10-15T09:00:00+01:00"
}
}Errors
defaultError
Forget a customer and their addresses
DELETE https://nways.ng/maps/v1/fleet/customers/{customerId}
For a customer who asks to be forgotten. Their deliveries stay, with your fleet's retention; a new delivery to them starts a new customer.
Parameters
| Name | In | Type | Description |
|---|---|---|---|
customerId | path | string | Required. |
curl -X DELETE "https://nways.ng/maps/v1/fleet/customers/cus_4fQ9xLm2Za" \
-H "X-NWays-Api-Key: YOUR_API_KEY"const res = await fetch('https://nways.ng/maps/v1/fleet/customers/cus_4fQ9xLm2Za', {
method: 'DELETE',
headers: { 'X-NWays-Api-Key': process.env.NWAYS_API_KEY },
})
const data = await res.json()import os
import requests
res = requests.delete(
"https://nways.ng/maps/v1/fleet/customers/cus_4fQ9xLm2Za",
headers={"X-NWays-Api-Key": os.environ["NWAYS_API_KEY"]},
timeout=10,
)
data = res.json()Response
Forgotten
No content.
Errors
defaultError
List a customer's addresses, last used first
GET https://nways.ng/maps/v1/fleet/customers/{customerId}/addresses
Each distinct drop-off (to about 11 m) with its latest name, address and door code, how often it was used and when last.
Parameters
| Name | In | Type | Description |
|---|---|---|---|
customerId | path | string | Required. |
q | query | string | Finds a name, address or door code. |
limit | query | integer | Default: 25. ≥ 1, ≤ 100. |
pageToken | query | string |
curl "https://nways.ng/maps/v1/fleet/customers/string/addresses" \
-H "X-NWays-Api-Key: YOUR_API_KEY"const res = await fetch('https://nways.ng/maps/v1/fleet/customers/string/addresses', {
headers: { 'X-NWays-Api-Key': process.env.NWAYS_API_KEY },
})
const data = await res.json()import os
import requests
res = requests.get(
"https://nways.ng/maps/v1/fleet/customers/string/addresses",
headers={"X-NWays-Api-Key": os.environ["NWAYS_API_KEY"]},
timeout=10,
)
data = res.json()Response
Addresses
| Field | Type | Description |
|---|---|---|
addresses | Address[] | Required. |
addresses[].id | string | Required. |
addresses[].name | string | Required. |
addresses[].address | string | Required. |
addresses[].doorCode | string | Required. The NIPOST or GhanaPost code the address starts with ("" for none). |
addresses[].lat | number | Required. |
addresses[].lng | number | Required. |
addresses[].uses | integer | Required. Deliveries that went there. |
addresses[].lastUsedAt | string (date-time) | Required. |
total | integer | Required. All the customer's addresses (not only those found). |
nextPageToken | string | |
prevPageToken | string | |
offset | integer | Required. |
{
"addresses": [
{
"id": "adr_8KwP2nVd5T",
"name": "string",
"address": "string",
"doorCode": "string",
"lat": 0,
"lng": 0,
"uses": 0,
"lastUsedAt": "2026-10-15T09:00:00+01:00"
}
],
"total": 0,
"nextPageToken": "string",
"prevPageToken": "string",
"offset": 0
}Errors
defaultError
The recipient's tracking link (a new one if it expired; none once the task ended)
POST https://nways.ng/maps/v1/fleet/tasks/{id}/share
Parameters
| Name | In | Type | Description |
|---|---|---|---|
id | path | string | Required. |
curl -X POST "https://nways.ng/maps/v1/fleet/tasks/string/share" \
-H "X-NWays-Api-Key: YOUR_API_KEY"const res = await fetch('https://nways.ng/maps/v1/fleet/tasks/string/share', {
method: 'POST',
headers: { 'X-NWays-Api-Key': process.env.NWAYS_API_KEY },
})
const data = await res.json()import os
import requests
res = requests.post(
"https://nways.ng/maps/v1/fleet/tasks/string/share",
headers={"X-NWays-Api-Key": os.environ["NWAYS_API_KEY"]},
timeout=10,
)
data = res.json()Response
Link
| Field | Type | Description |
|---|---|---|
url | string (uri) | Required. |
expiresAt | string (date-time) | Required. |
{
"url": "https://nways.ng/t/3fT9kQ2xVbN7LmP0aZc4RwYe",
"expiresAt": "2026-10-15T09:00:00+01:00"
}Errors
defaultError