Skip to main content

Documentation Index

Fetch the complete documentation index at: https://docs.rail.cl/llms.txt

Use this file to discover all available pages before exploring further.

Modelo

Los endpoints de lista en Rail devuelven un array puro (no envuelto en { data: [...] }). La info de paginación va en headers:
HeaderSignifica
X-Total-CountTotal de resultados que matchean tu query.
LinkURLs a páginas siguientes/anteriores/última (RFC 5988).
curl -i "https://api.rail.cl/v1/accounts/acc_xxx/movements?per_page=10" \
  -H "Authorization: Bearer rail_sk_live_…"
Response headers:
HTTP/2 200
content-type: application/json
x-total-count: 238
link: <https://api.rail.cl/v1/accounts/acc_xxx/movements?per_page=10&page=2>; rel="next", <https://api.rail.cl/v1/accounts/acc_xxx/movements?per_page=10&page=24>; rel="last"

Query params

ParamDefaultMax
page1
per_page30300
function parseLinkHeader(header: string): Record<string, string> {
  const links: Record<string, string> = {};
  for (const part of header.split(',')) {
    const m = part.trim().match(/^<(.+)>;\s*rel="(.+)"$/);
    if (m) links[m[2]] = m[1];
  }
  return links;
}

// Uso
const res = await fetch(url, { headers });
const links = parseLinkHeader(res.headers.get('link') ?? '');
console.log(links.next);  // → URL absoluta de la siguiente página
console.log(links.last);  // → URL absoluta de la última

Iterar todo

async function fetchAllMovements(accountId: string, apiKey: string) {
  const all: Movement[] = [];
  let url: string | null = `https://api.rail.cl/v1/accounts/${accountId}/movements?per_page=200`;
  while (url) {
    const res = await fetch(url, {
      headers: { Authorization: `Bearer ${apiKey}` },
    });
    const page = await res.json();
    all.push(...page);
    const links = parseLinkHeader(res.headers.get('link') ?? '');
    url = links.next ?? null;
  }
  return all;
}

Recomendación: usá synced_since en vez de page

Para sync incremental, no paginees por page. Usá synced_since con un cursor monótono:
# Primer sync
curl "...?per_page=200&page=1"
# guardá el max(synced_at) de la response como cursor

# Sucesivos
curl "...?per_page=200&synced_since=<cursor>"
Esto te asegura que no perdés movs retroactivos que el banco posteó días después de la transacción real. page puede saltearte movs si entre dos calls se insertaron nuevos en medio.