Sync
Un sync extrae datos de la fuente y los persiste. Corre fuera del request:
la API crea una corrida durable y responde 202 de inmediato; el procesamiento
real ocurre en un workflow asíncrono. Sigue el avance con
GET /sync-runs/{runId} o suscríbete a webhooks.
Gatillar un sync
Cuerpo (todo opcional):
| Campo | Tipo | Notas |
|---|---|---|
scopes | string[] | scopes a sincronizar (p. ej. ["rcv"]). Deben estar habilitados en la conexión. Si se omite, se usan todos los enabled_scopes de la conexión |
metadata | object | metadatos por scope para esta corrida (p. ej. { "period": "2026-05" } para RCV) |
El
triggerde las corridas creadas por este endpoint es siempremanual.Coalescing: si ya existe una corrida
queuedy aún no despachada para la misma conexión, se reutiliza en lugar de crear una nueva. Elsync_iddevuelto puede corresponder a una corrida existente.
Respuesta (202) — el recurso va al tope (sin data):
El 202 significa que la corrida quedó encolada (queued), no que ya terminó.
Metadatos por scope
Los metadatos (metadata) se aplican al scope correspondiente. Cada fuente define los
suyos:
| Fuente | Scope | Campos |
|---|---|---|
sii | rcv | period (string YYYY-MM) |
sii | guias | period (string YYYY-MM), issueType (issued|received, opcional) |
banco_security | directas | period (string YYYY-MM) |
banco_security | masivas | period (string YYYY-MM) |
banco_security | movimientos | period (string YYYY-MM) |
bci_pyme | movimientos | period (string YYYY-MM) |
Puedes consultar el sync_metadata de cada scope en el descriptor de conexión.
Listar corridas de sync
Devuelve las 10 corridas más recientes de la conexión, de la más nueva a la más antigua.
Respuesta (200):
Obtener una corrida de sync
Devuelve una corrida de sync en detalle, incluyendo scope_outcomes por scope e
input_metadata (los metadatos de entrada con secretos redactados). Usa este
endpoint para polling hasta que la corrida termine.
Respuesta (200):
Polling
Haz polling sobre GET /sync-runs/{runId} hasta que status sea terminal:
status | Significado |
|---|---|
queued | encolada, esperando despacho |
running | en ejecución |
succeeded | todos los scopes completaron sin error (pueden incluir notices informativos) |
partial | algunos scopes completaron, otros fallaron (ver scope_outcomes) |
failed | la corrida falló completamente |
Los estados succeeded y partial son terminales. Revisa scope_outcomes para
el detalle por scope cuando el estado es partial.
Campos de una corrida de sync
| Campo | Tipo | Notas |
|---|---|---|
id | UUID | identificador de la corrida |
connection_id | UUID | conexión asociada |
scopes | string[] | scopes sincronizados en esta corrida |
scope_outcomes | object[] | resultado por scope (ver abajo) |
trigger | string | manual · scheduled · system |
status | string | queued · running · succeeded · failed · partial |
started_at | datetime | null | cuándo empezó (null si aún queued) |
finished_at | datetime | null | cuándo terminó (null si en curso) |
error_code | string | null | código de error si la corrida falló totalmente |
error_message | string | null | mensaje de error con secretos redactados |
records_found | number | null | registros descubiertos en total |
records_created | number | null | registros nuevos persistidos |
records_updated | number | null | registros actualizados |
progress | object | null | avance sanitizado: { stage, message, updated_at } |
input_metadata | object | metadatos de entrada con secretos redactados (solo en GET /{runId}) |
created_at | datetime | cuándo se creó la corrida |
Campos de scope_outcomes[]
| Campo | Tipo | Notas |
|---|---|---|
scope | string | nombre del scope |
status | string | ok · partial · failed |
records_found | number | null | registros descubiertos para este scope |
duration_ms | integer | null | Wall-clock milliseconds this scope took during the sync run. |
period | string | null | periodo (YYYY-MM) sincronizado para este scope; null en scopes point-in-time (ej. saldos) |
error_code | string | null | código de error si este scope falló |
error_message | string | null | mensaje de error con secretos redactados |
notices | object[] | avisos informativos { code, message } que no degradan la corrida (ver abajo) |
progress.stagese limita a una lista blanca de etapas conocidas (p. ej.sii_login,fetching_rcv_detail,projecting_rcv_documents,completed); los mensajes redactan RUTs y secretos.
Avisos (notices)
Cada scope_outcomes[] incluye notices: condiciones informativas y
esperadas que no degradan el estado de la corrida. A diferencia de un
error, un aviso no cambia el status del scope (ok) ni del run (succeeded).
Caso típico: SII solo conserva el detalle de las guías de los últimos 6
meses. Para períodos más viejos el scope guias igual termina ok, pero deja
un aviso sii.guias.out_of_window:
Cada aviso es { code, message }: code es estable y pensado para programar
contra él; message es legible y va con secretos redactados.
Errores
400 validation_error— cuerpo inválido (JSON malformado o tipos incorrectos).404 connection_not_found— la conexión no existe o no pertenece a tu organización.404 sync_run_not_found— la corrida no existe en esa conexión.422 scope_not_supported— alguno de losscopespedidos no existe en el conector de la fuente.422 scope_not_enabled— alguno de losscopespedidos no está habilitado en la conexión.422 invalid_sync_metadata— los metadatos de sync no pasan la validación del scope.
Catálogo completo en Errores.