← deliverlah.com

Developer API

Add same-day walking delivery to your POS, website, or app in under a day.

How Integration Works

YOUR SYSTEM
Customer pays at counter or checkout
↓ Your system calls our API
DELIVERLAH
Job created → Dropper accepts → Walks to your shop
→ Picks up parcel → Delivers with photo proof
↓ You poll status to track progress
RESULT
Customer receives parcel. Dropper gets paid via FAST.
Your balance is deducted automatically.

For POS Vendors (Partner Programme)

POS vendors integrate DeliverLah once and offer same-day delivery to all their merchants. You earn a kickback on every delivery your merchants make.

YOU (POS VENDOR)
Partner account → API key (dlp_xxx)
Partner Portal → deliverlah.com/partner
Onboard merchants → manage their accounts
YOUR MERCHANTS
Each merchant → own API key (dlh_xxx)
Each merchant → own prepaid balance
Each merchant → own delivery history
YOUR REVENUE
Revenue share on every delivery by your merchants
Monthly reconciliation via Partner Portal
Partner API key (dlp_)
You get a partner-level API key to onboard and manage merchants programmatically. Separate from merchant API keys (dlh_).
Onboard merchants instantly
Call POST /api/partner/merchants to create a merchant account. Returns their API key and temp password — no manual signup needed.
Self-service Partner Portal
Log in at deliverlah.com/partner with your API key. View all merchants, jobs, platform fees, and your kickback earnings in real-time.
Top up on behalf of merchants
Call POST /api/partner/topup to request a balance top-up for any of your merchants. Admin confirms and credits the balance.
One integration, many merchants
Your POS code is identical for every merchant — only the API key and pickup details differ per outlet.
Revenue share
Partners earn on every delivery made by their merchants. Terms are agreed during onboarding — contact us for details.

Partner Onboarding

Getting started as a POS vendor partner:

  1. 1
    Contact us
    Email hello@deliverlah.com to set up your partner account. We'll create your partner API key (dlp_xxx) and set your kickback rate.
  2. 2
    Access Partner Portal
    Go to deliverlah.com/partner and enter your API key. You'll see your dashboard with merchant management tools.
  3. 3
    Onboard merchants
    Click '+ Onboard Merchant' or call POST /api/partner/merchants. Each merchant gets their own API key (dlh_xxx) and temp password.
  4. 4
    Integrate your POS
    Store each merchant's API key in your per-outlet config. Hardcode their pickup details. Only the dropoff (customer) changes per order.
  5. 5
    Top up and go live
    Top up merchant balances via Partner Portal or API. When a customer wants delivery, your POS calls the DeliverLah API. Job is created, balance deducted, Dropper dispatched.

Partner API Endpoints

These endpoints use your partner API key (dlp_ prefix):

GET/api/partner/merchants

List all merchants under your account with job stats and balances.

POST/api/partner/merchants

Onboard a new merchant. Provide name, email, phone. Returns API key and temp password.

GET/api/partner/stats

Dashboard stats: total merchants, jobs, platform fees, your kickback, monthly breakdown.

POST/api/partner/topup

Request a balance top-up for a merchant. Provide email and amount.

Merchants use the standard dlh_ merchant API (documented below) for creating jobs, tracking status, and cancellations.

Merchant Setup (Per Outlet)

For each merchant onboarded by a partner or signing up independently:

  1. 1
    Get API key
    Partner onboards via API (instant) or merchant signs up at deliverlah.com and generates a key from Business Dashboard.
  2. 2
    Top up balance
    Merchant or partner tops up via PayNow (S$50–1,000). Balance credited once confirmed.
  3. 3
    Configure POS
    Store the merchant's dlh_ API key + pickup details (name, phone, address, postal code) in your per-outlet config.
  4. 4
    Ready to deliver
    Customer wants delivery → POS calls POST /api/v1/jobs → balance deducted → Dropper dispatched within minutes.

Authentication

Every request needs your API key in the header:

Authorization: Bearer dlh_your_api_key_here

Base URL: https://www.deliverlah.com/api/v1

POST/api/v1/jobs

Create a delivery job

Creates a job and deducts from your prepaid balance. The job goes live immediately — Droppers see it on the board and in Telegram within seconds.

