Altyro Solicitar acceso

Integra tus solicitudes con Altyro.

Aprende qué campos enviar, cómo crear una solicitud y dónde consultar su estado, hitos y código de seguimiento. Cada operación incluye ejemplos y respuestas.

Estado: API de producción publicada para pilotos autorizados. El sandbox y la entrega de claves a integradores externos siguen pendientes.

Primeros pasos

Tu primera solicitud

01

Solicita una clave

Altyro asigna una credencial a tu empresa. La clave de pruebas es distinta de la de producción.

02

Prueba en sandbox

Cuando se habilite el entorno aislado, envía allí un JSON sin generar cobros ni correos reales. Todavía no está disponible.

03

Activa producción

Valida la respuesta por fila, guarda los identificadores y consulta los hitos a medida que avanzan.

Los ejemplos copiables usan producción: con una clave válida crean solicitudes reales. Ejecútalos solo durante un piloto autorizado.

crear-solicitud.sh
curl -X POST https://altyro-api.web.app/v1/solicitudes \
  -H 'Content-Type: application/json' \
  -H 'X-API-Key: TU_CLAVE_DE_PRODUCCION' \
  -H 'Idempotency-Key: pedido-1042' \
  -d '{
    "idSucursal": "SUCURSAL_ID",
    "tipo": "envio",
    "fechaRetiro": "2026-09-25",
    "calle": "Avenida Providencia",
    "nCalle": "1208",
    "comuna": "Providencia",
    "receptorNombre": "Cliente de prueba",
    "receptorTelefono": "+56912345678",
    "receptorCorreo": "[email protected]",
    "notas": "Entregar en conserjería",
    "ubicacionCoordenadas": { "lat": -33.4372, "lng": -70.6506 },
    "tamanio": "m"
  }'

Seguridad

Autenticación

Las integraciones de servidor envían X-API-Key. El portal Altyro usa Authorization: Bearer <Firebase ID token> y su empresa autorizada. Nunca incluyas una clave de integración en código de navegador ni en la URL.

Acceso por empresa. La API determina la empresa a partir de la credencial y comprueba la pertenencia de cada solicitud antes de responder. Para pedir, rotar o revocar una clave, contacta a [email protected].

URLs base

Dos entornos, una integración

La API de producción responde en el dominio de Firebase Hosting indicado abajo. Los ejemplos copiables usan producción y requieren autorización para un piloto; el sandbox aislado todavía no está disponible.

Pruebas · pendiente

https://sandbox-api.altyro.cl

Aún no disponible. Se habilitará con datos ficticios, sin cargos ni mensajes reales.

Producción · piloto

https://altyro-api.web.app

Servicio publicado. Requiere una clave de producción y autorización para el piloto.

Guía de integración

De la creación al seguimiento

Elige la tarea que necesitas. Las operaciones privadas usan la clave de tu empresa; el seguimiento por código es público y muestra menos datos.

Referencia de entrada

Qué enviar al crear

El cuerpo de POST /v1/solicitudes es un objeto JSON. En un lote, cada elemento de rows usa los mismos campos. Envía los nombres exactamente como aparecen aquí.

Desliza las tablas hacia los lados para ver todas las columnas.

Obligatorio significa que debe venir con un valor útil. Los campos opcionales pueden omitirse. No envíes coordenadas sueltas: lat y lng van juntas dentro de ubicacionCoordenadas.

Solicitud y dirección

Campo¿Obligatorio?Tipo y valoresPara qué sirve
idSucursalSíTexto · ID de una sucursal de tu empresaIndica desde qué sucursal se retira.
tipoSíTexto · envio, cambio o devolucionDefine la operación solicitada.
fechaRetiroSíTexto · fecha AAAA-MM-DDDía programado para el retiro; ejemplo: 2026-09-25.
calleSíTextoCalle del destino, sin mezclarla con la comuna.
nCalleSíTextoNúmero de la calle; conserva letras si corresponde, como 1208B.
comunaSíTexto · comuna habilitada para tu empresaDelimita el área de servicio y participa en el cálculo de tarifa.
nLugarNoTextoDepartamento, oficina, local, torre u otra indicación interior.
destinoTipoNoTexto · por defecto casaTipo de lugar de entrega.
ubicacionCoordenadasNoObjeto { "lat": -33.4372, "lng": -70.6506 }Punto exacto elegido en el mapa. Si se omite, Altyro geocodifica la dirección escrita.
rowIdSolo en lotesTexto único por fila, máximo 180 caracteresRelaciona cada fila enviada con su resultado. En creación individual puede omitirse.

