Desarrolladores
Los listados se recorren por páginas con page y limit.
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.
hasMore, sigue pidiendo páginas mientras sea true.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.
| Ruta | limit por defecto | limit máximo | Campos 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.
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;
} 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.