28 resultados
Navegar Seleccionar ESC Cerrar

Documentación.

API REST para consultar tracking, agencias y ubicaciones de shalom.com.pe, y crear pedidos en pro.shalom.pe.

Auth

X-API-Key

Rate limit

60 / min

Formato

JSON

Base URL: https://api.shalom-api-peru.com

Autenticación

Todas las rutas requieren el header X-API-Key con tu key.

X-API-Key: tu-api-key

Solicita tu API key por WhatsApp:

925 875 418

Errores

Estructura consistente en todos los errores:

{
  "error": {
    "code": "not_found",
    "message": "orden no existe",
    "request_id": "01JXZ..."
  }
}
HTTPcodeDescripción
400bad_requestParámetros faltantes o inválidos
401unauthorizedAPI key invalida o ausente
401shalom_auth_failedCredenciales de Shalom Pro rechazadas (solo /v1/orders)
403forbiddenSin permisos
404not_foundRecurso no existe
409conflictConflicto de estado (ej. persona duplicada en /v1/orders)
422upstream_rejectedShalom Pro rechazó la solicitud por una regla de negocio
429rate_limitedRate limit excedido
502upstream_unavailableShalom Pro no respondió o devolvió algo inesperado
502shalom_unavailableShalom Pro no disponible (solo /v1/orders)
504upstream_timeoutShalom Pro tardó más de 30s en responder
500internalError interno

Rate Limits

Limite por defecto: 60 requests por minuto por API key.

X-RateLimit-Limit: 60
X-RateLimit-Remaining: 55
X-RateLimit-Reset: 1713200060
GET/v1/tracking

Busca una orden y retorna orden + estados en paralelo.

Query params (al menos 1 requerido)

ParamTipoDescripción
numerostringEl identificador del envío que aparece impreso en el comprobante físico. 8 a 10 dígitos (ej. "12345678"). Mismo que guia en la respuesta de POST /v1/orders.
codigostringIdentificador alternativo, alfanumérico de 4 caracteres (ej. "CJTW"). Lo asigna Shalom.
ose_idstringID que asigna el sistema OSE (Operador de Servicios Electrónicos / SUNAT). Lo devuelve esta misma respuesta en order.ose_id y se usa como path param en los endpoints siguientes (/events, /voucher, /grt). Si ya tienes numero o codigo, no necesitas este.

Necesitas al menos uno de los tres params. El caso más común es mandar numero + codigo juntos (ambos vienen impresos en el comprobante físico). El ose_id se usa cuando ya lo tienes de la respuesta de POST /v1/orders.

Request — por numero + codigo
curl -H "X-API-Key: mi-key" \
  "https://api.shalom-api-peru.com/v1/tracking?numero=82100156&codigo=W79H"
Request — por ose_id
curl -H "X-API-Key: mi-key" \
  "https://api.shalom-api-peru.com/v1/tracking?ose_id=584210"
200 OK
{
  "order": {
    "ose_id": 584210,
    "numero_orden": "0123456789",
    "entregado": true,
    "origen": { "nombre": "LIMA" },
    "destino": { "nombre": "AREQUIPA" }
  },
  "status": {
    "origen":    { "fecha": "15/04/2026", "hora": "09:30" },
    "entregado": { "fecha": "16/04/2026", "hora": "11:40" }
  }
}
GET/v1/tracking/{ose_id}/events

Hitos del envio: origen, transito, demora, destino, entregado, reparto.

PathTipoDescripción
ose_idstringID del sistema OSE (SUNAT) — el campo order.ose_id de la respuesta de GET /v1/tracking. Es el handle público para acceder a eventos, comprobante y GRT.
200 OK
{
  "origen":    { "fecha": "15/04/2026", "hora": "09:30", "descripcion": "Recibido en agencia de origen" },
  "transito":  { "fecha": "15/04/2026", "hora": "14:20", "descripcion": "En viaje" },
  "demora":    null,
  "destino":   { "fecha": "16/04/2026", "hora": "08:15", "descripcion": "Llegó a destino" },
  "entregado": { "fecha": "16/04/2026", "hora": "11:40", "descripcion": "Entregado al destinatario" },
  "reparto":   null
}
GET/v1/tracking/{ose_id}/voucher

Comprobante de la orden. Retorna 404 si no tiene comprobante emitido.

GET/v1/tracking/{ose_id}/grt?cap_id={cap_id}

