Facturiadocs
Referencia API

Referencia de la API

Todos los endpoints de /v1, generados desde el OpenAPI 3.1 que publicamos junto con la especificación.

Esta referencia se genera desde public-api-openapi.yaml en cada build, así que no puede desviarse del contrato. La especificación en prosa manda donde ambas difieran.

https://api.facturia.cl/v1

Solo TLS 1.2+. No hay raíz sin versionar ni puerto sin cifrar. Cada respuesta lleva Facturia-Request-Id; cítalo en soporte.

El contrato en crudo

Esta página es la lectura humana. El documento OpenAPI 3.1 del que sale, versión 1.0.0, se publica tal cual para generar clientes:

ArchivoQué es
/openapi.yamlEl contrato de /v1, byte a byte el que revisamos.
/openapi.jsonEl mismo documento en JSON, generado del YAML en cada build.
/openapi-bootstrap.yamlEl arranque en frío: crear la cuenta y mintear la primera llave.
/openapi-bootstrap.jsonLo mismo, en JSON.

Son dos documentos porque son dos superficies: /v1 se autentica con una llave sk_, y una cuenta recién creada no tiene ninguna. El arranque en frío responde en otra URL base, con una sesión de cuenta en vez de una llave, así que meterlo en el mismo archivo declararía URLs y credenciales que no existen. Genera un cliente del segundo para conseguir la llave, y uno del primero para usar el producto.

Ninguna ruta llega al archivo publicado sin haber sido probada contra el router real: si el contrato declarara un endpoint que la API no monta, el build de este sitio falla antes de publicarlo.

Generar un cliente tipado

No publicamos un paquete de npm ni de pip: la API es HTTP y nada más, y un SDK propio es una capa que se queda atrás del contrato. Lo que sí publicamos es el contrato, y de ahí sale un cliente tipado con una línea. Son dos comandos porque son dos documentos: el del arranque en frío consigue la llave, el de /v1 usa el producto.

TypeScript

npx openapi-typescript https://docs.facturia.cl/openapi-bootstrap.yaml -o bootstrap.d.ts
npx openapi-typescript https://docs.facturia.cl/openapi.yaml -o facturia.d.ts

Emite solo tipos, sin runtime. Para las llamadas, fetch con esos tipos basta; si prefieres un cliente con métodos, openapi-fetch consume el mismo facturia.d.ts.

Python

pipx run openapi-python-client generate --url https://docs.facturia.cl/openapi-bootstrap.yaml
pipx run openapi-python-client generate --url https://docs.facturia.cl/openapi.yaml

# uvx openapi-python-client generate --url …   # lo mismo, si usas uv / same thing, with uv

