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.

Shape estándar

Todos los errores 4xx/5xx siguen este shape:
{
  "error": {
    "type": "invalid_request_error",
    "code": "missing_field",
    "message": "El campo 'link_id' es requerido.",
    "param": "link_id",
    "doc_url": "https://docs.rail.cl/guides/errors#missing_field"
  }
}
FieldTipoSignifica
typestringCategoría del error
codestringIdentificador específico (usar para lógica)
messagestringTexto en español para mostrar al user
paramstring?Field específico que rompió (opcional)
doc_urlstring?URL a esta doc con anchor al code (opcional)

Types

typeHTTPSignifica
invalid_request_error400Validación de body/query/params
authentication_error401Credencial inválida o ausente
permission_error403Credencial válida pero sin scope
not_found_error404Recurso no existe o no pertenece al cliente
conflict_error409Estado conflictivo (idempotency_conflict, in_progress, etc)
rate_limit_error429Demasiados requests — backoff
bank_error502El banco rebotó (transient)
internal_error500Error nuestro — reintentá

Catálogo de codes

Auth

codeSignifica
invalid_credentialKey inexistente, malformada o revocada
insufficient_scopeKey válida pero sin permisos para el endpoint
wrong_modeEstás usando sk_test contra recursos live o viceversa

Validación

codeSignifica
missing_fieldFalta un campo requerido (ver param)
invalid_fieldCampo con valor inválido (ver param)
unknown_fieldCampo no reconocido en el body

Recursos

codeSignifica
link_not_foundEl link_id no existe o no pertenece al cliente
account_not_foundEl account_id no existe
bank_not_supportedEl bank_id no está habilitado

Refresh intents

codeSignifica
refresh_intent_in_progressYa hay un intent activo para este link
refresh_intent_cooldownEsperá los 5min de cooldown desde el último intent

Bancos (transient — reintentables)

codeSignifica
bank_unavailableBanco caído o muy lento
bank_format_changeBanco cambió HTML, parser nuestro está roto. Rail está sobre eso.
rejected_credentialsBanco rechazó las creds. User debe re-conectar (no es transient técnicamente — es del user).

Idempotency

codeSignifica
idempotency_conflictMisma Idempotency-Key con body diferente

Manejo recomendado

async function railFetch<T>(path: string, opts: RequestInit): Promise<T> {
  const res = await fetch(`https://api.rail.cl${path}`, opts);
  if (!res.ok) {
    const body = await res.json().catch(() => ({}));
    const err = body.error ?? {};
    throw new RailError(res.status, err.code, err.message, err.param);
  }
  return res.json();
}

class RailError extends Error {
  constructor(
    public status: number,
    public code: string,
    message: string,
    public param?: string,
  ) {
    super(message);
  }
}
Después, en tu app:
try {
  await railFetch('/v1/refresh_intents', { ... });
} catch (e) {
  if (e instanceof RailError) {
    if (e.code === 'refresh_intent_in_progress') {
      // No es error real — ya está corriendo
      return;
    }
    if (e.code === 'rejected_credentials') {
      // Notificá al user para que re-conecte
    }
    if (e.status >= 500) {
      // Transient, reintentar con backoff
    }
  }
}