Dentro de ubicacionCoordenadas, lat y lng deben ser números JSON (sin comillas). Latitud: −90 a 90. Longitud: −180 a 180. Si se envía el objeto, ambos valores son obligatorios; un punto inválido devuelve 400 COORDINATES_INVALID. La calle y comuna siguen siendo necesarias aunque envíes el punto.

Receptor

Campo¿Obligatorio?Tipo y valoresPara qué sirve
receptorNombreSíTextoNombre de quien recibe.
receptorTelefonoSíTexto · ejemplo +56912345678Contacto telefónico del receptor.
receptorCorreoNoTexto · correo válidoCorreo del receptor para las notificaciones del envío. No es el correo de la empresa.
receptorRutNoTextoRUT del receptor, cuando corresponda.
horarioDesdeNoTexto HH:MM o númeroInicio de la franja horaria solicitada.
horarioHastaNoTexto HH:MM o númeroFin de la franja horaria solicitada.

Paquete y datos propios

Campo¿Obligatorio?Tipo y valoresPara qué sirve
tamanioSíTexto · s, m o lTamaño del paquete para la tarifa.
alto_cm, ancho_cm, largo_cmNoNúmeros o texto numérico · centímetrosDimensiones del paquete.
peso_grNoNúmero o texto numérico · gramosPeso del paquete.
codigoReferenciaNoTextoTu referencia de pedido. Es distinta del código de seguimiento que genera Altyro.
descripcionPaqueteNoTextoDescripción del contenido del paquete.
notasNoTexto · hasta 3000 caracteresInstrucción o nota interna de la solicitud; se envía al crearla.
etiquetasUINoArreglo de textos · ejemplo ["Frágil", "Prioritario"]Etiquetas visibles para organizar la solicitud.

No envíes una tarifa calculada: Altyro determina el total desde la empresa, la sucursal, la comuna, el tamaño y el horario.

Valores que debes evitar

CampoNo envíesEnvía
tipo"entrega""envio", "cambio" o "devolucion".
fechaRetiro"25/09/2026""2026-09-25".
receptorCorreo"cliente-sin-arroba"Un correo válido o simplemente omite el campo.
ubicacionCoordenadas{ "lat": "-33.43" }Ambos números JSON: { "lat": -33.43, "lng": -70.65 }; también puedes omitir el objeto completo.
tamanio"xl""s", "m" o "l". Otros valores pueden normalizarse a m y dar una tarifa inesperada.
rowId del loteDos filas con el mismo ID.Un texto distinto por cada fila.

Paso 1 · creación individual

Crear una solicitud

Envía POST /v1/solicitudes con Content-Type: application/json, tu clave y una Idempotency-Key de 8 a 180 caracteres. Guarda el solicitudId para consultas privadas y el codigo para seguimiento.

Petición · crear una solicitud
curl -X POST https://altyro-api.web.app/v1/solicitudes \
  -H 'Content-Type: application/json' \
  -H 'X-API-Key: TU_CLAVE_DE_PRODUCCION' \
  -H 'Idempotency-Key: pedido-1042' \
  -d '{
    "idSucursal": "SUCURSAL_ID",
    "tipo": "envio",
    "fechaRetiro": "2026-09-25",
    "calle": "Avenida Providencia",
    "nCalle": "1208",
    "comuna": "Providencia",
    "receptorNombre": "Cliente de prueba",
    "receptorTelefono": "+56912345678",
    "receptorCorreo": "[email protected]",
    "tamanio": "m",
    "codigoReferencia": "PED-1042",
    "notas": "Entregar en conserjería",
    "ubicacionCoordenadas": { "lat": -33.4372, "lng": -70.6506 }
  }'
Respuesta de ejemplo · HTTP 201
{
  "requestId": "7e2a2f4d-54c8-4d72-b3a4-34723658482b",
  "rowId": "api-fila-generada",
  "status": "created",
  "solicitudId": "SOLICITUD_ID",
  "codigo": "a12b34c56d78e90fa12b34c56d78e90f",
  "total": 4990
}

La respuesta real puede incluir más campos. created indica una solicitud nueva; existing indica que esa misma intención ya tenía una solicitud; review_pending indica que quedó agendada con revisión de dirección; failed incluye un objeto error. Reutiliza la misma Idempotency-Key al reintentar. Una clave distinta representa otra intención, aunque el JSON sea igual.

