N-Ways
Developer docsDeliveries and tracking

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
Note:

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

NameInTypeDescription
idpathstringRequired.
cURL
curl "https://nways.ng/maps/v1/fleet/tasks/string/proofs" \
  -H "X-NWays-Api-Key: YOUR_API_KEY"
JavaScript
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()
Python
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

FieldTypeDescription
taskIdstringRequired.
proofsProof[]Required.
proofs[].idstringRequired.
proofs[].kindstringRequired. One of: photo, signature.
proofs[].contentTypestringRequired. One of: image/jpeg, image/png, image/webp.
proofs[].bytesintegerRequired.
proofs[].latnumber | nullRequired.
proofs[].lngnumber | nullRequired.
proofs[].bystringRequired. The rider's name.
proofs[].createdAtstring (date-time)Required.
endNotestringRequired. What the rider wrote when finishing.
200 OK
{
  "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

  • default Error

A proof's image (JPEG, PNG or WebP), kept as long as its task

GET https://nways.ng/maps/v1/fleet/proofs/{proofId}

Parameters

NameInTypeDescription
proofIdpathstringRequired.
cURL
curl "https://nways.ng/maps/v1/fleet/proofs/string" \
  -H "X-NWays-Api-Key: YOUR_API_KEY"
JavaScript
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()
Python
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

  • default Error

List tasks, newest first

GET https://nways.ng/maps/v1/fleet/tasks

Parameters

NameInTypeDescription
statusquerystringactive = assigned, picked_up or arriving. One of: created, assigned, picked_up, arriving, completed, failed, cancelled, active.
vehicleIdquerystring
limitqueryintegerDefault: 100. ≥ 1, ≤ 500.
pageTokenquerystringnextPageToken from the previous page.
cURL
curl "https://nways.ng/maps/v1/fleet/tasks" \
  -H "X-NWays-Api-Key: YOUR_API_KEY"
JavaScript
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()
Python
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

FieldTypeDescription
tasksTask[]Required.
tasks[].idstringRequired.
tasks[].refstringRequired. The delivery's short number in the project, given by N-Ways ("1042", shown #1042): for people, in alerts and lists.
tasks[].statusstringRequired. One of: created, assigned, picked_up, arriving, completed, failed, cancelled.
tasks[].vehicleIdstring | nullRequired.
tasks[].pickupStop | nullRequired.
tasks[].dropoffStopRequired.
tasks[].dropoff.latnumberRequired.
tasks[].dropoff.lngnumberRequired.
tasks[].dropoff.namestringUp to 120 characters.
tasks[].dropoff.addressstringUp to 300 characters.
tasks[].recipientNamestringRequired.
tasks[].recipientPhonestring
tasks[].notesstringRequired.
tasks[].langstringRequired. One of: en, fr, pt.
tasks[].arrivingSintegerRequired.
tasks[].etaETA | nullRequired. Null until a fresh position is in, and once the task ends.
tasks[].dueAtstring (date-time) | nullRequired.
tasks[].latebooleanRequired. Open and past dueAt, or expected after it.
tasks[].trackingUrlstring (uri) | nullRequired. Null once expired.
tasks[].trackingExpiresAtstring (date-time) | nullRequired.
tasks[].failureReasonstring
tasks[].createdAtstring (date-time)Required.
tasks[].assignedAtstring (date-time) | nullRequired.
tasks[].pickedUpAtstring (date-time) | nullRequired.
tasks[].arrivingAtstring (date-time) | nullRequired.
tasks[].endedAtstring (date-time) | nullRequired.
tasks[].areaArea | nullThe delivery's own area: leaving it raises asset.geofence_exit.
tasks[].proofsProof[]Only in GET /tasks/{id}: the rider's photos and signatures (N-Ways Business).
tasks[].proofs[].idstringRequired.
tasks[].proofs[].kindstringRequired. One of: photo, signature.
tasks[].proofs[].contentTypestringRequired. One of: image/jpeg, image/png, image/webp.
tasks[].proofs[].bytesintegerRequired.
tasks[].proofs[].latnumber | nullRequired.
tasks[].proofs[].lngnumber | nullRequired.
tasks[].proofs[].bystringRequired. The rider's name.
tasks[].proofs[].createdAtstring (date-time)Required.
tasks[].endNotestringOnly in GET /tasks/{id}: what the rider wrote when finishing.
tasks[].recipientEmailstring
tasks[].proofRequiredstring[]The delivery's own, else your settings'.
tasks[].proofRequiredOverridestring[] | null
tasks[].packageSizestring | nullOne of: small, medium, large, null.
tasks[].itemDescriptionstring
tasks[].referencestring
tasks[].scheduledAtstring (date-time) | null
tasks[].connectionIdstring | nullThe N-Ways driver's connection that accepted it.
tasks[].acceptedAtstring (date-time) | null
tasks[].startedAtstring (date-time) | null
tasks[].editablestringWhat PATCH /tasks/{id} may change now: everything, only notes and dueAt (picked up or started), or nothing (ended). One of: all, limited, none.
tasks[].editedAtstring (date-time) | nullThe last edit.
tasks[].editedFieldsstring[]What the last edit changed.
tasks[].pinDeliveryPinDeliveryHow the delivery PIN is reaching the customer, when the delivery asks for one and PINs go on WhatsApp. Never the PIN itself.
tasks[].pinDelivery.channelstringRequired. One of: whatsapp, email, none.
tasks[].pinDelivery.statestringRequired. One of: sending, sent, delivered, read, failed.
tasks[].pinDelivery.whatsappErrorCodeinteger | nullRequired. WhatsApp's failure (131026: not on WhatsApp), kept after the PIN went by email.
tasks[].pinDelivery.needsEmailbooleanRequired. The customer hasn't got the PIN: send it with POST /tasks/{id}/pin-email.
tasks[].pinDelivery.updatedAtstring (date-time)Required.
nextPageTokenstring
200 OK
{
  "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

  • default Error

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

FieldTypeDescription
idstringYour id for it; N-Ways makes one (job_…) when you leave it out.
pickupStop
pickup.latnumberRequired.
pickup.lngnumberRequired.
pickup.namestringUp to 120 characters.
pickup.addressstringUp to 300 characters.
pickupPlaceIdstringOne of your pickup places as the pickup (its name, address and position are copied in), instead of pickup.
dropoffStopRequired.
dropoff.latnumberRequired.
dropoff.lngnumberRequired.
dropoff.namestringUp to 120 characters.
dropoff.addressstringUp to 300 characters.
recipientNamestringFor your records; never shown on the tracking page. Up to 100 characters.
recipientPhonestringSo the rider can call the customer from N-Ways Business; never shown on the tracking page. Up to 32 characters.
notesstringUp to 500 characters.
langstringThe tracking page's language. One of: en, fr, pt. Default: en.
arrivingSintegerSeconds before arrival at which the task becomes arriving. Default: 180. ≥ 30, ≤ 1800.
vehicleIdstring
dueAtstring (date-time)The deadline: past it (or expected after it) the task is late.
areaAreaA circle (lat, lng, radiusM 50–100000) or a polygon (coordinates: 3–500 [lng, lat] points).
area.typestringRequired. One of: circle, polygon.
area.latnumber
area.lngnumber
area.radiusMnumber≥ 50, ≤ 100000.
area.coordinatesnumber[][]
recipientEmailstring (email)N-Ways emails the customer its news (on its way, arriving, delivered) with the tracking link.
proofRequiredstring[]What the driver must give to deliver; leave out for your settings' proofRequired.
packageSizestringOne of: small, medium, large.
itemDescriptionstringUp to 200 characters.
referencestringYour own reference (an invoice or order number). Up to 64 characters.
scheduledAtstring (date-time)A pickup later (up to 60 days ahead): the driver is reminded before it.
cURL
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"}'
JavaScript
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()
Python
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

FieldTypeDescription
idstringRequired.
refstringRequired. The delivery's short number in the project, given by N-Ways ("1042", shown #1042): for people, in alerts and lists.
statusstringRequired. One of: created, assigned, picked_up, arriving, completed, failed, cancelled.
vehicleIdstring | nullRequired.
pickupStop | nullRequired.
dropoffStopRequired.
dropoff.latnumberRequired.
dropoff.lngnumberRequired.
dropoff.namestringUp to 120 characters.
dropoff.addressstringUp to 300 characters.
recipientNamestringRequired.
recipientPhonestring
notesstringRequired.
langstringRequired. One of: en, fr, pt.
arrivingSintegerRequired.
etaETA | nullRequired. Null until a fresh position is in, and once the task ends.
dueAtstring (date-time) | nullRequired.
latebooleanRequired. Open and past dueAt, or expected after it.
trackingUrlstring (uri) | nullRequired. Null once expired.
trackingExpiresAtstring (date-time) | nullRequired.
failureReasonstring
createdAtstring (date-time)Required.
assignedAtstring (date-time) | nullRequired.
pickedUpAtstring (date-time) | nullRequired.
arrivingAtstring (date-time) | nullRequired.
endedAtstring (date-time) | nullRequired.
areaArea | nullThe delivery's own area: leaving it raises asset.geofence_exit.
proofsProof[]Only in GET /tasks/{id}: the rider's photos and signatures (N-Ways Business).
proofs[].idstringRequired.
proofs[].kindstringRequired. One of: photo, signature.
proofs[].contentTypestringRequired. One of: image/jpeg, image/png, image/webp.
proofs[].bytesintegerRequired.
proofs[].latnumber | nullRequired.
proofs[].lngnumber | nullRequired.
proofs[].bystringRequired. The rider's name.
proofs[].createdAtstring (date-time)Required.
endNotestringOnly in GET /tasks/{id}: what the rider wrote when finishing.
recipientEmailstring
proofRequiredstring[]The delivery's own, else your settings'.
proofRequiredOverridestring[] | null
packageSizestring | nullOne of: small, medium, large, null.
itemDescriptionstring
referencestring
scheduledAtstring (date-time) | null
connectionIdstring | nullThe N-Ways driver's connection that accepted it.
acceptedAtstring (date-time) | null
startedAtstring (date-time) | null
editablestringWhat PATCH /tasks/{id} may change now: everything, only notes and dueAt (picked up or started), or nothing (ended). One of: all, limited, none.
editedAtstring (date-time) | nullThe last edit.
editedFieldsstring[]What the last edit changed.
pinDeliveryPinDeliveryHow the delivery PIN is reaching the customer, when the delivery asks for one and PINs go on WhatsApp. Never the PIN itself.
pinDelivery.channelstringRequired. One of: whatsapp, email, none.
pinDelivery.statestringRequired. One of: sending, sent, delivered, read, failed.
pinDelivery.whatsappErrorCodeinteger | nullRequired. WhatsApp's failure (131026: not on WhatsApp), kept after the PIN went by email.
pinDelivery.needsEmailbooleanRequired. The customer hasn't got the PIN: send it with POST /tasks/{id}/pin-email.
pinDelivery.updatedAtstring (date-time)Required.
201 OK
{
  "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

  • 403 DELIVERIES_OFF (N-Ways turned new deliveries off for your organisation) or ORGANISATION_SUSPENDED; the message says why.
  • default Error

Get a task with its live ETA

GET https://nways.ng/maps/v1/fleet/tasks/{id}

Parameters

NameInTypeDescription
idpathstringRequired.
cURL
curl "https://nways.ng/maps/v1/fleet/tasks/string" \
  -H "X-NWays-Api-Key: YOUR_API_KEY"
JavaScript
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()
Python
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

FieldTypeDescription
idstringRequired.
refstringRequired. The delivery's short number in the project, given by N-Ways ("1042", shown #1042): for people, in alerts and lists.
statusstringRequired. One of: created, assigned, picked_up, arriving, completed, failed, cancelled.
vehicleIdstring | nullRequired.
pickupStop | nullRequired.
dropoffStopRequired.
dropoff.latnumberRequired.
dropoff.lngnumberRequired.
dropoff.namestringUp to 120 characters.
dropoff.addressstringUp to 300 characters.
recipientNamestringRequired.
recipientPhonestring
notesstringRequired.
langstringRequired. One of: en, fr, pt.
arrivingSintegerRequired.
etaETA | nullRequired. Null until a fresh position is in, and once the task ends.
dueAtstring (date-time) | nullRequired.
latebooleanRequired. Open and past dueAt, or expected after it.
trackingUrlstring (uri) | nullRequired. Null once expired.
trackingExpiresAtstring (date-time) | nullRequired.
failureReasonstring
createdAtstring (date-time)Required.
assignedAtstring (date-time) | nullRequired.
pickedUpAtstring (date-time) | nullRequired.
arrivingAtstring (date-time) | nullRequired.
endedAtstring (date-time) | nullRequired.
areaArea | nullThe delivery's own area: leaving it raises asset.geofence_exit.
proofsProof[]Only in GET /tasks/{id}: the rider's photos and signatures (N-Ways Business).
proofs[].idstringRequired.
proofs[].kindstringRequired. One of: photo, signature.
proofs[].contentTypestringRequired. One of: image/jpeg, image/png, image/webp.
proofs[].bytesintegerRequired.
proofs[].latnumber | nullRequired.
proofs[].lngnumber | nullRequired.
proofs[].bystringRequired. The rider's name.
proofs[].createdAtstring (date-time)Required.
endNotestringOnly in GET /tasks/{id}: what the rider wrote when finishing.
recipientEmailstring
proofRequiredstring[]The delivery's own, else your settings'.
proofRequiredOverridestring[] | null
packageSizestring | nullOne of: small, medium, large, null.
itemDescriptionstring
referencestring
scheduledAtstring (date-time) | null
connectionIdstring | nullThe N-Ways driver's connection that accepted it.
acceptedAtstring (date-time) | null
startedAtstring (date-time) | null
editablestringWhat PATCH /tasks/{id} may change now: everything, only notes and dueAt (picked up or started), or nothing (ended). One of: all, limited, none.
editedAtstring (date-time) | nullThe last edit.
editedFieldsstring[]What the last edit changed.
pinDeliveryPinDeliveryHow the delivery PIN is reaching the customer, when the delivery asks for one and PINs go on WhatsApp. Never the PIN itself.
pinDelivery.channelstringRequired. One of: whatsapp, email, none.
pinDelivery.statestringRequired. One of: sending, sent, delivered, read, failed.
pinDelivery.whatsappErrorCodeinteger | nullRequired. WhatsApp's failure (131026: not on WhatsApp), kept after the PIN went by email.
pinDelivery.needsEmailbooleanRequired. The customer hasn't got the PIN: send it with POST /tasks/{id}/pin-email.
pinDelivery.updatedAtstring (date-time)Required.
200 OK
{
  "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

  • default Error

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

NameInTypeDescription
idpathstringRequired.

Request body

FieldTypeDescription
pickupStop | nullnull removes it (not for a delivery sent to an N-Ways driver).
pickupPlaceIdstringOne of your pickup places as the new pickup, instead of pickup.
dropoffStop
dropoff.latnumberRequired.
dropoff.lngnumberRequired.
dropoff.namestringUp to 120 characters.
dropoff.addressstringUp to 300 characters.
recipientNamestringUp to 100 characters.
recipientPhonestringUp to 32 characters.
recipientEmailstringAn email address, or "" for none.
notesstringUp to 500 characters.
itemDescriptionstringUp to 200 characters.
packageSizestring | nullOne of: small, medium, large, null.
referencestringUp to 64 characters.
dueAtstring (date-time) | null
scheduledAtstring (date-time) | nullNow to 60 days ahead.
proofRequiredstring[] | nullnull: your settings' proofRequired.
areaArea | null
langstringOne of: en, fr, pt.
arrivingSinteger≥ 30, ≤ 1800.
cURL
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"}'
JavaScript
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()
Python
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

FieldTypeDescription
idstringRequired.
refstringRequired. The delivery's short number in the project, given by N-Ways ("1042", shown #1042): for people, in alerts and lists.
statusstringRequired. One of: created, assigned, picked_up, arriving, completed, failed, cancelled.
vehicleIdstring | nullRequired.
pickupStop | nullRequired.
dropoffStopRequired.
dropoff.latnumberRequired.
dropoff.lngnumberRequired.
dropoff.namestringUp to 120 characters.
dropoff.addressstringUp to 300 characters.
recipientNamestringRequired.
recipientPhonestring
notesstringRequired.
langstringRequired. One of: en, fr, pt.
arrivingSintegerRequired.
etaETA | nullRequired. Null until a fresh position is in, and once the task ends.
dueAtstring (date-time) | nullRequired.
latebooleanRequired. Open and past dueAt, or expected after it.
trackingUrlstring (uri) | nullRequired. Null once expired.
trackingExpiresAtstring (date-time) | nullRequired.
failureReasonstring
createdAtstring (date-time)Required.
assignedAtstring (date-time) | nullRequired.
pickedUpAtstring (date-time) | nullRequired.
arrivingAtstring (date-time) | nullRequired.
endedAtstring (date-time) | nullRequired.
areaArea | nullThe delivery's own area: leaving it raises asset.geofence_exit.
proofsProof[]Only in GET /tasks/{id}: the rider's photos and signatures (N-Ways Business).
proofs[].idstringRequired.
proofs[].kindstringRequired. One of: photo, signature.
proofs[].contentTypestringRequired. One of: image/jpeg, image/png, image/webp.
proofs[].bytesintegerRequired.
proofs[].latnumber | nullRequired.
proofs[].lngnumber | nullRequired.
proofs[].bystringRequired. The rider's name.
proofs[].createdAtstring (date-time)Required.
endNotestringOnly in GET /tasks/{id}: what the rider wrote when finishing.
recipientEmailstring
proofRequiredstring[]The delivery's own, else your settings'.
proofRequiredOverridestring[] | null
packageSizestring | nullOne of: small, medium, large, null.
itemDescriptionstring
referencestring
scheduledAtstring (date-time) | null
connectionIdstring | nullThe N-Ways driver's connection that accepted it.
acceptedAtstring (date-time) | null
startedAtstring (date-time) | null
editablestringWhat PATCH /tasks/{id} may change now: everything, only notes and dueAt (picked up or started), or nothing (ended). One of: all, limited, none.
editedAtstring (date-time) | nullThe last edit.
editedFieldsstring[]What the last edit changed.
pinDeliveryPinDeliveryHow the delivery PIN is reaching the customer, when the delivery asks for one and PINs go on WhatsApp. Never the PIN itself.
pinDelivery.channelstringRequired. One of: whatsapp, email, none.
pinDelivery.statestringRequired. One of: sending, sent, delivered, read, failed.
pinDelivery.whatsappErrorCodeinteger | nullRequired. WhatsApp's failure (131026: not on WhatsApp), kept after the PIN went by email.
pinDelivery.needsEmailbooleanRequired. The customer hasn't got the PIN: send it with POST /tasks/{id}/pin-email.
pinDelivery.updatedAtstring (date-time)Required.
200 OK
{
  "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

  • 409 TASK_UNDER_WAY (only notes and dueAt can change now) or TASK_ENDED.
  • default Error

Assign (or reassign) a vehicle — created|assigned → assigned; event task.assigned

POST https://nways.ng/maps/v1/fleet/tasks/{id}/assign

Parameters

NameInTypeDescription
idpathstringRequired.

Request body

FieldTypeDescription
vehicleIdstringRequired.
cURL
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"}'
JavaScript
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()
Python
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

FieldTypeDescription
idstringRequired.
refstringRequired. The delivery's short number in the project, given by N-Ways ("1042", shown #1042): for people, in alerts and lists.
statusstringRequired. One of: created, assigned, picked_up, arriving, completed, failed, cancelled.
vehicleIdstring | nullRequired.
pickupStop | nullRequired.
dropoffStopRequired.
dropoff.latnumberRequired.
dropoff.lngnumberRequired.
dropoff.namestringUp to 120 characters.
dropoff.addressstringUp to 300 characters.
recipientNamestringRequired.
recipientPhonestring
notesstringRequired.
langstringRequired. One of: en, fr, pt.
arrivingSintegerRequired.
etaETA | nullRequired. Null until a fresh position is in, and once the task ends.
dueAtstring (date-time) | nullRequired.
latebooleanRequired. Open and past dueAt, or expected after it.
trackingUrlstring (uri) | nullRequired. Null once expired.
trackingExpiresAtstring (date-time) | nullRequired.
failureReasonstring
createdAtstring (date-time)Required.
assignedAtstring (date-time) | nullRequired.
pickedUpAtstring (date-time) | nullRequired.
arrivingAtstring (date-time) | nullRequired.
endedAtstring (date-time) | nullRequired.
areaArea | nullThe delivery's own area: leaving it raises asset.geofence_exit.
proofsProof[]Only in GET /tasks/{id}: the rider's photos and signatures (N-Ways Business).
proofs[].idstringRequired.
proofs[].kindstringRequired. One of: photo, signature.
proofs[].contentTypestringRequired. One of: image/jpeg, image/png, image/webp.
proofs[].bytesintegerRequired.
proofs[].latnumber | nullRequired.
proofs[].lngnumber | nullRequired.
proofs[].bystringRequired. The rider's name.
proofs[].createdAtstring (date-time)Required.
endNotestringOnly in GET /tasks/{id}: what the rider wrote when finishing.
recipientEmailstring
proofRequiredstring[]The delivery's own, else your settings'.
proofRequiredOverridestring[] | null
packageSizestring | nullOne of: small, medium, large, null.
itemDescriptionstring
referencestring
scheduledAtstring (date-time) | null
connectionIdstring | nullThe N-Ways driver's connection that accepted it.
acceptedAtstring (date-time) | null
startedAtstring (date-time) | null
editablestringWhat PATCH /tasks/{id} may change now: everything, only notes and dueAt (picked up or started), or nothing (ended). One of: all, limited, none.
editedAtstring (date-time) | nullThe last edit.
editedFieldsstring[]What the last edit changed.
pinDeliveryPinDeliveryHow the delivery PIN is reaching the customer, when the delivery asks for one and PINs go on WhatsApp. Never the PIN itself.
pinDelivery.channelstringRequired. One of: whatsapp, email, none.
pinDelivery.statestringRequired. One of: sending, sent, delivered, read, failed.
pinDelivery.whatsappErrorCodeinteger | nullRequired. WhatsApp's failure (131026: not on WhatsApp), kept after the PIN went by email.
pinDelivery.needsEmailbooleanRequired. The customer hasn't got the PIN: send it with POST /tasks/{id}/pin-email.
pinDelivery.updatedAtstring (date-time)Required.
200 OK
{
  "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

  • default Error

Mark picked up — assigned → picked_up

POST https://nways.ng/maps/v1/fleet/tasks/{id}/pickup

Parameters

NameInTypeDescription
idpathstringRequired.
cURL
curl -X POST "https://nways.ng/maps/v1/fleet/tasks/string/pickup" \
  -H "X-NWays-Api-Key: YOUR_API_KEY"
JavaScript
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()
Python
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

FieldTypeDescription
idstringRequired.
refstringRequired. The delivery's short number in the project, given by N-Ways ("1042", shown #1042): for people, in alerts and lists.
statusstringRequired. One of: created, assigned, picked_up, arriving, completed, failed, cancelled.
vehicleIdstring | nullRequired.
pickupStop | nullRequired.
dropoffStopRequired.
dropoff.latnumberRequired.
dropoff.lngnumberRequired.
dropoff.namestringUp to 120 characters.
dropoff.addressstringUp to 300 characters.
recipientNamestringRequired.
recipientPhonestring
notesstringRequired.
langstringRequired. One of: en, fr, pt.
arrivingSintegerRequired.
etaETA | nullRequired. Null until a fresh position is in, and once the task ends.
dueAtstring (date-time) | nullRequired.
latebooleanRequired. Open and past dueAt, or expected after it.
trackingUrlstring (uri) | nullRequired. Null once expired.
trackingExpiresAtstring (date-time) | nullRequired.
failureReasonstring
createdAtstring (date-time)Required.
assignedAtstring (date-time) | nullRequired.
pickedUpAtstring (date-time) | nullRequired.
arrivingAtstring (date-time) | nullRequired.
endedAtstring (date-time) | nullRequired.
areaArea | nullThe delivery's own area: leaving it raises asset.geofence_exit.
proofsProof[]Only in GET /tasks/{id}: the rider's photos and signatures (N-Ways Business).
proofs[].idstringRequired.
proofs[].kindstringRequired. One of: photo, signature.
proofs[].contentTypestringRequired. One of: image/jpeg, image/png, image/webp.
proofs[].bytesintegerRequired.
proofs[].latnumber | nullRequired.
proofs[].lngnumber | nullRequired.
proofs[].bystringRequired. The rider's name.
proofs[].createdAtstring (date-time)Required.
endNotestringOnly in GET /tasks/{id}: what the rider wrote when finishing.
recipientEmailstring
proofRequiredstring[]The delivery's own, else your settings'.
proofRequiredOverridestring[] | null
packageSizestring | nullOne of: small, medium, large, null.
itemDescriptionstring
referencestring
scheduledAtstring (date-time) | null
connectionIdstring | nullThe N-Ways driver's connection that accepted it.
acceptedAtstring (date-time) | null
startedAtstring (date-time) | null
editablestringWhat PATCH /tasks/{id} may change now: everything, only notes and dueAt (picked up or started), or nothing (ended). One of: all, limited, none.
editedAtstring (date-time) | nullThe last edit.
editedFieldsstring[]What the last edit changed.
pinDeliveryPinDeliveryHow the delivery PIN is reaching the customer, when the delivery asks for one and PINs go on WhatsApp. Never the PIN itself.
pinDelivery.channelstringRequired. One of: whatsapp, email, none.
pinDelivery.statestringRequired. One of: sending, sent, delivered, read, failed.
pinDelivery.whatsappErrorCodeinteger | nullRequired. WhatsApp's failure (131026: not on WhatsApp), kept after the PIN went by email.
pinDelivery.needsEmailbooleanRequired. The customer hasn't got the PIN: send it with POST /tasks/{id}/pin-email.
pinDelivery.updatedAtstring (date-time)Required.
200 OK
{
  "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

  • default Error

Mark delivered — assigned|picked_up|arriving → completed; event task.completed

POST https://nways.ng/maps/v1/fleet/tasks/{id}/complete

Parameters

NameInTypeDescription
idpathstringRequired.
cURL
curl -X POST "https://nways.ng/maps/v1/fleet/tasks/string/complete" \
  -H "X-NWays-Api-Key: YOUR_API_KEY"
JavaScript
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()
Python
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

FieldTypeDescription
idstringRequired.
refstringRequired. The delivery's short number in the project, given by N-Ways ("1042", shown #1042): for people, in alerts and lists.
statusstringRequired. One of: created, assigned, picked_up, arriving, completed, failed, cancelled.
vehicleIdstring | nullRequired.
pickupStop | nullRequired.
dropoffStopRequired.
dropoff.latnumberRequired.
dropoff.lngnumberRequired.
dropoff.namestringUp to 120 characters.
dropoff.addressstringUp to 300 characters.
recipientNamestringRequired.
recipientPhonestring
notesstringRequired.
langstringRequired. One of: en, fr, pt.
arrivingSintegerRequired.
etaETA | nullRequired. Null until a fresh position is in, and once the task ends.
dueAtstring (date-time) | nullRequired.
latebooleanRequired. Open and past dueAt, or expected after it.
trackingUrlstring (uri) | nullRequired. Null once expired.
trackingExpiresAtstring (date-time) | nullRequired.
failureReasonstring
createdAtstring (date-time)Required.
assignedAtstring (date-time) | nullRequired.
pickedUpAtstring (date-time) | nullRequired.
arrivingAtstring (date-time) | nullRequired.
endedAtstring (date-time) | nullRequired.
areaArea | nullThe delivery's own area: leaving it raises asset.geofence_exit.
proofsProof[]Only in GET /tasks/{id}: the rider's photos and signatures (N-Ways Business).
proofs[].idstringRequired.
proofs[].kindstringRequired. One of: photo, signature.
proofs[].contentTypestringRequired. One of: image/jpeg, image/png, image/webp.
proofs[].bytesintegerRequired.
proofs[].latnumber | nullRequired.
proofs[].lngnumber | nullRequired.
proofs[].bystringRequired. The rider's name.
proofs[].createdAtstring (date-time)Required.
endNotestringOnly in GET /tasks/{id}: what the rider wrote when finishing.
recipientEmailstring
proofRequiredstring[]The delivery's own, else your settings'.
proofRequiredOverridestring[] | null
packageSizestring | nullOne of: small, medium, large, null.
itemDescriptionstring
referencestring
scheduledAtstring (date-time) | null
connectionIdstring | nullThe N-Ways driver's connection that accepted it.
acceptedAtstring (date-time) | null
startedAtstring (date-time) | null
editablestringWhat PATCH /tasks/{id} may change now: everything, only notes and dueAt (picked up or started), or nothing (ended). One of: all, limited, none.
editedAtstring (date-time) | nullThe last edit.
editedFieldsstring[]What the last edit changed.
pinDeliveryPinDeliveryHow the delivery PIN is reaching the customer, when the delivery asks for one and PINs go on WhatsApp. Never the PIN itself.
pinDelivery.channelstringRequired. One of: whatsapp, email, none.
pinDelivery.statestringRequired. One of: sending, sent, delivered, read, failed.
pinDelivery.whatsappErrorCodeinteger | nullRequired. WhatsApp's failure (131026: not on WhatsApp), kept after the PIN went by email.
pinDelivery.needsEmailbooleanRequired. The customer hasn't got the PIN: send it with POST /tasks/{id}/pin-email.
pinDelivery.updatedAtstring (date-time)Required.
200 OK
{
  "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

  • default Error

Mark failed — any open status → failed; event task.failed

POST https://nways.ng/maps/v1/fleet/tasks/{id}/fail

Parameters

NameInTypeDescription
idpathstringRequired.

Request body

FieldTypeDescription
reasonstringUp to 200 characters.
cURL
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"}'
JavaScript
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()
Python
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

FieldTypeDescription
idstringRequired.
refstringRequired. The delivery's short number in the project, given by N-Ways ("1042", shown #1042): for people, in alerts and lists.
statusstringRequired. One of: created, assigned, picked_up, arriving, completed, failed, cancelled.
vehicleIdstring | nullRequired.
pickupStop | nullRequired.
dropoffStopRequired.
dropoff.latnumberRequired.
dropoff.lngnumberRequired.
dropoff.namestringUp to 120 characters.
dropoff.addressstringUp to 300 characters.
recipientNamestringRequired.
recipientPhonestring
notesstringRequired.
langstringRequired. One of: en, fr, pt.
arrivingSintegerRequired.
etaETA | nullRequired. Null until a fresh position is in, and once the task ends.
dueAtstring (date-time) | nullRequired.
latebooleanRequired. Open and past dueAt, or expected after it.
trackingUrlstring (uri) | nullRequired. Null once expired.
trackingExpiresAtstring (date-time) | nullRequired.
failureReasonstring
createdAtstring (date-time)Required.
assignedAtstring (date-time) | nullRequired.
pickedUpAtstring (date-time) | nullRequired.
arrivingAtstring (date-time) | nullRequired.
endedAtstring (date-time) | nullRequired.
areaArea | nullThe delivery's own area: leaving it raises asset.geofence_exit.
proofsProof[]Only in GET /tasks/{id}: the rider's photos and signatures (N-Ways Business).
proofs[].idstringRequired.
proofs[].kindstringRequired. One of: photo, signature.
proofs[].contentTypestringRequired. One of: image/jpeg, image/png, image/webp.
proofs[].bytesintegerRequired.
proofs[].latnumber | nullRequired.
proofs[].lngnumber | nullRequired.
proofs[].bystringRequired. The rider's name.
proofs[].createdAtstring (date-time)Required.
endNotestringOnly in GET /tasks/{id}: what the rider wrote when finishing.
recipientEmailstring
proofRequiredstring[]The delivery's own, else your settings'.
proofRequiredOverridestring[] | null
packageSizestring | nullOne of: small, medium, large, null.
itemDescriptionstring
referencestring
scheduledAtstring (date-time) | null
connectionIdstring | nullThe N-Ways driver's connection that accepted it.
acceptedAtstring (date-time) | null
startedAtstring (date-time) | null
editablestringWhat PATCH /tasks/{id} may change now: everything, only notes and dueAt (picked up or started), or nothing (ended). One of: all, limited, none.
editedAtstring (date-time) | nullThe last edit.
editedFieldsstring[]What the last edit changed.
pinDeliveryPinDeliveryHow the delivery PIN is reaching the customer, when the delivery asks for one and PINs go on WhatsApp. Never the PIN itself.
pinDelivery.channelstringRequired. One of: whatsapp, email, none.
pinDelivery.statestringRequired. One of: sending, sent, delivered, read, failed.
pinDelivery.whatsappErrorCodeinteger | nullRequired. WhatsApp's failure (131026: not on WhatsApp), kept after the PIN went by email.
pinDelivery.needsEmailbooleanRequired. The customer hasn't got the PIN: send it with POST /tasks/{id}/pin-email.
pinDelivery.updatedAtstring (date-time)Required.
200 OK
{
  "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

  • default Error

Cancel — any open status → cancelled

POST https://nways.ng/maps/v1/fleet/tasks/{id}/cancel

Parameters

NameInTypeDescription
idpathstringRequired.
cURL
curl -X POST "https://nways.ng/maps/v1/fleet/tasks/string/cancel" \
  -H "X-NWays-Api-Key: YOUR_API_KEY"
JavaScript
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()
Python
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

FieldTypeDescription
idstringRequired.
refstringRequired. The delivery's short number in the project, given by N-Ways ("1042", shown #1042): for people, in alerts and lists.
statusstringRequired. One of: created, assigned, picked_up, arriving, completed, failed, cancelled.
vehicleIdstring | nullRequired.
pickupStop | nullRequired.
dropoffStopRequired.
dropoff.latnumberRequired.
dropoff.lngnumberRequired.
dropoff.namestringUp to 120 characters.
dropoff.addressstringUp to 300 characters.
recipientNamestringRequired.
recipientPhonestring
notesstringRequired.
langstringRequired. One of: en, fr, pt.
arrivingSintegerRequired.
etaETA | nullRequired. Null until a fresh position is in, and once the task ends.
dueAtstring (date-time) | nullRequired.
latebooleanRequired. Open and past dueAt, or expected after it.
trackingUrlstring (uri) | nullRequired. Null once expired.
trackingExpiresAtstring (date-time) | nullRequired.
failureReasonstring
createdAtstring (date-time)Required.
assignedAtstring (date-time) | nullRequired.
pickedUpAtstring (date-time) | nullRequired.
arrivingAtstring (date-time) | nullRequired.
endedAtstring (date-time) | nullRequired.
areaArea | nullThe delivery's own area: leaving it raises asset.geofence_exit.
proofsProof[]Only in GET /tasks/{id}: the rider's photos and signatures (N-Ways Business).
proofs[].idstringRequired.
proofs[].kindstringRequired. One of: photo, signature.
proofs[].contentTypestringRequired. One of: image/jpeg, image/png, image/webp.
proofs[].bytesintegerRequired.
proofs[].latnumber | nullRequired.
proofs[].lngnumber | nullRequired.
proofs[].bystringRequired. The rider's name.
proofs[].createdAtstring (date-time)Required.
endNotestringOnly in GET /tasks/{id}: what the rider wrote when finishing.
recipientEmailstring
proofRequiredstring[]The delivery's own, else your settings'.
proofRequiredOverridestring[] | null
packageSizestring | nullOne of: small, medium, large, null.
itemDescriptionstring
referencestring
scheduledAtstring (date-time) | null
connectionIdstring | nullThe N-Ways driver's connection that accepted it.
acceptedAtstring (date-time) | null
startedAtstring (date-time) | null
editablestringWhat PATCH /tasks/{id} may change now: everything, only notes and dueAt (picked up or started), or nothing (ended). One of: all, limited, none.
editedAtstring (date-time) | nullThe last edit.
editedFieldsstring[]What the last edit changed.
pinDeliveryPinDeliveryHow the delivery PIN is reaching the customer, when the delivery asks for one and PINs go on WhatsApp. Never the PIN itself.
pinDelivery.channelstringRequired. One of: whatsapp, email, none.
pinDelivery.statestringRequired. One of: sending, sent, delivered, read, failed.
pinDelivery.whatsappErrorCodeinteger | nullRequired. WhatsApp's failure (131026: not on WhatsApp), kept after the PIN went by email.
pinDelivery.needsEmailbooleanRequired. The customer hasn't got the PIN: send it with POST /tasks/{id}/pin-email.
pinDelivery.updatedAtstring (date-time)Required.
200 OK
{
  "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

  • default Error

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

NameInTypeDescription
idpathstringRequired.

Request body

FieldTypeDescription
emailstring (email)Required.
cURL
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"}'
JavaScript
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()
Python
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

FieldTypeDescription
idstringRequired.
refstringRequired. The delivery's short number in the project, given by N-Ways ("1042", shown #1042): for people, in alerts and lists.
statusstringRequired. One of: created, assigned, picked_up, arriving, completed, failed, cancelled.
vehicleIdstring | nullRequired.
pickupStop | nullRequired.
dropoffStopRequired.
dropoff.latnumberRequired.
dropoff.lngnumberRequired.
dropoff.namestringUp to 120 characters.
dropoff.addressstringUp to 300 characters.
recipientNamestringRequired.
recipientPhonestring
notesstringRequired.
langstringRequired. One of: en, fr, pt.
arrivingSintegerRequired.
etaETA | nullRequired. Null until a fresh position is in, and once the task ends.
dueAtstring (date-time) | nullRequired.
latebooleanRequired. Open and past dueAt, or expected after it.
trackingUrlstring (uri) | nullRequired. Null once expired.
trackingExpiresAtstring (date-time) | nullRequired.
failureReasonstring
createdAtstring (date-time)Required.
assignedAtstring (date-time) | nullRequired.
pickedUpAtstring (date-time) | nullRequired.
arrivingAtstring (date-time) | nullRequired.
endedAtstring (date-time) | nullRequired.
areaArea | nullThe delivery's own area: leaving it raises asset.geofence_exit.
proofsProof[]Only in GET /tasks/{id}: the rider's photos and signatures (N-Ways Business).
proofs[].idstringRequired.
proofs[].kindstringRequired. One of: photo, signature.
proofs[].contentTypestringRequired. One of: image/jpeg, image/png, image/webp.
proofs[].bytesintegerRequired.
proofs[].latnumber | nullRequired.
proofs[].lngnumber | nullRequired.
proofs[].bystringRequired. The rider's name.
proofs[].createdAtstring (date-time)Required.
endNotestringOnly in GET /tasks/{id}: what the rider wrote when finishing.
recipientEmailstring
proofRequiredstring[]The delivery's own, else your settings'.
proofRequiredOverridestring[] | null
packageSizestring | nullOne of: small, medium, large, null.
itemDescriptionstring
referencestring
scheduledAtstring (date-time) | null
connectionIdstring | nullThe N-Ways driver's connection that accepted it.
acceptedAtstring (date-time) | null
startedAtstring (date-time) | null
editablestringWhat PATCH /tasks/{id} may change now: everything, only notes and dueAt (picked up or started), or nothing (ended). One of: all, limited, none.
editedAtstring (date-time) | nullThe last edit.
editedFieldsstring[]What the last edit changed.
pinDeliveryPinDeliveryHow the delivery PIN is reaching the customer, when the delivery asks for one and PINs go on WhatsApp. Never the PIN itself.
pinDelivery.channelstringRequired. One of: whatsapp, email, none.
pinDelivery.statestringRequired. One of: sending, sent, delivered, read, failed.
pinDelivery.whatsappErrorCodeinteger | nullRequired. WhatsApp's failure (131026: not on WhatsApp), kept after the PIN went by email.
pinDelivery.needsEmailbooleanRequired. The customer hasn't got the PIN: send it with POST /tasks/{id}/pin-email.
pinDelivery.updatedAtstring (date-time)Required.
200 OK
{
  "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

  • default Error

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

NameInTypeDescription
phonequerystringAs typed: +234…, or the local way for your country. Up to 32 characters.
cURL
curl "https://nways.ng/maps/v1/fleet/whatsapp/number" \
  -H "X-NWays-Api-Key: YOUR_API_KEY"
JavaScript
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()
Python
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

FieldTypeDescription
enabledbooleanRequired. PINs go on WhatsApp. When false, they go by email and push.
phonestringRequired. The number in E.164 ("" when it isn't one).
validbooleanRequired.
knownbooleanRequired.
unreachablebooleanRequired.
200 OK
{
  "enabled": true,
  "phone": "+2348031234567",
  "valid": true,
  "known": true,
  "unreachable": true
}

Errors

  • default Error

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

NameInTypeDescription
idpathstringRequired.

Request body

FieldTypeDescription
areaArea | nullRequired.
cURL
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}}'
JavaScript
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()
Python
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

FieldTypeDescription
idstringRequired.
refstringRequired. The delivery's short number in the project, given by N-Ways ("1042", shown #1042): for people, in alerts and lists.
statusstringRequired. One of: created, assigned, picked_up, arriving, completed, failed, cancelled.
vehicleIdstring | nullRequired.
pickupStop | nullRequired.
dropoffStopRequired.
dropoff.latnumberRequired.
dropoff.lngnumberRequired.
dropoff.namestringUp to 120 characters.
dropoff.addressstringUp to 300 characters.
recipientNamestringRequired.
recipientPhonestring
notesstringRequired.
langstringRequired. One of: en, fr, pt.
arrivingSintegerRequired.
etaETA | nullRequired. Null until a fresh position is in, and once the task ends.
dueAtstring (date-time) | nullRequired.
latebooleanRequired. Open and past dueAt, or expected after it.
trackingUrlstring (uri) | nullRequired. Null once expired.
trackingExpiresAtstring (date-time) | nullRequired.
failureReasonstring
createdAtstring (date-time)Required.
assignedAtstring (date-time) | nullRequired.
pickedUpAtstring (date-time) | nullRequired.
arrivingAtstring (date-time) | nullRequired.
endedAtstring (date-time) | nullRequired.
areaArea | nullThe delivery's own area: leaving it raises asset.geofence_exit.
proofsProof[]Only in GET /tasks/{id}: the rider's photos and signatures (N-Ways Business).
proofs[].idstringRequired.
proofs[].kindstringRequired. One of: photo, signature.
proofs[].contentTypestringRequired. One of: image/jpeg, image/png, image/webp.
proofs[].bytesintegerRequired.
proofs[].latnumber | nullRequired.
proofs[].lngnumber | nullRequired.
proofs[].bystringRequired. The rider's name.
proofs[].createdAtstring (date-time)Required.
endNotestringOnly in GET /tasks/{id}: what the rider wrote when finishing.
recipientEmailstring
proofRequiredstring[]The delivery's own, else your settings'.
proofRequiredOverridestring[] | null
packageSizestring | nullOne of: small, medium, large, null.
itemDescriptionstring
referencestring
scheduledAtstring (date-time) | null
connectionIdstring | nullThe N-Ways driver's connection that accepted it.
acceptedAtstring (date-time) | null
startedAtstring (date-time) | null
editablestringWhat PATCH /tasks/{id} may change now: everything, only notes and dueAt (picked up or started), or nothing (ended). One of: all, limited, none.
editedAtstring (date-time) | nullThe last edit.
editedFieldsstring[]What the last edit changed.
pinDeliveryPinDeliveryHow the delivery PIN is reaching the customer, when the delivery asks for one and PINs go on WhatsApp. Never the PIN itself.
pinDelivery.channelstringRequired. One of: whatsapp, email, none.
pinDelivery.statestringRequired. One of: sending, sent, delivered, read, failed.
pinDelivery.whatsappErrorCodeinteger | nullRequired. WhatsApp's failure (131026: not on WhatsApp), kept after the PIN went by email.
pinDelivery.needsEmailbooleanRequired. The customer hasn't got the PIN: send it with POST /tasks/{id}/pin-email.
pinDelivery.updatedAtstring (date-time)Required.
200 OK
{
  "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

  • default Error

List your pickup places (the default first)

GET https://nways.ng/maps/v1/fleet/places

Parameters

NameInTypeDescription
qquerystringFinds a name, address or door code.
cURL
curl "https://nways.ng/maps/v1/fleet/places" \
  -H "X-NWays-Api-Key: YOUR_API_KEY"
JavaScript
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()
Python
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

FieldTypeDescription
placesPlace[]Required.
places[].idstringRequired.
places[].namestringRequired.
places[].doorCodestringRequired. The NIPOST or GhanaPost door code it was found by ("" for none).
places[].addressstringRequired.
places[].latnumberRequired.
places[].lngnumberRequired.
places[].phonestringRequired.
places[].hoursstringRequired.
places[].defaultbooleanRequired. New deliveries in the console start from it.
places[].createdAtstring (date-time)Required.
places[].updatedAtstring (date-time)Required.
200 OK
{
  "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

  • default Error

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.

FieldTypeDescription
namestringUp to 100 characters.
doorCodestringUp to 32 characters.
addressstringUp to 300 characters.
latnumber
lngnumber
phonestringUp to 32 characters.
hoursstringUp to 200 characters.
defaultboolean
cURL
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"}'
JavaScript
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()
Python
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

FieldTypeDescription
idstringRequired.
namestringRequired.
doorCodestringRequired. The NIPOST or GhanaPost door code it was found by ("" for none).
addressstringRequired.
latnumberRequired.
lngnumberRequired.
phonestringRequired.
hoursstringRequired.
defaultbooleanRequired. New deliveries in the console start from it.
createdAtstring (date-time)Required.
updatedAtstring (date-time)Required.
201 OK
{
  "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

  • default Error

Get a pickup place

GET https://nways.ng/maps/v1/fleet/places/{placeId}

Parameters

NameInTypeDescription
placeIdpathstringRequired.
cURL
curl "https://nways.ng/maps/v1/fleet/places/plc_4fQ9xLm2Za" \
  -H "X-NWays-Api-Key: YOUR_API_KEY"
JavaScript
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()
Python
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

FieldTypeDescription
idstringRequired.
namestringRequired.
doorCodestringRequired. The NIPOST or GhanaPost door code it was found by ("" for none).
addressstringRequired.
latnumberRequired.
lngnumberRequired.
phonestringRequired.
hoursstringRequired.
defaultbooleanRequired. New deliveries in the console start from it.
createdAtstring (date-time)Required.
updatedAtstring (date-time)Required.
200 OK
{
  "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

  • default Error

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

NameInTypeDescription
placeIdpathstringRequired.

Request body

name, lat and lng are required to add one.

FieldTypeDescription
namestringUp to 100 characters.
doorCodestringUp to 32 characters.
addressstringUp to 300 characters.
latnumber
lngnumber
phonestringUp to 32 characters.
hoursstringUp to 200 characters.
defaultboolean
cURL
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}'
JavaScript
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()
Python
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

FieldTypeDescription
idstringRequired.
namestringRequired.
doorCodestringRequired. The NIPOST or GhanaPost door code it was found by ("" for none).
addressstringRequired.
latnumberRequired.
lngnumberRequired.
phonestringRequired.
hoursstringRequired.
defaultbooleanRequired. New deliveries in the console start from it.
createdAtstring (date-time)Required.
updatedAtstring (date-time)Required.
200 OK
{
  "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

  • default Error

Delete a pickup place

DELETE https://nways.ng/maps/v1/fleet/places/{placeId}

Parameters

NameInTypeDescription
placeIdpathstringRequired.
cURL
curl -X DELETE "https://nways.ng/maps/v1/fleet/places/plc_4fQ9xLm2Za" \
  -H "X-NWays-Api-Key: YOUR_API_KEY"
JavaScript
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()
Python
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

  • default Error

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

NameInTypeDescription
qquerystringFinds a name, an email, or any part of a phone number.
limitqueryintegerDefault: 25. ≥ 1, ≤ 100.
pageTokenquerystringnextPageToken (or prevPageToken) from another page.
cURL
curl "https://nways.ng/maps/v1/fleet/customers" \
  -H "X-NWays-Api-Key: YOUR_API_KEY"
JavaScript
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()
Python
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

FieldTypeDescription
customersCustomer[]Required.
customers[].idstringRequired.
customers[].namestringRequired. As the latest delivery named them.
customers[].phonestringRequired.
customers[].emailstringRequired.
customers[].deliveriesintegerRequired.
customers[].addressesintegerRequired.
customers[].lastDeliveryAtstring (date-time)Required.
customers[].lastAddressAddress | nullRequired. Where the latest delivery went.
nextPageTokenstring
prevPageTokenstring
offsetintegerRequired.
200 OK
{
  "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

  • default Error

Get a customer

GET https://nways.ng/maps/v1/fleet/customers/{customerId}

Parameters

NameInTypeDescription
customerIdpathstringRequired.
cURL
curl "https://nways.ng/maps/v1/fleet/customers/cus_4fQ9xLm2Za" \
  -H "X-NWays-Api-Key: YOUR_API_KEY"
JavaScript
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()
Python
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

FieldTypeDescription
idstringRequired.
namestringRequired. As the latest delivery named them.
phonestringRequired.
emailstringRequired.
deliveriesintegerRequired.
addressesintegerRequired.
lastDeliveryAtstring (date-time)Required.
lastAddressAddress | nullRequired. Where the latest delivery went.
200 OK
{
  "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

  • default Error

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

NameInTypeDescription
customerIdpathstringRequired.
cURL
curl -X DELETE "https://nways.ng/maps/v1/fleet/customers/cus_4fQ9xLm2Za" \
  -H "X-NWays-Api-Key: YOUR_API_KEY"
JavaScript
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()
Python
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

  • default Error

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

NameInTypeDescription
customerIdpathstringRequired.
qquerystringFinds a name, address or door code.
limitqueryintegerDefault: 25. ≥ 1, ≤ 100.
pageTokenquerystring
cURL
curl "https://nways.ng/maps/v1/fleet/customers/string/addresses" \
  -H "X-NWays-Api-Key: YOUR_API_KEY"
JavaScript
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()
Python
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

FieldTypeDescription
addressesAddress[]Required.
addresses[].idstringRequired.
addresses[].namestringRequired.
addresses[].addressstringRequired.
addresses[].doorCodestringRequired. The NIPOST or GhanaPost code the address starts with ("" for none).
addresses[].latnumberRequired.
addresses[].lngnumberRequired.
addresses[].usesintegerRequired. Deliveries that went there.
addresses[].lastUsedAtstring (date-time)Required.
totalintegerRequired. All the customer's addresses (not only those found).
nextPageTokenstring
prevPageTokenstring
offsetintegerRequired.
200 OK
{
  "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

  • default Error

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

NameInTypeDescription
idpathstringRequired.
cURL
curl -X POST "https://nways.ng/maps/v1/fleet/tasks/string/share" \
  -H "X-NWays-Api-Key: YOUR_API_KEY"
JavaScript
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()
Python
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

FieldTypeDescription
urlstring (uri)Required.
expiresAtstring (date-time)Required.
200 OK
{
  "url": "https://nways.ng/t/3fT9kQ2xVbN7LmP0aZc4RwYe",
  "expiresAt": "2026-10-15T09:00:00+01:00"
}

Errors

  • default Error