Tabla de contenidos
Documentación de la API Pública de ShaQ Express
Bienvenido a la API Pública de ShaQ Express. Esta documentación proporciona a los socios y desarrolladores los endpoints necesarios para gestionar paquetes, envíos y recibir actualizaciones de seguimiento.
| Info | Valor |
|---|---|
| versión | 1.0 |
| URL base (Desa.) | https://test-partner.shaqexpress.com/api/v1 |
Cabeceras Estándar
Todas las solicitudes a la API deben contener las siguientes cabeceras HTTP estándar:
| Cabecera | Tipo | Descripción |
|---|---|---|
Content-Type |
application/json |
Requiere cuerpos de solicitud en JSON |
Accept |
application/json |
Espera cuerpos de respuesta en JSON |
(Nota: Los endpoints protegidos también requerirán una cabecera Authorization: Bearer <token>, que se obtiene al iniciar sesión).
Estados de Paquetes
Nuestro sistema utiliza varios estados para rastrear el ciclo de vida de un paquete. A continuación se muestra la lista completa de estados que puede recibir:
📦 Pendiente & Recolección
pending: El paquete aún no ha sido recibido del Socioreceived: El paquete ha sido recibido del Sociowarehouse_received: El paquete ha sido recibido en un almacén regionalcollected: El paquete ha sido recogido del Socio por ShaQ Expressready_for_pickup: El paquete está listo para ser recogido por el cliente
🚚 Tránsito & Despacho
shipped: El paquete ha sido enviado por el Socioassigned: El paquete ha sido asignado a un Repartidorin_transit: El paquete está en tránsito hacia el almacén más cercanodispatched: El paquete está en camino para ser entregado
✅ Resultados de Entrega
confirmed: Se ha llamado al cliente y la entrega ha sido confirmadadelivered: El paquete fue entregado exitosamente al cliente
⚠️ Problemas & Excepciones
not_delivered: Se intentó la entrega pero no se pudo completarrescheduled: La entrega del paquete fue reprogramada para un nuevo intentocustomer_hold: La entrega está en espera por solicitud del clientecustomer_unreachable: La entrega está en espera porque el cliente no es localizablesuspected_scam: La entrega está en espera debido a una sospecha de fraude
🔙 Devoluciones
return_picked: El paquete ha sido recogido del cliente para devolución al socioreturn_in_progress: El paquete está siendo preparado para ser devuelto al Socioreturned_to_sender: El paquete ha sido devuelto al Socioreturn_to_central: El paquete está siendo devuelto al almacén central de ShaQ Express tras múltiples intentos fallidos de entrega, en preparación para ser devuelto al socio
Endpoints de la API
Inicio de Sesión
Obtener un token de autenticación para solicitudes posteriores.
Como medida de seguridad, el token es válido por 7 días, tras los cuales deberá generarse uno nuevo usando la ruta /auth/login.
Solicitud
| Parámetro | Tipo | Descripción |
|---|---|---|
identifier |
string |
requerido. |
secret |
string |
requerido. |
Respuesta
200
{
"message": "Request successful",
"data": {
"token": "UtXdU9HODhjdmtTNkRtUWNsVlM4OWI1d2Z2TXVIanlkRk"
}
}
Obtener Paquetes
Obtener todos los paquetes
Cabeceras
| Parámetro | Tipo | Descripción |
|---|---|---|
Authorization |
bearer |
Requerido. |
Respuesta
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
}
}
}
Obtener un Paquete Específico
Obtener detalles de un paquete
Cabeceras
| Parámetro | Tipo | Descripción |
|---|---|---|
Authorization |
bearer |
Requerido. |
Respuesta
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
}
]
}
}
Eliminar un Paquete Pendiente
Eliminar un paquete. Solo se pueden eliminar paquetes pendientes.
Cabeceras
| Parámetro | Tipo | Descripción |
|---|---|---|
Authorization |
bearer |
Requerido. |
Respuesta
200
Cancelar Orden
Cancelar una orden de fulfillment.
Cabeceras
| Parámetro | Tipo | Descripción |
|---|---|---|
Authorization |
bearer |
Requerido. |
Respuesta
200
400
404
Crear Paquete Individual
Crear un solo paquete
Cabeceras
| Parámetro | Tipo | Descripción |
|---|---|---|
Authorization |
bearer |
Requerido. |
Solicitud
| Parámetro | Tipo | Descripción |
|---|---|---|
tracking_number |
string |
opcional. |
partner_ref |
string |
requerido. Debe ser único. |
customer_name |
string |
requerido. |
customer_phone_1 |
string |
requerido. |
customer_phone_2 |
string |
opcional. |
source_country_iso2 |
string |
requerido. |
source_address_line_1 |
string |
requerido. |
source_address_line_2 |
string |
opcional. |
destination_region |
string |
requerido si region_id está vacío. |
destination_city |
string |
requerido. |
destination_address_line_1 |
string |
requerido. |
destination_address_line_2 |
string |
opcional. |
destination_postal_code |
string |
opcional. |
length |
decimal |
opcional. |
height |
decimal |
opcional. |
weight |
decimal |
opcional. |
description |
string |
requerido. |
units |
string |
requerido. |
type |
string |
requerido . entre parcel, box |
handling |
string |
requerido . entre normal, fragile |
special_instructions |
string |
opcional. |
latitude |
decimal |
opcional. |
longitude |
decimal |
opcional. |
value |
decimal |
requerido. |
amount_to_collect |
decimal |
opcional. Por defecto, igual al value del paquete. |
payment_collector |
string |
opcional. entre shaq, partner (Este parámetro solo puede enviarse cuando ShaQ Express es el cobrador de pagos. Especifica quién es responsable de cobrar el pago al cliente por el paquete y está destinado a casos especiales donde el socio gestiona el cobro. Si no se proporciona, se utilizará la configuración predeterminada acordada de cobrador de pagos.) |
items |
array |
requerido. {name, quantity} |
region_id |
integer |
requerido si destination_region está vacío. |
Respuesta
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
Crear Paquetes en Masa
Crear múltiples paquetes
Cabeceras
| Parámetro | Tipo | Descripción |
|---|---|---|
Authorization |
bearer |
Requerido. |
Solicitud
| Parámetro | Tipo | Descripción |
|---|---|---|
packages |
array |
requerido. |
packages.*.tracking_number |
string |
opcional. |
packages.*.partner_ref |
string |
requerido. |
packages.*.customer_name |
string |
requerido. |
packages.*.customer_phone_1 |
string |
requerido. |
packages.*.customer_phone_2 |
string |
opcional. |
packages.*.source_country_iso2 |
string |
requerido. |
packages.*.source_address_line_1 |
string |
requerido. |
packages.*.source_address_line_2 |
string |
opcional. |
packages.*.destination_region |
string |
requerido si region_id está vacío. |
packages.*.destination_city |
string |
requerido. |
packages.*.destination_address_line_1 |
string |
requerido. |
packages.*.destination_address_line_2 |
string |
opcional. |
packages.*.destination_postal_code |
string |
opcional. |
packages.*.length |
decimal |
opcional. |
packages.*.height |
decimal |
opcional. |
packages.*.weight |
decimal |
opcional. |
packages.*.description |
string |
requerido. |
packages.*.units |
string |
requerido. |
packages.*.type |
string |
requerido . entre parcel, box |
packages.*.handling |
string |
requerido . entre normal, fragile |
packages.*.special_instructions |
string |
opcional. |
packages.*.latitude |
decimal |
opcional. |
packages.*.longitude |
decimal |
opcional. |
packages.*.value |
decimal |
requerido. |
packages.*.amount_to_collect |
decimal |
opcional. Por defecto, igual al value del paquete. |
packages.*.payment_collector |
string |
opcional. entre shaq, partner (Este parámetro solo puede enviarse cuando ShaQ Express es el cobrador de pagos. Especifica quién es responsable de cobrar el pago al cliente por el paquete y está destinado a casos especiales donde el socio gestiona el cobro. Si no se proporciona, se utilizará la configuración predeterminada acordada de cobrador de pagos.) |
packages.*.items |
array |
requerido. {name, quantity} |
packages.*.region_id |
integer |
requerido si destination_region está vacío. |
Respuesta
200
Crear Envío
Crear un envío que representa el envío físico de paquetes que serán enviados a ShaQ Express.
Cabeceras
| Parámetro | Tipo | Descripción |
|---|---|---|
Authorization |
bearer |
Requerido. |
Solicitud
| Parámetro | Tipo | Descripción |
|---|---|---|
packages |
array |
requerido. |
packages.*.tracking_number |
string |
opcional. |
packages.*.partner_ref |
string |
requerido. |
packages.*.customer_name |
string |
requerido. |
packages.*.customer_phone_1 |
string |
requerido. |
packages.*.customer_phone_2 |
string |
opcional. |
packages.*.source_country_iso2 |
string |
requerido. |
packages.*.source_address_line_1 |
string |
requerido. |
packages.*.source_address_line_2 |
string |
opcional. |
packages.*.destination_region |
string |
requerido si region_id está vacío. |
packages.*.destination_city |
string |
requerido. |
packages.*.destination_address_line_1 |
string |
requerido. |
packages.*.destination_address_line_2 |
string |
opcional. |
packages.*.destination_postal_code |
string |
opcional. |
packages.*.length |
decimal |
opcional. |
packages.*.height |
decimal |
opcional. |
packages.*.weight |
decimal |
opcional. |
packages.*.description |
string |
requerido. |
packages.*.units |
string |
requerido. |
packages.*.type |
string |
requerido . entre parcel, box |
packages.*.handling |
string |
requerido . entre normal, fragile |
packages.*.special_instructions |
string |
opcional. |
packages.*.latitude |
decimal |
opcional. |
packages.*.longitude |
decimal |
opcional. |
packages.*.value |
decimal |
requerido. |
packages.*.amount_to_collect |
decimal |
opcional. Por defecto, igual al value del paquete. |
packages.*.payment_collector |
string |
opcional. entre shaq, partner (Este parámetro solo puede enviarse cuando ShaQ Express es el cobrador de pagos. Especifica quién es responsable de cobrar el pago al cliente por el paquete y está destinado a casos especiales donde el socio gestiona el cobro. Si no se proporciona, se utilizará la configuración predeterminada acordada de cobrador de pagos.) |
packages.*.items |
array |
requerido. |
packages.*.region_id |
integer |
requerido si destination_region está vacío. |
Respuesta
200
Obtener un Envío Específico
Obtener detalles de un envío
Cabeceras
| Parámetro | Tipo | Descripción |
|---|---|---|
Authorization |
bearer |
Requerido. |
Respuesta
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
}
]
}
]
}
}
Actualizar un Paquete
Actualizar un paquete específico
Cabeceras
| Parámetro | Tipo | Descripción |
|---|---|---|
Authorization |
bearer |
Requerido. |
Solicitud
| Parámetro | Tipo | Descripción |
|---|---|---|
tracking_number |
string |
opcional. |
customer_name |
string |
opcional. |
customer_phone_1 |
string |
opcional. |
customer_phone_2 |
string |
opcional. |
source_country_iso2 |
string |
opcional. |
source_address_line_1 |
string |
opcional. |
source_address_line_2 |
string |
opcional. |
destination_region |
string |
opcional. |
destination_city |
string |
opcional. |
destination_address_line_1 |
string |
opcional. |
destination_address_line_2 |
string |
opcional. |
destination_postal_code |
string |
opcional. |
length |
decimal |
opcional. |
height |
decimal |
opcional. |
weight |
decimal |
opcional. |
description |
string |
opcional. |
units |
string |
opcional. |
type |
string |
opcional . entre parcel, box |
handling |
string |
opcional . entre normal, fragile |
special_instructions |
string |
opcional. |
latitude |
decimal |
opcional. |
longitude |
decimal |
opcional. |
value |
decimal |
opcional. |
amount_to_collect |
decimal |
opcional. |
items |
array |
opcional. |
Respuesta
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
}
]
}
}
Rastrear Paquete
Obtener los estados de seguimiento de un paquete específico
Cabeceras
| Parámetro | Tipo | Descripción |
|---|---|---|
Authorization |
bearer |
Requerido. |
Respuesta
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"
}
]
}
}
Obtener Regiones
Obtener todas las regiones permitidas
Cabeceras
| Parámetro | Tipo | Descripción |
|---|---|---|
Authorization |
bearer |
Requerido. |
Respuesta
200
{
"message": "Request successful",
"data": [
{
"id": 16,
"name": "Western North"
},
{
"id": 15,
"name": "Ashanti"
}
]
}
Recibir Actualizaciones de Paquetes vía Webhook
Realizaremos un POST a su URL webhook cada vez que ocurra un evento rastreado en un paquete.
Sobre
Cada payload de webhook comparte el mismo sobre de nivel superior:
| Campo | Tipo | Descripción |
|---|---|---|
event |
string |
El tipo de evento. Ver Eventos Webhook a continuación. |
event_id |
string |
UUID único por entrega. Usar para idempotencia/deduplicación. |
api_version |
string |
Versión del payload, ej. v1 |
occurred_at |
string |
Marca de tiempo UTC ISO 8601 de cuándo ocurrió el evento |
data |
object |
Payload específico del evento. La forma varía según event. |
Eventos Webhook
package.status_updated
Se dispara cada vez que cambia el estado de un paquete.
| Campo | Tipo | Descripción |
|---|---|---|
tracking_number |
string |
Número de seguimiento ShaQ Express |
partner_ref |
string |
Su referencia para el paquete |
status |
string |
El nuevo estado. Ver Estados de Paquetes para los valores |
description |
string |
Descripción legible del estado |
comment |
string |
Contexto o comentario adicional. Puede ser null |
meta |
object |
Datos adicionales. Incluye proof_url cuando status es 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
Se dispara cuando el monto a cobrar de un paquete es revisado, siempre solicitado y aprobado por el Cliente.
| Campo | Tipo | Descripción |
|---|---|---|
tracking_number |
string |
Número de seguimiento ShaQ Express |
partner_ref |
string |
Su referencia para el paquete |
status |
string |
Estado del paquete al momento de la revisión. Ver Estados de Paquetes para valores |
meta.old_amount_to_collect |
number |
Monto anterior a cobrar |
meta.new_amount_to_collect |
number |
Monto revisado a cobrar |
meta.currency |
string |
Código de moneda, ej. GHS |
meta.reason |
string |
Motivo de la revisión |
{
"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"
}
}
}
Respuesta Esperada
Su endpoint debe retornar una respuesta 2xx para confirmar la recepción del webhook. Cualquier respuesta no-2xx será reintentada hasta 3 veces.
Requisitos del Webhook
Para garantizar una entrega confiable y evitar tiempos de espera del webhook, siga estas pautas:
* **Tiempo de Respuesta:** Su servidor debe retornar un código de estado `2xx` dentro de los **10 segundos** de recibir el payload.
* **Procesamiento Asíncrono:** Confirme la recepción del webhook inmediatamente y procese cualquier operación de base de datos, lógica de negocio o notificaciones externas de forma asíncrona (ej. usando una cola/worker en segundo plano).
* **Deduplicación e Idempotencia:** Use el `event_id` proporcionado en el sobre del payload para garantizar la idempotencia. Mantenga un registro de los IDs de eventos procesados y omita el procesamiento si el ID ya fue visto.
* **Espere Duplicados:** Su endpoint debe estar preparado para manejar entregas duplicadas de forma elegante en caso de reintentos de red o problemas de conexión transitorios.
Crear Reemplazo de Paquete
Descripción:
Crear uno o dos paquetes para reemplazar un paquete existente. El campo rule determina cuántos paquetes se requieren y qué action debe realizar cada uno.
Cabeceras
| Parámetro | Tipo | Descripción |
|---|---|---|
Authorization |
bearer |
Requerido. |
Reglas
| Regla | Paquetes Requeridos | Acciones Requeridas |
|---|---|---|
deliver |
1 | action = deliver |
return |
1 | action = return |
return_deliver |
2 | Un return, un deliver |
Solicitud
| Parámetro | Tipo | Descripción |
|---|---|---|
rule |
string |
Requerido. Uno de deliver, return, return_deliver |
packages |
array |
Requerido. 1–2 objetos de paquete. Debe satisfacer las restricciones de la rule |
Objeto Paquete
Cada elemento del array packages debe tener la siguiente estructura:
| Parámetro | Tipo | Descripción |
|---|---|---|
action |
string |
Requerido. Uno de deliver, return. Debe alinearse con la rule |
partner_ref |
string |
Requerido. Debe ser único |
customer_name |
string |
Requerido |
customer_phone_1 |
string |
Requerido. Número de móvil válido |
customer_phone_2 |
string |
Opcional |
source_country_iso2 |
string |
Requerido. Código de país ISO2 válido |
source_address_line_1 |
string |
Requerido |
source_address_line_2 |
string |
Opcional |
destination_country_iso2 |
string |
Requerido. Código de país ISO2 válido |
destination_region |
string |
Requerido si region_id está ausente |
destination_city |
string |
Requerido |
destination_address_line_1 |
string |
Requerido |
destination_address_line_2 |
string |
Opcional |
destination_postal_code |
string |
Opcional |
landmark |
string |
Opcional |
region_id |
integer |
Requerido si destination_region está ausente |
length |
decimal |
Opcional |
height |
decimal |
Opcional |
weight |
decimal |
Opcional |
description |
string |
Requerido |
units |
number |
Requerido |
type |
string |
Requerido. Uno de parcel, box |
value |
decimal |
Requerido. Mínimo 0 |
amount_to_collect |
decimal |
Opcional. Mínimo 0 |
handling |
string |
Requerido. Uno de normal, fragile |
payment_collector |
string |
opcional. entre shaq, partner (Este parámetro solo puede enviarse cuando ShaQ Express es el cobrador de pagos. Especifica quién es responsable de cobrar el pago al cliente por el paquete y está destinado a casos especiales donde el socio gestiona el cobro. Si no se proporciona, se utilizará la configuración predeterminada acordada de cobrador de pagos.) |
items |
array |
Requerido. Array de { name: string, quantity: number }. Puede estar vacío |
special_instructions |
string |
Opcional |
latitude |
decimal |
Opcional |
longitude |
decimal |
Opcional |
Respuesta
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
}
]
}
]
}
Obtener Etiqueta del Paquete
Obtener la etiqueta de un paquete específico
Cabeceras
| Parámetro | Tipo | Descripción |
|---|---|---|
Authorization |
bearer |
Requerido. |
Respuesta
200
{
"message": "Label ready",
"data": {
"url": "https://d167icvhk5jowg.cloudfront.net/labels/20250410X51DIQ.pdf"
}
}
202
404