Paso 1 · creación por lote

Crear varias solicitudes

POST /v1/solicitudes/lotes recibe un objeto con rows, entre 1 y 100 solicitudes. Cada fila tiene los campos de la tabla anterior y un rowId único dentro del lote. La respuesta trae un resultado independiente por fila; un fallo no oculta las filas creadas.

Petición · lote de dos filas
curl -X POST https://altyro-api.web.app/v1/solicitudes/lotes \
  -H 'Content-Type: application/json' \
  -H 'X-API-Key: TU_CLAVE_DE_PRODUCCION' \
  -H 'Idempotency-Key: lote-2026-09-25-01' \
  -d '{
    "rows": [
      {
        "rowId": "pedido-1042",
        "idSucursal": "SUCURSAL_ID",
        "tipo": "envio",
        "fechaRetiro": "2026-09-25",
        "calle": "Avenida Providencia",
        "nCalle": "1208",
        "comuna": "Providencia",
        "receptorNombre": "Ana Pérez",
        "receptorTelefono": "+56912345678",
        "tamanio": "m"
      },
      {
        "rowId": "pedido-1043",
        "idSucursal": "SUCURSAL_ID",
        "tipo": "cambio",
        "fechaRetiro": "2026-09-25",
        "calle": "Los Leones",
        "nCalle": "250",
        "comuna": "Providencia",
        "receptorNombre": "Luis Díaz",
        "receptorTelefono": "+56987654321",
        "receptorCorreo": "correo-invalido",
        "tamanio": "s"
      }
    ]
  }'
Respuesta ilustrativa para ese lote · HTTP 200
{
  "created": 1,
  "existing": 0,
  "pendingReview": 0,
  "failed": 1,
  "results": [
    { "rowId": "pedido-1042", "status": "created", "solicitudId": "SOLICITUD_1", "codigo": "CODIGO_1" },
    { "rowId": "pedido-1043", "status": "failed", "error": { "code": "ROW_INVALID", "message": "La solicitud normalizada no es valida.", "details": [{ "field": "receptorCorreo", "message": "Correo receptor invalido." }] } }
  ]
}

El lote es síncrono: usa un timeout de cliente de al menos 180 segundos. Si una falla temporal del proveedor de geocodificación deja el lote parcial, reintenta con la misma clave y el mismo contenido. Una fila creada antes puede regresar como existing; concilia por rowId y no sumes el total de distintos intentos.

Paso 2 · consulta privada

Estado e hitos de tus solicitudes

La clave solo puede leer solicitudes de su empresa. Usa la lista para localizar un pedido y GET /v1/solicitudes/{id} para ver su estado actual y la secuencia de hitos. {id} es el solicitudId devuelto al crear, no el código público.

Listar y filtrar

Parámetro de GET /v1/solicitudesTipoUso
limitEntero de 1 a 100; por defecto 30Cantidad máxima de resultados por página.
cursorTextoEnvía el nextCursor de la página anterior para continuar.
estadoTextoFiltra por el estado guardado de la solicitud.
referenciaTextoFiltra por codigoReferencia enviado por tu sistema.
codigoTextoFiltra por el código de seguimiento generado por Altyro.

Usa como máximo uno de estado, referencia o codigo por consulta. Los resultados se ordenan por fecha de creación, del más reciente al más antiguo.

Petición · buscar por referencia
curl 'https://altyro-api.web.app/v1/solicitudes?referencia=PED-1042&limit=30' \
  -H 'X-API-Key: TU_CLAVE_DE_PRODUCCION'
Respuesta de ejemplo
{
  "items": [
    {
      "id": "SOLICITUD_ID",
      "codigo": "a12b34c56d78e90fa12b34c56d78e90f",
      "referencia": "PED-1042",
      "tipo": "envio",
      "estado": "retiroPendiente",
      "fechaCreacion": "2026-09-23T16:15:00.000Z",
      "fechaRetiro": "2026-09-25"
    }
  ],
  "nextCursor": null,
  "requestId": "6a885909-6025-47c1-9203-28652e676774"
}

Abrir el detalle y leer hitos

Petición · detalle privado
curl 'https://altyro-api.web.app/v1/solicitudes/SOLICITUD_ID' \
  -H 'X-API-Key: TU_CLAVE_DE_PRODUCCION'
