Shippea
Shippea Partner API

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

POST

/api/v2/partner/auth/token

Obtener access 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.

Public endpoint • No bearer token required

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

GET

/api/v2/partner/regions

Listar regiones

Devuelve todas las regiones activas disponibles para cobertura de servicio. Usa el id de región al consultar servicios.

Requires header: Authorization: Bearer <token>

Solicitud

GET {BASE_URL}/regions

Respuesta (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

GET

/api/v2/partner/services

Cotizar servicios

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.

Required query: region_id • Optional query: origin_region_id, weight, coordinates for ASAP

Solicitud Parameters

CampoTipoRequeridoDescripción
region_idintegerREQUERIDOID de región del endpoint Listar Regiones.
origin_region_idintegerOPCIONALID de la región de origen del remitente. Los couriers regionales que no cubren este origen son excluidos.
weightfloatOPCIONALPeso en libras. Cuando se proporciona, solo se devuelven servicios cuyo rango de peso cubre este valor.
sender_latfloatOPCIONALLatitud de la dirección de retiro del remitente. Requerido para cotización dinámica/ASAP.
sender_longfloatOPCIONALLongitud de la dirección de retiro del remitente. Requerido para cotización dinámica/ASAP.
receiver_latfloatOPCIONALLatitud de la dirección de entrega del destinatario. Requerido para cotización dinámica/ASAP.
receiver_longfloatOPCIONALLongitud 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.5

Respuesta (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

POST

/api/v2/partner/customers

Crear customer

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.

Requires header: Authorization: Bearer <token>

Request Body Fields

CampoTipoRequeridoDescripción
first_namestringREQUERIDONombre del cliente.
last_namestringREQUERIDOApellido del cliente.
emailstringREQUERIDODirección de email. Usado como identificador único — devuelve el registro existente si ya está registrado.
phonestringOPCIONALNúmero de teléfono en formato internacional.
passwordstringOPCIONALContraseñ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.

Service lookupCreate shipmentWallet debitAsync label generationTrack shipment
POST

/api/v2/partner/shipments

Crear shipment

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.

Pago inmediato: La billetera se debita en el momento de la creación. El envío comienza en estado label_created con is_paid: true. Consulta GET /shipments/{tracking}/label hasta que la etiqueta esté disponible.
Idempotencia: Si envías el mismo order_number dos veces, se devuelve el envío original sin crear un duplicado.

Request Body Fields

CampoTipoRequeridoDescripción
service_idintegerOPCIONAL*ID del servicio de Listar Servicios. Proporciona service_id o service_name.
service_namestringOPCIONAL*Nombre exacto del servicio. Alternativa a service_id.
order_numberstringOPCIONALTu referencia interna de pedido, almacenada contra el envío.
customerobjectOPCIONALDatos del cliente: nombre, email, teléfono.
sender_detailsobjectREQUERIDODatos de recogida/remitente. Ver Objeto Remitente.
receiver_detailsobjectREQUERIDODatos de entrega/destinatario. Ver Objeto Destinatario.
items_informationarrayREQUERIDOArray de objetos artículo. Ver Objeto Artículo.

Objeto Remitente

CampoTipoRequeridoDescripción
namestringOPCIONALNombre completo o nombre comercial del remitente.
first_namestringOPCIONALNombre del remitente. Alternativa a name.
last_namestringOPCIONALApellido del remitente. Alternativa a name.
emailstringOPCIONALEmail del remitente.
addressstringREQUERIDODirección completa de la calle.
address_2stringOPCIONALLínea adicional de dirección: suite, piso, local, etc.
citystringREQUERIDONombre de la ciudad.
countrystringREQUERIDONombre del país.
province_codestringOPCIONALCódigo de provincia ISO. Usado para resolver la región.
zipstringOPCIONALCódigo postal.
phonestringOPCIONALNúmero de teléfono de contacto.
notesstringOPCIONALNotas adicionales para la ubicación de recogida.
latitudefloatOPCIONALCoordenada GPS de recogida: latitud.
longitudefloatOPCIONALCoordenada GPS de recogida: longitud.

Objeto Destinatario

CampoTipoRequeridoDescripción
namestringOPCIONALNombre completo del destinatario. Alternativa a first_name + last_name.
first_namestringOPCIONALNombre del destinatario.
last_namestringOPCIONALApellido del destinatario.
emailstringOPCIONALEmail del destinatario.
addressstringREQUERIDODirección completa del destinatario.
address_2stringOPCIONALLínea adicional de dirección.
citystringREQUERIDOCiudad del destinatario.
countrystringREQUERIDOPaís del destinatario, por ejemplo Panama.
province_codestringREQUERIDOCódigo de provincia ISO, por ejemplo PA-8. Usado para resolver la región destino.
zipstringOPCIONALCódigo postal / ZIP.
phonestringOPCIONALNúmero de teléfono del destinatario.
notesstringOPCIONALNotas de entrega para la ubicación del destinatario.
latitudefloatOPCIONALCoordenada GPS del destinatario: latitud.
longitudefloatOPCIONALCoordenada GPS del destinatario: longitud.

Objeto Artículo

CampoTipoRequeridoDescripción
titlestringREQUERIDONombre del artículo / título del producto.
skustringOPCIONALIdentificador SKU.
quantityintegerREQUERIDONúmero de unidades.
weightfloatREQUERIDOPeso por unidad en libras.
lengthfloatOPCIONALLargo del paquete en pulgadas.
widthfloatOPCIONALAncho del paquete en pulgadas.
heightfloatOPCIONALAlto del paquete en pulgadas.
package_typestringOPCIONALTipo de embalaje.
declared_valuefloatOPCIONALValor 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}]
    }'