Enlace a la Guía de Remisión del Transportista. Un envío puede pasar por varios cargueros (transportistas) y cada uno emite su propio GRT — por eso el cap_id es obligatorio.

ParamEnDescripción
ose_idpathID del sistema OSE (SUNAT) — el campo order.ose_id de la respuesta de GET /v1/tracking.
cap_idqueryID del carguero (transportista). Los ids están en status.transito.cargueros[] de GET /v1/tracking. (requerido)
Request
curl -H "X-API-Key: tu-api-key" \
  "https://api.shalom-api-peru.com/v1/tracking/584210/grt?cap_id=898441"
200 OK
{
  "enlace": "https://..."
}
GET/v1/agencies

Lista paginada de agencias.

ParamDefaultDescripción
page1Página
per_page100Ítems por página (máx 500)
200 OK
{
  "page": 1,
  "per_page": 100,
  "items": [
    {
      "id": 1,
      "nombre": "LIMA CENTRO",
      "departamento": "LIMA",
      "aereo": true,
      "latitud": -12.046,
      "longitud": -77.030
    }
  ]
}
GET/v1/agencies/{id}

Detalle completo de una agencia por ID numérico.

GET/v1/locations/departments

Todos los departamentos del Perú.

{
  "items": [
    { "id": 1, "name": "AMAZONAS", "ubi_id": 101 }
  ]
}
GET/v1/locations/departments/{depId}/provinces

Provincias de un departamento.

PathDescripción
depIdID del departamento
GET/v1/locations/departments/{depId}/provinces/{provId}/districts

Distritos de una provincia.

PathDescripción
depIdID del departamento
provIdID de la provincia

Crear pedido en Shalom Pro

Crea una guía de envío real en la cuenta de Shalom Pro del cliente y devuelve los identificadores para tracking, descarga de PDF y operaciones posteriores. La resolución de remitente y destinatario, la validación del servicio de cobranza y la cotización se hacen automáticamente en una sola llamada.

Auth a dos niveles. Además del header X-API-Key, estos endpoints exigen las credenciales del cliente final contra Shalom Pro. Hay dos formas — elige una.

Importante: cada llamada exitosa a POST /v1/orders crea una preguía real en la cuenta de Shalom Pro. La orden queda registrada y visible en el panel de pro.shalom.pe. Si fue creada por error, puedes borrarla con DELETE /v1/orders/{id} mientras no haya sido despachada.

Auth Shalom — opción A (recomendada): token efímero

Haces POST /v1/shalom/sessions una vez con email + password en el body, recibes un session_token con TTL de 2 horas, y las llamadas siguientes (productos, crear/listar/borrar orden) usan header X-Shalom-Session: ssk_.... El password viaja una sola vez. Recomendado para integraciones que loguean requests.

Auth Shalom — opción B: email/password directo

Mandás X-Shalom-Email + X-Shalom-Password en cada request. Más simple — sin paso previo — pero el password viaja en cada llamada. Ideal para scripts cortos o pruebas rápidas.

Headers

HeaderCuándoDescripción
X-API-KeysiempreTu API key de Shalom API Perú.
X-Shalom-Sessionopción AToken ssk_... emitido por POST /v1/shalom/sessions. Si está, tiene precedencia sobre email/password.
X-Shalom-Emailopción BEmail de la cuenta del cliente en pro.shalom.pe.
X-Shalom-Passwordopción BPassword de esa cuenta. NO se loguea ni persiste en nuestro servidor.
Content-TypePOST/PUTapplication/json

Latencia y cache

Latencia típica: 700ms – 1.5s en el primer pedido de cada cuenta, ~700ms en los siguientes (la sesión se reutiliza durante 90 minutos sin re-autenticación).

POST/v1/shalom/sessions

Valida las credenciales contra pro.shalom.pe y emite un token efímero (formato ssk_<64-hex>) con TTL de 2 horas.

El password viaja en el body, no en headers. Headers HTTP suelen aparecer en logs por defecto (proxies, error trackers, observabilidad); el body solo si configuras logging de bodies. El password no se persiste en ningún lado — se usa solo para emitir el token y se descarta.

Request
curl -X POST https://api.shalom-api-peru.com/v1/shalom/sessions \
  -H "X-API-Key: tu-api-key" \
  -H "Content-Type: application/json" \
  -d '{
    "email": "cliente@empresa.com",
    "password": "tu-password-de-shalom-pro"
  }'
