Shippea Partner API Documentation
API REST para partners SaaS e integraciones: autenticación Bearer, wallet, servicios, tracking, etiquetas, estados, recogidas y webhooks.
Descripción General
Shippea Partner API
API REST completa para partners SaaS e integraciones personalizadas. La autenticación usa Bearer token por credenciales de cliente y el ciclo de vida cubre desde búsqueda de servicios hasta seguimiento, cancelación y recogidas.
Autenticación
Bearer token via client credentials
Tipo de Contenido
application/json
Producción
https://app.shippea.io/api/v2/partner
Sandbox
https://sandbox.shippea.io/api/v2/partner
Authentication
/api/v2/partner/auth/token
Usa tu client_id y client_secret para obtener un token Bearer. Incluye este token en todas las solicitudes posteriores mediante el encabezado Authorization. Los tokens no expiran automáticamente; vuelve a autenticarte si recibes una respuesta 401.
Solicitud
POST /api/v2/partner/auth/token\nContent-Type: application/json\n\n
{
"client_id": "your_client_id",
"client_secret": "your_client_secret"
}Respuesta (200)
{
"success": true,
"token_type": "Bearer",
"access_token": "1|...",
"message": "Access token generated successfully."
}Master Data
/api/v2/partner/regions
Devuelve todas las regiones activas disponibles para cobertura de servicio. Usa el id de región al consultar servicios.
Solicitud
GET https://app.shippea.io/api/v2/partner/regionsRespuesta (200)
{
"success": true,
"data": [
{"id": 1, "name": "Panamá", "iso_code": "PA-8"}
]
}Services & Prices
/api/v2/partner/services
Devuelve servicios disponibles y precios para una región dada. Filtra por peso para ver solo los servicios que aceptan el paquete.
Solicitud Parameters
| Campo | Tipo | Requerido | Descripción |
|---|---|---|---|
region_id | integer | requerido | ID de región del endpoint Listar Regiones. |
origin_region_id | integer | opcional | ID de la región de origen del remitente. Los couriers regionales que no cubren este origen son excluidos. |
weight | float | opcional | Peso en libras. Cuando se proporciona, solo se devuelven servicios cuyo rango de peso cubre este valor. |
sender_lat | float | opcional | Latitud de la dirección de retiro del remitente, requerido para cotización dinámica/ASAP. |
sender_long | float | opcional | Longitud de la dirección de retiro del remitente, requerido para cotización dinámica/ASAP. |
receiver_lat | float | opcional | Latitud de la dirección de entrega del destinatario, requerido para cotización dinámica/ASAP. |
receiver_long | float | opcional | Longitud de la dirección de entrega del destinatario, requerido para cotización dinámica/ASAP. |
Solicitud
GET https://app.shippea.io/api/v2/partner/services?region_id=1&origin_region_id=2&weight=2.5Respuesta (200)
{
"success": true,
"data": [
{
"id": 12,
"rate_name": "Door-to-Door",
"rate_type": "Door-to-Door",
"min_weight": 0.0,
"max_weight": 5.0,
"price": 4.99,
"return_charge": 0.0,
"weight_unit": "lb",
"min_transit_days": 1,
"max_transit_days": 3,
"is_dynamic": false,
"courier": {"id": 3, "name": "Shippea Express", "logo_url": "https://..."},
"agency": {"id": 2, "name": "Agency Name", "region_id": 1}
}
]
}Customers
/api/v2/partner/customers
Crea una cuenta de cliente para la titularidad del envío. Si el email ya existe, devuelve la información del cliente existente y no crea duplicados.
Campos del Cuerpo de la Solicitud
| Campo | Tipo | Requerido | Descripción |
|---|---|---|---|
first_name | string | requerido | Nombre del cliente. |
last_name | string | requerido | Apellido del cliente. |
email | string | requerido | Dirección de email. Usado como identificador único; devuelve el registro existente si ya está registrado. |
phone | string | opcional | Número de teléfono en formato internacional. |
password | string | opcional | Contraseña para acceso directo al portal. Si se omite, el cliente no puede iniciar sesión directamente. |
Ejemplo de cuerpo de solicitud
{
"first_name": "John",
"last_name": "Doe",
"email": "john@example.com",
"phone": "+50760000000",
"password": "optionalStrongPassword"
}Respuesta (201)
{
"success": true,
"message": "Customer account created successfully.",
"data": {"customer_uuid": "...", "email": "john@example.com"}
}Shipments
Shipment Lifecycle
Shippea soporta listado, creación, pago, seguimiento, recuperación de etiqueta y cancelación. En el flujo estándar, crear un envío debita la billetera inmediatamente y encola la generación asíncrona de etiqueta.
/api/v2/partner/shipments
Crea un envío, debita la billetera automáticamente y encola la generación asíncrona de etiqueta. El peso total y el precio final se calculan en el servidor. Acepta service_id o service_name.
label_created con is_paid: true.order_number dos veces, se devuelve el envío original sin crear un duplicado.Campos del Cuerpo de la Solicitud
| Campo | Tipo | Requerido | Descripción |
|---|---|---|---|
service_id | integer | opcional | ID del servicio de Listar Servicios. Proporciona este o service_name. |
service_name | string | opcional | Nombre exacto del servicio. Alternativa a service_id. |
order_number | string | opcional | Referencia interna de pedido, almacenada contra el envío. |
customer | object | opcional | Datos del cliente: nombre, email y teléfono. |
sender_details | object | requerido | Datos de recogida/remitente. |
receiver_details | object | requerido | Datos de entrega/destinatario. |
items_information | array | requerido | Array de objetos artículo. |
Objeto Remitente
| Campo | Tipo | Requerido | Descripción |
|---|---|---|---|
name | string | opcional | Nombre completo o nombre comercial del remitente. |
first_name | string | opcional | Sender first name, alternative to name. |
last_name | string | opcional | Sender last name, alternative to name. |
email | string | opcional | Sender email address. |
address | string | requerido | Dirección completa de la calle. |
address_2 | string | opcional | Additional address line: suite, floor, etc. |
city | string | requerido | Nombre de la ciudad. |
country | string | requerido | Nombre del país. |
province_code | string | opcional | Código de provincia ISO. Usado para resolver la región. |
zip | string | opcional | Código postal. |
phone | string | opcional | Número de teléfono de contacto. |
notes | string | opcional | Additional delivery notes for sender location. |
latitude | float | opcional | Coordenadas GPS para mapeo de recogida, lat. |
longitude | float | opcional | Coordenadas GPS para mapeo de recogida, long. |
Objeto Destinatario
| Campo | Tipo | Requerido | Descripción |
|---|---|---|---|
name | string | opcional | Recipient full name, alternative to first_name + last_name. |
first_name | string | opcional | Recipient first name. |
last_name | string | opcional | Recipient last name. |
email | string | opcional | Recipient email address. |
address | string | requerido | Street address of the recipient. |
address_2 | string | opcional | Additional address line. |
city | string | requerido | Recipient city. |
country | string | requerido | Recipient country, e.g. Panama. |
province_code | string | requerido | ISO province code, e.g. PA-8; used to resolve destination region. |
zip | string | opcional | Postal / ZIP code. |
phone | string | opcional | Recipient phone number. |
notes | string | opcional | Delivery notes for the recipient location. |
latitude | float | opcional | Recipient GPS latitude. |
longitude | float | opcional | Recipient GPS longitude. |
Objeto Artículo
| Campo | Tipo | Requerido | Descripción |
|---|---|---|---|
title | string | requerido | Nombre del artículo / título del producto. |
sku | string | opcional | Identificador SKU. |
quantity | integer | requerido | Número de unidades. |
weight | float | requerido | Peso por unidad en libras. |
length | float | opcional | Dimensiones del paquete en pulgadas: length. |
width | float | opcional | Dimensiones del paquete en pulgadas: width. |
height | float | opcional | Dimensiones del paquete en pulgadas: height. |
package_type | string | opcional | Tipo de embalaje. |
declared_value | float | opcional | Valor declarado para fines de seguro. |
Ejemplo de cuerpo de solicitud
{
"order_number": "ORDER-1001",
"service_name": "Door-to-Door",
"customer": {"name": "John Doe", "email": "john@example.com", "phone": "+50760000000"},
"sender_details": {"name": "My Store", "address": "Sender Street 45", "city": "Panamá", "country": "Panama", "province_code": "PA-8", "latitude": 8.9824, "longitude": -79.5199},
"receiver_details": {"name": "John Doe", "address": "Street 123", "city": "Panamá", "country": "Panama", "province_code": "PA-8", "latitude": 8.9943, "longitude": -79.5188},
"items_information": [{"title": "Shoes", "sku": "SHOE-001", "quantity": 1, "weight": 1.2}]
}Respuesta (201)
{
"success": true,
"message": "Shipment created and payment processed. Label generation has been queued.",
"data": {
"shipment_id": 991,
"tracking_number": "4001234",
"status": "label_created",
"is_paid": true,
"payment_method": "shippea_wallet",
"total_price": 4.99,
"currency": "USD",
"wallet_balance": 195.01,
"service": {"id": 12, "name": "Door-to-Door", "type": "Door-to-Door"},
"calculation": {"total_items": 1, "total_weight": 1.2, "final_price": 4.99},
"items": [{"id": 1, "title": "Shoes", "quantity": 1, "weight": 1.2}]
}
}/api/v2/partner/shipments/{trackingNumber}
Obtiene el estado del envío y detalles completos usando el número de seguimiento devuelto al crear.
Solicitud
GET https://app.shippea.io/api/v2/partner/shipments/4001234Respuesta (200)
{
"success": true,
"data": {
"tracking_number": "4001234",
"order_number": "ORDER-1001",
"status": "in_transit",
"is_paid": true,
"total_price": 4.99,
"currency": "USD",
"service": {"id": 12, "name": "Door-to-Door", "type": "Door-to-Door"},
"sender": {"username": "My Store", "city": "Panamá", "country": "PA", "phone": "+50761110000"},
"receiver": {"username": "John Doe", "city": "Panamá", "country": "PA", "phone": "+50760000000"},
"items": [{"id": 1, "title": "Shoes", "quantity": 1, "weight": 1.2}],
"label_url": "https://app.shippea.io/storage/labels/4001234.pdf",
"tracking_history": [{"status": "confirmed", "remarks": "Payment confirmed", "timestamp": "2026-06-12 10:00:00"}],
"proof_of_delivery": {
"receiver_name": "John Doe",
"photos": ["https://app.shippea.io/storage/proof_of_delivery/4001234-1.jpg"],
"signature": "data:image/png;base64,iVBORw0KGgoAAAANSU...",
"location": {"lat": "8.98240000", "lng": "-79.51990000"},
"delivered_at": "2026-06-12 18:30:00"
},
"created_at": "2026-06-12 09:00:00",
"updated_at": "2026-06-12 18:00:00"
}
}Prueba de Entrega
La prueba de entrega incluye fotos, firma, nombre del receptor, ubicación GPS y fecha/hora capturada por el mensajero al momento de la entrega. Se devuelve como parte de la respuesta de GET /shipments/{trackingNumber}.
proof_of_delivery only populated once the shipment's status is delivered and a proof-of-delivery record exists; otherwise it is null. There is currently no equivalent proof-of-pickup field.Campos
| Campo | Tipo | Requerido | Descripción |
|---|---|---|---|
receiver_name | string|null | opcional | Name of the person who received the shipment. |
note | string|null | opcional | Free-text delivery note left by the courier. |
photos | array<string> | opcional | Absolute URLs of delivery photos. Empty array if none were captured. |
signature | string|null | opcional | Base64-encoded signature image data, or null if none was captured. |
location.lat | string|null | opcional | Latitude captured at the moment of delivery. |
location.lng | string|null | opcional | Longitude captured at the moment of delivery. |
delivered_at | string|null | opcional | Delivery timestamp, format Y-m-d H:i:s. |
Example — proof_of_delivery field on Obtener Envío
{
"proof_of_delivery": {
"receiver_name": "John Doe",
"note": "Left at front door",
"photos": ["https://app.shippea.io/storage/proof_of_delivery/4001234-1.jpg"],
"signature": "data:image/png;base64,iVBORw0KGgoAAAANSU...",
"location": {"lat": "8.98240000", "lng": "-79.51990000"},
"delivered_at": "2026-06-12 18:30:00"
}
}/api/v2/partner/shipments/{trackingNumber}
Cancela un envío cuando su estado actual permite la cancelación. Devuelve un error si el envío ya fue despachado o entregado.
Solicitud
DELETE https://app.shippea.io/api/v2/partner/shipments/4001234Respuesta (200)
{"success": true, "message": "Shipment cancelled successfully."}/api/v2/partner/shipments
Devuelve una lista paginada de todos los envíos de la cuenta partner autenticada. Los resultados están ordenados del más reciente al más antiguo.
Parámetros de Consulta
| Campo | Tipo | Requerido | Descripción |
|---|---|---|---|
status | string | opcional | Filtrar por estado: label_created, in_transit, delivered, cancelled. |
order_number | string | opcional | Filtrar por tu número de referencia interna de pedido. |
from_date | date | opcional | Fecha de creación más antigua a incluir. Formato: Y-m-d. |
to_date | date | opcional | Fecha de creación más reciente a incluir. Formato: Y-m-d. |
per_page | integer | opcional | Resultados por página. Por defecto: 20. Máximo: 100. |
Solicitud
GET https://app.shippea.io/api/v2/partner/shipments?status=label_created&per_page=20Respuesta (200)
{
"success": true,
"data": [
{
"shipment_id": 991,
"tracking_number": "4001234",
"order_number": "ORDER-1001",
"status": "label_created",
"is_paid": true,
"total_price": 4.99,
"currency": "USD",
"label_url": "https://...",
"created_at": "2026-06-12 10:00:00"
}
],
"meta": {"current_page": 1, "per_page": 20, "total": 145, "last_page": 8}
}/api/v2/partner/shipments/{trackingNumber}/pay
Debita la billetera y encola la generación asíncrona de etiqueta para un envío en estado PENDING_PAYMENT. En el flujo estándar, el pago se debita automáticamente al crear.
Solicitud
POST https://app.shippea.io/api/v2/partner/shipments/4001234/payRespuesta (200)
{
"success": true,
"message": "Payment successful. Label generation has been queued.",
"data": {
"tracking_number": "4001234",
"status": "label_created",
"transaction_id": "TXN-...",
"amount_charged": 4.99,
"currency": "USD",
"wallet_balance": 195.01
}
}/api/v2/partner/shipments/{trackingNumber}/label
Devuelve la URL de etiqueta para un envío. La generación es asíncrona; consulta este endpoint después de la creación hasta que se devuelva una URL. Si el envío está en PENDING_PAYMENT, devuelve 402.
Solicitud
GET https://app.shippea.io/api/v2/partner/shipments/4001234/labelRespuesta (200)
{
"success": true,
"data": {
"tracking_number": "4001234",
"label_url": "https://.../label.pdf",
"combined_url": "https://.../combined.pdf"
}
}Account & Wallet
/api/v2/partner/account
Devuelve el perfil de la cuenta partner autenticada, resumen de billetera y detalles del cliente API.
Solicitud
GET https://app.shippea.io/api/v2/partner/accountRespuesta (200)
{
"success": true,
"data": {
"account": {"name": "My Company", "email": "partner@example.com", "phone": "+50760000000", "status": "active"},
"wallet": {"balance": 195.01, "currency": "USD", "is_active": true},
"api_client": {"name": "My Integration", "client_id": "clnt_abc123", "webhook_url": "https://myapp.com/webhooks", "last_used_at": "2026-06-12 10:00:00"}
}
}Wallet
/api/v2/partner/wallet
Devuelve el saldo actual de la billetera, moneda y las últimas 20 transacciones.
Solicitud
GET https://app.shippea.io/api/v2/partner/walletRespuesta (200)
{
"success": true,
"data": {
"balance": 195.01,
"currency": "USD",
"is_active": true,
"transactions": [
{"type": "debit", "amount": 4.99, "balance": 195.01, "reason": "Shipment payment - 4001234", "reference": "SHIPMENT-4001234", "date": "2026-06-12 10:00:00"}
]
}
}Webhook
Webhook Configuration
Registra una webhook URL para notificaciones de eventos. Verifica los payloads calculando HMAC-SHA256(webhook_secret, raw_body) y comparándolo con el encabezado X-Shippea-Signature.
/api/v2/partner/webhook
Devuelve la URL y el secreto del webhook actualmente registrados para este cliente API.
Solicitud
GET https://app.shippea.io/api/v2/partner/webhookRespuesta (200)
{
"success": true,
"data": {
"webhook_url": "https://myapp.com/webhooks",
"webhook_secret": "shp_secret_abc..."
}
}/api/v2/partner/webhook
Registra o actualiza la URL del webhook. Se genera automáticamente un webhook_secret en el primer registro.
| Campo | Tipo | Requerido | Descripción |
|---|---|---|---|
webhook_url | string | requerido | URL HTTPS completa de tu endpoint para recibir notificaciones de eventos webhook. |
Solicitud
{
"webhook_url": "https://myapp.com/webhooks/shippea"
}Respuesta
{
"success": true,
"message": "Webhook URL registered successfully.",
"data": {
"webhook_url": "https://myapp.com/webhooks/shippea",
"webhook_secret": "shp_secret_abc..."
}
}/api/v2/partner/webhook
Elimina la URL de webhook registrada. No se enviarán más eventos a la URL antigua.
{"success": true, "message": "Webhook URL removed successfully."}Authentication
/api/v2/partner/auth/logout
Revoca el token de acceso actual. Las solicitudes posteriores con este token devuelven 401. Solo se revoca el token usado para esta solicitud; los demás tokens activos del mismo cliente no se ven afectados.
Solicitud
POST https://app.shippea.io/api/v2/partner/auth/logoutRespuesta (200)
{"success": true, "message": "Token revoked successfully."}Statuses
/api/v2/partner/statuses
Devuelve todos los códigos de estado de envío que usa Shippea, con su nombre en inglés y español. Se lee en vivo del mismo catálogo que administra el panel de administración; los estados nuevos aparecen aquí automáticamente en cuanto se agregan.
Solicitud
GET https://app.shippea.io/api/v2/partner/statusesRespuesta (200)
{
"success": true,
"data": [
{"id": 6, "code": "pending_payment", "name": {"en": "Pending Payment", "es": "Pago Pendiente"}},
{"id": 3, "code": "label_created", "name": {"en": "Label Created", "es": "Etiqueta Creada"}}
]
}Pickups
Pickups / Recogidas
/api/v2/partner/pickups
Lista tus propias solicitudes de recogida, las más recientes primero.
| Campo | Tipo | Requerido | Descripción |
|---|---|---|---|
per_page | integer | opcional | Resultados por página, máximo 100; por defecto 20. |
Solicitud
GET https://app.shippea.io/api/v2/partner/pickups?per_page=20Respuesta (200)
{
"success": true,
"data": [
{
"pickup_number": "PU-2026-0042",
"status": "pending",
"pickup_date": "2026-08-20",
"time_slot": "AM",
"pickup_address": "Calle 50, Ciudad de Panamá",
"phone_number": "+50760000000",
"package_count": 3,
"courier_provider": "hotexpress",
"created_at": "2026-08-13 10:00:00"
}
],
"meta": {"current_page": 1, "per_page": 20, "total": 4, "last_page": 1}
}/api/v2/partner/pickups
Envía una solicitud de recogida al courier. Se escribe en la misma cola que usa el panel de comercios de Shippea, por lo que se procesa con el mismo flujo de admin/courier y los correos de notificación se envían igual que desde el formulario del panel.
| Campo | Tipo | Requerido | Descripción |
|---|---|---|---|
pickup_date | date | requerido | Today or later, format YYYY-MM-DD. |
time_slot | string | requerido | AM (9:00am–12:00pm) or PM (1:00pm–3:00pm). |
pickup_address | string | requerido | Full address the courier picks up from. |
phone_number | string | requerido | Contact number at the pickup address. |
package_count | integer | requerido | Number of packages, 1–999. |
courier_provider | string | requerido | hotexpress or unoexpress. |
merchant_notes | string | opcional | Free-text notes for the courier. |
Ejemplo de cuerpo de solicitud
{
"pickup_date": "2026-08-20",
"time_slot": "AM",
"pickup_address": "Calle 50, Ciudad de Panamá",
"phone_number": "+50760000000",
"package_count": 3,
"courier_provider": "hotexpress",
"merchant_notes": "Ring the front desk"
}Respuesta (201)
{
"success": true,
"data": {
"pickup_number": "PU-2026-0042",
"status": "pending",
"pickup_date": "2026-08-20",
"time_slot": "AM",
"pickup_address": "Calle 50, Ciudad de Panamá",
"phone_number": "+50760000000",
"package_count": 3,
"courier_provider": "hotexpress",
"merchant_notes": "Ring the front desk",
"created_at": "2026-08-13 10:00:00"
}
}/api/v2/partner/pickups/{pickupNumber}
Obtiene el estado actual de una recogida que enviaste. status puede ser: pending, confirmed, completed, rejected o cancelled.
Solicitud
GET https://app.shippea.io/api/v2/partner/pickups/PU-2026-0042Respuesta (200)
{
"success": true,
"data": {
"pickup_number": "PU-2026-0042",
"status": "confirmed",
"pickup_date": "2026-08-20",
"time_slot": "AM",
"pickup_address": "Calle 50, Ciudad de Panamá",
"phone_number": "+50760000000",
"package_count": 3,
"courier_provider": "hotexpress",
"courier_notes": null,
"rejected_reason": null,
"updated_at": "2026-08-13 14:00:00"
}
}Reference
Regiones Reference
Panama region IDs and ISO codes to use with region_id, origin_region_id, and province_code. Usa GET /regions para recuperar IDs vivos; pueden diferir entre producción y sandbox.
Códigos de Provincia para Campos de Envío
| ID de Región | Nombre de Provincia | Código ISO de Provincia | Uso |
|---|---|---|---|
1 | Bocas del Toro | PA-1 | region_id=1, province_code="PA-1" |
2 | Coclé | PA-2 | region_id=2, province_code="PA-2" |
3 | Colón | PA-3 | region_id=3, province_code="PA-3" |
4 | Chiriquí | PA-4 | region_id=4, province_code="PA-4" |
5 | Darién | PA-5 | region_id=5, province_code="PA-5" |
6 | Herrera | PA-6 | region_id=6, province_code="PA-6" |
7 | Los Santos | PA-7 | region_id=7, province_code="PA-7" |
8 | Panamá | PA-8 | region_id=8, province_code="PA-8" |
9 | Veraguas | PA-9 | region_id=9, province_code="PA-9" |
10 | Kuna Yala (Guna Yala) | PA-KY | region_id=10, province_code="PA-KY" |
11 | Panamá Oeste | PA-10 | region_id=11, province_code="PA-10" |
Reference
Códigos de Error
Todos los errores devuelven success: false y un message legible. El código de estado HTTP indica la categoría del error.
| HTTP | Código de Error | Descripción |
|---|---|---|
422 | VALIDATION_ERROR | Campos faltantes o inválidos. |
401 | UNAUTHORIZED | Token Bearer inválido o expirado. |
403 | AUTH_INACTIVE_ACCOUNT | Cuenta o billetera inactiva. |
422 | SERVICE_NOT_FOUND | El nombre o ID de servicio especificado no coincide con ningún servicio activo. |
400 | INSUFFICIENT_WALLET_BALANCE | El saldo de la billetera es inferior al costo del servicio. |
404 | SHIPMENT_NOT_FOUND | Ningún envío coincide con el número de seguimiento. |
400 | CANNOT_CANCEL | El envío superó el estado cancelable — ya fue despachado o entregado. |
404 | LABEL_NOT_READY | La etiqueta aún no ha sido generada. Reintenta en unos segundos. |
402 | PAYMENT_REQUIRED | El envío está pendiente de pago antes de que se pueda emitir la etiqueta. |
Developer Tools
Colección Postman
Descarga la colección Postman para obtener todos los endpoints v2 preconfigurados con scripts de guardado automático de token.
Partner API – Postman Collection
Después de importar, configura la variable base_url e ingresa client_id y client_secret. La solicitud de token de Auth guarda automáticamente el token en una variable de colección.
-5.png)