Table des matières
Documentation de l'API Publique ShaQ Express
Bienvenue sur l'API Publique ShaQ Express. Cette documentation fournit aux partenaires et aux développeurs les points de terminaison nécessaires pour gérer les colis, les expéditions et recevoir des mises à jour de suivi.
| Info | Valeur |
|---|---|
| version | 1.0 |
| URL de base (Dév) | https://test-partner.shaqexpress.com/api/v1 |
En-têtes Standard
Toutes les requêtes envoyées à l'API doivent contenir les en-têtes HTTP standard suivants :
| En-tête | Type | Description |
|---|---|---|
Content-Type |
application/json |
Nécessite des corps de requête en JSON |
Accept |
application/json |
Attend des corps de réponse en JSON |
(Remarque : Les points de terminaison protégés nécessiteront également un en-tête Authorization: Bearer <token>, que vous obtenez en vous connectant).
Statuts des Colis
Notre système utilise différents statuts pour suivre le cycle de vie d'un colis. Voici la liste complète des statuts que vous pouvez recevoir :
📦 En Attente & Collecte
pending: Le colis n'a pas encore été reçu du Partenairereceived: Le colis a été reçu du Partenairewarehouse_received: Le colis a été reçu dans un entrepôt régionalcollected: Le colis a été collecté auprès du Partenaire par ShaQ Expressready_for_pickup: Le colis est prêt pour le retrait par le client
🚚 Transit & Expédition
shipped: Le colis a été expédié par le Partenaireassigned: Le colis a été assigné à un Livreurin_transit: Le colis est en transit vers l'entrepôt le plus prochedispatched: Le colis est en route pour être livré
✅ Résultats de Livraison
confirmed: Le client a été appelé et la livraison confirméedelivered: Le colis a été livré avec succès au client
⚠️ Problèmes & Exceptions
not_delivered: Tentative de livraison échouéerescheduled: La livraison du colis a été replanifiée pour une nouvelle tentativecustomer_hold: La livraison est en attente à la demande du clientcustomer_unreachable: La livraison est en attente car le client est injoignablesuspected_scam: La livraison est en attente en raison d'une suspicion de fraude
🔙 Retours
return_picked: Le colis a été récupéré chez le client pour retour au partenairereturn_in_progress: Le colis est en cours de préparation pour être renvoyé au Partenairereturned_to_sender: Le colis a été renvoyé au Partenairereturn_to_central: Le colis est renvoyé à l'entrepôt central de ShaQ Express après plusieurs tentatives de livraison infructueuses, en préparation du retour au partenaire
Points de Terminaison API
Connexion
Obtenir un jeton d'authentification pour les requêtes suivantes.
Par mesure de sécurité, le jeton est valide pendant 7 jours, après quoi un nouveau devra être généré via la route /auth/login.
Requête
| Paramètre | Type | Description |
|---|---|---|
identifier |
string |
obligatoire. |
secret |
string |
obligatoire. |
Réponse
200
{
"message": "Request successful",
"data": {
"token": "UtXdU9HODhjdmtTNkRtUWNsVlM4OWI1d2Z2TXVIanlkRk"
}
}
Obtenir les Colis
Obtenir tous les colis
En-têtes
| Paramètre | Type | Description |
|---|---|---|
Authorization |
bearer |
Obligatoire. |
Réponse
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
}
}
}
Obtenir un Colis Spécifique
Obtenir les détails d'un colis
En-têtes
| Paramètre | Type | Description |
|---|---|---|
Authorization |
bearer |
Obligatoire. |
Réponse
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
}
]
}
}
Supprimer un Colis en Attente
Supprimer un colis. Seuls les colis en attente peuvent être supprimés.
En-têtes
| Paramètre | Type | Description |
|---|---|---|
Authorization |
bearer |
Obligatoire. |
Réponse
200
Annuler une Commande
Annuler une commande d'exécution.
En-têtes
| Paramètre | Type | Description |
|---|---|---|
Authorization |
bearer |
Obligatoire. |
Réponse
200
400
404
Créer un Colis Unique
Créer un seul colis
En-têtes
| Paramètre | Type | Description |
|---|---|---|
Authorization |
bearer |
Obligatoire. |
Requête
| Paramètre | Type | Description |
|---|---|---|
tracking_number |
string |
optionnel. |
partner_ref |
string |
obligatoire. Doit être unique. |
customer_name |
string |
obligatoire. |
customer_phone_1 |
string |
obligatoire. |
customer_phone_2 |
string |
optionnel. |
source_country_iso2 |
string |
obligatoire. |
source_address_line_1 |
string |
obligatoire. |
source_address_line_2 |
string |
optionnel. |
destination_region |
string |
obligatoire si region_id est vide. |
destination_city |
string |
obligatoire. |
destination_address_line_1 |
string |
obligatoire. |
destination_address_line_2 |
string |
optionnel. |
destination_postal_code |
string |
optionnel. |
length |
decimal |
optionnel. |
height |
decimal |
optionnel. |
weight |
decimal |
optionnel. |
description |
string |
obligatoire. |
units |
string |
obligatoire. |
type |
string |
obligatoire . parmi parcel, box |
handling |
string |
obligatoire . parmi normal, fragile |
special_instructions |
string |
optionnel. |
latitude |
decimal |
optionnel. |
longitude |
decimal |
optionnel. |
value |
decimal |
obligatoire. |
amount_to_collect |
decimal |
optionnel. Par défaut, égal à la value du colis. |
payment_collector |
string |
optionnel. parmi shaq, partner (Ce paramètre ne peut être envoyé que lorsque ShaQ Express est le collecteur de paiement. Il précise qui est responsable de la collecte du paiement auprès du client et est destiné aux cas particuliers où le partenaire gère la collecte. Si non fourni, la configuration de collecteur de paiement convenue par défaut sera utilisée.) |
items |
array |
obligatoire. {name, quantity} |
region_id |
integer |
obligatoire si destination_region est vide. |
Réponse
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
Créer des Colis en Masse
Créer plusieurs colis
En-têtes
| Paramètre | Type | Description |
|---|---|---|
Authorization |
bearer |
Obligatoire. |
Requête
| Paramètre | Type | Description |
|---|---|---|
packages |
array |
obligatoire. |
packages.*.tracking_number |
string |
optionnel. |
packages.*.partner_ref |
string |
obligatoire. |
packages.*.customer_name |
string |
obligatoire. |
packages.*.customer_phone_1 |
string |
obligatoire. |
packages.*.customer_phone_2 |
string |
optionnel. |
packages.*.source_country_iso2 |
string |
obligatoire. |
packages.*.source_address_line_1 |
string |
obligatoire. |
packages.*.source_address_line_2 |
string |
optionnel. |
packages.*.destination_region |
string |
obligatoire si region_id est vide. |
packages.*.destination_city |
string |
obligatoire. |
packages.*.destination_address_line_1 |
string |
obligatoire. |
packages.*.destination_address_line_2 |
string |
optionnel. |
packages.*.destination_postal_code |
string |
optionnel. |
packages.*.length |
decimal |
optionnel. |
packages.*.height |
decimal |
optionnel. |
packages.*.weight |
decimal |
optionnel. |
packages.*.description |
string |
obligatoire. |
packages.*.units |
string |
obligatoire. |
packages.*.type |
string |
obligatoire . parmi parcel, box |
packages.*.handling |
string |
obligatoire . parmi normal, fragile |
packages.*.special_instructions |
string |
optionnel. |
packages.*.latitude |
decimal |
optionnel. |
packages.*.longitude |
decimal |
optionnel. |
packages.*.value |
decimal |
obligatoire. |
packages.*.amount_to_collect |
decimal |
optionnel. Par défaut, égal à la value du colis. |
packages.*.payment_collector |
string |
optionnel. parmi shaq, partner (Ce paramètre ne peut être envoyé que lorsque ShaQ Express est le collecteur de paiement. Il précise qui est responsable de la collecte du paiement auprès du client et est destiné aux cas particuliers où le partenaire gère la collecte. Si non fourni, la configuration de collecteur de paiement convenue par défaut sera utilisée.) |
packages.*.items |
array |
obligatoire. {name, quantity} |
packages.*.region_id |
integer |
obligatoire si destination_region est vide. |
Réponse
200
Créer une Expédition
Créer une expédition représentant l'envoi physique de colis à ShaQ Express.
En-têtes
| Paramètre | Type | Description |
|---|---|---|
Authorization |
bearer |
Obligatoire. |
Requête
| Paramètre | Type | Description |
|---|---|---|
packages |
array |
obligatoire. |
packages.*.tracking_number |
string |
optionnel. |
packages.*.partner_ref |
string |
obligatoire. |
packages.*.customer_name |
string |
obligatoire. |
packages.*.customer_phone_1 |
string |
obligatoire. |
packages.*.customer_phone_2 |
string |
optionnel. |
packages.*.source_country_iso2 |
string |
obligatoire. |
packages.*.source_address_line_1 |
string |
obligatoire. |
packages.*.source_address_line_2 |
string |
optionnel. |
packages.*.destination_region |
string |
obligatoire si region_id est vide. |
packages.*.destination_city |
string |
obligatoire. |
packages.*.destination_address_line_1 |
string |
obligatoire. |
packages.*.destination_address_line_2 |
string |
optionnel. |
packages.*.destination_postal_code |
string |
optionnel. |
packages.*.length |
decimal |
optionnel. |
packages.*.height |
decimal |
optionnel. |
packages.*.weight |
decimal |
optionnel. |
packages.*.description |
string |
obligatoire. |
packages.*.units |
string |
obligatoire. |
packages.*.type |
string |
obligatoire . parmi parcel, box |
packages.*.handling |
string |
obligatoire . parmi normal, fragile |
packages.*.special_instructions |
string |
optionnel. |
packages.*.latitude |
decimal |
optionnel. |
packages.*.longitude |
decimal |
optionnel. |
packages.*.value |
decimal |
obligatoire. |
packages.*.amount_to_collect |
decimal |
optionnel. Par défaut, égal à la value du colis. |
packages.*.payment_collector |
string |
optionnel. parmi shaq, partner (Ce paramètre ne peut être envoyé que lorsque ShaQ Express est le collecteur de paiement. Il précise qui est responsable de la collecte du paiement auprès du client et est destiné aux cas particuliers où le partenaire gère la collecte. Si non fourni, la configuration de collecteur de paiement convenue par défaut sera utilisée.) |
packages.*.items |
array |
obligatoire. |
packages.*.region_id |
integer |
obligatoire si destination_region est vide. |
Réponse
200
Obtenir une Expédition Spécifique
Obtenir les détails d'une expédition
En-têtes
| Paramètre | Type | Description |
|---|---|---|
Authorization |
bearer |
Obligatoire. |
Réponse
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
}
]
}
]
}
}
Mettre à Jour un Colis
Mettre à jour un colis spécifique
En-têtes
| Paramètre | Type | Description |
|---|---|---|
Authorization |
bearer |
Obligatoire. |
Requête
| Paramètre | Type | Description |
|---|---|---|
tracking_number |
string |
optionnel. |
customer_name |
string |
optionnel. |
customer_phone_1 |
string |
optionnel. |
customer_phone_2 |
string |
optionnel. |
source_country_iso2 |
string |
optionnel. |
source_address_line_1 |
string |
optionnel. |
source_address_line_2 |
string |
optionnel. |
destination_region |
string |
optionnel. |
destination_city |
string |
optionnel. |
destination_address_line_1 |
string |
optionnel. |
destination_address_line_2 |
string |
optionnel. |
destination_postal_code |
string |
optionnel. |
length |
decimal |
optionnel. |
height |
decimal |
optionnel. |
weight |
decimal |
optionnel. |
description |
string |
optionnel. |
units |
string |
optionnel. |
type |
string |
optionnel . parmi parcel, box |
handling |
string |
optionnel . parmi normal, fragile |
special_instructions |
string |
optionnel. |
latitude |
decimal |
optionnel. |
longitude |
decimal |
optionnel. |
value |
decimal |
optionnel. |
amount_to_collect |
decimal |
optionnel. |
items |
array |
optionnel. |
Réponse
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
}
]
}
}
Suivre un Colis
Obtenir les statuts de suivi d'un colis spécifique
En-têtes
| Paramètre | Type | Description |
|---|---|---|
Authorization |
bearer |
Obligatoire. |
Réponse
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"
}
]
}
}
Obtenir les Régions
Obtenir toutes les régions autorisées
En-têtes
| Paramètre | Type | Description |
|---|---|---|
Authorization |
bearer |
Obligatoire. |
Réponse
200
{
"message": "Request successful",
"data": [
{
"id": 16,
"name": "Western North"
},
{
"id": 15,
"name": "Ashanti"
}
]
}
Recevoir des Mises à Jour via Webhook
Nous enverrons un POST à votre URL webhook chaque fois qu'un événement suivi se produit sur un colis.
Enveloppe
Chaque payload webhook partage la même enveloppe de niveau supérieur :
| Champ | Type | Description |
|---|---|---|
event |
string |
Le type d'événement. Voir Événements Webhook ci-dessous. |
event_id |
string |
UUID unique par livraison. Utilisé pour l'idempotence/déduplication. |
api_version |
string |
Version du payload, ex. v1 |
occurred_at |
string |
Horodatage UTC ISO 8601 de l'événement |
data |
object |
Payload spécifique à l'événement. La forme varie selon event. |
Événements Webhook
package.status_updated
Déclenché chaque fois que le statut d'un colis change.
| Champ | Type | Description |
|---|---|---|
tracking_number |
string |
Numéro de suivi ShaQ Express |
partner_ref |
string |
Votre référence pour le colis |
status |
string |
Le nouveau statut. Voir Statuts des Colis pour les valeurs |
description |
string |
Description lisible du statut |
comment |
string |
Contexte ou commentaire supplémentaire. Peut être null |
meta |
object |
Données supplémentaires. Inclut proof_url quand status est 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
Déclenché lorsque le montant à collecter d'un colis est révisé, toujours à la demande et avec l'approbation du Client.
| Champ | Type | Description |
|---|---|---|
tracking_number |
string |
Numéro de suivi ShaQ Express |
partner_ref |
string |
Votre référence pour le colis |
status |
string |
Statut du colis au moment de la révision. Voir Statuts des Colis pour les valeurs |
meta.old_amount_to_collect |
number |
Ancien montant à collecter |
meta.new_amount_to_collect |
number |
Nouveau montant à collecter |
meta.currency |
string |
Code de devise, ex. GHS |
meta.reason |
string |
Motif de la révision |
{
"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"
}
}
}
Réponse Attendue
Votre point de terminaison doit retourner une réponse 2xx pour accuser réception du webhook. Toute réponse non-2xx sera réessayée jusqu'à 3 fois.
Exigences Webhook
Pour garantir une livraison fiable et éviter les délais d'expiration des webhooks, veuillez respecter les directives suivantes :
* **Délai de Réponse :** Votre serveur doit retourner un code de statut `2xx` dans les **10 secondes** suivant la réception du payload.
* **Traitement Asynchrone :** Accusez réception du webhook immédiatement et traitez toute opération de base de données, logique métier ou notification externe de manière asynchrone (ex. via une file d'attente en arrière-plan).
* **Déduplication & Idempotence :** Utilisez l'`event_id` fourni dans l'enveloppe du payload pour garantir l'idempotence. Conservez un journal des IDs d'événements traités et ignorez le traitement si l'ID a déjà été vu.
* **Attendez-vous aux Doublons :** Votre point de terminaison doit être préparé à gérer les livraisons en double en cas de nouvelles tentatives réseau ou de problèmes de connexion transitoires.
Créer un Remplacement de Colis
Description :
Créer un ou deux colis pour remplacer un colis existant. Le champ rule détermine combien de colis sont requis et quelle action chacun doit effectuer.
En-têtes
| Paramètre | Type | Description |
|---|---|---|
Authorization |
bearer |
Obligatoire. |
Règles
| Règle | Colis Requis | Actions Requises |
|---|---|---|
deliver |
1 | action = deliver |
return |
1 | action = return |
return_deliver |
2 | Un return, un deliver |
Requête
| Paramètre | Type | Description |
|---|---|---|
rule |
string |
Obligatoire. L'un de deliver, return, return_deliver |
packages |
array |
Obligatoire. 1–2 objets colis. Doit satisfaire les contraintes de la rule |
Objet Colis
Chaque élément du tableau packages doit respecter la structure suivante :
| Paramètre | Type | Description |
|---|---|---|
action |
string |
Obligatoire. L'un de deliver, return. Doit correspondre à la rule |
partner_ref |
string |
Obligatoire. Doit être unique |
customer_name |
string |
Obligatoire |
customer_phone_1 |
string |
Obligatoire. Numéro de mobile valide |
customer_phone_2 |
string |
Optionnel |
source_country_iso2 |
string |
Obligatoire. Code pays ISO2 valide |
source_address_line_1 |
string |
Obligatoire |
source_address_line_2 |
string |
Optionnel |
destination_country_iso2 |
string |
Obligatoire. Code pays ISO2 valide |
destination_region |
string |
Obligatoire si region_id est absent |
destination_city |
string |
Obligatoire |
destination_address_line_1 |
string |
Obligatoire |
destination_address_line_2 |
string |
Optionnel |
destination_postal_code |
string |
Optionnel |
landmark |
string |
Optionnel |
region_id |
integer |
Obligatoire si destination_region est absent |
length |
decimal |
Optionnel |
height |
decimal |
Optionnel |
weight |
decimal |
Optionnel |
description |
string |
Obligatoire |
units |
number |
Obligatoire |
type |
string |
Obligatoire. L'un de parcel, box |
value |
decimal |
Obligatoire. Minimum 0 |
amount_to_collect |
decimal |
Optionnel. Minimum 0 |
handling |
string |
Obligatoire. L'un de normal, fragile |
payment_collector |
string |
optionnel. parmi shaq, partner (Ce paramètre ne peut être envoyé que lorsque ShaQ Express est le collecteur de paiement. Il précise qui est responsable de la collecte du paiement auprès du client et est destiné aux cas particuliers où le partenaire gère la collecte. Si non fourni, la configuration de collecteur de paiement convenue par défaut sera utilisée.) |
items |
array |
Obligatoire. Tableau de { name: string, quantity: number }. Peut être vide |
special_instructions |
string |
Optionnel |
latitude |
decimal |
Optionnel |
longitude |
decimal |
Optionnel |
Réponse
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
}
]
}
]
}
Obtenir l'Étiquette d'un Colis
Obtenir l'étiquette d'un colis spécifique
En-têtes
| Paramètre | Type | Description |
|---|---|---|
Authorization |
bearer |
Obligatoire. |
Réponse
200
{
"message": "Label ready",
"data": {
"url": "https://d167icvhk5jowg.cloudfront.net/labels/20250410X51DIQ.pdf"
}
}
202
404