200 OK
{
  "session_token": "ssk_a1b2c3d4e5f6...",
  "expires_at": "2026-05-08T18:23:01Z"
}

Body

CampoTipoDescripción
emailstringEmail de la cuenta en pro.shalom.pe.
passwordstringPassword de esa cuenta.

Cuándo el token expira

TTL del token: 2 horas desde la emisión. Si una request usa un token vencido, devuelve 401 con código shalom_auth_failed — pide uno nuevo. Los tokens se mantienen en memoria, así que los reinicios del servicio los invalidan.

Errores

HTTPcodeCuándo se da
400bad_requestBody inválido o email/password vacíos.
401shalom_auth_failedCredenciales rechazadas por Shalom Pro.
502shalom_unavailablePro Web caído o respuesta inesperada.
DELETE/v1/shalom/sessions

Revoca un token antes de que expire. Idempotente: si el token ya estaba revocado o nunca existió, igual responde 200. Útil para forzar logout cuando el cliente cambia de cuenta o detecta actividad sospechosa.

Request
curl -X DELETE https://api.shalom-api-peru.com/v1/shalom/sessions \
  -H "X-API-Key: tu-api-key" \
  -H "X-Shalom-Session: ssk_a1b2c3d4e5f6..."
200 OK
{ "revoked": true }

El token a revocar va en el header X-Shalom-Session, no en el path ni en el body. Si el header falta, devuelve 400.

GET/v1/products

Lista los productos disponibles en la cuenta de Shalom Pro del cliente: Sobre, Caja Paquete XXS/XS/S/M/L y Otra Medida. Devuelve el id que usas en el body de POST /v1/orders y las dimensiones default de cada uno.

Mismo auth Shalom que el resto. Requiere X-API-Key + X-Shalom-Session (recomendado) o X-Shalom-Email + X-Shalom-Password. La sesión se cachea por 90 min y se comparte entre todos los endpoints Shalom: si ya creaste una orden con esas credenciales, este call no paga login.

Request
curl https://api.shalom-api-peru.com/v1/products \
  -H "X-API-Key: tu-api-key" \
  -H "X-Shalom-Email: cliente@empresa.com" \
  -H "X-Shalom-Password: tu-password-de-shalom-pro"
200 OK
{
  "products": [
    {
      "id": 3,
      "title": "Sobre",
      "img": "https://pro.shalom.pe/img/products/sobre.png",
      "content": "Hasta 0.5 kg",
      "sub_content": "Documentos y similares",
      "measurements": {
        "weight": 0.5,
        "width": 0.3,
        "height": 0.02,
        "length": 0.4
      }
    },
    {
      "id": 1098,
      "title": "Otra Medida",
      "img": "https://pro.shalom.pe/img/products/custom.png",
      "content": "Definí dimensiones",
      "sub_content": "Para bultos fuera de catálogo",
      "measurements": { "weight": 0, "width": 0, "height": 0, "length": 0 }
    }
  ]
}

Campos del producto

CampoTipoDescripción
idintID del producto. Pasalo en product_id al crear la orden.
titlestringNombre legible: "Sobre", "Caja Paquete XS", "Otra Medida", etc.
contentstringDescripción corta del límite de peso.
sub_contentstringTexto auxiliar: ejemplos de uso.
imgstringURL del thumbnail para mostrar en tu UI.
measurementsobjectMedidas default { weight, width, height, length } en kg/m. Para Otra Medida vienen en cero — defínelas tú en el body de la orden.

Otra Medida — bulto fuera de catálogo

Si tu envío no entra en los tamaños estándar, usa el producto cuyo title sea "Otra Medida" y manda el campo opcional dimensions en el body de POST /v1/orders con { weight_kg, height_m, length_m, width_m }. Para los demás productos puedes omitirlo y se usan las medidas default.

POST/v1/tariff/calculate

Calcula el precio de un envío entre dos terminales sin comprometer la orden. Devuelve el precio para cada tipo de producto del catálogo (sobre, cajas XXS/XS/S/M/L y otra medida) para que puedas mostrar la cotización antes del checkout.

