Base URL: https://api4.shiplee.in
Version: 1.1 (Internal Release)
Authenticates a user and returns a JWT Bearer token required for all other endpoints.
POST/api/login
| Parameter | Type | Required | Description |
|---|---|---|---|
mobile | string | Yes | Registered mobile number (e.g., "6393538851") |
password | string | Yes | User password |
curl -X POST "https://api4.shiplee.in/api/login" \
-H "Content-Type: application/json" \
-d '{
"mobile": "6393538851",
"password": "Test@123"
}'
access_token and send it in the headers of subsequent requests.
{
"status": "success",
"message": "Login successful",
"redirect": "index",
"token": "eyJ0eXAi...", // Legacy support
"access_token": "eyJ0eXAi...", // Use this for Authorization
"token_type": "Bearer",
"expires_in": 10800, // 3 Hours
"email_verified": true
}
403 Forbidden: Account pending/blocked.
401 Unauthorized: Invalid credentials.
Fetches the initial app state, including user profile details, wallet balance, action alerts (like pending orders), and pickup schedules.
GET/api/home
| Key | Value | Description |
|---|---|---|
Authorization | Bearer <access_token> | Token from Login API |
Accept | application/json | Standard accept header |
curl -X GET "https://api4.shiplee.in/api/home" \ -H "Authorization: Bearer eyJ0eXAiOiJK..." \ -H "Accept: application/json"
{
"status": "success",
"data": {
"user": {
"fullname": "Ankit",
"mobile": "6393538851",
"email": "[email protected]",
"account_status": "active",
"wallet_balance": 5000
},
"steps": [],
"actions": [
{ "label": "Unprocessable Orders", "value": 0 },
{ "label": "Weight Discrepancy Due", "value": 0 },
{ "label": "Shipment Delays", "value": 0 },
{ "label": "Pickup Delays", "value": 0 }
],
"categories": [
{ "value": "all", "label": "All Categories" },
{ "value": "alerts", "label": "Alerts" }
],
"pickups": {
"today": "20 Jan 2026",
"tomorrow": "21 Jan 2026",
"has_pickups": false
}
}
}
Fetches detailed shipment statistics, earnings graphs, and courier performance for a specific date range.
GET/api/dashboard
| Type | Key | Required | Description |
|---|---|---|---|
| Header | Authorization | Yes | Bearer <access_token> |
| Query | start_date | Yes | YYYY-MM-DD (e.g., 2023-01-01) |
| Query | end_date | Yes | YYYY-MM-DD (e.g., 2026-01-31) |
curl -X GET "https://api4.shiplee.in/api/dashboard?start_date=2023-01-01&end_date=2026-01-31" \ -H "Authorization: Bearer eyJ0eXAiOiJK..."
{
"status": "success",
"filter": { "start": "2023-01-01", "end": "2026-01-31" },
"data": {
"tiles": {
"total_shipments": 8734,
"delivered": 556,
"pending_orders": 1,
"rto_count": 930
},
"wallet": 5000,
"charts": {
"courier_stats": [
{ "courier": "Bluedart- Surface", "total": 338, "delivered": 135, "rto": 195 }
],
"channels": [
{ "name": "Shopify", "count": 8440 },
{ "name": "Custom", "count": 290 }
],
"state_loads": [
{ "state": "Delhi", "count": 1110 },
{ "state": "Maharashtra", "count": 1480 }
],
"monthly_cod_earnings": [
{ "label": "Sep 2024", "earnings": 1437144 },
{ "label": "Jan 2026", "earnings": 5976 }
]
}
}
}
Returns available courier options and calculated shipping charges based on source/destination pincodes, weight, order value, and payment type (COD/Prepaid).
POST/api/rates
| Key | Value | Description |
|---|---|---|
Authorization | Bearer <access_token> | JWT token from Login API |
Content-Type | application/json | Request body JSON format |
Accept | application/json | Standard accept header |
| Parameter | Type | Required | Description |
|---|---|---|---|
order_info | object | Yes | Main payload wrapper |
order_info.source_pincode | string | Yes | Pickup pincode (e.g., "110001") |
order_info.destination_pincode | string | Yes | Delivery pincode (e.g., "560001") |
order_info.order_weight | number | Yes | Weight in grams (e.g., 1500 = 1.5 KG) |
order_info.order_value | number | Yes | Order value in INR (used for COD rules/thresholds) |
order_info.payment_type | string | Yes | cod or prepaid |
curl -X POST "https://api4.shiplee.in/api/rates" \
-H "Authorization: Bearer <access_token>" \
-H "Content-Type: application/json" \
-d '{
"order_info": {
"source_pincode": "110001",
"destination_pincode": "560001",
"order_weight": 1500,
"order_value": 1200,
"payment_type": "cod"
}
}'
$headers = @{
"Authorization" = "Bearer <access_token>"
"Content-Type" = "application/json"
"Accept" = "application/json"
}
$body = @{
order_info = @{
source_pincode = "110001"
destination_pincode = "560001"
order_weight = 1500
order_value = 1200
payment_type = "cod"
}
} | ConvertTo-Json -Depth 5
Invoke-RestMethod `
-Uri "https://api4.shiplee.in/api/rates" `
-Method POST `
-Headers $headers `
-Body $body
carrier_info array (courier options). Usually, the UI should show the lowest cost first.cost = freight_charges + cod_charges (for COD shipments).
{
"status": 1,
"code": 200,
"message": "success",
"data": {
"carrier_info": [
{
"carrier_id": "delhivery_2kg_surface",
"carrier_name": "Delhivery 2kg Surface",
"ratecard_id": 60,
"courier_id": "delhivery_surface",
"zone": "D",
"rate_type": "slab",
"cost": 162,
"freight_charges": 124,
"cod_charges": 38,
"slab": {
"slab_id": 265,
"weight_slab_grams": 2000,
"pricing_type": "slab",
"freight_amount": 124,
"cod_charge": 38,
"cod_percent": 2,
"cod_threshold": 1700,
"cod_apply_after_threshold": false,
"includes_cod": false,
"includes_rto": false
}
}
],
"order_summary": {
"source_pincode": "110001",
"destination_pincode": "560001",
"order_weight": 1500,
"order_value": 1200,
"payment_type": "cod"
}
}
}
| Field | Type | Description |
|---|---|---|
carrier_id | string | Internal carrier/service identifier |
carrier_name | string | Display name for UI (e.g., "Delhivery Surface") |
zone | string | Zone mapping between pincodes (A/B/C/D etc.) |
rate_type | string | Pricing logic type (e.g., slab) |
freight_charges | number | Base freight amount |
cod_charges | number | COD fee (0 for prepaid) |
cost | number | Total payable shipping cost |
slab | object | Matched slab details (weight slab, COD percent, thresholds, etc.) |
401 Unauthorized: Missing/invalid token.
422 Unprocessable Entity: Validation error (missing pincode/weight/value).
404 Not Found: No ratecards/couriers available for given lane.
Fetch the authenticated user's profile and perform account actions: change password or send an email verification link.
GET/api/account_settings
| Key | Value | Description |
|---|---|---|
Authorization | Bearer <access_token> | JWT token from Login API |
Accept | application/json | Standard accept header |
curl -X GET "https://api4.shiplee.in/api/account_settings" \ -H "Authorization: Bearer <access_token>"
{
"status": "success",
"data": {
"fullname": "Ankit",
"email": "[email protected]",
"mobile": "6393538851",
"email_verified": true
}
}
401 Unauthorized: Missing/invalid token.
404 Not Found: User not found.
POST/api/account_settings
All POST actions share the same endpoint. Pass the action field in the JSON body to specify what to do.
| Key | Value | Description |
|---|---|---|
Authorization | Bearer <access_token> | JWT token from Login API |
Content-Type | application/json | Request body JSON format |
change_password| Parameter | Type | Required | Description |
|---|---|---|---|
action | string | Yes | Must be "change_password" |
old_password | string | Yes | The user's current password |
new_password | string | Yes | New password (min 8 characters) |
confirm_password | string | Yes | Must match new_password |
curl -X POST "https://api4.shiplee.in/api/account_settings" \
-H "Authorization: Bearer <access_token>" \
-H "Content-Type: application/json" \
-d '{
"action": "change_password",
"old_password": "OldPass@123",
"new_password": "NewPass@456",
"confirm_password": "NewPass@456"
}'
{
"status": "success",
"message": "Password updated successfully."
}
401 Unauthorized: Current password is incorrect.
422 Unprocessable Entity: Missing fields / passwords don't match / new password too short.
send_verification_emailGenerates a secure one-time token and emails a verification link to the user's registered email. The link expires in 1 hour. Any previously issued tokens are invalidated.
| Parameter | Type | Required | Description |
|---|---|---|---|
action | string | Yes | Must be "send_verification_email" |
curl -X POST "https://api4.shiplee.in/api/account_settings" \
-H "Authorization: Bearer <access_token>" \
-H "Content-Type: application/json" \
-d '{
"action": "send_verification_email"
}'
{
"status": "success",
"message": "Verification email sent to [email protected]."
}
200 OK with "message": "Email is already verified." — no email is sent.
401 Unauthorized: Missing/invalid token.
500 Internal Server Error: Database error or email delivery failure.
List, add, and delete warehouses for the authenticated seller. New warehouses are automatically registered with SmartShip for both Express and Economy delivery types.
GET/api/warehouse
| Key | Value | Description |
|---|---|---|
Authorization | Bearer <access_token> | JWT token from Login API |
curl -X GET "https://api4.shiplee.in/api/warehouse" \ -H "Authorization: Bearer <access_token>"
{
"status": "success",
"total": 2,
"data": [
{
"id": 1,
"nickname": "Delhi HQ",
"address1": "123 Main Street",
"address2": "Near Metro",
"pincode": "110001",
"city": "New Delhi",
"state": "Delhi",
"mobile_number": "9876543210",
"address_type": "primary",
"express_hub_id": "EXP_HUB_001",
"economy_hub_id": "ECO_HUB_001",
"created_at": "2026-01-15 10:30:00"
},
{
"id": 2,
"nickname": "Mumbai Warehouse",
"address1": "456 Park Lane",
"address2": "Shiplee-partner",
"pincode": "400001",
"city": "Mumbai",
"state": "Maharashtra",
"mobile_number": "9123456789",
"address_type": "secondary",
"express_hub_id": "EXP_HUB_002",
"economy_hub_id": "ECO_HUB_002",
"created_at": "2026-02-01 09:00:00"
}
]
}
POST/api/warehouse
| Key | Value | Description |
|---|---|---|
Authorization | Bearer <access_token> | JWT token from Login API |
Content-Type | application/json | Request body JSON format |
add_warehouseaddress_type: "primary". All subsequent ones are "secondary". SmartShip hub registration runs in the same transaction — if it fails, nothing is saved.
| Parameter | Type | Required | Description |
|---|---|---|---|
action | string | Yes | Must be "add_warehouse" |
nickname | string | Yes | Display name for the warehouse |
mobile | string | Yes | 10-digit mobile number (no country code) |
address1 | string | Yes | Address line 1 |
address2 | string | No | Address line 2 (defaults to "Shiplee-partner") |
pincode | string | Yes | 6-digit Indian pincode |
state | string | Yes | State name |
city | string | Yes | City name |
curl -X POST "https://api4.shiplee.in/api/warehouse" \
-H "Authorization: Bearer <access_token>" \
-H "Content-Type: application/json" \
-d '{
"action": "add_warehouse",
"nickname": "Delhi HQ",
"mobile": "9876543210",
"address1": "123 Main Street",
"address2": "Near Metro Station",
"pincode": "110001",
"state": "Delhi",
"city": "New Delhi"
}'
{
"status": "success",
"message": "Warehouse added successfully.",
"data": {
"warehouse_id": 42,
"address_type": "primary",
"express_hub_id": "EXP_HUB_042",
"economy_hub_id": "ECO_HUB_042"
}
}
422 Unprocessable Entity: Missing/invalid fields (mobile not 10 digits, pincode not 6 digits).
500 Internal Server Error: SmartShip registration failure or DB error — transaction is rolled back.
delete_warehousePerforms a soft delete (is_deleted = 1). Primary warehouses cannot be deleted.
| Parameter | Type | Required | Description |
|---|---|---|---|
action | string | Yes | Must be "delete_warehouse" |
warehouse_id | integer | Yes | ID of the warehouse to delete |
curl -X POST "https://api4.shiplee.in/api/warehouse" \
-H "Authorization: Bearer <access_token>" \
-H "Content-Type: application/json" \
-d '{
"action": "delete_warehouse",
"warehouse_id": 42
}'
{
"status": "success",
"message": "Warehouse deleted successfully."
}
404 Not Found: Warehouse not found or doesn't belong to the seller
404 Not Found: Warehouse not found or doesn't belong to the seller.
422 Unprocessable Entity: Attempting to delete a primary warehouse.
make_primaryPromotes a warehouse to primary. All other seller warehouses are demoted to secondary in the same operation.
| Parameter | Type | Required | Description |
|---|---|---|---|
action | string | Yes | Must be "make_primary" |
warehouse_id | integer | Yes | ID of the warehouse to promote |
curl -X POST "https://api4.shiplee.in/api/warehouse" \
-H "Authorization: Bearer <access_token>" \
-H "Content-Type: application/json" \
-d '{ "action": "make_primary", "warehouse_id": 3 }'
{ "status": "success", "message": "Primary warehouse updated successfully." }
add_warehouse), if a non-deleted warehouse with the same seller + mobile + pincode + city + state already has both SmartShip hub IDs, the API returns 200 success with "is_duplicate": true and the existing warehouse_id — no new row or SmartShip registration is created.
List, connect, and remove WooCommerce stores for the authenticated seller. Each store gets a unique API key and internal name used to sync orders.
GET/api/woocommerce
| Key | Value | Description |
|---|---|---|
Authorization | Bearer <access_token> | JWT token from Login API |
curl -X GET "https://api4.shiplee.in/api/woocommerce" \ -H "Authorization: Bearer <access_token>"
{
"status": "success",
"total": 1,
"data": [
{
"id": 5,
"store_url": "https://myshop.com",
"api_key": "a3f8e1c2d94b...",
"woocommerce_name": "wc_a1b2c3d4",
"status": "active",
"created_at": "2026-01-10 11:00:00"
}
]
}
POST/api/woocommerce
| Key | Value | Description |
|---|---|---|
Authorization | Bearer <access_token> | JWT token from Login API |
Content-Type | application/json | Request body JSON format |
add_store| Parameter | Type | Required | Description |
|---|---|---|---|
action | string | Yes | Must be "add_store" |
store_url | string | Yes | Full URL of the WooCommerce store (e.g., https://myshop.com) |
curl -X POST "https://api4.shiplee.in/api/woocommerce" \
-H "Authorization: Bearer <access_token>" \
-H "Content-Type: application/json" \
-d '{
"action": "add_store",
"store_url": "https://myshop.com"
}'
api_key and woocommerce_name — these are used to configure the Shiplee plugin on the WooCommerce side.
{
"status": "success",
"message": "WooCommerce store added successfully.",
"data": {
"id": 5,
"store_url": "https://myshop.com",
"api_key": "a3f8e1c2d94b...",
"woocommerce_name": "wc_a1b2c3d4",
"status": "active"
}
}
409 Conflict: This store URL is already linked to the seller's account.
422 Unprocessable Entity: Missing or invalid store_url.
delete_store| Parameter | Type | Required | Description |
|---|---|---|---|
action | string | Yes | Must be "delete_store" |
store_id | integer | Yes | ID of the store to remove (from list response) |
curl -X POST "https://api4.shiplee.in/api/woocommerce" \
-H "Authorization: Bearer <access_token>" \
-H "Content-Type: application/json" \
-d '{
"action": "delete_store",
"store_id": 5
}'
{
"status": "success",
"message": "Store removed successfully."
}
404 Not Found: Store not found or doesn't belong to the seller.
422 Unprocessable Entity: Missing store_id.
auth_middleware.php. If the user has not accepted the current active agreement, all
API calls (except GET /api/agreement and POST /api/agreement) return:
HTTP 403 Forbidden
{
"status": "error",
"error_code": "AGREEMENT_REQUIRED",
"message": "You must accept the Terms and Conditions before continuing."
}
The frontend should intercept this error_code globally and redirect the user to the agreement screen.
GET/api/agreement
skip_agreement_check: true — it is always accessible even if the agreement hasn't been accepted yet.
| Key | Value | Description |
|---|---|---|
Authorization | Bearer <access_token> | JWT token from Login API |
curl -X GET "https://api4.shiplee.in/api/agreement" \ -H "Authorization: Bearer <access_token>"
{
"status": "success",
"agreement_required": true,
"data": {
"id": 3,
"title": "Shiplee Terms and Conditions v2",
"content": "<p>Full HTML agreement content...</p>"
}
}
{
"status": "success",
"agreement_required": false
}
403 Forbidden with "error_code": "EMAIL_NOT_VERIFIED" — user must verify email before they can view or accept agreements.
POST/api/agreement
skip_agreement_check: true — the user needs to be able to POST acceptance before the gate is lifted. After a successful acceptance, all subsequent API calls will pass the middleware check.
| Key | Value | Description |
|---|---|---|
Authorization | Bearer <access_token> | JWT token from Login API |
Content-Type | application/json | Request body JSON format |
| Parameter | Type | Required | Description |
|---|---|---|---|
action | string | Yes | Must be "accept" |
agreement_id | integer | Yes | The id from the GET response |
curl -X POST "https://api4.shiplee.in/api/agreement" \
-H "Authorization: Bearer <access_token>" \
-H "Content-Type: application/json" \
-d '{
"action": "accept",
"agreement_id": 3
}'
{
"status": "success",
"message": "Agreement accepted successfully.",
"email_sent": true
}
user_agreements with the user's IP and timestamp.users2.agreement_accepted is set to 1.404 Not Found: Agreement ID is invalid or no longer active.
422 Unprocessable Entity: Missing agreement_id or unknown action.
| Step | Action |
|---|---|
| 1 | After login, call GET /api/agreement |
| 2 | If agreement_required: true → show agreement screen with content |
| 3 | User checks the box and taps Accept → call POST /api/agreement |
| 4 | On success → navigate to the app normally |
| 5 | On any API call returning "error_code": "AGREEMENT_REQUIRED" → redirect back to agreement screen (handles edge case of agreement being updated) |
Three endpoints power the Reverse Orders page: listing orders with date/product filters, a live search bar, and a product-name dropdown loader.
GET/api/reverse_orders
| Key | Value | Description |
|---|---|---|
Authorization | Bearer <access_token> | JWT token from Login API |
| Parameter | Type | Required | Description |
|---|---|---|---|
start_date | string | No | YYYY-MM-DD. Defaults to 90 days ago. |
end_date | string | No | YYYY-MM-DD. Defaults to tomorrow. |
product_name | string | No | Exact product name to filter by. |
curl -X GET "https://api4.shiplee.in/api/reverse_orders?start_date=2026-01-01&end_date=2026-03-18&product_name=Shoes" \ -H "Authorization: Bearer <access_token>"
{
"status": "success",
"filter": {
"start": "2026-01-01",
"end": "2026-03-18",
"product_name": "Shoes"
},
"total": 2,
"data": [
{
"id": 101,
"reverse_order_id": "REV-10001",
"awb_number": "143900012345",
"customer_name": "Rahul Sharma",
"customer_mobile": "9876543210",
"customer_address1": "12 MG Road",
"customer_address2": "Apt 4B",
"customer_city": "Bengaluru",
"customer_state": "Karnataka",
"customer_pincode": "560001",
"product_names": "Shoes",
"total_price": 1299.00,
"payment_type": "prepaid",
"charge_weight": 0.5,
"length": 30,
"breadth": 20,
"height": 15,
"reason": "Wrong size",
"status": "pending",
"warehouse_id": 3,
"wh_nickname": "Delhi HQ",
"wh_addr1": "123 Main Street",
"wh_addr2": "Near Metro",
"wh_city": "New Delhi",
"wh_state": "Delhi",
"wh_pincode": "110001",
"wh_type": "primary",
"created_at": "10 Mar 2026"
}
]
}
charge_weight is in KG. Multiply by 1000 for grams (as the UI does). If warehouse_id is null, the order has no warehouse assigned and cannot be booked.
GET/api/search_reverse_orders
Searches across AWB number, customer name, and customer mobile. Used by the topbar search box.
| Parameter | Type | Required | Description |
|---|---|---|---|
q | string | Yes | Search term — minimum 3 characters. |
curl -X GET "https://api4.shiplee.in/api/search_reverse_orders?q=Rahul" \ -H "Authorization: Bearer <access_token>"
{
"status": "success",
"total": 1,
"data": [
{
"id": 101,
"reverse_order_id": "REV-10001",
"awb_number": "143900012345",
"customer_name": "Rahul Sharma",
"customer_mobile": "9876543210",
"status": "pending",
"created_at": "10 Mar 2026"
}
]
}
422 Unprocessable Entity: Search term is fewer than 3 characters.
GET/api/reverse_order_products
Returns all distinct product names for the seller — used to populate the Filter dropdown.
curl -X GET "https://api4.shiplee.in/api/reverse_order_products" \ -H "Authorization: Bearer <access_token>"
{
"status": "success",
"total": 3,
"data": ["Shoes", "T-Shirt", "Watch"]
}
Entry point for the Shiplee Shopify app. Checks whether a given shop is connected and either returns a session JWT or the OAuth redirect URL to begin the connection flow.
GET/api/shopify_app
Authorization header — it is public-facing and called by the Shopify app iframe on load.
| Parameter | Type | Required | Description |
|---|---|---|---|
shop | string | Yes | The Shopify store domain (e.g. mystore.myshopify.com) |
curl -X GET "https://api4.shiplee.in/api/shopify_app?shop=mystore.myshopify.com"
access_token and use it as a Bearer token for any subsequent Shiplee API calls made from within the Shopify app context. It expires in 24 hours.
{
"status": "success",
"connected": true,
"shop": "mystore.myshopify.com",
"access_token": "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9...",
"token_type": "Bearer",
"expires_in": 86400,
"dashboard_url": "https://app.shiplee.ai"
}
connected: false, redirect the user (or open a popup) to the oauth_redirect URL to begin the Shopify OAuth flow. After OAuth completes, call this endpoint again — it will return a JWT.
{
"status": "success",
"connected": false,
"oauth_redirect": "https://app.shiplee.ai/shopify/connect?shop=mystore.myshopify.com",
"message": "Store not connected. Redirect user to oauth_redirect to begin OAuth."
}
| Step | Action |
|---|---|
| 1 | Shopify app loads → call GET /api/shopify_app?shop=<shop> |
| 2 | If connected: false → redirect to oauth_redirect |
| 3 | OAuth completes → call endpoint again → receive JWT |
| 4 | If connected: true → store JWT, show dashboard button |
422 Unprocessable Entity: Missing or invalid shop parameter (must be a .myshopify.com domain).
Raises a billing support ticket, creates escalation rows (one per AWB), and fires an in-app notification — all in a single transaction.
POST/api/billing_ticket
| Key | Value | Description |
|---|---|---|
Authorization | Bearer <access_token> | JWT token from Login API |
Content-Type | application/json | Request body JSON format |
| Parameter | Type | Required | Description |
|---|---|---|---|
issue | string | Yes | Must be one of the allowed issue types (see below) |
remarks | string | Yes | Query description — max 300 characters, alphanumeric only |
awb_numbers | string | No | Comma-separated AWB numbers (e.g. "AWB001, AWB002"). Defaults to "NA" if omitted. |
| Value |
|---|
Billing Invoice |
Billing Credit |
Billing Debit |
Wallet Recharge |
COD Transaction |
Service Fee |
GST Issue |
curl -X POST "https://api4.shiplee.in/api/billing_ticket" \
-H "Authorization: Bearer <access_token>" \
-H "Content-Type: application/json" \
-d '{
"issue": "Billing Invoice",
"remarks": "Invoice amount looks incorrect for last month",
"awb_numbers": "AWB1234, AWB5678"
}'
{
"status": "success",
"message": "Billing ticket raised successfully. Our billing team will contact you shortly.",
"ticket_id": 42
}
tickets with status Open.escalations row per AWB number, assigned to Billing Team.notifications row created for the seller.422 Unprocessable Entity: Missing fields, invalid issue type, or remarks exceeding 300 characters. When the issue type is invalid, the response also includes an allowed array of valid values.
401 Unauthorized: Missing or invalid token.
500 Internal Server Error: DB failure — transaction rolled back, nothing is saved.
Books a forward shipment for an order. Resolves the seller's plan ratecard, checks serviceability, calculates charges, calls the courier API, saves the booking, and records cost snapshots — all in one call.
POST/api/book_shipment
| Key | Value | Description |
|---|---|---|
Authorization | Bearer <access_token> | JWT token from Login API |
Content-Type | application/json | Request body JSON format |
| Parameter | Type | Required | Description |
|---|---|---|---|
carrier_id | string | Yes | The carrier_id (booking key) returned by the Rates API |
carrier_name | string | No | Display name of the carrier (used as fallback for service matching) |
order_id | integer | Yes | The Shiplee customer_info.id of the order to book |
warehouse_id | integer | Yes | The warehouse to ship from (must belong to the seller) |
curl -X POST "https://api4.shiplee.in/api/book_shipment" \
-H "Authorization: Bearer <access_token>" \
-H "Content-Type: application/json" \
-d '{
"carrier_id": "delhivery_2kg_surface",
"carrier_name": "Delhivery 2kg Surface",
"order_id": 10042,
"warehouse_id": 3
}'
{
"status": "success",
"message": "Shipment booked successfully.",
"awb_number": "1234567890123",
"carrier": "Delhivery 2kg Surface",
"zone": "D",
"charges": {
"freight_charges": 124,
"cod_charges": 38,
"cost": 162
}
}
zone_rules table (city → state → metro → fallback D).customer_info.status updated, row inserted in orders, wallet debited, ShippingCharges recorded.courier_cost_snapshots: our calculated rate (source: "booking") and the live rate from the courier API (source: "live_rate") for reconciliation.| Step | Check | Failure Response |
|---|---|---|
| 1 | JWT auth + agreement gate | 401 / 403 |
| 2 | Duplicate booking guard (orders.linkid) | 409 ALREADY_BOOKED |
| 3 | Order exists and belongs to seller | 404 |
| 4 | Warehouse exists and belongs to seller | 404 |
| 5 | Wallet balance ≥ ₹500 | 402 INSUFFICIENT_BALANCE |
| 6 | Ratecard found in seller's plan | 422 |
| 7 | Destination serviceable for payment type | 422 NOT_SERVICEABLE |
| 8 | Rate slab found for zone + weight | 422 |
| 9 | Courier API returns AWB | 500 |
order_value ≤ cod_threshold → COD = ₹0 (included in freight)order_value > cod_threshold → COD = max(cod_charge, order_value × cod_percent / 100)
402 Payment Required — INSUFFICIENT_BALANCE: Wallet below ₹500.
404 Not Found: Order or warehouse not found / doesn't belong to seller.
409 Conflict — ALREADY_BOOKED: Order already has an AWB. Response includes existing awb_number.
422 Unprocessable Entity: Missing fields, ratecard not found, destination not serviceable, slab not found, or unsupported courier.
500 Internal Server Error: Courier API failure or DB error.
Queues multiple orders for shipment booking. Orders are processed asynchronously by a cron job — this endpoint only enqueues them. Use Book Shipment for single, immediate bookings.
POST/api/bulk_booking
| Key | Value | Description |
|---|---|---|
Authorization | Bearer <access_token> | JWT token from Login API |
Content-Type | application/json | Request body JSON format |
| Parameter | Type | Required | Description |
|---|---|---|---|
order_ids | integer[] | Yes | Array of customer_info.id values to queue |
warehouse_id | integer | Yes | Warehouse to ship from (must belong to the seller) |
curl -X POST "https://api4.shiplee.in/api/bulk_booking" \
-H "Authorization: Bearer <access_token>" \
-H "Content-Type: application/json" \
-d '{
"order_ids": [1001, 1002, 1003],
"warehouse_id": 3
}'
{
"status": "success",
"message": "2 order(s) queued for booking (1 skipped — already pending or booked)",
"queued_count": 2,
"queued_orders": [1001, 1002],
"skipped_count": 1,
"skipped_orders": [1003],
"skipped_reasons": {
"1003": "already_booked"
}
}
bulk_booking_logs shows status pending or processing.orders table.failed or new rows are deleted before inserting a fresh pending row.customer_info.status is set to 'pending' (only if currently 'new').pending rows and calls the booking logic.| Code | Meaning |
|---|---|
already_queued | Order is already in pending or processing state in the queue |
already_booked | Order already has an AWB in the orders table |
db_error | Insert failed — check server logs |
404 Not Found: Warehouse not found or no valid orders found for this account.
422 Unprocessable Entity: Missing order_ids or warehouse_id.
Cancels one or more orders. Only orders with status new can be cancelled. Also soft-deletes any linked Shopify import rows.
POST/api/cancel_orders
| Key | Value | Description |
|---|---|---|
Authorization | Bearer <access_token> | JWT token from Login API |
Content-Type | application/json | Request body JSON format |
| Parameter | Type | Required | Description |
|---|---|---|---|
order_ids | integer[] | Yes | Array of customer_info.id values to cancel |
curl -X POST "https://api4.shiplee.in/api/cancel_orders" \
-H "Authorization: Bearer <access_token>" \
-H "Content-Type: application/json" \
-d '{
"order_ids": [1001, 1002, 1003]
}'
{
"status": "success",
"message": "2 order(s) cancelled successfully.",
"cancelled": [1001, 1002],
"skipped": {
"not_found": [],
"non_cancellable": {
"1003": "manifested"
}
}
}
new are cancelled — already booked/manifested orders are reported in non_cancellable with their current status.not_found.shopify_implink, it is soft-deleted (is_deleted = 1) in the same transaction.409 Conflict: A race condition prevented one or more orders from being cancelled. No changes saved — retry the request.
422 Unprocessable Entity: No cancellable orders found (all orders are already booked, not found, or wrong status).
Cancels already-booked or manifested shipments. Calls the courier's cancellation API, reverts the order status, deletes the booking record, refunds the wallet, and writes a full audit log — all in one transaction.
new) orders, use Cancel Orders instead.
POST/api/cancel_shipments
| Key | Value | Description |
|---|---|---|
Authorization | Bearer <access_token> | JWT token from Login API |
Content-Type | application/json | Request body JSON format |
| Parameter | Type | Required | Description |
|---|---|---|---|
order_ids | integer[] | Yes | Array of customer_info.id values to cancel |
action | string | No | "cancel" — reset to new (rebookable) | "delete" — set to cancelled (default) |
curl -X POST "https://api4.shiplee.in/api/cancel_shipments" \
-H "Authorization: Bearer <access_token>" \
-H "Content-Type: application/json" \
-d '{
"order_ids": [1001, 1002],
"action": "cancel"
}'
{
"status": "success",
"message": "Shipment(s) cancelled and reset to new. You can rebook these orders.",
"cancelled_count": 2,
"new_status": "new",
"wallet_balance": 4836.50
}
courier_name).customer_info.status set to new (action=cancel) or cancelled (action=delete).orders table.userwallet) and logged to RechargeLogs.ShippingCharges.Status set to cancelled.CancelDeleteLogs (success or failure).| Action | Resulting Status | Use Case |
|---|---|---|
cancel | new | Cancel and rebook with a different courier |
delete | cancelled | Permanently cancel the order |
422 Unprocessable Entity: No orders found in booked or manifested status for this seller.
503 Service Unavailable: Could not obtain courier API tokens — retry after a short delay.
500 Internal Server Error: Courier API rejected the cancellation, or a DB step failed. Transaction rolled back. Failure logged to CancelDeleteLogs.
Manage connected sales channels across Shopify, WooCommerce, and QuickSell. Shopify and WooCommerce stores are connected via their own OAuth flows — this API only handles listing and deleting them. QuickSell is connected directly via API key.
GET/api/channels
curl -X GET "https://api4.shiplee.in/api/channels" \ -H "Authorization: Bearer <access_token>"
{
"status": "success",
"total": 3,
"data": [
{
"id": 1,
"store_name": "my-store",
"store_url": "https://my-store.myshopify.com",
"platform": "shopify",
"status": "active"
},
{
"id": 4,
"store_name": "myshop.com",
"store_url": "https://myshop.com",
"platform": "woocommerce",
"status": "active"
},
{
"id": 7,
"store_name": "https://quicksell.co/s/abc123",
"store_url": "https://quicksell.co/s/abc123",
"platform": "quicksell",
"status": "active"
}
]
}
POST/api/channels
| Key | Value | Description |
|---|---|---|
Authorization | Bearer <access_token> | JWT token from Login API |
Content-Type | application/json | Request body JSON format |
add_quicksell| Parameter | Type | Required | Description |
|---|---|---|---|
action | string | Yes | Must be "add_quicksell" |
api_key | string | Yes | QuickSell API key from Account Settings → Developer API |
catalogue_url | string | No | QuickSell catalogue URL for share links |
length | number | No | Default parcel length in cm (default: 10) |
breadth | number | No | Default parcel breadth in cm (default: 10) |
height | number | No | Default parcel height in cm (default: 10) |
weight | number | No | Default parcel weight in kg (default: 0.5) |
curl -X POST "https://api4.shiplee.in/api/channels" \
-H "Authorization: Bearer <access_token>" \
-H "Content-Type: application/json" \
-d '{
"action": "add_quicksell",
"api_key": "qs_live_abc123xyz",
"catalogue_url": "https://quicksell.co/s/mystore",
"length": 20,
"breadth": 15,
"height": 10,
"weight": 0.8
}'
{
"status": "success",
"message": "QuickSell connected successfully.",
"data": {
"id": 7,
"platform": "quicksell"
}
}
409 Conflict — DUPLICATE: This API key is already connected.
422 Unprocessable Entity: Missing api_key or invalid dimensions.
delete_channelstatus = 'delete') if the column exists, otherwise hard delete.| Parameter | Type | Required | Description |
|---|---|---|---|
action | string | Yes | Must be "delete_channel" |
channel_id | integer | Yes | The id of the channel from the list response |
platform | string | Yes | shopify, woocommerce, or quicksell |
curl -X POST "https://api4.shiplee.in/api/channels" \
-H "Authorization: Bearer <access_token>" \
-H "Content-Type: application/json" \
-d '{
"action": "delete_channel",
"channel_id": 7,
"platform": "quicksell"
}'
{
"status": "success",
"message": "Channel deleted successfully."
}
404 Not Found: Channel not found or doesn't belong to the seller.
422 Unprocessable Entity: Missing fields or invalid platform.
Returns the seller's COD remittance summary, all grouped remittance rows, available plans, current plan, and COD→Wallet eligibility status.
GET/api/cod_remittance
curl -X GET "https://api4.shiplee.in/api/cod_remittance" \ -H "Authorization: Bearer <access_token>"
{
"status": "success",
"data": {
"summary": {
"remitted_till_date": 45230.00,
"total_pending": 8750.00,
"total_adjustment": 120.00,
"total_cancelled": 300.00,
"last_remittance_date": "2026-03-01"
},
"current_plan": { "id": 4, "name": "Standard D+7" },
"plans": [
{ "id": 3, "plan_name": "Express D+3", "tat_days": 3, "fee_percentage": 1.5, "is_current": false },
{ "id": 4, "plan_name": "Standard D+7", "tat_days": 7, "fee_percentage": 0.5, "is_current": true }
],
"wallet_eligible": true,
"open_disputes": 0,
"remittances": [
{
"remittance_ids": "201,202",
"awbs": "AWB001,AWB002",
"total_cod_amount": 3500.00,
"total_net_remittance": 3482.50,
"total_base_charge": 15.00,
"total_gst_component": 2.50,
"remittance_status": "pending",
"remittance_date": "2026-03-18",
"tat_days": 7,
"fee_percentage": 0.5,
"utr_number": null,
"wallet_convertible": true,
"days_until_eligible": null
}
]
}
}
true only when: status is pending, open_disputes === 0, and remittance_date ≤ today. Use this field to decide whether to show the COD→Wallet button per row.POST/api/cod_remittance
| Parameter | Type | Required | Description |
|---|---|---|---|
action | string | Yes | Must be "activate_plan" |
plan_id | integer | Yes | ID of the plan to activate (from the plans array) |
curl -X POST "https://api4.shiplee.in/api/cod_remittance" \
-H "Authorization: Bearer <access_token>" \
-H "Content-Type: application/json" \
-d '{ "action": "activate_plan", "plan_id": 3 }'
{ "status": "success", "message": "Remittance plan activated successfully." }
404 Not Found: Plan not found or inactive.
422 Unprocessable Entity: Missing plan_id.
Converts pending COD remittances directly to the seller's main shipping wallet. Runs as a fully atomic 5-step transaction — all or nothing.
POST/api/cod_to_wallet
| Key | Value | Description |
|---|---|---|
Authorization | Bearer <access_token> | JWT token from Login API |
Content-Type | application/json | Request body JSON format |
| Parameter | Type | Required | Description |
|---|---|---|---|
remittance_ids | string or integer[] | Yes | Comma-separated string or array of cod_remittance.id values. Max 100. |
curl -X POST "https://api4.shiplee.in/api/cod_to_wallet" \
-H "Authorization: Bearer <access_token>" \
-H "Content-Type: application/json" \
-d '{ "remittance_ids": [201, 202] }'
{
"status": "success",
"message": "₹3,500.00 credited to your wallet from 2 remittance(s).",
"total_credited": 3500.00,
"new_balance": 8500.00,
"rows_converted": 2,
"recharge_log_id": 9142,
"utr_reference": "WALLET-CREDIT-9142"
}
FOR UPDATE and validated (seller ownership + pending status + date ≤ today).userwallet.balance credited atomically.RechargeLogs.completed, utr_number set to WALLET-CREDIT-{recharge_log_id}.cod_wallet_conversions.403 Forbidden — DISPUTES_OPEN: Seller has open weight disputes that must be resolved first.
409 Conflict: A row's status changed between validation and update (race condition) — transaction rolled back, retry.
422 Unprocessable Entity: Missing IDs, more than 100 IDs, or rows not eligible (future date or wrong status).
Manages the COD Order Confirmation Call Service — trained agents call COD customers to confirm orders and verify delivery addresses before dispatch.
GET/api/cod_confirmation
| Parameter | Type | Required | Description |
|---|---|---|---|
status | string | No | Filter orders by call status (see table below). queued returns orders with no call record yet. |
limit | integer | No | Max orders to return. Default 200, max 500. |
| Value | Meaning |
|---|---|
queued | COD order placed, not yet called |
pending | In the calling queue |
called | Call attempted |
connected | Call connected |
not_reachable | Customer unreachable after 3 attempts |
callback_requested | Customer requested a callback |
confirmed | Order confirmed by customer — ₹5 charged |
address_updated | Address corrected during call — ₹5 charged |
cancelled | Customer cancelled the order on call |
curl -X GET "https://api4.shiplee.in/api/cod_confirmation?status=confirmed&limit=50" \ -H "Authorization: Bearer <access_token>"
{
"status": "success",
"data": {
"service_enabled": true,
"activated_since": "2026-01-15 10:30:00",
"stats": {
"total_cod": 342,
"calls_done": 280,
"confirmed": 241,
"cancelled": 18,
"address_updated": 21,
"pending": 62,
"total_charged": 1310.00,
"total_confirmed_value": 485200.00
},
"orders": [
{
"awb": "ORD-10042",
"customer_name": "Rahul Sharma",
"customer_phone": "9876543210",
"address": "12 MG Road, Bengaluru, Karnataka, 560001",
"order_value": 1299.00,
"order_date": "2026-03-17",
"call_status": "confirmed",
"call_outcome": null,
"agent_name": "Priya",
"call_time": "2026-03-17 14:22:00",
"charge_amount": 5.00,
"charged": true,
"address_confirmed": true,
"address_remarks": null,
"call_remarks": "Customer confirmed order and address"
}
],
"total_orders": 1
}
}
{
"status": "success",
"data": {
"service_enabled": false,
"activated_since": null,
"stats": null,
"orders": []
}
}
POST/api/cod_confirmation
| Parameter | Type | Required | Description |
|---|---|---|---|
action | string | Yes | "enable" or "disable" |
curl -X POST "https://api4.shiplee.in/api/cod_confirmation" \
-H "Authorization: Bearer <access_token>" \
-H "Content-Type: application/json" \
-d '{ "action": "enable" }'
{
"status": "success",
"message": "COD Confirmation Call service enabled. New COD orders will be queued for calling within a few hours.",
"service_enabled": true
}
INSERT ... ON DUPLICATE KEY UPDATE — activated_at is set only on first activation and preserved on re-enables.422 Unprocessable Entity: action is missing or not "enable"/"disable".
Enables or disables the COD Confirmation Call Service. When active, the cron automatically picks up new COD orders and queues confirmation calls within 24 hours.
GET/api/cod_confirmation_service
curl -X GET "https://api4.shiplee.in/api/cod_confirmation_service" \ -H "Authorization: Bearer <access_token>"
{
"status": "success",
"data": {
"is_active": true,
"activated_at": "2026-03-10 14:22:00",
"updated_at": "2026-03-10 14:22:00"
}
}
POST/api/cod_confirmation_service
| Parameter | Type | Required | Description |
|---|---|---|---|
action | string | Yes | "enable" or "disable" |
// Enable
curl -X POST "https://api4.shiplee.in/api/cod_confirmation_service" \
-H "Authorization: Bearer <access_token>" \
-H "Content-Type: application/json" \
-d '{ "action": "enable" }'
// Disable
curl -X POST "https://api4.shiplee.in/api/cod_confirmation_service" \
-H "Authorization: Bearer <access_token>" \
-H "Content-Type: application/json" \
-d '{ "action": "disable" }'
// Enabled
{
"status": "success",
"message": "COD Confirmation Call Service activated. New COD orders from today will be called within 24 hours.",
"is_active": true
}
// Disabled
{
"status": "success",
"message": "COD Confirmation Call Service disabled. Orders already in queue will still be processed.",
"is_active": false
}
enable when already enabled (or disable when already disabled) returns 200 OK with the current state — no error, idempotent.
422 Unprocessable Entity: Invalid action value.
Manages per-seller courier enable/disable toggles and booking priority mode (Cheapest / Fastest / Custom drag order). Services are dynamically loaded from the seller's assigned shipping plan.
GET/api/courier_preferences
curl -X GET "https://api4.shiplee.in/api/courier_preferences" \ -H "Authorization: Bearer <access_token>"
{
"status": "success",
"no_plan": false,
"data": {
"mode": "custom",
"custom_order": ["delhivery_2kg_surface", "xpressbees_air"],
"groups": [
{
"group_key": "delhivery",
"group_label": "Delhivery",
"logo": "https://cdn.shiplee.ai/fet.png",
"services": [
{
"toggle_key": "delhivery_2kg_surface",
"label": "Delhivery 2kg Surface",
"logo": "https://cdn.shiplee.ai/fet.png",
"enabled": true
}
]
},
{
"group_key": "xpressbees",
"group_label": "Xpressbees",
"logo": "https://old-xpressbees.xbees.in/images/logo.png",
"services": [
{
"toggle_key": "xpressbees_air",
"label": "Xpressbees Air",
"logo": "https://old-xpressbees.xbees.in/images/logo.png",
"enabled": true
}
]
}
]
}
}
no_plan: true is returned with data: null.POST/api/courier_preferences
| Key | Value | Description |
|---|---|---|
Authorization | Bearer <access_token> | JWT token from Login API |
Content-Type | application/json | Request body JSON format |
| Parameter | Type | Required | Description |
|---|---|---|---|
mode | string | Yes | "cheapest", "fastest", or "custom" |
services | object | Yes | Map of toggle_key → boolean. Keys not in seller's plan are silently ignored. |
custom_order | string[] | No | Ordered array of toggle_key values. Only used when mode = "custom". Only enabled keys are stored. |
curl -X POST "https://api4.shiplee.in/api/courier_preferences" \
-H "Authorization: Bearer <access_token>" \
-H "Content-Type: application/json" \
-d '{
"mode": "custom",
"services": {
"delhivery_2kg_surface": true,
"xpressbees_air": true,
"ekart_standard": false
},
"custom_order": ["delhivery_2kg_surface", "xpressbees_air"]
}'
{
"status": "success",
"message": "Courier preferences saved successfully.",
"data": {
"mode": "custom",
"custom_order": ["delhivery_2kg_surface", "xpressbees_air"]
}
}
| Mode | Behaviour |
|---|---|
cheapest | Always picks the lowest-cost serviceable courier for each order |
fastest | Prefers air services — Blue Dart Apex first, then Air Xpressbees |
custom | Uses the custom_order array. First serviceable courier in the list is booked |
422 Unprocessable Entity: services is not an object, or seller has no plan assigned.
Fetch or update a new status order. Once an order is booked/manifested it can no longer be edited.
GET/api/edit_order?order_id=123
| Parameter | Type | Required | Description |
|---|---|---|---|
order_id | integer | Yes | customer_info.id |
curl -X GET "https://api4.shiplee.in/api/edit_order?order_id=1042" \ -H "Authorization: Bearer <access_token>"
{
"status": "success",
"data": {
"order": {
"id": 1042,
"order_id": "ORD-001",
"pincode": "110001",
"city": "New Delhi",
"state": "Delhi",
"name": "Rahul Sharma",
"mobile": "9876543210",
"address1": "12 MG Road",
"payment_type": "cod",
"same_billing_address": true,
"total_price": 1299.00
},
"products": [
{ "product_name": "Shoes", "quantity": 1, "product_price": 1299.00, "sku": "SKU001" }
],
"parcels": [
{ "length": 30, "breadth": 20, "height": 15, "physical_weight": 0.5, "charge_weight_grams": 500 }
]
}
}
POST/api/edit_order
| Parameter | Type | Required | Description |
|---|---|---|---|
order_id | integer | Yes | The order to update |
pincode | string | Yes | Delivery pincode |
city | string | Yes | Delivery city |
state | string | Yes | Delivery state |
name | string | Yes | Customer name |
mobile | string | Yes | Customer mobile |
address1 | string | Yes | Address line 1 |
same_billing_address | boolean | No | If true, billing fields are copied from shipping |
payment_type | string | No | cod or prd (default: cod) |
pickup_type | string | No | fwd or rvrs (default: fwd) |
products | object[] | Yes | Array of { product_name, quantity, product_price, sku } |
parcels | object[] | Yes | Array of { length, breadth, height, physical_weight } in cm/kg. Volumetric weight is calculated server-side. |
curl -X POST "https://api4.shiplee.in/api/edit_order" \
-H "Authorization: Bearer <access_token>" \
-H "Content-Type: application/json" \
-d '{
"order_id": 1042,
"pincode": "110001",
"city": "New Delhi",
"state": "Delhi",
"name": "Rahul Sharma",
"mobile": "9876543210",
"address1": "12 MG Road",
"payment_type": "cod",
"same_billing_address": true,
"products": [
{ "product_name": "Shoes", "quantity": 1, "product_price": 1299, "sku": "SKU001" }
],
"parcels": [
{ "length": 30, "breadth": 20, "height": 15, "physical_weight": 0.5 }
]
}'
{
"status": "success",
"message": "Order updated successfully.",
"data": {
"order_id": 1042,
"total_price": 1299.00
}
}
404 Not Found: Order not found, doesn't belong to seller, or is not in new status.
422 Unprocessable Entity: Missing required fields, no products, or no parcels.
Returns wallet transaction history from RechargeLogs. Supports date-range filtering for the full list, or AWB-specific lookup for a single shipment's charges/refunds.
GET/api/wallet_transactions
| Parameter | Type | Required | Description |
|---|---|---|---|
start_date | string | No | YYYY-MM-DD. Defaults to 90 days ago. |
end_date | string | No | YYYY-MM-DD. Defaults to tomorrow. |
awb | string | No | AWB number — returns all transactions for this shipment only. When present, date filters are ignored. |
curl -X GET "https://api4.shiplee.in/api/wallet_transactions?start_date=2026-03-01&end_date=2026-03-18" \ -H "Authorization: Bearer <access_token>"
curl -X GET "https://api4.shiplee.in/api/wallet_transactions?awb=143900012345" \ -H "Authorization: Bearer <access_token>"
{
"status": "success",
"filter": { "start": "2026-03-01", "end": "2026-03-18" },
"total": 2,
"data": [
{
"transaction_id": 9142,
"date": "2026-03-15 14:22:00",
"awb_number": "143900012345",
"credit": 0.00,
"debit": 162.00,
"closing_balance": 4838.00,
"description": "Shipping charges for AWB: 143900012345"
},
{
"transaction_id": 9100,
"date": "2026-03-10 09:00:00",
"awb_number": null,
"credit": 5000.00,
"debit": 0.00,
"closing_balance": 5000.00,
"description": "Wallet recharge via PhonePe"
}
]
}
"awb" instead of "filter". All other fields are identical.
Fetch weight disputes raised by Shiplee against the seller's shipments, and submit seller responses with evidence images.
status = 'DISPUTE' are automatically closed (auto_accepted = true). This mirrors the original page-load behaviour.GET/api/weight_disputes?start_date=2026-03-01&end_date=2026-03-18
| Parameter | Type | Required | Description |
|---|---|---|---|
start_date | string | No | YYYY-MM-DD. Defaults to 7 days ago. |
end_date | string | No | YYYY-MM-DD. Defaults to today. |
{
"status": "success",
"filter": { "start": "2026-03-01", "end": "2026-03-18" },
"total": 1,
"disputes": [
{
"id": 42,
"order_id": "ORD-001",
"awb_number": "143900012345",
"carrier": "Delhivery",
"chargeable_booked_weight": 500,
"chargeable_applied_weight": 1000,
"difference": 500,
"upcoming_charges": 41.00,
"status": "DISPUTE",
"image_url": "https://...",
"seller_response": null,
"new_weight": null,
"auto_accepted": false,
"created_at": "2026-03-15 10:00:00"
}
]
}
POST/api/weight_disputes
| Field | Type | Required | Description |
|---|---|---|---|
dispute_id | integer | Yes | ID of the open dispute to respond to |
new_weight | float | Yes | Seller's actual package weight in grams |
response | string | Yes | Seller's written explanation |
weighing_scale_image | file | Yes | Package on weighing scale |
length_image | file | Yes | Length measurement |
breadth_image | file | Yes | Breadth measurement |
height_image | file | Yes | Height measurement |
curl -X POST "https://api4.shiplee.in/api/weight_disputes" \ -H "Authorization: Bearer <access_token>" \ -F "dispute_id=42" \ -F "new_weight=480" \ -F "response=Package weighs 480g, not 1000g as claimed." \ -F "weighing_scale_image=@/path/to/scale.jpg" \ -F "length_image=@/path/to/length.jpg" \ -F "breadth_image=@/path/to/breadth.jpg" \ -F "height_image=@/path/to/height.jpg"
{
"status": "success",
"message": "Response and ticket submitted successfully.",
"ticket_id": 88
}
404 Not Found: Dispute not found, doesn't belong to seller, or already responded to.
422 Unprocessable Entity: Missing required fields or one or more image uploads failed.
Returns the seller's submitted dispute tickets with their images, seller response, resolution notes, and current status. Supports date range, status, order ID, and AWB filters with server-side pagination.
GET/api/dispute_tickets
| Parameter | Type | Required | Description |
|---|---|---|---|
start_date | string | No | YYYY-MM-DD. Defaults to 14 days ago. |
end_date | string | No | YYYY-MM-DD. Defaults to today. |
status | string | No | OPEN, IN_REVIEW, RESOLVED, or CLOSED |
order_id | string | No | Partial match |
awb_number | string | No | Partial match |
page | integer | No | Default 1 |
page_size | integer | No | Default 10, max 100 |
curl -X GET "https://api4.shiplee.in/api/dispute_tickets?status=OPEN&page=1&page_size=10" \ -H "Authorization: Bearer <access_token>"
{
"status": "success",
"filter": { "start": "2026-03-04", "end": "2026-03-18", "status": "OPEN" },
"pagination": { "page": 1, "page_size": 10, "total": 3, "total_pages": 1 },
"tickets": [
{
"id": 88,
"dispute_id": 42,
"awb_number": "143900012345",
"order_id": "ORD-001",
"booked_weight_g": 500,
"applied_weight_g": 1000,
"new_weight_g": 480,
"status": "OPEN",
"seller_response": "Package weighs 480g...",
"resolution_notes": null,
"dispute_image": "https://...",
"weighing_scale_image": "https://...",
"resolved_at": null,
"created_at": "2026-03-15 14:00:00"
}
]
}
Generates and streams a TCPDF manifest PDF for a set of manifested orders, grouped by courier. Each courier gets its own page. Returns application/pdf on success and application/json on error.
GET/api/manifest?order_ids=1,2,3&warehouse_id=5
| Parameter | Type | Required | Description |
|---|---|---|---|
order_ids | string | Yes | Comma-separated customer_info.id values. Orders must have status = 'manifested' and belong to the seller. Max 500. |
warehouse_id | integer | No | Warehouse to show as pickup address. If omitted, falls back to the first order's warehouse. |
curl -X GET "https://api4.shiplee.in/api/manifest?order_ids=1042,1043,1044&warehouse_id=3" \ -H "Authorization: Bearer <access_token>" \ --output Shiplee_Manifest.pdf
200 OK — Content-Type: application/pdf with Content-Disposition: attachment; filename="Shiplee_Manifest_YYYYMMDD_HHMMSS.pdf"
_TS timestamp suffixes before being printed.
404 Not Found: No manifested orders found for the given IDs (wrong status, wrong seller, or invalid IDs).
422 Unprocessable Entity: order_ids missing, empty, or more than 500 IDs.
Returns all new status orders for the seller with date range and optional product name filter. Used to populate the All Orders table.
POST/api/get_orders
| Field | Type | Required | Description |
|---|---|---|---|
start_date | string | No | YYYY-MM-DD. Defaults to 90 days ago. |
end_date | string | No | YYYY-MM-DD. Defaults to tomorrow. |
product_name | string | No | Partial match on product name. |
curl -X POST "https://api4.shiplee.in/api/get_orders" \
-H "Authorization: Bearer <access_token>" \
-H "Content-Type: application/json" \
-d '{ "start_date": "2026-03-01", "end_date": "2026-03-21" }'
{
"success": true,
"count": 2,
"data": [
{
"id": 1042,
"customer_order_id": "ORD-001",
"name": "Rahul Sharma",
"mobile1": "9876543210",
"pincode": "110001",
"ptype": "cod",
"total_price": 1299.00,
"status": "new",
"order_date": "2026-03-15 10:00:00",
"whatsapp_status": "pending",
"wa_confirm_status": "",
"type": "quick",
"product_names": "Shoes",
"chargeweightgram": 500,
"length": 30, "breadth": 20, "height": 15,
"rto_score": 42,
"rto_score_reasons": "New address, first order"
}
]
}
Searches booked/manifested orders by AWB number, customer name, or mobile number. Powers the topbar search across all pages. Returns a maximum of 20 results.
POST/api/search_orders
| Field | Type | Required | Description |
|---|---|---|---|
search | string | Yes | Minimum 3 characters. Matched against AWB, name, and mobile. |
curl -X POST "https://api4.shiplee.in/api/search_orders" \
-H "Authorization: Bearer <access_token>" \
-H "Content-Type: application/json" \
-d '{ "search": "98765" }'
{
"orders": [
{
"customer_info_id": 1042,
"awb_number": "143900012345",
"customer_name": "Rahul Sharma",
"customer_mobile": "9876543210",
"status": "manifested",
"order_date": "2026-03-15 10:00:00"
}
]
}
{ "orders": [] } (not an error) if the query is under 3 characters or no results are found.Updates parcel dimensions and recalculates volumetric and charge weight for multiple orders in one call. Only affects orders with status = 'new' that belong to the seller. Leave any field null/omitted to keep the existing value.
POST/api/bulk_update_dimensions
| Field | Type | Required | Description |
|---|---|---|---|
orderIds | integer[] | Yes | customer_info.id values. Max 500. |
length | float | No* | Length in cm |
breadth | float | No* | Breadth in cm |
height | float | No* | Height in cm |
weight | float | No* | Physical weight in grams |
* At least one of these fields must be provided.
curl -X POST "https://api4.shiplee.in/api/bulk_update_dimensions" \
-H "Authorization: Bearer <access_token>" \
-H "Content-Type: application/json" \
-d '{
"orderIds": [1042, 1043, 1044],
"length": 30,
"breadth": 20,
"height": 15,
"weight": 500
}'
{
"success": true,
"message": "3 order(s) updated successfully.",
"updated": 3,
"failed": 0,
"errors": [],
"skipped_ids": []
}
max(physical_weight, volumetric_weight) where volumetric = (L × B × H) / 5000. Orders not in new status or belonging to a different seller are silently skipped and returned in skipped_ids.
404 Not Found: No eligible orders found for the given IDs.
422 Unprocessable Entity: No orderIds provided, more than 500 IDs, or no dimension fields provided.
Creates a new quick (manual) order with full customer details, one or more products, and parcel dimensions. Insertions to customer_info, products_q, and parcels are all committed atomically.
POST/api/create_order
| Key | Value | Description |
|---|---|---|
Authorization | Bearer <access_token> | JWT token from Login API |
Content-Type | application/json | Request body JSON format |
| Parameter | Type | Required | Description |
|---|---|---|---|
pincode | string | Yes | 6-digit delivery pincode |
city | string | Yes | Delivery city |
state | string | Yes | Delivery state |
name | string | Yes | Customer name |
mobile | string | Yes | 10-digit mobile (starts 6–9) |
address1 | string | Yes | Address line 1 (max 100 chars) |
address2 | string | No | Address line 2 (max 110 chars) |
email | string | No | Customer email. Defaults to [email protected] |
order_id | string | Yes | Seller's own reference ID (e.g. "ORD-001") |
pickup_type | string | No | fwd (default) or rvrs |
payment_type | string | No | cod (default) or prd |
same_billing_address | boolean | No | If true (default), billing fields are copied from shipping |
reseller_name | string | No | Optional reseller name |
gstin_number | string | No | Optional GSTIN |
products | object[] | Yes | At least one product (see below) |
parcels | object[] | Yes | At least one parcel (see below) |
| Field | Type | Required | Description |
|---|---|---|---|
product_name | string | Yes | Product name |
quantity | integer | Yes | Quantity |
product_price | float | Yes | Unit price in INR |
sku | string | No | SKU code. Auto-generated if blank. |
gst_percentage | float | No | GST % (default 0) |
hsn_code | string | No | HSN code |
| Field | Type | Required | Description |
|---|---|---|---|
length | float | Yes | Length in cm |
breadth | float | Yes | Breadth in cm |
height | float | Yes | Height in cm |
physical_weight | float | Yes | Physical weight in kg. Volumetric weight is calculated server-side. |
curl -X POST "https://api4.shiplee.in/api/create_order" \
-H "Authorization: Bearer <access_token>" \
-H "Content-Type: application/json" \
-d '{
"pincode": "110001",
"city": "New Delhi",
"state": "Delhi",
"name": "Rahul Sharma",
"mobile": "9876543210",
"address1": "123 Main Street",
"order_id": "ORD-TEST-001",
"pickup_type": "fwd",
"payment_type": "cod",
"same_billing_address": true,
"products": [
{ "product_name": "Shoes", "quantity": 1, "product_price": 1299 }
],
"parcels": [
{ "length": 30, "breadth": 20, "height": 15, "physical_weight": 0.5 }
]
}'
{
"success": true,
"message": "Order created successfully.",
"order_id": 1085,
"data": {
"id": 1085,
"order_id": "ORD-TEST-001",
"total_price": 1299.00,
"status": "new",
"type": "quick"
}
}
customer_info with type = 'quick', status = 'new'.products_q (with GST calculation).parcels (volumetric weight = L×B×H/5000, charge weight = max(physical, volumetric)).order_id (integer) is the customer_info.id — this is what you pass to book_shipment.422 Unprocessable Entity: Missing required fields, invalid pincode/mobile format, invalid pickup_type/payment_type, no products, or no parcels.
500 Internal Server Error: DB failure — transaction rolled back, nothing saved.