Kooryr API Reference
Connect your store to Kooryr to generate shipping orders, compare rates, and track shipments. This guide covers everything you need to ship your first order via the API.
Overview
https://api.kooryr.com- • All requests and responses use
application/json - • Authentication is required on all endpoints except
GET /rates/slabs - • The API is currently scoped to India domestic shipping
Authentication
Kooryr uses session-based JWT authentication. Register an account, verify your email, then log in to receive a token. Pass this token as a Bearer header on all subsequent requests.
1. Register
/auth/registerstore (default) or logistics. Use store for e-commerce integrations.curl -X POST https://api.kooryr.com/auth/register \
-H "Content-Type: application/json" \
-d '{
"name": "Acme Store",
"email": "ops@acme.in",
"password": "securepass123",
"user_type": "store"
}'{
"message": "Account created. Please check your email to verify your account.",
"user": {
"id": "a1b2c3d4-...",
"name": "Acme Store",
"email": "ops@acme.in",
"user_type": "store"
}
}A verification link is sent to your email. You must verify before you can log in.
2. Log in
/auth/logincurl -X POST https://api.kooryr.com/auth/login \
-H "Content-Type: application/json" \
-c cookies.txt \
-d '{
"email": "ops@acme.in",
"password": "securepass123"
}'{
"user": {
"id": "a1b2c3d4-...",
"name": "Acme Store",
"email": "ops@acme.in",
"user_type": "store",
"onboarding_complete": false
}
}The response sets an httpOnly cookie named token containing a signed JWT (valid 7 days). For server-side integrations, capture this cookie and replay it on subsequent requests.
# Extract the JWT from the Set-Cookie header after login, then: curl https://api.kooryr.com/orders \ -H "Authorization: Bearer <your_jwt_token>"
Zone Reference
Every order requires a zone. Kooryr determines zone automatically from the origin and destination pincodes in the dashboard, but if you are integrating via the API you must supply it. Use the table below, or call GET /rates/slabs for machine-readable rate data.
| Zone | Description | Examples |
|---|---|---|
| local | Same sorting district (first 3 pincode digits match) or within the same metro city | Andheri → Bandra, Delhi → Delhi |
| metro | Between two of the top 8 metro cities | Mumbai → Bangalore, Delhi → Pune |
| regional | Different districts but same state/postal circle | Jaipur → Jodhpur, Lucknow → Agra |
| national | Different states | Mumbai → Hyderabad, Delhi → Chennai |
| remote | J&K, North-East states, A&N Islands, Lakshadweep, Sikkim | Srinagar, Shillong, Port Blair |
Unsure of the zone? Use the rate calculator in your dashboard or POST /rates/calculate which also returns the computed zone.
Rate Calculation
Calculate the shipping cost for a given zone and weight before creating an order.
Calculate rate
/rates/calculate· requires authlocal · regional · metro · national · remote1.5prepaid (default) or cod. COD rates are ~15% higher.curl -X POST https://api.kooryr.com/rates/calculate \
-H "Content-Type: application/json" \
-H "Authorization: Bearer <token>" \
-d '{
"zone": "national",
"weight_kg": 1.5,
"payment_type": "prepaid"
}'{
"zone": "national",
"weight_kg": 1.5,
"payment_type": "prepaid",
"base": 35,
"add05": 44,
"add1": 0,
"total": 79
}Pricing is in INR. base covers the first 0.5 kg.add05 is additional charge for each 0.5 kg up to 5 kg.add1 covers each 1 kg above 5 kg.
Get rate slabs (public)
/rates/slabs· no auth requiredReturns the full prepaid and COD rate slabs for all zones.
curl https://api.kooryr.com/rates/slabs
Creating an Order
An order is a shipment manifest — it records the origin, destination, weight, and cost for a parcel. Once created, the order can be assigned to a carrier to generate a shipping label.
Create order
/orders· requires auth/rates/calculate endpoint to get this value.prepaid (default) or cod.curl -X POST https://api.kooryr.com/orders \
-H "Content-Type: application/json" \
-H "Authorization: Bearer <token>" \
-d '{
"origin_pincode": "400001",
"destination_pincode": "110001",
"zone": "national",
"weight_kg": 1.5,
"estimated_cost": 79,
"payment_type": "prepaid"
}'{
"order": {
"id": "f7e8d9c0-...",
"user_id": "a1b2c3d4-...",
"origin_pincode": "400001",
"destination_pincode": "110001",
"zone": "national",
"weight_kg": "1.50",
"estimated_cost": "79.00",
"payment_type": "prepaid",
"status": "pending",
"carrier": null,
"tracking_id": null,
"created_at": "2026-03-26T09:00:00.000Z"
}
}Typical integration flow
- Determine the
zonefrom the customer's pincode (see zone table) - Call
POST /rates/calculateto getestimated_cost - Call
POST /orderswith all fields to create the order - Use the returned
order.idto purchase a carrier label viaPOST /carriers/amazon/rates
Listing Orders
List your orders
/orders· requires authReturns the 50 most recent orders for the authenticated account, newest first.
curl https://api.kooryr.com/orders \ -H "Authorization: Bearer <token>"
{
"orders": [
{
"id": "f7e8d9c0-...",
"origin_pincode": "400001",
"destination_pincode": "110001",
"zone": "national",
"weight_kg": "1.50",
"estimated_cost": "79.00",
"payment_type": "prepaid",
"status": "pending",
"carrier": null,
"tracking_id": null,
"created_at": "2026-03-26T09:00:00.000Z"
}
]
}Errors
All errors return a JSON object with an error field describing the problem.
| Status | Meaning |
|---|---|
| 400 | Bad Request — a required field is missing or invalid. |
| 401 | Unauthorised — missing or expired token. |
| 403 | Forbidden — email not yet verified. |
| 404 | Not Found — the requested resource does not exist. |
| 409 | Conflict — e.g. email already registered. |
| 500 | Server Error — something went wrong on our end. |
{ "error": "origin_pincode, destination_pincode, zone, weight_kg are required" }More endpoints (carrier labels, tracking, webhooks) are being added. Contact us if you need help integrating.