Referencia de la API
Generada desde la especificación OpenAPI que sirve la propia API, así que siempre refleja lo que está desplegado.
URL base — producción y pruebas
https://go-api.kroni.io/v1El entorno lo determina el prefijo de tu llave (kg_test_ / kg_live_).
/pingValidar la credencial
Devuelve el entorno, la organización y los límites vigentes. Úsalo como prueba de humo al configurar la integración.
Errores posibles
| HTTP | Códigos |
|---|---|
| 401 | unauthorized — Falta el encabezado Authorization con tu API Key. invalid_api_key — La API Key no es válida. |
| 403 | app_suspended — Tu aplicación está suspendida. Escríbenos para reactivarla. |
| 429 | rate_limited — Rebasaste el límite de peticiones. Espera unos segundos e inténtalo de nuevo. |
| 503 | api_disabled — La API de Kroni está temporalmente deshabilitada. |
/ratesCotizar un envío
Devuelve una tarifa por servicio disponible, con el costo total real que se cobrará. El folio (`quote_id`) vive 60 minutos. `declared_value_mxn` por sí solo **no cobra nada**: viaja a la guía y sirve de base para la protección opcional, que se activa con `protect_declared_value`.
Cuerpo de la petición
| Campo | Tipo | Obligatorio | Notas |
|---|---|---|---|
origin | object | Sí | — |
| origin.postal_code | string | Sí | formato ^\d{5}$ |
| origin.city | string | No | máx. 120 caracteres |
| origin.state |
/rates/{quote_id}Recuperar una cotización por folio
Un folio vencido responde 200 con `expired: true`, para que puedas auditar históricos. El rechazo por vigencia ocurre al generar la guía.
Parámetros
| Nombre | En | Obligatorio | Formato |
|---|---|---|---|
quote_id | ruta | Sí | ^qt_[0-9a-f]{32}$ |
Errores posibles
| HTTP | Códigos |
|---|---|
| 401 | unauthorized — Falta el encabezado Authorization con tu API Key. |
| 404 | quote_not_found — No encontramos esa cotización. |
/reference/carriersPaqueterías, límites y conceptos de cargo
Describe los conceptos y cómo se calculan. Los importes concretos solo aparecen dentro de una cotización, ya sumados al precio de esa ruta.
Errores posibles
| HTTP | Códigos |
|---|---|
| 401 | unauthorized — Falta el encabezado Authorization con tu API Key. |
| 429 | rate_limited — Rebasaste el límite de peticiones. Espera unos segundos e inténtalo de nuevo. |
| 503 | api_disabled — La API de Kroni está temporalmente deshabilitada. |
/reference/coverageCobertura de un código postal
Estado, municipio y qué paqueterías cubren el código postal. Úsalo para descartar rutas sin gastar una cotización.
Parámetros
| Nombre | En | Obligatorio | Formato |
|---|---|---|---|
postal_code | query | Sí | ^\d{5}$ |
Errores posibles
| HTTP | Códigos |
|---|---|
| 401 | unauthorized — Falta el encabezado Authorization con tu API Key. |
| 404 | no_coverage — No encontramos paqueterías con cobertura para esa ruta. |
/shipmentsGenerar una guía a partir de una cotización
Toma el folio (`quote_id`) y la tarifa (`rate_id`) de `POST /rates`, más las direcciones completas. Los códigos postales deben coincidir con los de la cotización. Requiere el encabezado `Idempotency-Key`. Misma llave + mismo cuerpo → la misma guía (200). Misma llave + cuerpo distinto → `409 idempotency_conflict`. En producción descuenta del saldo prepago. En pruebas no cobra ni contacta a ninguna paquetería.
Parámetros
| Nombre | En | Obligatorio | Formato |
|---|---|---|---|
| Idempotency-Key | query | Sí | string |
Cuerpo de la petición
| Campo | Tipo | Obligatorio | Notas |
|---|
/shipmentsListar guías
Paginación por cursor: manda `next_cursor` de la respuesta anterior en `cursor`. No hay `offset`.
Parámetros
| Nombre | En | Obligatorio | Formato |
|---|---|---|---|
limit | query | No | integer |
cursor | query | No | string |
status | query | No | "created" | "picked_up" | "in_transit" | "out_for_delivery" | "delivered" | "incident" | "returned" | "cancelled" | "failed" |
/shipments/{shipment_id}Consultar una guía
Parámetros
| Nombre | En | Obligatorio | Formato |
|---|---|---|---|
shipment_id | ruta | Sí | ^shp_[0-9a-f]{32}$ |
Errores posibles
| HTTP | Códigos |
|---|---|
| 401 | unauthorized — Falta el encabezado Authorization con tu API Key. |
| 404 | shipment_not_found — No encontramos esa guía. |
| 429 | rate_limited — Rebasaste el límite de peticiones. Espera unos segundos e inténtalo de nuevo. |
/shipments/{shipment_id}/labelDescargar la etiqueta
Devuelve el PDF. `format=pdf` es térmica de 4×6 pulgadas (por defecto); `format=pdf_letter` es tamaño carta. Con `redirect=true` responde `302` a una URL firmada temporal, para no proxear el binario. ZPL no está disponible por ahora; pedirlo responde `415 label_format_unavailable`.
Parámetros
| Nombre | En | Obligatorio | Formato |
|---|---|---|---|
shipment_id | ruta | Sí | ^shp_[0-9a-f]{32}$ |
format | query | No | "pdf" | "pdf_letter" |
redirect | query | No | "true" | "false" |
/shipments/{shipment_id}/cancelSolicitar la cancelación de una guía
NO cancela de inmediato: registra una solicitud que Kroni revisa. Solo procede mientras la paquetería no haya recolectado. Refleja `pending_review` en tu sistema hasta recibir la resolución.
Parámetros
| Nombre | En | Obligatorio | Formato |
|---|---|---|---|
shipment_id | ruta | Sí | ^shp_[0-9a-f]{32}$ |
Cuerpo de la petición
| Campo | Tipo | Obligatorio | Notas |
|---|---|---|---|
reason |
/tracking/{tracking_number}Estado de un envío
Consulta a la paquetería en tiempo real y devuelve el estado normalizado y el historial. Solo guías de tu organización.
Parámetros
| Nombre | En | Obligatorio | Formato |
|---|---|---|---|
tracking_number | ruta | Sí | string |
Errores posibles
| HTTP | Códigos |
|---|---|
| 401 | unauthorized — Falta el encabezado Authorization con tu API Key. |
| 404 | shipment_not_found — No encontramos esa guía. |
Catálogo de códigos de error
Ramifica por code: es estable. El texto de message puede cambiar de redacción.
unauthorized
invalid_api_key
key_revoked
key_expired
app_suspended
ip_not_allowed
account_blocked
wrong_environment
api_disabled
api_writes_disabled
rate_limited
validation_error
not_found
invalid_json
quote_not_found
quote_expired
rate_not_found
no_coverage
weight_limit_exceeded
dimension_limit_exceeded
multi_package_unsupported
insufficient_balance
carrier_unavailable
idempotency_conflict
idempotency_key_required
shipment_not_found
shipment_processing
shipment_cancelled
cancellation_pending
cancellation_quota_exceeded
shipment_not_cancellable
label_not_ready
label_format_unavailable
internal_error