Request
curl -X POST https://api.shalom-api-peru.com/v1/tariff/calculate \
  -H "X-API-Key: tu-api-key" \
  -H "X-Shalom-Email: cliente@empresa.com" \
  -H "X-Shalom-Password: tu-password-de-shalom-pro" \
  -H "Content-Type: application/json" \
  -d '{
    "origin_terminal_id": 66,
    "destiny_terminal_id": 7,
    "dimensions": {
      "weight_kg": 1.0,
      "height_m": 0.1,
      "length_m": 0.2,
      "width_m": 0.15
    }
  }'
200 OK
{
  "currency": "PEN",
  "breakdown": {
    "sobre": 8.00,
    "caja_paquete_xxs": 8.00,
    "caja_paquete_xs": 10.00,
    "caja_paquete_s": 12.00,
    "caja_paquete_m": 15.00,
    "caja_paquete_l": 20.00,
    "otra_medida": 25.00
  }
}

Body

CampoTipoDescripción
origin_terminal_idintegerID del terminal de origen (lo obtienes de /v1/agencies) (requerido)
destiny_terminal_idintegerID del terminal de destino (requerido)
dimensionsobjectPeso y medidas del paquete (weight_kg, height_m, length_m, width_m). Afectan SOLO el precio de otra_medida. Si no se pasan, se usan defaults mínimos.
product_idintegerSi lo pasas, la respuesta incluye un campo product con el precio puntual para mostrar al usuario. Si el id no existe en el catálogo, el campo se omite (la respuesta sigue siendo 200 con el breakdown).

Con product_id — precio puntual

Si ya sabes qué producto va a comprar el usuario, manda product_id y te ahorras el mapeo manual del breakdown:

Request
curl -X POST https://api.shalom-api-peru.com/v1/tariff/calculate \
  -H "X-API-Key: tu-api-key" \
  -H "X-Shalom-Email: cliente@empresa.com" \
  -H "X-Shalom-Password: tu-password-de-shalom-pro" \
  -H "Content-Type: application/json" \
  -d '{
    "origin_terminal_id": 66,
    "destiny_terminal_id": 7,
    "product_id": 3
  }'
200 OK
{
  "currency": "PEN",
  "breakdown": {
    "sobre": 8.00,
    "caja_paquete_xxs": 8.00,
    "caja_paquete_xs": 10.00,
    "caja_paquete_s": 12.00,
    "caja_paquete_m": 15.00,
    "caja_paquete_l": 20.00,
    "otra_medida": 25.00
  },
  "product": {
    "id": 3,
    "title": "Sobre",
    "price": 8.00
  }
}

Errores específicos

HTTPcodeCuándo se da
400bad_requestBody inválido o faltan origin_terminal_id / destiny_terminal_id
401shalom_auth_failedCredenciales Shalom Pro rechazadas
502shalom_unavailablePro Web caído o respuesta inesperada
POST/v1/orders

Crea una guía de envío. Devuelve guia, serie y codigo — los identificadores con los que después puedes trackear o borrar la orden.

Request
curl -X POST https://api.shalom-api-peru.com/v1/orders \
  -H "X-API-Key: tu-api-key" \
  -H "X-Shalom-Email: cliente@empresa.com" \
  -H "X-Shalom-Password: tu-password-de-shalom-pro" \
  -H "Content-Type: application/json" \
  -d '{
    "origin_terminal_id": 404,
    "destiny_terminal_id": 7,
    "product_id": 3,
    "quantity": 1,
    "payer": "sender",
    "sender": {
      "id": 2833026
    },
    "receiver": {
      "document_type": "DNI",
      "document": "87654321",
      "name": "MARIA",
      "last_name": "GOMEZ",
      "sur_name": "TORRES",
      "phone": 998765432
    },
    "pickup_code": "2415"
  }'
200 OK
{
  "guia": "80574902",
  "serie": "v872",
  "codigo": "CJTW"
}

Qué es cada campo

  • guia — Identificador con el que se rastrea el envío públicamente. 8 a 10 dígitos (ej. "12345678"). Es lo que aparece impreso en el comprobante físico que el cliente final recibe, y lo mismo que pasas como numero= en GET /v1/tracking.
  • serie — Prefijo del talonario del que sale la guía (ej. "v872", "s001"). No interviene en tracking ni en ninguna llamada de esta API — es informativo, sirve si tienes que reconciliar contra papeles físicos.
  • codigo — Identificador alternativo con el que también puedes rastrear el envío. Alfanumérico, 4 caracteres (ej. "CJTW"). Lo asigna Shalom al crear la orden — tú no lo eliges. Lo pasas como codigo= en GET /v1/tracking.

