The courier delivery workflow through the mobile API
From the parcel list to full or partial delivery, refusal and failure through the courier API at /api/v10/deliveryman, with the rules and errors. There is no courier web panel.
Last updated 22 October 2026 · Last verified 22 October 2026
Purpose#
This guide follows one parcel from its assignment to a courier until the courier records the result: open the list, read the details, deliver in full or partially, or report a refusal or failure. There is no courier web panel. Everything here is done through the mobile API under /api/v10/deliveryman/*, called by whatever mobile app the platform operator provides for couriers; this guide does not cover a specific app or its download links (ask the platform operator which app your couriers use). This page describes what the API allows.
Who can use it#
Courier accounts of a delivery company, including couriers of a merchant's private delivery company. A suspended courier cannot sign in (HTTP 403). Company staff do what a courier cannot: assign parcels, reschedule, and undo a recorded result.
What you need#
- The
apiKeyheader (a single platform-wide key configured on the server, the same for every account), theAccept: application/jsonheader, and a Bearer token fromPOST /api/v10/deliveryman/login, which takesdriver_id(courier ID, mobile or email) andpassword(at least 6 characters) and is limited to 10 requests per minute. - A parcel assigned to you by the company.
- If your company requires couriers to be online, send
POST /api/v10/deliveryman/dutywith{"on_duty": true}first; otherwise company dispatchers cannot assign parcels to you.
Steps#
Sign in
Send the login request with the
apiKeyheader. The reply carriesdata.token; send it asAuthorization: Bearer ...on every later call. A wrong ID or password gives HTTP 401, a missingapiKeygives HTTP 400Invalid Api Key.Open your parcels
GET /api/v10/deliveryman/dashboardgroups parcels by status: assigned, rescheduled, returned to the company, and delivered (full and partial).GET .../parcel/indexlists every parcel ever linked to you as delivery or pickup courier, not only active ones.GET .../parcel/details/{id}returns the parcel and its events, or HTTP 404 if it is not linked to you. The lists returned by thedashboardendpoint show the amount to collect (cod_display,cod_original,cod_currency) andis_amount_collectedfor each parcel.Deliver in full
POST /api/v10/deliveryman/parcel/delivered/{id}, with optionalnote,imageandsignatureImage. The whole amount to collect is recorded as collected. Images must be JPEG, PNG, WebP or GIF up to 5 MB; an invalid image is skipped without an error.Deliver partially
POST /api/v10/deliveryman/parcel/partial-delivered/{id}withcash_collection(required), plus the same optional fields. The amount must be between 0 and the parcel's amount to collect.Report a refusal or failure
POST /api/v10/deliveryman/parcel-status-updatewithparcel_idandstatus_action, and optionallyreason(ornote) with your explanation. Use 5 when the recipient refuses or this attempt failed: the parcel goes back to the warehouse for another try, the reason you sent is saved (a default "delivery failed" reason is recorded if you send none) and you are unassigned. Use 24 for a final failure: the parcel returns to the company and the return-to-merchant path begins.
Expected result#
| Action | Request | New status | What follows |
|---|---|---|---|
| Full delivery | delivered/{id} or status_action 9 |
Delivered | Final; only staff can undo |
| Partial delivery | partial-delivered/{id} or status_action 32 |
Partial Delivered | Final; only staff can undo |
| Refusal or failed attempt | status_action 5 |
Received Warehouse | Staff can assign it again |
| Final failure | status_action 24 |
Return to Courier (back with the company) | Staff continue the return |
Replies use the shape {success, message, data}; a missing parcel_id or status_action returns HTTP 422 with Laravel's standard message and errors for JSON requests (without the Accept header Laravel redirects instead). On delivered/{id} and partial-delivered/{id}, the rule errors quoted below repeat after a dash and end with a reference like (ref: E1A2B3) (not on parcel-status-update), so they are only the start of the message: match on the HTTP status and part of the text. The fields is required! comes unchanged. Each change is recorded as a parcel event and triggers the notifications set for it.
Rules the system enforces#
- You can act only on a parcel assigned to you whose status is "Delivery Man Assign" (with courier) or "Delivery Re-Schedule" (rescheduled). Otherwise the answer is HTTP 422 with a message starting
This parcel is not assigned to you. Repeating a delivery on a parcel that is already delivered gets the same answer. A parcel assigned to you for return to the merchant passes this check; the next rule then refuses delivery, partial delivery and refusal (status_action9, 32 and 5) on it, while 24 is accepted from "Return assign to merchant" and moves it to "Return to Courier". - Only moves on the allowed list are accepted; a refused move returns HTTP 422 with a message naming both statuses.
- Rescheduling, pickup steps and the final return to the merchant are done by company staff, with no courier endpoint. A rescheduled parcel stays in your list with the new date and you finish it the same way.
- Lists are built from events that name you, so a parcel you refused or that was reassigned may still be listed.
Common mistakes#
- A
status_actionother than 5, 9, 24 or 32. HTTP 400, and the text is the untranslated keyparcel.invalid_status_action.GET .../parcel-statuslists only 9, 24 and 32, although 5 is also accepted. - No
cash_collectionon a partial delivery. Onlypartial-delivered/{id}rejects it (HTTP 422The fields is required!);parcel-status-updatewithstatus_action32 reads it as 0 and records Partial Delivered with nothing collected. Always send it. - A collected amount above the parcel's amount, or negative. HTTP 422 with a message starting
The collected amount exceeds the parcel COD amountorThe collected amount cannot be negative.
Limits and permissions#
- Login and parcel endpoints need the
apiKeyheader. The location, duty and tracking-config endpoints are registered outside that check and need only the Bearer token. - The default API limit is 60 requests per minute per account;
POST /api/v10/deliveryman/locationis limited to 30 andPOST /api/v10/deliveryman/dutyto 20 requests per minute. - A courier works only with parcels of their own company.
- The partial amount is checked against the parcel's amount in US dollars; see the guide on how a courier records cash on delivery.
API
POST /api/v10/deliveryman/loginGET /api/v10/deliveryman/dashboardGET /api/v10/deliveryman/parcel/indexGET /api/v10/deliveryman/parcel/details/{id}POST /api/v10/deliveryman/parcel/delivered/{id}POST /api/v10/deliveryman/parcel/partial-delivered/{id}GET /api/v10/deliveryman/parcel-statusPOST /api/v10/deliveryman/parcel-status-updatePOST /api/v10/deliveryman/duty