Request Body
{
  "pickupName": "My Shop",            // Your shop name
  "pickupPhone": "+6591234567",       // Contact number at pickup
  "pickupAddress": "Blk 123 #01-01", // Full address
  "pickupPostalCode": "520123",       // 6-digit Singapore postal code
  "dropoffName": "John Tan",          // Customer name
  "dropoffPhone": "+6598765432",      // Customer phone
  "dropoffAddress": "Blk 456 #05-05",// Customer address
  "dropoffPostalCode": "460456",      // Customer postal code
  "parcelSize": "LIGHT",              // LIGHT | MEDIUM | HEAVY
  "note": "Ring doorbell",            // Optional instructions
  "pickupTime": "14:00",              // Optional, HH:MM format
  "priorityFee": 5.00                 // Optional, S$0-300
}
Response
{
  "id": "cmnxxxxx",
  "jobNumber": "DL-260407-0001",
  "status": "OPEN",
  "paymentStatus": "SECURED",
  "totalFee": 4.50,
  "dropperEarns": 3.00,
  "distanceKm": 1.23,
  "balanceRemaining": 995.50
}
Postal codes are auto-geocoded — no lat/lon needed
Distance and fee are calculated automatically from postal codes
Returns 402 if balance is insufficient (includes required amount)
GET/api/v1/status?id={jobId}

Track delivery status

Get real-time status of a job. Poll every 30–60 seconds to show progress in your UI. You can use either the job ID or job number.

Example
GET /api/v1/status?id=cmnxxxxx
  — or —
GET /api/v1/status?jobNumber=DL-260407-0001
Response
{
  "id": "cmnxxxxx",
  "jobNumber": "DL-260407-0001",
  "status": "PICKED_UP",
  "pickupName": "My Shop",
  "dropoffName": "John Tan",
  "distanceKm": 1.23,
  "totalFee": 4.50,
  "proofPhotoUrl": null,
  "createdAt": "2026-04-07T10:00:00Z",
  "acceptedAt": "2026-04-07T10:02:15Z",
  "pickedUpAt": "2026-04-07T10:15:30Z",
  "deliveredAt": null,
  "dropper": {
    "name": "Ahmad",
    "rating": 4.8,
    "phone": "+6581234567"
  },
  "dropperLat": 1.3521,
  "dropperLon": 103.8198
}
Dropper info (name, rating, phone, GPS) only appears after ACCEPTED
proofPhotoUrl appears after DELIVERED — link to the delivery photo
dropperLat/dropperLon update as the Dropper moves
GET/api/v1/jobs

List your jobs

Returns your jobs, newest first. Filter by status and paginate.

Example
GET /api/v1/jobs?status=OPEN&limit=20&offset=0
Response
{
  "jobs": [ ... ],
  "total": 42,
  "limit": 20,
  "offset": 0
}
status filter: OPEN, ACCEPTED, PICKED_UP, IN_TRANSIT, DELIVERED, CONFIRMED, CANCELLED
limit: max 100 per request
POST/api/v1/cancel

Cancel a job

Cancel before delivery. Prepaid balance is refunded instantly — no admin action needed.

Request Body
{
  "id": "cmnxxxxx"
  // — or —
  "jobNumber": "DL-260407-0001"
}
Response
{
  "id": "cmnxxxxx",
  "jobNumber": "DL-260407-0001",
  "status": "CANCELLED",
  "refundPending": false
}
Cannot cancel after DELIVERED status
Prepaid balance refunded automatically and instantly
refundPending: true only if original payment was PayNow (not API prepaid)
GET/api/v1/topup

Check prepaid balance

Returns your current balance. Show this in your UI so operators know when to top up.

Example
GET /api/v1/topup
Response
{
  "balance": 995.50,
  "apiEnabled": true,
  "topupAmounts": [50, 100, 200, 500, 1000]
}
Top up at deliverlah.com/business via PayNow
Admin confirms the transfer — balance is credited within minutes

Job Status Flow

Happy path:
OPEN → ACCEPTED → PICKED_UP → IN_TRANSIT → DELIVERED → CONFIRMED
Cancellation:
Any status before DELIVERED → CANCELLED
Dispute (rare):
DELIVERED → DISPUTED → resolved by admin

OPEN — Waiting for a Dropper to accept (typically 1–10 minutes)

ACCEPTED — Dropper is heading to your pickup location