¿Y la clave de retiro? La clave de 4 dígitos que el destinatario presenta en agencia es la que tú elegiste en pickup_code del body al crear. Este endpoint no la devuelve — tú ya la sabes porque la elegiste — pero la ves reflejada en GET /v1/orders.

GET/v1/orders

Lista todas las órdenes de la cuenta del cliente — preguías + envíos despachados — en una sola respuesta. Útil para construir un dashboard, exportar historial o reconciliar con tu sistema interno.

Sin paginación ni filtros server-side. Este endpoint devuelve la lista completa de la cuenta en una sola respuesta. Si necesitas filtrar o paginar, hazlo en el cliente sobre el array.

Cuidado con cuentas grandes. Cada orden ocupa ~3 KB en la respuesta limpia. Una cuenta con 5.000 envíos = ~15 MB en una sola request. Cachea del lado del cliente cuando puedas (TTL de pocos minutos suele ser suficiente).

Request
curl https://api.shalom-api-peru.com/v1/orders \
  -H "X-API-Key: tu-api-key" \
  -H "X-Shalom-Email: cliente@empresa.com" \
  -H "X-Shalom-Password: tu-password-de-shalom-pro"
200 OK
{
  "orders": [
    {
      "id": 87654321,
      "internal_id": 4567890,
      "guia": "12345678",
      "serie": "s001",
      "codigo": "ABCD",
      "pickup_code": "2415",
      "created_at": "2026-05-08 10:11:12",
      "updated_at": "2026-05-08 10:11:13",
      "shipping_date": "2026-05-08",
      "status": 1,
      "payer": "receiver",
      "aereo": false,
      "delivered": false,
      "paid": false,
      "origin": {
        "ter_id": 404,
        "name": "SALAS ICA",
        "address": "SUB LOTE 01 ZONA PANAMERICANA SUR KM. 293.350...",
        "abbreviation": "sls",
        "phone": "(01) 500 7878",
        "ubigeo": "ICA - ICA - SALAS"
      },
      "destination": {
        "ter_id": 7,
        "name": "AV PARRA 379 CO",
        "address": "AV. PARRA 379",
        "abbreviation": "AQP",
        "phone": "0",
        "ubigeo": "AREQUIPA - AREQUIPA - AREQUIPA"
      },
      "sender": {
        "id": 1234567,
        "document": "12345678",
        "name": "JUAN",
        "last_name": "PEREZ",
        "sur_name": "GARCIA",
        "full_name": "JUAN PEREZ GARCIA",
        "phone": 999888777
      },
      "receiver": { "id": 7654321, "document": "87654321", "...": "..." },
      "items": [
        {
          "id": 11223344,
          "quantity": 1,
          "weight": 0,
          "width": 0,
          "length": 0,
          "height": 0,
          "status": 1,
          "product_name": "Sobre",
          "product_detail": "Documentos simples en sobre manila / Tamaño A4",
          "product_price": 20
        }
      ],
      "warranty": { "active": false, "amount": 0, "total_cost": 0, "percent": 0.01 }
    }
  ]
}

Campos de la orden

CampoTipoDescripción
idintID que pro.shalom.pe le asigna a la orden dentro de la cuenta empresarial. Lo usas como path param en DELETE /v1/orders/{id} para borrarla. No confundir con ose_id: este es para operar sobre la orden (borrar), ose_id es para tracking.
internal_idintID interno que Shalom Pro asigna a cada orden (visible en su panel como "id"). Útil solo si necesitas cruzar información contra capturas o reportes de Shalom Pro — no se usa en ninguna llamada de esta API.
guiastringIdentificador con el que se rastrea el envío públicamente. 8 a 10 dígitos (ej. "12345678"). Es lo que aparece impreso en el comprobante físico que el cliente final recibe, y lo que pasas como numero= en GET /v1/tracking.
seriestringPrefijo del talonario del que sale la guía (ej. "s001"). Informativo — no se usa en ninguna llamada.
codigostringIdentificador alternativo para tracking, alfanumérico de 4 caracteres (ej. "ABCD"). Lo asigna Shalom al crear. Lo pasas como codigo= en GET /v1/tracking.
pickup_codestringClave de 4 dígitos que el destinatario presenta en la agencia para retirar el envío. La elegiste tú al crear la orden.
created_at / updated_at / shipping_datestringTimestamps en formato Lima (YYYY-MM-DD HH:MM:SS y YYYY-MM-DD).
statusintCódigo numérico de estado de la orden (1 = creada, etc.). El significado lo define el flujo operativo de Shalom Pro.
payerstring"sender" o "receiver" (mapeado de REMITENTE/DESTINATARIO).
aereo / delivered / paidboolBooleanos que indican si el envío es aéreo, ya fue entregado y/o ya fue pagado.
origin / destinationobjectAgencia con ter_id, name, address, abbreviation, phone, ubigeo.
sender / receiverobjectPersona con id, document, name, last_name, sur_name, full_name, phone, email, address.
items[]arrayDetalle por bulto: quantity, weight, width, length, height, product_name, product_detail, product_price.
warrantyobject{ active, amount, total_cost, percent }. Si la orden no tiene garantía, active es false.

