Ir al contenido

Desarrolladores

Paginación

Los listados se recorren por páginas con page y limit.

El patrón

Los listados admiten dos parámetros de consulta:

  • page: número de página, empezando en 1.
  • limit: elementos por página. Cada ruta tiene su valor por defecto y su máximo; un valor superior al máximo se limita al máximo.

La respuesta incluye la lista en una propiedad con nombre propio (documents, items, contacts…) y los campos de paginación total, page y limit, más hasMore en la mayoría de rutas. Todas las rutas paginadas devuelven total.

Cómo saber si hay más páginas

  • Si la respuesta trae hasMore, sigue pidiendo páginas mientras sea true.
  • Si no la trae (hoy, GET /contacts), calcula las páginas con total y limit, o usa pages si viene en la respuesta.

La paginación no es idéntica en todas las rutas. La tabla de abajo recoge lo que hace cada una hoy y la referencia lo repite en cada operación.

Rutas paginadas

Rutalimit por defectolimit máximoCampos de paginación
GET /billing 50 500 total, page, limit, hasMore
GET /suppliers 50 500 total, page, limit, hasMore
GET /books/{companyId}/journal-lines 100 500 total, page, limit, hasMore
GET /books/{companyId}/accounts 200 500 total, page, limit, hasMore
GET /contacts 50 200 total, page, limit, pages

El resto de listados no tiene parámetros de paginación: devuelven el conjunto completo que cumple el filtro (por ejemplo, los saldos de tesorería o los informes contables, que son un único documento por rango de fechas). Acota el resultado con los filtros de fecha de cada ruta.

Recorrer todas las páginas

TypeScript (fetch)
const items = [];
for (let page = 1; ; page++) {
  const res = await fetch(`https://app.bm.consulting/api/v1/billing?page=${page}&limit=200`, {
    headers: { Authorization: `Bearer ${process.env.BMC_TOKEN}` },
  });
  if (!res.ok) throw new Error(String(res.status));
  const body = await res.json();
  items.push(...body.documents);
  if (!body.hasMore) break;
}
Python (requests)
import os
import requests

items, page = [], 1
while True:
    res = requests.get(
        "https://app.bm.consulting/api/v1/billing",
        params={"page": page, "limit": 200},
        headers={"Authorization": f"Bearer {os.environ['BMC_TOKEN']}"},
        timeout=30,
    )
    res.raise_for_status()
    body = res.json()
    items += body["documents"]
    if not body["hasMore"]:
        break
    page += 1

Pide páginas de forma secuencial y respeta los límites de uso: una carga completa de un histórico grande consume una petición por página.

Email
Contacto