Shippea Partner API Documentation
API REST completa para partners SaaS e integraciones personalizadas: autenticación Bearer, pagos de envíos por billetera, búsqueda de servicios, tracking, consulta de etiquetas, cancelación y webhooks.
Descripción General
Shippea Partner API
Esta API está diseñada para plataformas SaaS de terceros e integraciones personalizadas. Si estás desarrollando una app de Shopify, usa la API de Integración Shopify v1, ya que utiliza autenticación por clave de app y un modelo de datos nativo de Shopify.
Authentication
Bearer token via client credentials
Content Type
application/json
Production
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 {BASE_URL}/auth/token
Content-Type: application/json
{
"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."
}cURL Example
curl --request POST '{BASE_URL}/auth/token' \
--header 'Content-Type: application/json' \
--data '{
"client_id": "your_client_id",
"client_secret": "your_client_secret"
}'
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 {BASE_URL}/regionsRespuesta (200)
{
"success": true,
"data": [
{"id": 1, "name": "Panamá", "iso_code": "PA-8"}
]
}cURL Example
curl --request GET '{BASE_URL}/regions' \
--header 'Authorization: Bearer YOUR_ACCESS_TOKEN' \
--header 'Accept: application/json'
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. También soporta coordenadas para cotización dinámica/ASAP.
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 {BASE_URL}/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}
}
]
}cURL Example
curl --request GET '{BASE_URL}/services?region_id=1&origin_region_id=2&weight=2.5' \
--header 'Authorization: Bearer YOUR_ACCESS_TOKEN' \
--header 'Accept: application/json'
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 — no se crea un duplicado.
Request Body Fields
| 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"}
}cURL Example
curl --request POST '{BASE_URL}/customers' \
--header 'Authorization: Bearer YOUR_ACCESS_TOKEN' \
--header 'Content-Type: application/json' \
--data '{
"first_name": "John",
"last_name": "Doe",
"email": "john@example.com",
"phone": "+50760000000",
"password": "optionalStrongPassword"
}'
Shipments
Shipment Lifecycle
Shippea soporta creación, pago, listado, tracking, consulta de etiquetas y cancelación. En el flujo estándar, la creación del envío debita la billetera automáticamente y encola la generación de etiqueta de forma asíncrona.
/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. Consulta GET /shipments/{tracking}/label hasta que la etiqueta esté disponible.order_number dos veces, se devuelve el envío original sin crear un duplicado.Request Body Fields
| Campo | Tipo | Requerido | Descripción |
|---|---|---|---|
service_id | integer | OPCIONAL* | ID del servicio de Listar Servicios. Proporciona service_id o service_name. |
service_name | string | OPCIONAL* | Nombre exacto del servicio. Alternativa a service_id. |
order_number | string | OPCIONAL | Tu referencia interna de pedido, almacenada contra el envío. |
customer | object | OPCIONAL | Datos del cliente: nombre, email, teléfono. |
sender_details | object | REQUERIDO | Datos de recogida/remitente. Ver Objeto Remitente. |
receiver_details | object | REQUERIDO | Datos de entrega/destinatario. Ver Objeto Destinatario. |
items_information | array | REQUERIDO | Array de objetos artículo. Ver Objeto Artículo. |
Objeto Remitente
| Campo | Tipo | Requerido | Descripción |
|---|---|---|---|
name | string | OPCIONAL | Nombre completo o nombre comercial del remitente. |
first_name | string | OPCIONAL | Nombre del remitente. Alternativa a name. |
last_name | string | OPCIONAL | Apellido del remitente. Alternativa a name. |
email | string | OPCIONAL | Email del remitente. |
address | string | REQUERIDO | Dirección completa de la calle. |
address_2 | string | OPCIONAL | Línea adicional de dirección: suite, piso, local, 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 | Notas adicionales para la ubicación de recogida. |
latitude | float | OPCIONAL | Coordenada GPS de recogida: latitud. |
longitude | float | OPCIONAL | Coordenada GPS de recogida: longitud. |
Objeto Destinatario
| Campo | Tipo | Requerido | Descripción |
|---|---|---|---|
name | string | OPCIONAL | Nombre completo del destinatario. Alternativa a first_name + last_name. |
first_name | string | OPCIONAL | Nombre del destinatario. |
last_name | string | OPCIONAL | Apellido del destinatario. |
email | string | OPCIONAL | Email del destinatario. |
address | string | REQUERIDO | Dirección completa del destinatario. |
address_2 | string | OPCIONAL | Línea adicional de dirección. |
city | string | REQUERIDO | Ciudad del destinatario. |
country | string | REQUERIDO | País del destinatario, por ejemplo Panama. |
province_code | string | REQUERIDO | Código de provincia ISO, por ejemplo PA-8. Usado para resolver la región destino. |
zip | string | OPCIONAL | Código postal / ZIP. |
phone | string | OPCIONAL | Número de teléfono del destinatario. |
notes | string | OPCIONAL | Notas de entrega para la ubicación del destinatario. |
latitude | float | OPCIONAL | Coordenada GPS del destinatario: latitud. |
longitude | float | OPCIONAL | Coordenada GPS del destinatario: longitud. |
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 | Largo del paquete en pulgadas. |
width | float | OPCIONAL | Ancho del paquete en pulgadas. |
height | float | OPCIONAL | Alto del paquete en pulgadas. |
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",
"email": "store@example.com",
"address": "Sender Street 45",
"city": "Panamá",
"country": "Panama",
"province_code": "PA-8",
"zip": "0801",
"phone": "+50761110000",
"latitude": 8.9824,
"longitude": -79.5199
},
"receiver_details": {
"name": "John Doe",
"email": "john@example.com",
"address": "Street 123",
"city": "Panamá",
"country": "Panama",
"province_code": "PA-8",
"zip": "0801",
"phone": "+50760000000",
"latitude": 8.9943,
"longitude": -79.5188
},
"items_information": [
{"title": "Shoes", "sku": "SHOE-001", "quantity": 1, "weight": 1.2, "length": 12, "width": 8, "height": 5, "package_type": "Box", "declared_value": 35}
]
}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, "total_declared_value": 35, "base_price": 4.99, "return_fee": 0, "final_price": 4.99},
"items": [{"id": 1, "title": "Shoes", "sku": "SHOE-001", "quantity": 1, "weight": 1.2, "length": 12, "width": 8, "height": 5, "package_type": "Box", "declared_value": 35, "description": null, "category": null}]
}
}cURL Example
curl --request POST '{BASE_URL}/shipments' \
--header 'Authorization: Bearer YOUR_ACCESS_TOKEN' \
--header 'Content-Type: application/json' \
--data '{
"order_number": "ORDER-1001",
"service_name": "Door-to-Door",
"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": {"address":"Street 123","city":"Panamá","country":"Panama","province_code":"PA-8","latitude":8.9943,"longitude":-79.5188},
"items_information": [{"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 {BASE_URL}/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", "address": "Sender Street 45", "city": "Panamá", "country": "PA", "phone": "+50761110000"},
"receiver": {"username": "John Doe", "address": "Street 123", "city": "Panamá", "country": "PA", "phone": "+50760000000"},
"items": [{"id": 1, "title": "Shoes", "sku": "SHOE-001", "quantity": 1, "weight": 1.2, "length": 12, "width": 8, "height": 5, "package_type": "Box", "declared_value": 35, "description": null, "category": null}],
"label_url": "https://app.shippea.io/storage/labels/4001234.pdf",
"tracking_history": [
{"status": "confirmed", "remarks": "Payment confirmed", "location": null, "timestamp": "2026-06-12 10:00:00"},
{"status": "picked_up", "remarks": "Picked up by courier", "location": "Panamá", "timestamp": "2026-06-12 14:30:00"},
{"status": "in_transit", "remarks": "In transit", "location": "Penonomé", "timestamp": "2026-06-12 18:00:00"}
],
"created_at": "2026-06-12 09:00:00",
"updated_at": "2026-06-12 18:00:00"
}
}cURL Example
curl --request GET '{BASE_URL}/shipments/4001234' \
--header 'Authorization: Bearer YOUR_ACCESS_TOKEN' \
--header 'Accept: application/json'/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 {BASE_URL}/shipments/4001234Respuesta (200)
{
"success": true,
"message": "Shipment cancelled successfully."
}cURL Example
curl --request DELETE '{BASE_URL}/shipments/4001234' \
--header 'Authorization: Bearer YOUR_ACCESS_TOKEN' \
--header 'Accept: application/json'/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.
Query Parameters
| Campo | Tipo | Requerido | Descripción |
|---|---|---|---|
status | string | OPCIONAL | Filtrar por estado del envío: label_created, in_transit, delivered, cancelled. |
order_number | string | OPCIONAL | Filtrar por tu 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 {BASE_URL}/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}
}cURL Example
curl --request GET '{BASE_URL}/shipments?per_page=20' \
--header 'Authorization: Bearer YOUR_ACCESS_TOKEN' \
--header 'Accept: application/json'/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. Solo aplica a envíos que no fueron pagados automáticamente en la creación.
PENDING_PAYMENT.Solicitud
POST {BASE_URL}/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
}
}cURL Example
curl --request POST '{BASE_URL}/shipments/4001234/pay' \
--header 'Authorization: Bearer YOUR_ACCESS_TOKEN' \
--header 'Accept: application/json'/api/v2/partner/shipments/{trackingNumber}/label
Devuelve la URL de etiqueta para un envío. La generación de etiqueta es asíncrona — consulta este endpoint después de la creación hasta que se devuelva una URL.
PENDING_PAYMENT, se devuelve una respuesta 402 indicando que se requiere pago primero.Solicitud
GET {BASE_URL}/shipments/4001234/labelRespuesta (200)
{
"success": true,
"data": {
"tracking_number": "4001234",
"label_url": "https://.../label.pdf",
"combined_url": "https://.../combined.pdf"
}
}cURL Example
curl --request GET '{BASE_URL}/shipments/4001234/label' \
--header 'Authorization: Bearer YOUR_ACCESS_TOKEN' \
--header 'Accept: application/json'Account & Wallet
/api/v2/partner/account
Devuelve el perfil de la cuenta partner autenticada, resumen de billetera y detalles del cliente API.
Solicitud
GET {BASE_URL}/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"}
}
}cURL Example
curl --request GET '{BASE_URL}/account' \
--header 'Authorization: Bearer YOUR_ACCESS_TOKEN' \
--header 'Accept: application/json'
Wallet
/api/v2/partner/wallet
Devuelve el saldo actual de la billetera, moneda, estado activo y las últimas 20 transacciones.
Solicitud
GET {BASE_URL}/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"}
]
}
}cURL Example
curl --request GET '{BASE_URL}/wallet' \
--header 'Authorization: Bearer YOUR_ACCESS_TOKEN' \
--header 'Accept: application/json'
Webhook
Webhook Configuration
Registra una URL de webhook para recibir notificaciones de eventos de envío. Verifica los payloads entrantes 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 {BASE_URL}/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 — guárdalo de forma segura para verificar los payloads entrantes.
Request Body
| Campo | Tipo | Requerido | Descripción |
|---|---|---|---|
webhook_url | string | REQUERIDO | URL HTTPS completa de tu endpoint para recibir notificaciones webhook. |
Solicitud
PUT {BASE_URL}/webhook
Content-Type: application/json
{
"webhook_url": "https://myapp.com/webhooks/shippea"
}Respuesta (200)
{
"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 del webhook registrada. No se enviarán más eventos a la URL antigua.
Solicitud
DELETE {BASE_URL}/webhookRespuesta (200)
{
"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.
Solicitud
POST {BASE_URL}/auth/logoutRespuesta (200)
{
"success": true,
"message": "Token revoked successfully."
}cURL Example
curl --request POST '{BASE_URL}/auth/logout' \
--header 'Authorization: Bearer YOUR_ACCESS_TOKEN' \
--header 'Accept: application/json'
Reference
Regiones Reference
Panama region IDs and ISO codes to use with the region_id and origin_region_id query parameters on the /services endpoint, and the province_code fields in shipment creation. Use the /regions endpoint to retrieve live IDs.
region_id integers and province_code ISO values below are defaults for Panama. Always verify IDs against your environment using GET /regions — IDs may differ between production and sandbox.Province Codes for Shipment Fields
Use the province_code ISO value in sender_details.province_code and receiver_details.province_code when creating shipments.
| Region ID | Province Name | ISO Province Code | Usage |
|---|---|---|---|
| 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" |
Errors
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. |
Standard Error Shape
{
"success": false,
"message": "Human-readable error message."
}
Reference
Colección Postman
Descarga la colección Postman para obtener todos los endpoints v2 preconfigurados con scripts de guardado automático de token.
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)