Ir al contenido

Paginación

Todos los endpoints que devuelven listas usan la misma paginación por limit y offset, y responden con la misma forma.

Parámetro Tipo Default Rango
limit entero 50 de 1 a 100
offset entero 0 0 o mayor
Ventana de terminal
curl "https://api.afippi.com/v1/cuits?limit=25&offset=50" \
-H "Authorization: Bearer $AFIPPI_API_TOKEN"

Los listados devuelven los registros en data y los metadatos en pagination:

{
"data": [],
"pagination": { "limit": 25, "offset": 50, "total": 137 }
}

total es la cantidad completa de registros que matchean la consulta, no la cantidad devuelta en esta página. Es el número que necesitás para saber cuántas páginas faltan. Si filtrás GET /v1/cuits por etiqueta o condición fiscal, total es el recuento de esa coincidencia, no de todos los CUITs de la cuenta.

async function* traerTodosLosCuits(token) {
const limit = 100
let offset = 0
while (true) {
const respuesta = await fetch(
`https://api.afippi.com/v1/cuits?limit=${limit}&offset=${offset}`,
{ headers: { Authorization: `Bearer ${token}` } },
)
const { data, pagination } = await respuesta.json()
yield* data
offset += limit
if (offset >= pagination.total) {
return
}
}
}

Acordate de que cada página consume una request de tu cuota mensual. Con limit=100 gastás la menor cantidad posible de pedidos.

El orden es estable dentro de cada recurso, así que paginar no te va a saltear ni duplicar registros:

  • CUITs — por nombre, y a igualdad de nombre por identificador interno. El desempate existe porque el nombre no es único.
  • Etiquetas — por nombre.
  • Comprobantes — por fecha.
  • Notificaciones del DFE — de la más reciente a la más antigua.
  • Movimientos de CCMA — por período, del más reciente al más antiguo, y dentro de cada período por orden. Es el único listado donde limit, offset y total cuentan períodos y no registros: cada página trae todos los movimientos de los períodos que le tocaron.

Un limit o un offset fuera de rango responden 400 con el detalle en español:

{ "error": "'limit' debe ser un entero entre 1 y 100." }

Si mandás los dos mal, la respuesta junta ambos mensajes:

{ "error": "'limit' debe ser un entero entre 1 y 100. 'offset' debe ser un entero mayor o igual a 0." }