Privacidad

La respuesta que ves arriba es exactamente lo que llega al cliente. Filtramos cualquier campo sensible (passwords, banderas internas, datos de la company del cliente) antes de devolverlo, así no hay sorpresas en lo que termine en tus logs.

DELETE/v1/orders/{id}

Borra una orden de la cuenta del cliente. Funciona tanto para borradores (preguías sin guía empresarial real) como para guías ya emitidas que aún no fueron recibidas en agencia.

Path param. {id} es el campo id que devuelve GET /v1/orders — el ID de la orden dentro de la cuenta empresarial. No es ose_id (eso es para tracking) ni la guia.

Operación destructiva. La orden no se puede recuperar una vez borrada. Conviene confirmar con el usuario antes del submit.

Request
curl -X DELETE https://api.shalom-api-peru.com/v1/orders/87654321 \
  -H "X-API-Key: tu-api-key" \
  -H "X-Shalom-Email: cliente@empresa.com" \
  -H "X-Shalom-Password: tu-password-de-shalom-pro"
200 OK
{
  "deleted": true,
  "id": 87654321
}

Errores específicos

HTTPcodeCuándo se da
400bad_requestEl path param {id} no es un entero positivo válido.
404not_foundLa orden no existe en la cuenta del cliente (ya fue borrada o el id es de otra cuenta).
422upstream_rejectedShalom Pro rechaza el borrado — típicamente porque la guía ya fue recibida en agencia o despachada.
502shalom_unavailablePro Web caído, lento o respuesta inesperada. Reintentar.
422 — Shalom rechaza el borrado
{
  "error": {
    "code": "upstream_rejected",
    "message": "Shalom Pro rechazó el borrado: shalompro: delete /delete-guia: La guia ya fue recibida en agencia",
    "request_id": "01KQ..."
  }
}
GET/v1/orders/{ose_id}/label

Descarga el rótulo de la orden (etiqueta que se pega en el paquete) como PDF. Pensado para imprimir y entregar en la agencia. Respuesta binaria con Content-Type: application/pdf.

El path param {ose_id} NO es el mismo que el id empresarial. Es el campo ose_id que devolvemos al crear la orden con POST /v1/orders. Guárdalo cuando crees la orden si piensas imprimir el rótulo después.

Request
curl https://api.shalom-api-peru.com/v1/orders/1234567890/label \
  -H "X-API-Key: tu-api-key" \
  -H "X-Shalom-Email: cliente@empresa.com" \
  -H "X-Shalom-Password: tu-password-de-shalom-pro" \
  --output rotulo.pdf

Errores específicos

HTTPcodeCuándo se da
400bad_requestEl path param {ose_id} no es entero positivo.
404not_foundEl ose_id no existe en la cuenta del cliente.
502shalom_unavailablePro Web caído o respuesta inesperada.
GET/v1/orders/{ose_id}/voucher

Descarga el comprobante de la orden (resumen con datos de remitente, destinatario e items) como PDF. Mismo contrato que /label: Content-Type: application/pdf binario y mismo path param {ose_id}.

Request
curl https://api.shalom-api-peru.com/v1/orders/1234567890/voucher \
  -H "X-API-Key: tu-api-key" \
  -H "X-Shalom-Email: cliente@empresa.com" \
  -H "X-Shalom-Password: tu-password-de-shalom-pro" \
  --output comprobante.pdf

Errores específicos

