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.
| Info | Value |
|---|---|
| version | 1.0 |
| Dev 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 Partner into main regional hubwarehouse_received: Package has been received at a regional warehouse for onward deliverycollected: Package has been collected from Partner by ShaQ Expressready_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_picked: Package has been picked up from the customer for return to partnerreturn_in_progress: Package is being prepared to be sent back to Partnerreturned_to_sender: Package has been sent back to Partnerreturn_to_central: 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",
"eta": "2026-04-20 - 2026-04-22",
"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",
"eta": "2026-04-20 - 2026-04-22",
"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",
"eta": "2026-04-20 - 2026-04-22",
"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
},
{
"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
Cancel Order
Cancel a fulfillment order.
Headers
| Parameter | Type | Description |
|---|---|---|
Authorization |
bearer |
Required. |
Response
200
400
404
Create Single Package
Create a single package
Headers
| Parameter | Type | Description |
|---|---|---|
Authorization |
bearer |
Required. |
Request
| Parameter | Type | Description |
|---|---|---|
tracking_number |
string |
optional. |
partner_ref |
string |
required. Must be unique. |
customer_name |
string |
required. |
customer_phone_1 |
string |
required. |
customer_phone_2 |
string |
optional. |
source_country_iso2 |
string |
required. |
source_address_line_1 |
string |
required. |
source_address_line_2 |
string |
optional. |
destination_region |
string |
required if region_id is empty. |
destination_city |
string |
required. |
destination_address_line_1 |
string |
required. |
destination_address_line_2 |
string |
optional. |
destination_postal_code |
string |
optional. |
length |
decimal |
optional. |
height |
decimal |
optional. |
weight |
decimal |
optional. |
description |
string |
required. |
units |
string |
required. |
type |
string |
required . in parcel, box |
handling |
string |
required . in normal, fragile |
special_instructions |
string |
optional. |
latitude |
decimal |
optional. |
longitude |
decimal |
optional. |
value |
decimal |
required. |
amount_to_collect |
decimal |
optional. defaults to package value. |
payment_collector |
string |
optional. in shaq, partner (This parameter can only be sent when ShaQ Express is the payment collector. It specifies who is responsible for collecting payment from the customer for the package and is intended for special cases where the partner handles the collection instead. If not provided, the default agreed payment collector configuration will be used.) |
items |
array |
required. {name, quantity} |
region_id |
integer |
required if destination_region is empty. |
Response
200
{
"message": "Package created successfully",
"data": {
"partnerRef": "UNIQUE-REF-001",
"trackingNumber": "20250410X51DIQ",
"customerName": "Kwaku Ananse",
"customerPhone1": "+233244100200",
"customerPhone2": null,
"altPhone": 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",
"units": 1,
"type": "box",
"handling": "normal",
"specialInstructions": null,
"status": "pending",
"statusDescription": "Package is yet to be received by Partner",
"landmark": null,
"proofPhotoUrl": null,
"partner": "Demo Partner",
"scheduleDate": null,
"deliveryFee": null,
"value": "300.00",
"amountToCollect": "300.00",
"paymentCollector": "shaq",
"paymentStatus": null,
"date": "2025-04-10 11:15",
"deliveredAt": null,
"eta": "2026-04-20 - 2026-04-22",
"deliveryAttempts": 0,
"items": [
{ "name": "iPhone 6", "quantity": 1 },
{ "name": "iPhone 14 Pro", "quantity": 2 }
]
}
}
404
Create Bulk 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 (This parameter can only be sent when ShaQ Express is the payment collector. It specifies who is responsible for collecting payment from the customer for the package and is intended for special cases where the partner handles the collection instead. If not provided, the default agreed payment collector configuration will be used.) |
packages.*.items |
array |
required. {name, quantity} |
packages.*.region_id |
integer |
required if destination_region is empty. |
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 (This parameter can only be sent when ShaQ Express is the payment collector. It specifies who is responsible for collecting payment from the customer for the package and is intended for special cases where the partner handles the collection instead. If not provided, the default agreed payment collector configuration will be used.) |
packages.*.items |
array |
required. |
packages.*.region_id |
integer |
required if destination_region is empty. |
Response
200
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",
"eta": "2026-04-20 - 2026-04-22",
"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",
"eta": "2026-04-20 - 2026-04-22",
"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.",
"eta": "2026-04-20 - 2026-04-22",
"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 Updates Through Webhook
We will POST to your webhook URL whenever a tracked event occurs on a package.
Envelope
Every webhook payload shares the same top-level envelope:
| Field | Type | Description |
|---|---|---|
event |
string |
The event type. See Webhook Events below. |
event_id |
string |
Unique UUID per delivery. Use for idempotency/deduplication. |
api_version |
string |
Payload version e.g. v1 |
occurred_at |
string |
ISO 8601 UTC timestamp of when the event occurred |
data |
object |
Event-specific payload. Shape varies by event — see below. |
Webhook Events
package.status_updated
Fired whenever a package status changes.
| Field | Type | Description |
|---|---|---|
tracking_number |
string |
ShaQ Express tracking number |
partner_ref |
string |
Your reference for the package |
status |
string |
The new status. See Package Statuses for values |
description |
string |
Human-readable description of the status |
comment |
string |
Additional context or comment. May be null |
meta |
object |
Extra data. Includes proof_url when status is delivered |
{
"event": "package.status_updated",
"event_id": "018e2b3c-7f4a-7c2d-9e1b-4a8f3d2c6b5a",
"api_version": "v1",
"occurred_at": "2025-05-29T10:30:00Z",
"data": {
"tracking_number": "20250410X51DIQ",
"partner_ref": "FGVHKJ567",
"status": "delivered",
"description": "Package was successfully delivered to customer",
"comment": null,
"meta": {
"proof_url": "https://example.com/proof.jpg"
}
}
}
package.amount_to_collect_updated
Fired when the amount to collect of a package is revised, always requested from and approved by Client.
| Field | Type | Description |
|---|---|---|
tracking_number |
string |
ShaQ Express tracking number |
partner_ref |
string |
Your reference for the package |
status |
string |
Package status at the time of revision. See Package Statuses for values |
meta.old_amount_to_collect |
number |
Previous amount to collect |
meta.new_amount_to_collect |
number |
Revised amount to collect |
meta.currency |
string |
Currency code e.g. GHS |
meta.reason |
string |
Reason for revision |
{
"event": "package.amount_to_collect_updated",
"event_id": "039g4d5e-9h6c-9e4f-1g3d-6c0h5f4e8d7c",
"api_version": "v1",
"occurred_at": "2025-05-29T09:00:00Z",
"data": {
"tracking_number": "20250410X51DIQ",
"partner_ref": "FGVHKJ567",
"status": "received",
"meta": {
"old_amount_to_collect": 25.0,
"new_amount_to_collect": 35.0,
"currency": "GHS",
"reason": "Items changed"
}
}
}
Expected Response
Your endpoint must return a 2xx response to acknowledge receipt of the webhook. Any non-2xx response will be retried up to 3 times.
Webhook Requirements
To ensure reliable delivery and prevent webhook timeouts, please adhere to the following guidelines:
* **Response Timeout:** Your server must return a `2xx` status code within **10 seconds** of receiving the payload.
* **Asynchronous Processing:** Acknowledge receipt of the webhook immediately, and process any database operations, business logic, or external notifications asynchronously (e.g., using a background queue/worker).
* **Deduplication & Idempotency:** Use the `event_id` provided in the payload envelope to ensure idempotency. Keep a log of processed event IDs and skip processing if the ID has already been seen.
* **Expect Duplicates:** Your endpoint must be prepared to handle duplicate deliveries gracefully in case of network retries or transient connection issues.
Create Package Replacement
background-color: var(--md-code-bg-color) Description: Create one or two packages to replace an existing package. Therule field determines how many packages are required and what action each must carry.
Headers
| Parameter | Type | Description |
|---|---|---|
Authorization |
bearer |
Required. |
Rules
| Rule | Packages Required | Actions Required |
|---|---|---|
deliver |
1 | action = deliver |
return |
1 | action = return |
return_deliver |
2 | One return, one deliver |
Request
| Parameter | Type | Description |
|---|---|---|
rule |
string |
Required. One of deliver, return, return_deliver |
packages |
array |
Required. 1–2 package objects. Must satisfy the rule constraints above |
Package Object
Each item in the packages array must conform to the following shape:
| Parameter | Type | Description |
|---|---|---|
action |
string |
Required. One of deliver, return. Must align with rule |
partner_ref |
string |
Required. Must be unique |
customer_name |
string |
Required |
customer_phone_1 |
string |
Required. Valid mobile number |
customer_phone_2 |
string |
Optional |
source_country_iso2 |
string |
Required. Valid ISO2 country code |
source_address_line_1 |
string |
Required |
source_address_line_2 |
string |
Optional |
destination_country_iso2 |
string |
Required. Valid ISO2 country code |
destination_region |
string |
Required if region_id is absent |
destination_city |
string |
Required |
destination_address_line_1 |
string |
Required |
destination_address_line_2 |
string |
Optional |
destination_postal_code |
string |
Optional |
landmark |
string |
Optional |
region_id |
integer |
Required if destination_region is absent |
length |
decimal |
Optional |
height |
decimal |
Optional |
weight |
decimal |
Optional |
description |
string |
Required |
units |
number |
Required |
type |
string |
Required. One of parcel, box |
value |
decimal |
Required. Minimum 0 |
amount_to_collect |
decimal |
Optional. Minimum 0 |
handling |
string |
Required. One of normal, fragile |
payment_collector |
string |
optional. in shaq, partner (This parameter can only be sent when ShaQ Express is the payment collector. It specifies who is responsible for collecting payment from the customer for the package and is intended for special cases where the partner handles the collection instead. If not provided, the default agreed payment collector configuration will be used.) |
items |
array |
Required. Array of { name: string, quantity: number }. Can be empty |
special_instructions |
string |
Optional |
latitude |
decimal |
Optional |
longitude |
decimal |
Optional |
Response
200
{
"message": "Package replacement created successfully",
"data": [
{
"partnerRef": "GH945214",
"trackingNumber": "9F0FD9D5",
"customerName": "Derrick Nti",
"customerPhone1": "+233549632604",
"customerPhone2": null,
"sourceCountry": "Ghana",
"sourceAddressLine1": "21 Abiriw Street",
"sourceAddressLine2": null,
"destinationCountry": "Ghana",
"destinationRegion": "Greater Accra",
"destinationCity": "Kwashieman",
"destinationAddressLine1": "23 Abiriw Street",
"destinationAddressLine2": null,
"destinationPostalCode": null,
"length": 30,
"height": 20,
"weight": 5.5,
"description": "Test package",
"labelUrl": null,
"units": 1,
"type": "box",
"value": 20,
"amountToCollect": 20,
"paymentStatus": "unpaid",
"handling": "normal",
"specialInstructions": null,
"status": "pending",
"statusDescription": "Package is yet to be received by Partner",
"latitude": null,
"longitude": null,
"receivedAt": null,
"isReplacement": true,
"action": "deliver",
"items": [
{
"name": "Bluetooth",
"quantity": 3
}
],
"rescheduledDate": null,
"deliveredAt": null,
"eta": null,
"maxEta": null,
"pickedAt": null,
"packedAt": null,
"cancelledAt": null,
"trackingHistory": [
{
"name": "pending",
"description": "Package is yet to be received by Partner",
"date": "2026-05-04 12:16",
"comment": null
}
]
},
{
"partnerRef": "GH545728",
"trackingNumber": "A797CA0A",
"customerName": "Kwabena Azaglo",
"customerPhone1": "+233549632604",
"customerPhone2": null,
"sourceCountry": "Ghana",
"sourceAddressLine1": "21 Abiriw Street",
"sourceAddressLine2": null,
"destinationCountry": "Ghana",
"destinationRegion": "Greater Accra",
"destinationCity": "Kwashieman",
"destinationAddressLine1": "23 Abiriw Street",
"destinationAddressLine2": null,
"destinationPostalCode": null,
"length": 30,
"height": 20,
"weight": 5.5,
"description": "Test package",
"labelUrl": null,
"units": 1,
"type": "box",
"value": 20,
"amountToCollect": 20,
"paymentStatus": "unpaid",
"handling": "normal",
"specialInstructions": null,
"status": "pending",
"statusDescription": "Package is yet to be received by Partner",
"latitude": null,
"longitude": null,
"receivedAt": null,
"isReplacement": true,
"action": "return",
"items": [
{
"name": "Bluetooth",
"quantity": 3
}
],
"rescheduledDate": null,
"deliveredAt": null,
"eta": null,
"maxEta": null,
"pickedAt": null,
"packedAt": null,
"cancelledAt": null,
"trackingHistory": [
{
"name": "pending",
"description": "Package is yet to be received by Partner",
"date": "2026-05-04 12:16",
"comment": null
}
]
}
]
}
Get Package Label
Get the label of a specific package
Headers
| Parameter | Type | Description |
|---|---|---|
Authorization |
bearer |
Required. |
Response
200
{
"message": "Label ready",
"data": {
"url": "https://d167icvhk5jowg.cloudfront.net/labels/20250410X51DIQ.pdf"
}
}
202
404