Los dos documentos pasan enteros por los dos generadores de Python: openapi-python-client genera las 11 operaciones del arranque en frío y las 122 de /v1 sin descartar ninguna respuesta ni ningún esquema, y openapi-generator-cli -g python termina sin excepción sobre ambos. Hasta el 2026-09-07 no era así — el data nullable del sobre chocaba con el data tipado de cada operación y las cinco respuestas de /account/* salían sin tipo, justo la que entrega data.api_key.secret; y SendJob, StatementImportJob, RcvEntry, RcvEntryList y AutomationSettings desaparecían del cliente. Eran formas del documento, no límites del generador, y están corregidas (#476) sin cambiar un byte de lo que viaja por el cable.

La única excepción que queda: los cuatro artefactos binarios (GET /documents/{document_id}/pdf y /xml, y sus dos gemelos en /received_documents) responden application/pdf y application/xml, y openapi-python-client solo tipa cuerpos JSON. El método se genera igual y response.content trae los bytes; si quieres el tipo, pásale un config.yml con content_type_overrides: {"application/pdf": "application/octet-stream", "application/xml": "text/plain"}. No lo arreglamos en el documento porque el Content-Type declarado es el que el servidor manda de verdad.

Los dos documentos son OpenAPI 3.1. Un generador que solo entiende 3.0 va a tropezar con los tipos nullable (type: [integer, "null"]), que es la forma correcta en 3.1 — usa una versión que soporte 3.1 en vez de convertir el documento.

El versionado es aditivo dentro de /v1 (§5.8), así que un cliente regenerado nunca pierde un método: gana campos y valores de enum nuevos. Un cliente que se cae con un campo desconocido tiene un bug, y esa es la única regla de compatibilidad que pedimos.

Capítulos

Todos los endpoints

MétodoRutaQué hace
GET/accountDevuelve la cuenta y la llave en uso
GET/api_keysLista las llaves de API (solo metadatos; los secretos nunca se devuelven)
POST/api_keysMintea una llave de API (solo con llave root)
DELETE/api_keys/{key_id}Revoca una llave de API de inmediato (solo con llave root)
POST/api_keys/{key_id}/rollEmite un secreto de reemplazo para una llave (solo con llave root)
GET/empresasLista las empresas que esta llave puede ver
POST/empresasCrea una empresa
GET/empresas/{empresa_id}Devuelve una empresa
PATCH/empresas/{empresa_id}Actualiza una empresa
DELETE/empresas/{empresa_id}Borra una empresa de SANDBOX
GET/empresas/{empresa_id}/mandatoSi el representante legal firmó, contra qué términos, y cómo
POST/empresas/{empresa_id}/mandatoRegistra el mandato que autoriza a Facturia a actuar ante el SII
DELETE/empresas/{empresa_id}/mandatoRevoca el mandato
GET/empresas/{empresa_id}/certificateDevuelve los metadatos del certificado
POST/empresas/{empresa_id}/certificateCarga (o reutiliza) el certificado digital de la empresa
DELETE/empresas/{empresa_id}/certificatePurga el certificado de la bóveda (revoca la custodia y suspende la emisión)
GET/empresas/{empresa_id}/sfg_credentialConsulta los metadatos de custodia de la clave centralizada del SFG
POST/empresas/{empresa_id}/sfg_credentialGuarda (o reemplaza) la clave centralizada del SFG
DELETE/empresas/{empresa_id}/sfg_credentialDestruye la clave centralizada del SFG (termina la custodia)
POST/empresas/{empresa_id}/mandato/revocation_linkAcuña la página alojada donde el representante legal revoca
POST/empresas/{empresa_id}/resolucion/verifyVerifica una resolución declarada con un único timbraje de producción (solo operadores de Facturia)
GET/empresas/{empresa_id}/counterpartiesLas contrapartes a las que has facturado, con la dirección y los contactos que tienes registrados para cada una
GET/contribuyentes/{rut}Lo que el SII publica sobre una empresa, por RUT, y un giro que cabe en la factura
GET/empresas/{empresa_id}/counterparties/{counterparty_rut}Lo que sabes de una contraparte, y si lo declaraste tú o lo inferimos nosotros
PATCH/empresas/{empresa_id}/counterparties/{counterparty_rut}Deja registrados la razón social, el giro y la dirección de una contraparte
GET/empresas/{empresa_id}/counterparties/{counterparty_rut}/contactsLos contactos registrados para una contraparte
POST/empresas/{empresa_id}/counterparties/{counterparty_rut}/contactsRegistrar un contacto responsable
PATCH/empresas/{empresa_id}/counterparties/{counterparty_rut}/contacts/{contact_id}Edit a contact, promote it, or record an opt-out
DELETE/empresas/{empresa_id}/counterparties/{counterparty_rut}/contacts/{contact_id}Sacar un contacto de la agenda
GET/empresas/{empresa_id}/onboardingCiclo de vida de la puesta en marcha, sus pasos y las acciones humanas que la bloquean
POST/empresas/{empresa_id}/onboarding/linksAcuna un enlace a una pagina alojada para el representante legal
DELETE/empresas/{empresa_id}/onboarding/links/{step}Revoca un enlace alojado del representante legal
POST/empresas/{empresa_id}/onboarding/go_livePide al titular que apruebe la puesta en marcha, o declara la decisión en su nombre
POST/empresas/{empresa_id}/onboarding/steps/{step}/recheckAvísanos que una persona hizo su paso, y vamos a mirar
POST/empresas/{empresa_id}/onboarding/steps/{step}/attestRegistra que una persona realizó un paso que este build no puede comprobar por sí solo (#395)
POST/empresas/{empresa_id}/onboarding/steps/{step}/approveRegistrar la autorización del titular para un paso que después ejecutamos nosotros (#452, #453)
GET/empresas/{empresa_id}/onboarding/certificationEl set de pruebas: qué se cargó, qué falta y qué contestó el SII
POST/empresas/{empresa_id}/onboarding/certification/set_fileSube el set de pruebas que el SII emitió para esta empresa
POST/empresas/{empresa_id}/onboarding/certification/inputsEntrega los datos que el set de pruebas no trae
GET/empresas/{empresa_id}/onboarding/evidenceLa rendicion de cuentas: lo que hicimos por la empresa ante el SII
GET/empresas/{empresa_id}/onboarding/evidence/exportLa rendicion de cuentas como un solo archivo CSV
GET/empresas/{empresa_id}/automation_settingsDevuelve las automatizaciones de la empresa
PATCH/empresas/{empresa_id}/automation_settingsActualiza las automatizaciones de la empresa
GET/empresas/{empresa_id}/brandingLee el logo, el formato de impresión por defecto y el texto del pie
PATCH/empresas/{empresa_id}/brandingActualiza el logo, el formato de impresión por defecto y el pie de página
GET/foliosDisponibilidad de folios por tipo de documento
POST/folios/requestsSolicita un CAF nuevo al SII (asíncrono)
GET/cafsLista los CAF que esta empresa tiene cargados
POST/cafsCarga un CAF que ya tienes
DELETE/cafs/{caf_id}Desactiva un CAF (el historial se conserva)
GET/documentsLista los documentos emitidos
POST/documentsEmite un DTE
POST/documents/previewsCotiza y valida un documento sin emitirlo
GET/documents/previews/{preview_id}Lee una previsualización guardada
GET/documents/{document_id}Devuelve un documento
GET/documents/{document_id}/pdfDescarga el PDF
GET/documents/{document_id}/xmlDescarga el XML firmado, exactamente como se envió al SII
GET/documents/{document_id}/eventsEventos del ciclo de vida de un documento
POST/documents/{document_id}/retryReintenta un documento en failed
POST/documents/{document_id}/sendEnvía el documento por correo al receptor
POST/documents/{document_id}/cesionPregúntale al SII si esta factura es cedible
POST/documents/{document_id}/cedeCede esta factura a un factoring, inscribiéndola en el RTC del SII
POST/documents/{document_id}/credit_noteEmite una nota de crédito contra este documento
POST/documents/{document_id}/public_linksCrea o rota los enlaces públicos de los artefactos de este documento
DELETE/documents/{document_id}/public_linksRevoca todos los enlaces públicos de este documento
GET/received_documentsLista los DTE de proveedores recibidos por esta empresa
GET/received_documents/{received_document_id}Devuelve un documento recibido
GET/received_documents/{received_document_id}/xmlDescarga el XML original del proveedor
GET/received_documents/{received_document_id}/pdfGenera el PDF del documento recibido
POST/received_documents/{received_document_id}/acceptAcepta el contenido (acción ACD del SII)
POST/received_documents/{received_document_id}/rejectReclama el documento (RCD / RFP / RFT)
POST/received_documents/{received_document_id}/acknowledge_receiptOtorga el recibo de mercaderías o servicios (acción ERM del SII)
GET/tax/purchasesRCV — registro de compras
GET/tax/salesRCV — registro de ventas
GET/tax/summaryTotales agregados del RCV para un período (las entradas del F29)
POST/tax/syncFuerza una resincronización del RCV (asíncrona)
POST/tax/purchases/characterizeCaracteriza hasta 500 entradas de compra en una sola llamada
POST/tax/purchases/{entry_id}/characterizeCaracteriza una entrada de compra (escribe en el registro del SII)
POST/tax/purchases/{entry_id}/characterize/revertDeshace la última caracterización asentada de una compra
POST/tax/purchases/{entry_id}/estado_contableMueve una entrada entre REGISTRO / PENDIENTE / NO_INCLUIR
GET/tax/f29/proposalsLista los períodos que tienen una propuesta calculada
GET/tax/f29/proposals/{period}Propuesta de F29 calculada para un período
GET/tax/f29/proposals/{period}/upload_fileDescarga el .txt en formato SII de esta propuesta
POST/tax/f29/proposals/{period}/public_linksCrea un enlace sin autenticación al .txt de carga de la propuesta
DELETE/tax/f29/proposals/{period}/public_linksRevoca todos los enlaces públicos de esta propuesta
POST/tax/f29/proposals/{period}/recomputeRecalcula la propuesta, con la opción de sobrescribir códigos
GET/tax/f29/filingsLista las declaraciones de F29
POST/tax/f29/filingsDeclara el F29 de un período (job asíncrono)
GET/tax/f29/filings/{filing_id}Devuelve una declaración
GET/tax/expensesLista los cargos en moneda extranjera ingresados
POST/tax/expensesIngresa un cargo que podría requerir una factura de compra tipo 46
GET/tax/suggestionsLista las sugerencias tributarias
GET/tax/suggestions/{suggestion_id}Devuelve una sugerencia
POST/tax/suggestions/{suggestion_id}/confirmConfirma una sugerencia (en emit_46, emite el documento)
POST/tax/suggestions/{suggestion_id}/dismissDescarta una sugerencia
GET/connectionsLista las conexiones de conectores de esta empresa
POST/connectionsCrea una conexión bancaria o de tarjeta con Fintoc
GET/connections/{connection_id}Devuelve una conexión
DELETE/connections/{connection_id}Desconecta (revoca el enlace y detiene la ingesta)
POST/connections/{connection_id}/syncFuerza una sincronización de movimientos (asíncrona)
GET/tax/statementsLista las cartolas cargadas
POST/tax/statementsCarga una cartola (CSV/XLSX) para crear gastos
GET/webhook_endpointsLista los endpoints de webhook
POST/webhook_endpointsRegistra un endpoint de webhook
GET/webhook_endpoints/{webhook_endpoint_id}Devuelve un endpoint de webhook
PATCH/webhook_endpoints/{webhook_endpoint_id}Actualiza un endpoint de webhook
DELETE/webhook_endpoints/{webhook_endpoint_id}Elimina un endpoint de webhook
POST/webhook_endpoints/{webhook_endpoint_id}/pingEnvía un evento sintético para verificar la conexión
POST/webhook_endpoints/{webhook_endpoint_id}/rotate_secretRota el secreto de firma
GET/webhook_endpoints/{webhook_endpoint_id}/deliveriesInspecciona los intentos de entrega
POST/webhook_endpoints/{webhook_endpoint_id}/deliveries/{delivery_id}/retryReenvía un evento
GET/eventsConsulta el libro de eventos (retención de 12 meses)
GET/events/{event_id}Devuelve un evento
GET/usageResumen de consumo de un período de facturación
GET/usage/recordsEl libro de consumo inmutable
POST/test_helpers/received_documentsInyecta un DTE de proveedor como si hubiera llegado a la casilla de recepción
POST/test_helpers/rcv/seedSiembra filas de RCV en un período para que la propuesta de F29 tenga datos
POST/test_helpers/clockAdelanta el reloj simulado de esta empresa
POST/test_helpers/empresas/{empresa_id}/onboardingLleva la puesta en marcha de una empresa a cualquier estado
POST/test_helpers/empresas/{empresa_id}/onboarding/stepsFuerza el estado de un paso concreto de la puesta en marcha
POST/test_helpers/documents/{document_id}/estadoFuerza el estado crudo del SII de un documento de sandbox ya emitido
POST/test_helpers/f29/proposalsInject a computed F29 propuesta
POST/test_helpers/f29/validationsFuerza el veredicto de la validación cruzada de un período
GET/jobs/{job_id}Devuelve un job asíncrono (solicitud de folios, envío, cesión, sincronización de RCV, importación)
GET/mandato_termsEl texto y la versión vigente del mandato
GET/error_codesEl diccionario de errores legible por máquina (sin autenticación)

Webhooks

El OpenAPI también describe los envíos salientes. Su forma, su firma y su calendario de reintentos están en Webhooks.

GrupoEventos
document.lifecycledocument.created | .sent | .accepted | .reparo | .rejected | .failed | .annulled
document.deliverydocument.emailed | .email_failed
document.cesiondocument.cesion_submitted | .cesion_confirmed | .cesion_failed
received_document.lifecyclereceived_document.created | .deadline_approaching | .accepted | .rejected | .receipt_acknowledged
reception.operationsreception.acuse_sent | .acuse_failed | .quarantined
empresa.lifecycleempresa.* | certificate.* | folios.* | connection.* | api_key.* | webhook_endpoint.disabled
tax.lifecycletax.rcv.synced | tax.f29.* | tax.suggestion.* | tax.statement.imported
pingping

En esta página