GET

/api/v2/partner/shipments/{trackingNumber}

Get shipment / tracking

Obtiene el estado del envío y detalles completos usando el número de seguimiento devuelto al crear.

Requires header: Authorization: Bearer <token>

Solicitud

GET {BASE_URL}/shipments/4001234

Respuesta (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'
DELETE

/api/v2/partner/shipments/{trackingNumber}

Cancelar shipment

Cancela un envío cuando su estado actual permite la cancelación. Devuelve un error si el envío ya fue despachado o entregado.

Requires header: Authorization: Bearer <token>

Solicitud

DELETE {BASE_URL}/shipments/4001234

Respuesta (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'
GET

/api/v2/partner/shipments

Listar 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.

Requires header: Authorization: Bearer <token>

Query Parameters

CampoTipoRequeridoDescripción
statusstringOPCIONALFiltrar por estado del envío: label_created, in_transit, delivered, cancelled.
order_numberstringOPCIONALFiltrar por tu referencia interna de pedido.
from_datedateOPCIONALFecha de creación más antigua a incluir. Formato: Y-m-d.
to_datedateOPCIONALFecha de creación más reciente a incluir. Formato: Y-m-d.
per_pageintegerOPCIONALResultados por página. Por defecto: 20. Máximo: 100.

Solicitud

GET {BASE_URL}/shipments?status=label_created&per_page=20

Respuesta (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'
POST

/api/v2/partner/shipments/{trackingNumber}/pay

Pagar shipment

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.

En el flujo estándar, el pago se debita automáticamente al crear. Este endpoint solo se necesita para envíos que estén explícitamente en estado PENDING_PAYMENT.

Solicitud

POST {BASE_URL}/shipments/4001234/pay

Respuesta (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'
GET

/api/v2/partner/shipments/{trackingNumber}/label

Consultar 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.

Si el envío aún está en estado PENDING_PAYMENT, se devuelve una respuesta 402 indicando que se requiere pago primero.

Solicitud

GET {BASE_URL}/shipments/4001234/label

Respuesta (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

GET

/api/v2/partner/account

Account

Devuelve el perfil de la cuenta partner autenticada, resumen de billetera y detalles del cliente API.

Requires header: Authorization: Bearer <token>

Solicitud

GET {BASE_URL}/account

Respuesta (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

GET

/api/v2/partner/wallet

Wallet balance

Devuelve el saldo actual de la billetera, moneda, estado activo y las últimas 20 transacciones.

Los envíos se pagan a través de la Shippea Wallet. En el flujo estándar, la creación del envío debita la billetera automáticamente.

Solicitud

GET {BASE_URL}/wallet

Respuesta (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.

GET

/api/v2/partner/webhook

Get webhook

Devuelve la URL y el secreto del webhook actualmente registrados para este cliente API.

Solicitud

GET {BASE_URL}/webhook

Respuesta (200)

{
  "success": true,
  "data": {"webhook_url": "https://myapp.com/webhooks", "webhook_secret": "shp_secret_abc..."}
}
PUT

/api/v2/partner/webhook

Registrar / actualizar 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

CampoTipoRequeridoDescripción
webhook_urlstringREQUERIDOURL 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..."}
}
DELETE

/api/v2/partner/webhook

Eliminar webhook

Elimina la URL del webhook registrada. No se enviarán más eventos a la URL antigua.

Solicitud

DELETE {BASE_URL}/webhook

Respuesta (200)

{
  "success": true,
  "message": "Webhook URL removed successfully."
}

Authentication

POST

/api/v2/partner/auth/logout

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 {BASE_URL}/auth/logout

Respuesta (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.

The 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 IDProvince NameISO Province CodeUsage
1Bocas del ToroPA-1region_id=1, province_code="PA-1"
2CocléPA-2region_id=2, province_code="PA-2"
3ColónPA-3region_id=3, province_code="PA-3"
4ChiriquíPA-4region_id=4, province_code="PA-4"
5DariénPA-5region_id=5, province_code="PA-5"
6HerreraPA-6region_id=6, province_code="PA-6"
7Los SantosPA-7region_id=7, province_code="PA-7"
8PanamáPA-8region_id=8, province_code="PA-8"
9VeraguasPA-9region_id=9, province_code="PA-9"
10Kuna Yala (Guna Yala)PA-KYregion_id=10, province_code="PA-KY"
11Panamá OestePA-10region_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.

HTTPCódigo de ErrorDescripción
422VALIDATION_ERRORCampos faltantes o inválidos.
401UNAUTHORIZEDToken Bearer inválido o expirado.
403AUTH_INACTIVE_ACCOUNTCuenta o billetera inactiva.
422SERVICE_NOT_FOUNDEl nombre o ID de servicio especificado no coincide con ningún servicio activo.
400INSUFFICIENT_WALLET_BALANCEEl saldo de la billetera es inferior al costo del servicio.
404SHIPMENT_NOT_FOUNDNingún envío coincide con el número de seguimiento.
400CANNOT_CANCELEl envío superó el estado cancelable — ya fue despachado o entregado.
404LABEL_NOT_READYLa etiqueta aún no ha sido generada. Reintenta en unos segundos.
402PAYMENT_REQUIREDEl 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.

📮 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.