PICKED_UP — Dropper has the parcel

IN_TRANSIT — Dropper is walking to the customer

DELIVERED — Photo proof uploaded, pending confirmation

CONFIRMED — Complete. Dropper gets paid within 24 hours via FAST.

Pricing

Parcel SizeWeightFeeDropper Earns
LIGHT< 3 kgS$4.50S$3.00
MEDIUM3–5 kgS$5.50S$4.00
HEAVY5–8 kgS$7.00S$5.50

Distance surcharge: +S$1.00 per km beyond 1 km (auto-calculated)

Priority fee: S$0–300, optional — 100% goes to Dropper for faster pickup

Merchant commissions: Zero. The delivery fee is the only cost.

POS Integration Tips

Store pickup details
Your shop's pickup info (name, phone, address, postal code) is the same for every job. Hardcode it in your integration — only the dropoff changes per order.
Map parcel size to your menu
LIGHT covers most F&B orders (cakes, meals, drinks). MEDIUM for larger catering. HEAVY for bulk orders. Default to LIGHT if unsure.
Show delivery fee at checkout
Use the pricing table above to show the delivery fee before the customer pays. The fee is deterministic — same postal code pair always equals the same price.
Poll status, don't webhook
Call GET /api/v1/status every 30–60 seconds to update your POS screen. No webhook setup needed.
Handle low balance
Check GET /api/v1/topup before creating jobs. If balance is low, prompt the operator to top up at deliverlah.com/business.
Cancellation window
Jobs can be cancelled any time before DELIVERED. After that, the delivery is done and the Dropper gets paid.

Partner Quick Start (cURL)

Examples using your partner API key (dlp_):

1. Onboard a merchant

curl -X POST https://www.deliverlah.com/api/partner/merchants \
  -H "Authorization: Bearer dlp_your_partner_key" \
  -H "Content-Type: application/json" \
  -d '{
    "merchantName": "Kopi Corner",
    "merchantEmail": "kopi@example.com",
    "merchantPhone": "+6591234567"
  }'

# Returns: { merchant: { apiKey: "dlh_xxx", tempPassword: "abc123" } }

2. View your dashboard stats

curl https://www.deliverlah.com/api/partner/stats \
  -H "Authorization: Bearer dlp_your_partner_key"

3. Top up a merchant

curl -X POST https://www.deliverlah.com/api/partner/topup \
  -H "Authorization: Bearer dlp_your_partner_key" \
  -H "Content-Type: application/json" \
  -d '{
    "merchantEmail": "kopi@example.com",
    "amount": 100
  }'

Merchant Quick Start (cURL)

Examples using a merchant API key (dlh_):

1. Create a job

curl -X POST https://www.deliverlah.com/api/v1/jobs \
  -H "Authorization: Bearer dlh_your_key" \
  -H "Content-Type: application/json" \
  -d '{
    "pickupName": "My Shop",
    "pickupPhone": "+6591234567",
    "pickupAddress": "Blk 123 #01-01",
    "pickupPostalCode": "520123",
    "dropoffName": "Customer",
    "dropoffPhone": "+6598765432",
    "dropoffAddress": "Blk 456 #05-05",
    "dropoffPostalCode": "460456",
    "parcelSize": "LIGHT"
  }'

2. Track status

curl https://www.deliverlah.com/api/v1/status?jobNumber=DL-260407-0001 \
  -H "Authorization: Bearer dlh_your_key"

3. Cancel if needed

curl -X POST https://www.deliverlah.com/api/v1/cancel \
  -H "Authorization: Bearer dlh_your_key" \
  -H "Content-Type: application/json" \
  -d '{"jobNumber": "DL-260407-0001"}'

4. Check balance

curl https://www.deliverlah.com/api/v1/topup \
  -H "Authorization: Bearer dlh_your_key"

Error Codes

CodeMeaningAction
401Invalid API keyCheck your Bearer token
402Insufficient balanceTop up at deliverlah.com/business
400Missing/invalid fieldsCheck required fields in request body
429Rate limitedMax 100 jobs/hour. Wait and retry.
500Server errorRetry after 5 seconds

Rate Limits

Job creation: 100 per hour per API key. Status polling: unlimited (recommend 30–60 second intervals). Need higher limits? Contact us.

Integration Support

Need help integrating?

We will work with your development team to get you live.