Table of contents
ShaQ Express Public API Documentation
Welcome to the ShaQ Express Public API. This documentation provides partners and developers with the endpoints needed to seamlessly manage packages, shipments, and receive tracking updates.
API Environment
- Version:
1.0 - Development Base URL:
https://test-partner.shaqexpress.com/api/v1
Standard Headers
All requests made to the API should contain the following standard HTTP headers:
| Header | Type | Description |
|---|---|---|
Content-Type |
application/json |
Requires JSON requested bodies |
Accept |
application/json |
Expects JSON response bodies |
(Note: Protected endpoints will also require an Authorization: Bearer <token> header, which you acquire from logging in).
Package Statuses
Our system uses various statuses to track the lifecycle of a package. Below is the comprehensive list of statuses you may receive:
📦 Pending & Collection
pending: Package is yet to be received from Partnerreceived: Package has been received from Partnerready_for_pickup: Package is ready for customer pickup
🚚 Transit & Dispatch
shipped: Package has been shipped by Partnerassigned: Package has been assigned to a Riderin_transit: Package is in transit to closest warehousedispatched: Package is en-route to be delivered
✅ Delivery Outcomes
confirmed: Customer has been called and delivery confirmeddelivered: Package was successfully delivered to customer
⚠️ Issues & Exceptions
not_delivered: Attempted delivery but couldn't complete itrescheduled: Package delivery rescheduled for new delivery attemptcustomer_hold: Delivery is on hold based on customer requestcustomer_unreachable: Delivery is on hold because customer is unreachablesuspected_scam: Delivery is on hold due to suspected scam
🔙 Returns
return_in_progress: Package is being prepared to be sent back to Partnerreturned_to_sender: Package has been sent back to Partnerreturn_home: Package is being returned to ShaQ Express central warehouse after multiple unsuccessful delivery to prepare for being returned to partner
API Endpoints
Login
Get authentication token for subsequent requests.
As a security measure the token is valid for 7 days after which a new one will have to be generated
using the /auth/login route.
Request
| Parameter | Type | Description |
|---|---|---|
identifier |
string |
required. |
secret |
string |
required. |
Response
200
{
"message": "Request successful",
"data": {
"token": "UtXdU9HODhjdmtTNkRtUWNsVlM4OWI1d2Z2TXVIanlkRk"
}
}
Get Packages
Get all packages
Headers
| Parameter | Type | Description |
|---|---|---|
Authorization |
bearer |
Required. |
Response
200
{
"message": "Request successful",
"data": {
"list": [
{
"partnerRef": "FGVHKJ567",
"trackingNumber": "20250410X51DIQ",
"customerName": "Kwaku Ananse",
"customerPhone1": "+233244100200",
"customerPhone2": null,
"sourceCountry": "Ghana",
"sourceAddressLine1": "Accra Spintex",
"sourceAddressLine2": null,
"destinationCountry": "Ghana",
"destinationRegion": "Greater Accra",
"destinationCity": "Accra",
"destinationAddressLine1": "UPSA Hall, Room 3",
"destinationAddressLine2": null,
"destinationPostalCode": null,
"length": 0,
"height": 5,
"weight": 1.2,
"description": "iPhone 16 pro max black edge silver back casing",
"labelUrl": "https://debtufr1vwh35.cloudfront.net/labels_test/label/8B73CE6D.png",
"units": 1,
"type": "box",
"value": "300.00",
"amountToCollect": "300.00",
"paymentCollector": "shaq",
"handling": "normal",
"specialInstructions": null,
"status": "delivered",
"statusDescription": "Package was successfully delivered to customer",
"latitude": null,
"longitude": null,
"proofPhotoUrl": "https://debtufr1vwh35.cloudfront.net/labels_test/label/8B73CE6D.png",
"dateCreated": "2025-04-10 11:15",
"items": [
{
"name" : "iPhone 6",
"quantity" : 1,
},
{
"name" : "iPhone 14 Pro",
"quantity" : 2,
}
]
},
{
"partnerRef": "FGVHKJ567",
"trackingNumber": "20250410X51DIQ",
"customerName": "Kwaku Ananse",
"customerPhone1": "+233244100200",
"customerPhone2": null,
"sourceCountry": "Ghana",
"sourceAddressLine1": "Accra Spintex",
"sourceAddressLine2": null,
"destinationCountry": "Ghana",
"destinationRegion": "Greater Accra",
"destinationCity": "Accra",
"destinationAddressLine1": "UPSA Hall, Room 3",
"destinationAddressLine2": null,
"destinationPostalCode": null,
"length": 0,
"height": 5,
"weight": 1.2,
"description": "iPhone 16 pro max black edge silver back casing",
"labelUrl": "https://debtufr1vwh35.cloudfront.net/labels_test/label/8B73CE6D.png",
"units": 1,
"type": "box",
"value": "300.00",
"amountToCollect": "300.00",
"paymentCollector": "shaq",
"handling": "normal",
"specialInstructions": null,
"status": "pending",
"statusDescription": "Package is yet to be received from Partner.",
"latitude": null,
"longitude": null,
"proofPhotoUrl": null,
"dateCreated": "2025-04-10 11:15",
"items": [
{
"name" : "iPhone 6",
"quantity" : 1,
}
]
}
],
"meta": {
"total": 2,
"perPage": 15,
"currentPage": 1,
"lastPage": 1
}
}
}
Get single Package
Get package details
Headers
| Parameter | Type | Description |
|---|---|---|
Authorization |
bearer |
Required. |
Response
200
{
"message": "Request successful",
"data": {
"partnerRef": "FGVHKJ567",
"trackingNumber": "20250410X51DIQ",
"customerName": "Kwaku Ananse",
"customerPhone1": "+233244100200",
"customerPhone2": null,
"sourceCountry": "Ghana",
"sourceAddressLine1": "Accra Spintex",
"sourceAddressLine2": null,
"destinationCountry": "Ghana",
"destinationRegion": "Greater Accra",
"destinationCity": "Accra",
"destinationAddressLine1": "UPSA Hall, Room 3",
"destinationAddressLine2": null,
"destinationPostalCode": null,
"length": 0,
"height": 5,
"weight": 1.2,
"description": "iPhone 16 pro max black edge silver back casing",
"labelUrl": "https://debtufr1vwh35.cloudfront.net/labels_test/label/8B73CE6D.png",
"units": 1,
"type": "box",
"value": "300.00",
"amountToCollect": "300.00",
"paymentCollector": "shaq",
"handling": "normal",
"specialInstructions": null,
"status": "not_delivered",
"statusDescription": "Attempted delivery but couldn't complete it.",
"latitude": null,
"longitude": null,
"proofPhotoUrl": "https://debtufr1vwh35.cloudfront.net/labels_test/label/8B73CE6D.png",
"dateCreated": "2025-04-10 11:15",
"items": [
{
"name" : "iPhone 6",
"quantity" : 1,
},
{
"name" : "iPhone 14 Pro",
"quantity" : 2,
}
],
"replacementType": "end",
"previousOrderId": 411968,
"trackingHistory": [
{
"name": "not_delivered",
"description": "Attempted delivery but couldn't complete it.",
"date": "2025-07-16 09:00",
"comment": "Customer was unreachable upon arrival. Package rescheduled for 2nd delivery attempt."
},
{
"name": "dispatched",
"description": "Package is en-route to deliver.",
"date": "2025-07-15 15:45",
"comment": null
},
{
"name": "confirmed",
"description": "Customer has been called and delivery confirmed.",
"date": "2025-07-15 15:45",
"comment": null
},
{
"name": "received",
"description": "Package has been received from Partner.",
"date": "2025-07-15 15:38",
"comment": null
},
{
"name": "pending",
"description": "Package is yet to be received by Partner.",
"date": "2025-07-14 10:38",
"comment": null
}
]
}
}
Delete pending Package
Delete a package. Only pending packages can be deleted
Headers
| Parameter | Type | Description |
|---|---|---|
Authorization |
bearer |
Required. |
Response
200
Create Packages
Create multiple packages
Headers
| Parameter | Type | Description |
|---|---|---|
Authorization |
bearer |
Required. |
Request
| Parameter | Type | Description |
|---|---|---|
packages |
array |
required. |
packages.*.tracking_number |
string |
optional. |
packages.*.partner_ref |
string |
required. |
packages.*.customer_name |
string |
required. |
packages.*.customer_phone_1 |
string |
required. |
packages.*.customer_phone_2 |
string |
optional. |
packages.*.source_country_iso2 |
string |
required. |
packages.*.source_address_line_1 |
string |
required. |
packages.*.source_address_line_2 |
string |
optional. |
packages.*.destination_region |
string |
required if region_id is empty. |
packages.*.destination_city |
string |
required. |
packages.*.destination_address_line_1 |
string |
required. |
packages.*.destination_address_line_2 |
string |
optional. |
packages.*.destination_postal_code |
string |
optional. |
packages.*.length |
decimal |
optional. |
packages.*.height |
decimal |
optional. |
packages.*.weight |
decimal |
optional. |
packages.*.description |
string |
required. |
packages.*.units |
string |
required. |
packages.*.type |
string |
required . in parcel, box |
packages.*.handling |
string |
required . in normal, fragile |
packages.*.special_instructions |
string |
optional. |
packages.*.latitude |
decimal |
optional. |
packages.*.longitude |
decimal |
optional. |
packages.*.value |
decimal |
required. |
packages.*.amount_to_collect |
decimal |
optional. defaults to package value. |
packages.*.payment_collector |
string |
optional. in shaq, partner (Specify who collects money from customer. Defaults to agreed payment collector indicated in business agreement.) |
packages.*.items |
array |
required. |
packages.*.region_id |
integer |
required if destination_region is empty. |
packages.*.items |
array |
required. |
Response
200
Create Shipment
Create a shipment that represents the physical shipment of packages that will be sent to ShaQ Express.
Headers
| Parameter | Type | Description |
|---|---|---|
Authorization |
bearer |
Required. |
Request
| Parameter | Type | Description |
|---|---|---|
packages |
array |
required. |
packages.*.tracking_number |
string |
optional. |
packages.*.partner_ref |
string |
required. |
packages.*.customer_name |
string |
required. |
packages.*.customer_phone_1 |
string |
required. |
packages.*.customer_phone_2 |
string |
optional. |
packages.*.source_country_iso2 |
string |
required. |
packages.*.source_address_line_1 |
string |
required. |
packages.*.source_address_line_2 |
string |
optional. |
packages.*.destination_region |
string |
required if region_id is empty. |
packages.*.destination_city |
string |
required. |
packages.*.destination_address_line_1 |
string |
required. |
packages.*.destination_address_line_2 |
string |
optional. |
packages.*.destination_postal_code |
string |
optional. |
packages.*.length |
decimal |
optional. |
packages.*.height |
decimal |
optional. |
packages.*.weight |
decimal |
optional. |
packages.*.description |
string |
required. |
packages.*.units |
string |
required. |
packages.*.type |
string |
required . in parcel, box |
packages.*.handling |
string |
required . in normal, fragile |
packages.*.special_instructions |
string |
optional. |
packages.*.latitude |
decimal |
optional. |
packages.*.longitude |
decimal |
optional. |
packages.*.value |
decimal |
required. |
packages.*.amount_to_collect |
decimal |
optional. defaults to package value. |
packages.*.payment_collector |
string |
optional. in shaq, partner (Specify who collects money from customer. If not provided, it will default to agreed payment collector indicated in business agreement.) |
packages.*.items |
array |
required. |
packages.*.region_id |
integer |
required if destination_region is empty. |
Response
200
{
"message": "Request successful",
"data": {
"reference": "PAR-20260322053800",
"date": "2026-03-22 05:38",
"packages": [
{
"partnerRef": "qwertyui1a1aaqweqqaqx",
"trackingNumber": "C561819A",
"customerName": "Hema Mirpuri",
"customerPhone1": "+233244601165",
"customerPhone2": null,
"sourceAddressLine1": "Accra spintex basket junction",
"sourceAddressLine2": null,
"destinationRegion": "Greater Accra",
"destinationCity": "Tesano",
"destinationAddressLine1": "OPP total filling station Abeka tesano",
"destinationAddressLine2": null,
"destinationPostalCode": null,
"length": 0,
"height": 0,
"weight": 0,
"description": "Color Splicing Cotton Rope Storage Basket Toys Clothes Sundries Storage Basket AB-026 - Beige Yellow+White",
"units": 7,
"type": "parcel",
"handling": "normal",
"specialInstructions": null,
"status": "pending",
"statusDescription": "Package is yet to be received by Partner",
"latitude": null,
"longitude": null,
"value": "1468.00",
"amountToCollect": "1468.00",
"paymentCollector": "shaq",
"date": "2026-03-22 05:38",
"trackingUrl": "https://dev.tracking-website.pages.dev/packages/C561819A",
"items": [
{
"name": "14cm Alya Glass Cookie Holder - Transparent",
"quantity": 4
},
{
"name": "10.6 Color Splicing Cotton Rope Storage Basket Toys Clothes Sundries Storage Basket AB-026 - Beige Yellow+White",
"quantity": 1
},
{
"name": "6 Pieces Nossa 21cm Cake Plate Set",
"quantity": 1
}
]
}
]
}
}
Get single Shipment
Get package details
Headers
| Parameter | Type | Description |
|---|---|---|
Authorization |
bearer |
Required. |
Response
200
{
"message": "Request successful",
"data": {
"reference": "SAAM-20260322053800",
"date": "2026-03-22 05:38",
"packages": [
{
"partnerRef": "qwertyui1a1aaqweqqaqx",
"trackingNumber": "C561819A",
"customerName": "Kwaku Ananse",
"customerPhone1": "+233244100200",
"customerPhone2": null,
"sourceAddressLine1": "Accra spintex basket junction",
"sourceAddressLine2": null,
"destinationRegion": "Greater Accra",
"destinationCity": "Accra",
"destinationAddressLine1": "UPSA Hall, Room 3",
"destinationAddressLine2": null,
"destinationPostalCode": null,
"length": 0,
"height": 5,
"weight": 1.2,
"description": "iPhone 16 pro max black edge silver back casing",
"units": 1,
"type": "box",
"handling": "normal",
"specialInstructions": null,
"status": "pending",
"statusDescription": "Package is yet to be received by Partner",
"latitude": null,
"longitude": null,
"value": "1468.00",
"amountToCollect": "1468.00",
"paymentCollector": "shaq",
"date": "2026-03-22 05:38",
"trackingUrl": "https://dev.tracking-website.pages.dev/packages/C561819A",
"items": [
{
"name": "14cm Alya Glass Cookie Holder - Transparent",
"quantity": 4
},
{
"name": "10.6 Color Splicing Cotton Rope Storage Basket Toys Clothes Sundries Storage Basket AB-026 - Beige Yellow+White",
"quantity": 1
},
{
"name": "6 Pieces Nossa 21cm Cake Plate Set",
"quantity": 1
}
]
}
]
}
}
Update a Package
Update a specific package
Headers
| Parameter | Type | Description |
|---|---|---|
Authorization |
bearer |
Required. |
Request
| Parameter | Type | Description |
|---|---|---|
tracking_number |
string |
optional. |
customer_name |
string |
optional. |
customer_phone_1 |
string |
optional. |
customer_phone_2 |
string |
optional. |
source_country_iso2 |
string |
optional. |
source_address_line_1 |
string |
optional. |
source_address_line_2 |
string |
optional. |
destination_region |
string |
optional. |
destination_city |
string |
optional. |
destination_address_line_1 |
string |
optional. |
destination_address_line_2 |
string |
optional. |
destination_postal_code |
string |
optional. |
length |
decimal |
optional. |
height |
decimal |
optional. |
weight |
decimal |
optional. |
description |
string |
optional. |
units |
string |
optional. |
type |
string |
optional . in parcel, box |
handling |
string |
optional . in normal, fragile |
special_instructions |
string |
optional. |
latitude |
decimal |
optional. |
longitude |
decimal |
optional. |
value |
decimal |
optional. |
amount_to_collect |
decimal |
optional. |
items |
array |
optional. |
Response
200
{
"message": "Request successful",
"data": {
"partnerRef": "FGVHKJ567",
"trackingNumber": "20250410X51DIQ",
"customerName": "Kwaku Ananse",
"customerPhone1": "+233244100200",
"customerPhone2": null,
"sourceCountry": "Ghana",
"sourceAddressLine1": "Accra Spintex",
"sourceAddressLine2": null,
"destinationCountry": "Ghana",
"destinationRegion": "Greater Accra",
"destinationCity": "Accra",
"destinationAddressLine1": "UPSA Hall, Room 3",
"destinationAddressLine2": null,
"destinationPostalCode": null,
"length": 0,
"height": 5,
"weight": 1.2,
"description": "iPhone 16 pro max black edge silver back casing",
"labelUrl": "https://debtufr1vwh35.cloudfront.net/labels_test/label/8B73CE6D.png",
"units": 1,
"type": "box",
"value": "300.00",
"amountToCollect": "300.00",
"paymentCollector": "shaq",
"handling": "normal",
"specialInstructions": null,
"status": "not_delivered",
"statusDescription": "Attempted delivery but couldn't complete it.",
"latitude": null,
"longitude": null,
"proofPhotoUrl": "https://debtufr1vwh35.cloudfront.net/labels_test/label/8B73CE6D.png",
"dateCreated": "2025-04-10 11:15",
"items": [
{
"name" : "iPhone 6",
"quantity" : 1,
},
{
"name" : "iPhone 14 Pro",
"quantity" : 2,
}
],
"trackingHistory": [
{
"name": "not_delivered",
"description": "Attempted delivery but couldn't complete it.",
"date": "2025-07-16 09:00",
"comment": "Customer was unreachable upon arrival. Package rescheduled for 2nd delivery attempt."
},
{
"name": "dispatched",
"description": "Package is en-route to deliver.",
"date": "2025-07-15 15:45",
"comment": null
},
]
}
}
Track Package
Get tracking statuses of a specific package
Headers
| Parameter | Type | Description |
|---|---|---|
Authorization |
bearer |
Required. |
Response
200
{
"message": "Package tracking",
"data": {
"partnerRef": "FGVHKJ567",
"trackingNumber": "20250410X51DIQ",
"description": "Kitchen cabinet",
"status": "shipped",
"statusDescription": "Package has been shipped by Partner.",
"items": [
{
"name" : "iPhone 6",
"quantity" : 1,
},
{
"name" : "iPhone 14 Pro",
"quantity" : 2,
}
],
"tracking": [
{
"status": "shipped",
"description": "Package has been shipped by Partner.",
"date": "2025-04-10 15:17"
},
{
"status": "pending",
"description": "Package is yet to be shipped by Partner.",
"date": "2025-04-10 15:16"
},
{
"status": "shipped",
"description": "Package has been shipped by Partner.",
"date": "2025-04-10 15:15"
},
{
"status": "shipped",
"description": "Package has been shipped by Partner.",
"date": "2025-04-10 15:15"
},
{
"status": "pending",
"description": "Package is yet to be shipped by Partner.",
"date": "2025-04-10 15:14"
}
]
}
}
Get Regions
Get all allowable regions
Headers
| Parameter | Type | Description |
|---|---|---|
Authorization |
bearer |
Required. |
Response
200
{
"message": "Request successful",
"data": [
{
"id": 16,
"name": "Western North"
},
{
"id": 15,
"name": "Ashanti"
},
]
}
Receive Package Status Updates Through Webhook
We will send package status updates to your webhook
Request
| Parameter | Type | Description |
|---|---|---|
partner_ref |
string |
|
tracking_number |
string |
|
status |
string |
|
description |
string |
|
comment |
string |
|
date |
string |
format : yyyy-mm-dd HH:mm:ss (UTC) |
Response
200