Para agentes
Nodda está diseñado para operar sin intervención humana. Un agente puede descubrir conexiones, disparar syncs, esperar resultados y leer datos usando únicamente la API REST — sin scraping, sin sesiones de navegador.
El loop autónomo
1. Descubrir fuentes disponibles
Devuelve el catálogo público de fuentes (SII, Banco Security…) con sus scopes disponibles. No requiere conexión activa.
2. Listar conexiones de la organización
Devuelve todas las conexiones de la organización asociada a la key. Cada conexión
incluye su campo scopes[] con name, label, data_url, filters y
sync_metadata — suficiente para que el agente sepa qué datos puede consultar y
cómo disparar un sync con los parámetros correctos.
3. Sincronizar
La API responde 202 de inmediato con la corrida encolada:
El 202 confirma que la corrida quedó encolada. El sync real ocurre en un
workflow asíncrono fuera del request.
4. Esperar
Haz polling sobre GET /connections/{id}/sync-runs/{sync_id} hasta que status
sea terminal (succeeded, partial o failed):
Estados terminales:
status | Qué significa |
|---|---|
succeeded | todos los scopes completaron sin error (un scope ok puede traer notices informativos) |
partial | algunos scopes completaron, otros fallaron — revisa scope_outcomes[] |
failed | la corrida falló completamente |
Cuando el estado es partial, scope_outcomes[] te dice exactamente qué scope
falló y por qué:
Un scope ok puede traer notices: avisos informativos que no degradan
la corrida. P. ej. SII solo conserva el detalle de guías de los últimos 6 meses;
para periodos más viejos el scope guias termina ok con un aviso de código
estable:
5. Leer
Con la corrida en succeeded o partial, usa el data_url del scope (del
descriptor de la conexión) para consultar los datos proyectados:
Contrato legible por máquina
La especificación completa de la API está disponible en formato OpenAPI 3.1:
Cualquier framework de agentes (LangChain, LlamaIndex, Claude Tool Use, OpenAI Function Calling…) puede introspectarla directamente para descubrir endpoints, parámetros y esquemas de respuesta sin necesidad de documentación adicional.
Versión Markdown de cada página
Cada página de esta documentación se sirve también en Markdown para consumo por
LLMs. Basta agregar .md al final de la URL:
https://nodda.cl/docs/agents.mdhttps://nodda.cl/docs/index.mdhttps://nodda.cl/docs/sync.mdhttps://nodda.cl/docs/connections.md
Reglas clave para un agente
- La organización se resuelve desde la key: el header
Authorization: Bearer nodda_sk_…determina la organización — no hay que pasarorganization_idexplícitamente. directionusareceived/issued: norecibida/emitida. Así lo devuelve la API en todos los endpoints.- Los montos vienen como strings JSON:
"amount": "2500000.00"— parsea a decimal antes de operar aritméticamente. - Usa
…/periodspara descubrir periodos disponibles: los siete endpoints de lista principal (sii-rcv-documents,sii-dispatch-guides,sii-boletas,security-transfers,security-nominas,security-movements,bci-movements) exponen un sub-recurso/periodsque lista los periodos con registros. Úsalo en vez de adivinar rangos de fecha. El sub-listado…/pagosno tiene/periods. scope_outcomes[]te dice qué falló en unpartial: cuandostatusespartial, iterascope_outcomespara saber qué scopes completaron y cuáles no, en vez de asumir que todos fallaron. Después de iterarscope_outcomes, usascope_outcomes[].periodpara llamar al read endpoint de cada scope con el periodo correcto (?period=); en scopes point-in-timeperiodesnully se consulta con?latest=true.- Revisa
noticesincluso enok/succeeded: un scope puede completaroky aun así dejar avisos informativos (notices: [{ code, message }], concodeestable). P. ej.sii.guias.out_of_windowsignifica que esos periodos quedaron fuera de la ventana de 6 meses de SII: no es un error y reintentar no los recupera, así que no los reintentes en loop. - Crear o eliminar conexiones es solo-dashboard: las API keys reciben
403en esas operaciones. El agente puede leer y sincronizar, pero la gestión de conexiones es tarea del operador humano desde la plataforma. - Paginación
limit/offset: todos los endpoints de lista aceptanlimit(1–200, por defecto 50) yoffset(por defecto 0). Usahas_moreen la respuesta para saber si hay más páginas.