Respuesta resumida
{
  "id": "SOLICITUD_ID",
  "codigo": "a12b34c56d78e90fa12b34c56d78e90f",
  "referencia": "PED-1042",
  "tipo": "envio",
  "estado": "enRuta",
  "fechaCreacion": "2026-09-23T16:15:00.000Z",
  "fechaRetiro": "2026-09-25",
  "hitos": [
    { "estado": "creado", "fecha": "2026-09-23T16:15:00.000Z", "imagenes": [] },
    { "estado": "enRuta", "fecha": "2026-09-25T13:20:00.000Z", "imagenes": [] }
  ],
  "requestId": "9df5c209-2a1d-42cb-86bd-d5fb3d031668"
}

estado es la situación actual. hitos registra pasos con su fecha ISO 8601, que puede ser null en un paso inferido. Los estados habituales incluyen creado, retiroPendiente, retirado, enRuta, entregado, fallido y devolucion. También pueden aparecer estados de revisión u otros estados operativos; conserva el valor recibido.

Paso 3 · consulta pública

Seguimiento por código

GET /v1/seguimiento/{codigo} usa el codigo generado por Altyro. No necesita clave. Entrega estado, fechas y nombres de hitos; no entrega dirección, contactos, comentarios, fotos ni coordenadas. Puede consultar códigos anteriores a la API.

Petición · seguimiento
curl 'https://altyro-api.web.app/v1/seguimiento/a12b34c56d78e90fa12b34c56d78e90f'
Respuesta de ejemplo
{
  "codigo": "a12b34c56d78e90fa12b34c56d78e90f",
  "estado": "enRuta",
  "fechaCreacion": "2026-09-23T16:15:00.000Z",
  "fechaRetiro": "2026-09-25",
  "hitos": [
    { "estado": "creado", "fecha": "2026-09-23T16:15:00.000Z" },
    { "estado": "enRuta", "fecha": "2026-09-25T13:20:00.000Z" }
  ],
  "requestId": "89417e77-efb9-4f23-a9e0-54164a9ab07b"
}

Si necesitas la referencia, el tipo o fotos de una solicitud de tu empresa, usa el detalle privado con tu clave. Para integrar una página pública, usa el código y muestra el próximo hito cuando exista; no supongas que siempre habrá una fecha para cada paso.

Evidencia privada

Fotos de los hitos

El detalle autenticado puede incluir imagenes en cada hito. Cada elemento tiene url y expiresAt; la URL temporal vence a los 10 minutos. Para renovarla, envía la URL anterior o la clave de esa foto a POST /v1/solicitudes/{id}/fotos/firmar. La foto debe pertenecer a esa solicitud y empresa.

Petición · renovar una foto
curl -X POST 'https://altyro-api.web.app/v1/solicitudes/SOLICITUD_ID/fotos/firmar' \
  -H 'Content-Type: application/json' \
  -H 'X-API-Key: TU_CLAVE_DE_PRODUCCION' \
  -d '{ "url": "URL_ANTERIOR_DEL_HITO" }'

La respuesta devuelve una nueva url, su expiresAt y requestId. El seguimiento público nunca entrega fotos.

Operación

Errores, límites y reintentos

Los errores generales incluyen code, message y requestId. Guarda requestId para soporte. En la creación por lote, revisa también el status y error de cada fila aunque la petición responda HTTP 200.

HTTPQué significaQué hacer
400Entrada, filtro o coordenadas inválidas.Corrige los campos; no reintentes el mismo JSON sin cambios.
401Clave o sesión inválida.Comprueba la credencial y el entorno correspondiente.
403Sin permiso para la operación o empresa.Revisa el alcance de la credencial con Altyro.
404Solicitud, código o foto no encontrados.Verifica el ID o código; el detalle privado no muestra recursos de otra empresa.
409La clave de idempotencia sigue procesándose o se reutilizó con otro contenido.Si sigue procesándose, espera y reintenta igual; si cambió el contenido, usa otra clave.
422Fila de creación individual inválida.Lee error, corrige los datos y crea una intención nueva.
429Demasiadas peticiones.Respeta Retry-After antes de reintentar.
503Servicio temporalmente no disponible.Reintenta la creación con la misma Idempotency-Key.
120

lecturas / minuto / clave

10

creaciones / minuto / clave

30

consultas públicas / minuto / IP

Estos límites son orientativos en la vista previa local; la protección de borde se configurará antes de habilitar el servicio público.