Qué vas a construir
Una carga paginada de líneas, con importes y clasificaciones disponibles para tu modelo de análisis. No una suma que mezcla kilos, cajas y unidades.
Antes de empezar
- Una clave de la cuenta con permiso para ver reportes y acceso a las empresas que vas a analizar.
- Un proceso en tu servidor. El ejemplo descargable usa Node.js 22 o superior, sin dependencias adicionales.
- Un destino propio donde guardar o transformar los datos. Ruka no crea un dashboard externo al ejecutar esta consulta.
1. Define qué compras quieres analizar.
Usa purchase_lines cuando necesites el detalle de cada línea. issued_from e issued_to son obligatorios y ambos extremos se incluyen; su diferencia no puede superar 31 días. Para períodos mayores, divide la extracción en ventanas.
El filtro por emisión es el predeterminado. date_basis=reporting tiene otra lógica: usa mes de reporte y, si falta, acuse y después emisión. No combines ambas bases en una serie sin identificar cuál usaste.
curl --fail-with-body --get \
'https://api.rukafactura.cl/api/v1/reports/purchase_lines' \
--header "Authorization: Bearer $RUKA_API_KEY" \
--data-urlencode 'issued_from=2026-10-01' \
--data-urlencode 'issued_to=2026-10-26' \
--data-urlencode 'per_page=100' \
--data-urlencode 'page=1'2. Recorre todas las páginas.
La respuesta contiene data y meta. Continúa por page hasta total_pages y conserva exactamente los mismos filtros. El límite es 100 registros por página. Una respuesta vacía puede ser correcta: comprueba el rango y los permisos antes de tratarla como una falla.
El ejemplo descargable entrega una página por vez y se detiene ante un error. Guarda cada lote antes de avanzar tu checkpoint. No registra tokens ni datos de compras, no sigue redirecciones y no hace reintentos ilimitados.
import { purchaseLinePages } from './ruka-purchases.mjs';
for await (const page of purchaseLinePages({
issued_from: '2026-10-01',
issued_to: '2026-10-26',
}, { token: process.env.RUKA_API_KEY })) {
// Guarda page.data en tu destino antes de continuar.
// Define aquí tu persistencia; el ejemplo no escribe una base.
}3. Modela el costo, no solo el importe.
Montos y cantidades llegan como strings decimales; conserva esa precisión en una columna decimal o una biblioteca decimal. null significa que falta una asignación, no que su valor sea cero. Un costo unitario comparable exige cantidades y unidades compatibles.
cost_center_allocations contiene las divisiones sin multiplicar la fila original. No sumes el importe completo de la línea y, además, todos sus repartos. Si incluyes notas con include_credit_notes=true, se agregan DTE 61 y 56 con sus montos originales, sin invertir automáticamente el signo: define el tratamiento por tipo documental en tu modelo.
4. Comprueba el resultado antes de automatizar.
Contrasta una muestra autorizada con Ruka: misma empresa, período, filtros, unidades y tratamiento de notas. Una diferencia entre total de factura y líneas filtradas no demuestra por sí sola un error: son alcances distintos.
Ante 401 revisa la clave; ante 403, los permisos; ante 422, los filtros. Un 429 requiere espaciar solicitudes y respetar Retry-After cuando esté presente. Conserva el lote incompleto y reconcilia antes de dar por terminada la carga.
Antes de conectar producción
- La segunda página conserva los filtros de la primera.
- Una clasificación null permanece desconocida.
- Las notas no se restan dos veces.
- Los repartos no duplican la compra.
- La clave nunca llega al navegador ni al repositorio.
Ejemplo para tu servidor
Archivo JavaScript legible, para Node.js 22 o superior. No incluye claves, no se ejecuta al descargarlo y no reemplaza la persistencia ni los controles de tu integración.
Descargar ejemplo .mjsContrato y mantenimiento
La guía acompaña el contrato publicado en la fecha indicada. Antes de integrar, revisa permisos, filtros y respuestas vigentes en la referencia. Trabaja primero con datos de prueba autorizados.
Ver referencia de esta operación