Mismos códigos que /label (400, 404, 502).

Campos del body

Requeridos

CampoTipoDescripción
origin_terminal_idintID de la agencia de origen (campo id de GET /v1/agencies)
destiny_terminal_idintID de la agencia de destino (campo id de GET /v1/agencies)
product_idintID del producto (Sobre, Caja XXS/XS/S/M/L, Otra Medida). Listalo con GET /v1/products.
senderobjectRemitente (ver subcampos abajo).
receiverobjectDestinatario.
pickup_codestringClave de retiro de 4 dígitos. No puede ser repetido (1111..9999) ni consecutivo (1234..6789).

Opcionales

CampoTipoDescripción
quantityintDefault 1.
payerstring"sender" (default, paga al despachar) o "receiver" (contra entrega).
dimensionsobjectDimensiones custom { weight_kg, height_m, length_m, width_m }. Solo para producto "Otra Medida".
aereoboolServicio aéreo. Solo si origen y destino lo soportan.
warrantyobject{ "amount": "100.00" } activa garantía con monto declarado.
collection_serviceobjectCobro contra entrega. Requiere cuenta bancaria registrada en Shalom Pro previamente.
documentationarrayGuías adicionales: [{ "guide": "G123", "series": "S01" }].
declaracion_juradastringTipo de contenido declarado. Acepta 4 alias cortos"art", "docs", "ropa", "electro" — o los 4 textos literales que Shalom imprime en la guía: "Articulos de uso personal" (sin tilde), "Documentos", "Ropa", "Electrodomésticos" (con tilde). Internamente mapeamos al texto literal antes de enviarlo. Legacy: "merc" se acepta y mapea a "Articulos de uso personal".
contacto_docstringDocumento de la persona que recoge.

Sender / receiver

Hay dos formas de identificar a un remitente o destinatario (persona natural o empresa):

  1. Por id: cuando ya conoces su id (por ejemplo de GET /v1/persons/search o de un envío anterior). Pasas solo { "id": 2833026 } y los demás campos se completan automáticamente.
  2. Por datos completos: cuando todavía no existe en Shalom Pro. Pasás document_type, document, name, phone y — solo para DNI/CE — last_name + sur_name. Si ya existe se reusa; si no, se registra con esos datos.

Empresas (RUC): la razón social va completa en name. last_name y sur_name no aplican.

Ejemplo: persona (DNI)

{
  "document_type": "DNI",
  "document": "12345678",
  "name": "JUAN",
  "last_name": "PEREZ",
  "sur_name": "GARCIA",
  "phone": 999888777
}

Ejemplo: empresa (RUC)

{
  "document_type": "RUC",
  "document": "20100070970",
  "name": "MI EMPRESA S.A.C.",
  "phone": 999888777
}
CampoTipoDescripción
idintperson_id de Shalom Pro. Si lo pasas, los demás campos no son necesarios.
document_typestring"DNI" (8 dígitos), "RUC" (11 dígitos, empresas) o "CE" (carnet de extranjería).
documentstringSolo dígitos para DNI/RUC; alfanumérico ≥4 chars para CE.
namestringNombre (persona) o razón social completa (empresa). Obligatorio.
last_namestringPrimer apellido. Obligatorio para DNI/CE, no aplica a RUC.
sur_namestringSegundo apellido. No aplica a RUC.
phoneintTeléfono numérico (sin código de país, ej. 999888777).
emailstringOpcional.
addressstringOpcional.

Errores específicos de /v1/orders

Además de los códigos generales, este endpoint puede devolver:

HTTPcodeCuándo se da
401shalom_auth_failedFalta X-Shalom-Email/X-Shalom-Password o son rechazados por Shalom Pro.
409conflictPersona ya registrada con ese documento — pasa id en lugar de los datos.
422upstream_rejectedEl cliente no tiene servicio de cobranza habilitado, producto restringido para esa ruta, etc.
502shalom_unavailablePro Web caído, lento o respuesta inesperada. Reintentar.
401 — credenciales rechazadas
{
  "error": {
    "code": "shalom_auth_failed",
    "message": "X-Shalom-Email/Password rechazados por Shalom Pro",
    "request_id": "01KQ..."
  }
}

Health Checks

Publicos, sin auth.

GET/healthz

Liveness. 200 si el servidor está vivo.

GET/readyz

Readiness. 200 cuando está listo para recibir tráfico.