Download OpenAPI specification:
First-party fulfillment API. This is the rider/delivery operational API used by the DOEH rider app. It is not part of the public integration SDK (
sk_/edge) — it uses Sanctum bearer-token auth against the POS shop domain. Money is integer minor units.
First-party rider fulfillment API consumed by the DOEH rider app (doeh-rider-app). This is the rider stack, distinct from the @beyondplusmm/doehpos-sdk integration stack:
users row with
role='rider'), not third-party integrators.sk_ API key
and no edge gateway in this path — the app calls pos-shop directly.shop_id is derived from the authenticated user, never sent by the client,
and there is no cross-shop data access. A rider registered in multiple
shops uses a separate login/token per shop.Money is integer minor units (*_minor) on this public contract, matching the Orders convention. The internal Laravel aggregate stores float major units; a backend float⇄minor adapter is the authority that converts at the boundary (parallel to the Orders MoneyCodec). This document is therefore a governed projection of the already-authoritative API implemented in RiderDeliveryController / RiderNotificationController: it documents the public-facing surface, not the raw internal field shapes.
Exception — the rider wallet is not yet on this minor-units ABI. Its fields (balance, total_collected, total_settled) are emitted as raw major-unit floats. The wallet aggregates COD across deliveries that may span branches and currencies, so it has no single currency to attribute and no canonical minor-units projection is defined for it yet (deferred — INV-RIDER-1b).
Authenticates by email + password and returns a Sanctum token plus the list of shops where the rider is registered. The same email may exist in multiple shops; the password is tried against all of them.
| email required | string <email> |
| password required | string |
{- "password": "rider-demo-pass"
}{- "token": "12|abcdefghijklmnopqrstuvwxyz0123456789",
- "rider": {
- "id": 42,
- "name": "Demo Rider",
- "phone": 912345678,
- "email_verified_at": "2026-06-21T08:00:00Z"
}, - "shops": [
- {
- "shop": {
- "id": 1,
- "shop_code": "SANDBOX-DEMO",
- "name": "Sandbox Demo Shop"
}, - "user_id": 99,
- "rider_id": 42,
- "wallet": {
- "balance": 0,
- "total_collected": 0
}
}
]
}Creates a rider user (no shop yet) and emails a 6-digit verification OTP.
| name required | string <= 100 characters |
| email required | string <email> <= 255 characters |
| phone required | string <= 20 characters |
| password required | string >= 6 characters |
{- "name": "string",
- "phone": "string",
- "password": "string"
}{- "token": "string",
- "rider": {
- "id": 0,
- "name": "string",
- "email": "string",
- "phone": "string",
- "email_verified_at": "string"
}, - "verification": {
- "message": "string",
- "expires_in": 0,
- "otp": "string"
}
}Always returns success to prevent email enumeration.
| email required | string <email> |
{- "email": "[email protected]"
}{- "message": "string",
- "expires_in": 0
}| email required | string <email> |
| otp required | string = 6 characters |
| password required | string >= 6 characters |
| password_confirmation required | string |
{- "otp": "string",
- "password": "string",
- "password_confirmation": "string"
}{- "message": "string"
}| otp required | string = 6 characters |
{- "otp": "string"
}{- "message": "string",
- "email_verified_at": "2019-08-24T14:15:22Z"
}| current_password required | string |
| password required | string >= 6 characters |
| password_confirmation required | string |
{- "current_password": "string",
- "password": "string",
- "password_confirmation": "string"
}{- "message": "string"
}The authenticated rider's deliveries within the token's shop (INV-RIDER-2 — a token represents exactly one shop context). Pass history=1 for terminal deliveries (Delivered/Cancelled/Failed) within the last days (default 7, max 90).
| history | boolean Return terminal deliveries instead of active. |
| days | integer [ 1 .. 90 ] Default: 7 History window in days. |
[- {
- "id": 1001,
- "delivery_code": "DL-A3B7-2026",
- "drop_address": "No. 5, Demo Street, Yangon",
- "cod_amount_minor": 18000,
- "cod_collected": false,
- "is_cod": true,
- "status": 5,
- "status_label": "Out for Delivery",
- "order_number": "ORD-2026-0001",
- "shop_id": 1,
- "shop_name": "Sandbox Demo Shop",
- "shop_code": "SANDBOX-DEMO",
- "created_at": "2026-06-21T08:30:00Z"
}
]Looks up a delivery by code within the token's shop (INV-RIDER-2); a code from another shop returns 404. Use can_claim / is_assigned_to_me to decide the next action.
| code required | string The delivery_code from the QR. |
{- "id": 0,
- "delivery_code": "string",
- "pickup_address": "string",
- "drop_address": "string",
- "delivery_fee_minor": 0,
- "cod_amount_minor": 0,
- "cod_collected": true,
- "is_cod": true,
- "status": 1,
- "status_label": "string",
- "customer_phone": "string",
- "customer_name": "string",
- "order_number": "string",
- "shop_id": 0,
- "shop_name": "string",
- "rider_id": 0,
- "is_assigned_to_me": true,
- "can_claim": true,
- "created_at": "2019-08-24T14:15:22Z"
}Full detail for a delivery assigned to the authenticated rider, including order items and customer contact.
| id required | integer DeliveryOrder id. |
{- "id": 1001,
- "delivery_code": "DL-A3B7-2026",
- "pickup_address": "Sandbox Demo Shop, Yangon",
- "drop_address": "No. 5, Demo Street, Yangon",
- "delivery_lat": 16.8409,
- "delivery_lng": 96.1735,
- "delivery_fee_minor": 2500,
- "cod_amount_minor": 18000,
- "cod_collected": false,
- "is_cod": true,
- "status": 5,
- "status_label": "Out for Delivery",
- "customer_phone": 998765432,
- "customer_name": "Demo Customer",
- "order_number": "ORD-2026-0001",
- "items": [
- {
- "product_name": "Classic Burger",
- "quantity": 2,
- "unit_price_minor": 3500
}, - {
- "product_name": "Cola",
- "quantity": 1,
- "unit_price_minor": 1200
}
], - "accepted_at": "2026-06-21T08:32:00Z",
- "picked_up_at": "2026-06-21T08:45:00Z",
- "delivered_at": null,
- "created_at": "2026-06-21T08:30:00Z"
}Applies a rider-allowed transition. Transitions are linear: Pending→Accepted→Preparing→ReadyPickup→OutForDelivery→Delivered (or →Failed from OutForDelivery). Riders cannot cancel — only the shop can. Marking Delivered auto-collects COD into the rider wallet.
| id required | integer DeliveryOrder id. |
| status required | integer (DeliveryStatus) Enum: 1 2 3 4 5 6 7 8 1=Pending, 2=Accepted, 3=Preparing, 4=ReadyPickup, 5=OutForDelivery, 6=Delivered, 7=Cancelled, 8=Failed. |
| note | string or null <= 300 characters |
{- "status": 2
}{- "id": 1001,
- "status": 2,
- "status_label": "Accepted",
- "cod_collected": false
}Succeeds only when the delivery has no rider and is not terminal.
| id required | integer DeliveryOrder id. |
{- "id": 0,
- "rider_id": 0,
- "status": 1,
- "status_label": "string",
- "message": "string"
}One-shot used at the delivery point after a QR scan. Claims the delivery if unassigned, marks it Delivered, and auto-collects COD.
| id required | integer DeliveryOrder id. |
{- "id": 0,
- "status": 1,
- "status_label": "string",
- "cod_collected": true,
- "message": "string"
}Explicit COD collection for cases where auto-collect on delivery was skipped. Only valid for a COD delivery already marked Delivered and not yet collected.
| id required | integer DeliveryOrder id. |
{- "cod_collected": true,
- "amount_minor": 18000
}COD balance owed to the shop, plus lifetime collected / settled totals. Unlike the rest of this contract these are raw major-unit floats, NOT minor units: the wallet aggregates COD across branches/currencies and has no single currency to project into a canonical minor-units ABI yet (deferred — INV-RIDER-1b).
{- "balance": 3250,
- "total_collected": 5400,
- "total_settled": 2150
}Server throttles writes to ~20s resolution; a throttled call still returns ok.
| lat required | number [ -90 .. 90 ] |
| lng required | number [ -180 .. 180 ] |
{- "lat": -90,
- "lng": -180
}{- "ok": true,
- "throttled": true
}{- "data": [
- {
- "id": 0,
- "title": "string",
- "body": "string",
- "category": "string",
- "deep_link": "string",
- "icon": "string",
- "image_url": "string",
- "created_at": "2019-08-24T14:15:22Z"
}
], - "meta": {
- "current_page": 0,
- "last_page": 0,
- "per_page": 0,
- "total": 0
}
}| device_token required | string |
| platform required | string Enum: "ios" "android" "web" |
| device_id | string or null |
| device_model | string or null |
| os_version | string or null |
| app_version | string or null |
{- "device_token": "string",
- "platform": "ios",
- "device_id": "string",
- "device_model": "string",
- "os_version": "string",
- "app_version": "string"
}{- "success": true
}