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/v1Solo 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:
| Archivo | Qué es |
|---|---|
/openapi.yaml | El contrato de /v1, byte a byte el que revisamos. |
/openapi.json | El mismo documento en JSON, generado del YAML en cada build. |
/openapi-bootstrap.yaml | El arranque en frío: crear la cuenta y mintear la primera llave. |
/openapi-bootstrap.json | Lo 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.tsEmite 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 uvLos 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
Cuenta y llaves (5)
Empresas (40)
Folios y CAF (5)
Documentos (15)
Documentos recibidos (7)
Impuestos (23)
Conectores (7)
Webhooks (11)
Consumo (2)
Test helpers (8)
Meta (3)
Esquemas (5)
Todos los endpoints
| Método | Ruta | Qué hace |
|---|---|---|
GET | /account | Devuelve la cuenta y la llave en uso |
GET | /api_keys | Lista las llaves de API (solo metadatos; los secretos nunca se devuelven) |
POST | /api_keys | Mintea 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}/roll | Emite un secreto de reemplazo para una llave (solo con llave root) |
GET | /empresas | Lista las empresas que esta llave puede ver |
POST | /empresas | Crea 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}/mandato | Si el representante legal firmó, contra qué términos, y cómo |
POST | /empresas/{empresa_id}/mandato | Registra el mandato que autoriza a Facturia a actuar ante el SII |
DELETE | /empresas/{empresa_id}/mandato | Revoca el mandato |
GET | /empresas/{empresa_id}/certificate | Devuelve los metadatos del certificado |
POST | /empresas/{empresa_id}/certificate | Carga (o reutiliza) el certificado digital de la empresa |
DELETE | /empresas/{empresa_id}/certificate | Purga el certificado de la bóveda (revoca la custodia y suspende la emisión) |
GET | /empresas/{empresa_id}/sfg_credential | Consulta los metadatos de custodia de la clave centralizada del SFG |
POST | /empresas/{empresa_id}/sfg_credential | Guarda (o reemplaza) la clave centralizada del SFG |
DELETE | /empresas/{empresa_id}/sfg_credential | Destruye la clave centralizada del SFG (termina la custodia) |
POST | /empresas/{empresa_id}/mandato/revocation_link | Acuña la página alojada donde el representante legal revoca |
POST | /empresas/{empresa_id}/resolucion/verify | Verifica una resolución declarada con un único timbraje de producción (solo operadores de Facturia) |
GET | /empresas/{empresa_id}/counterparties | Las 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}/contacts | Los contactos registrados para una contraparte |
POST | /empresas/{empresa_id}/counterparties/{counterparty_rut}/contacts | Registrar 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}/onboarding | Ciclo de vida de la puesta en marcha, sus pasos y las acciones humanas que la bloquean |
POST | /empresas/{empresa_id}/onboarding/links | Acuna 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_live | Pide al titular que apruebe la puesta en marcha, o declara la decisión en su nombre |
POST | /empresas/{empresa_id}/onboarding/steps/{step}/recheck | Avísanos que una persona hizo su paso, y vamos a mirar |
POST | /empresas/{empresa_id}/onboarding/steps/{step}/attest | Registra que una persona realizó un paso que este build no puede comprobar por sí solo (#395) |
POST | /empresas/{empresa_id}/onboarding/steps/{step}/approve | Registrar la autorización del titular para un paso que después ejecutamos nosotros (#452, #453) |
GET | /empresas/{empresa_id}/onboarding/certification | El set de pruebas: qué se cargó, qué falta y qué contestó el SII |
POST | /empresas/{empresa_id}/onboarding/certification/set_file | Sube el set de pruebas que el SII emitió para esta empresa |
POST | /empresas/{empresa_id}/onboarding/certification/inputs | Entrega los datos que el set de pruebas no trae |
GET | /empresas/{empresa_id}/onboarding/evidence | La rendicion de cuentas: lo que hicimos por la empresa ante el SII |
GET | /empresas/{empresa_id}/onboarding/evidence/export | La rendicion de cuentas como un solo archivo CSV |
GET | /empresas/{empresa_id}/automation_settings | Devuelve las automatizaciones de la empresa |
PATCH | /empresas/{empresa_id}/automation_settings | Actualiza las automatizaciones de la empresa |
GET | /empresas/{empresa_id}/branding | Lee el logo, el formato de impresión por defecto y el texto del pie |
PATCH | /empresas/{empresa_id}/branding | Actualiza el logo, el formato de impresión por defecto y el pie de página |
GET | /folios | Disponibilidad de folios por tipo de documento |
POST | /folios/requests | Solicita un CAF nuevo al SII (asíncrono) |
GET | /cafs | Lista los CAF que esta empresa tiene cargados |
POST | /cafs | Carga un CAF que ya tienes |
DELETE | /cafs/{caf_id} | Desactiva un CAF (el historial se conserva) |
GET | /documents | Lista los documentos emitidos |
POST | /documents | Emite un DTE |
POST | /documents/previews | Cotiza 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}/pdf | Descarga el PDF |
GET | /documents/{document_id}/xml | Descarga el XML firmado, exactamente como se envió al SII |
GET | /documents/{document_id}/events | Eventos del ciclo de vida de un documento |
POST | /documents/{document_id}/retry | Reintenta un documento en failed |
POST | /documents/{document_id}/send | Envía el documento por correo al receptor |
POST | /documents/{document_id}/cesion | Pregúntale al SII si esta factura es cedible |
POST | /documents/{document_id}/cede | Cede esta factura a un factoring, inscribiéndola en el RTC del SII |
POST | /documents/{document_id}/credit_note | Emite una nota de crédito contra este documento |
POST | /documents/{document_id}/public_links | Crea o rota los enlaces públicos de los artefactos de este documento |
DELETE | /documents/{document_id}/public_links | Revoca todos los enlaces públicos de este documento |
GET | /received_documents | Lista los DTE de proveedores recibidos por esta empresa |
GET | /received_documents/{received_document_id} | Devuelve un documento recibido |
GET | /received_documents/{received_document_id}/xml | Descarga el XML original del proveedor |
GET | /received_documents/{received_document_id}/pdf | Genera el PDF del documento recibido |
POST | /received_documents/{received_document_id}/accept | Acepta el contenido (acción ACD del SII) |
POST | /received_documents/{received_document_id}/reject | Reclama el documento (RCD / RFP / RFT) |
POST | /received_documents/{received_document_id}/acknowledge_receipt | Otorga el recibo de mercaderías o servicios (acción ERM del SII) |
GET | /tax/purchases | RCV — registro de compras |
GET | /tax/sales | RCV — registro de ventas |
GET | /tax/summary | Totales agregados del RCV para un período (las entradas del F29) |
POST | /tax/sync | Fuerza una resincronización del RCV (asíncrona) |
POST | /tax/purchases/characterize | Caracteriza hasta 500 entradas de compra en una sola llamada |
POST | /tax/purchases/{entry_id}/characterize | Caracteriza una entrada de compra (escribe en el registro del SII) |
POST | /tax/purchases/{entry_id}/characterize/revert | Deshace la última caracterización asentada de una compra |
POST | /tax/purchases/{entry_id}/estado_contable | Mueve una entrada entre REGISTRO / PENDIENTE / NO_INCLUIR |
GET | /tax/f29/proposals | Lista 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_file | Descarga el .txt en formato SII de esta propuesta |
POST | /tax/f29/proposals/{period}/public_links | Crea un enlace sin autenticación al .txt de carga de la propuesta |
DELETE | /tax/f29/proposals/{period}/public_links | Revoca todos los enlaces públicos de esta propuesta |
POST | /tax/f29/proposals/{period}/recompute | Recalcula la propuesta, con la opción de sobrescribir códigos |
GET | /tax/f29/filings | Lista las declaraciones de F29 |
POST | /tax/f29/filings | Declara el F29 de un período (job asíncrono) |
GET | /tax/f29/filings/{filing_id} | Devuelve una declaración |
GET | /tax/expenses | Lista los cargos en moneda extranjera ingresados |
POST | /tax/expenses | Ingresa un cargo que podría requerir una factura de compra tipo 46 |
GET | /tax/suggestions | Lista las sugerencias tributarias |
GET | /tax/suggestions/{suggestion_id} | Devuelve una sugerencia |
POST | /tax/suggestions/{suggestion_id}/confirm | Confirma una sugerencia (en emit_46, emite el documento) |
POST | /tax/suggestions/{suggestion_id}/dismiss | Descarta una sugerencia |
GET | /connections | Lista las conexiones de conectores de esta empresa |
POST | /connections | Crea 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}/sync | Fuerza una sincronización de movimientos (asíncrona) |
GET | /tax/statements | Lista las cartolas cargadas |
POST | /tax/statements | Carga una cartola (CSV/XLSX) para crear gastos |
GET | /webhook_endpoints | Lista los endpoints de webhook |
POST | /webhook_endpoints | Registra 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}/ping | Envía un evento sintético para verificar la conexión |
POST | /webhook_endpoints/{webhook_endpoint_id}/rotate_secret | Rota el secreto de firma |
GET | /webhook_endpoints/{webhook_endpoint_id}/deliveries | Inspecciona los intentos de entrega |
POST | /webhook_endpoints/{webhook_endpoint_id}/deliveries/{delivery_id}/retry | Reenvía un evento |
GET | /events | Consulta el libro de eventos (retención de 12 meses) |
GET | /events/{event_id} | Devuelve un evento |
GET | /usage | Resumen de consumo de un período de facturación |
GET | /usage/records | El libro de consumo inmutable |
POST | /test_helpers/received_documents | Inyecta un DTE de proveedor como si hubiera llegado a la casilla de recepción |
POST | /test_helpers/rcv/seed | Siembra filas de RCV en un período para que la propuesta de F29 tenga datos |
POST | /test_helpers/clock | Adelanta el reloj simulado de esta empresa |
POST | /test_helpers/empresas/{empresa_id}/onboarding | Lleva la puesta en marcha de una empresa a cualquier estado |
POST | /test_helpers/empresas/{empresa_id}/onboarding/steps | Fuerza el estado de un paso concreto de la puesta en marcha |
POST | /test_helpers/documents/{document_id}/estado | Fuerza el estado crudo del SII de un documento de sandbox ya emitido |
POST | /test_helpers/f29/proposals | Inject a computed F29 propuesta |
POST | /test_helpers/f29/validations | Fuerza 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_terms | El texto y la versión vigente del mandato |
GET | /error_codes | El 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.
| Grupo | Eventos |
|---|---|
document.lifecycle | document.created | .sent | .accepted | .reparo | .rejected | .failed | .annulled |
document.delivery | document.emailed | .email_failed |
document.cesion | document.cesion_submitted | .cesion_confirmed | .cesion_failed |
received_document.lifecycle | received_document.created | .deadline_approaching | .accepted | .rejected | .receipt_acknowledged |
reception.operations | reception.acuse_sent | .acuse_failed | .quarantined |
empresa.lifecycle | empresa.* | certificate.* | folios.* | connection.* | api_key.* | webhook_endpoint.disabled |
tax.lifecycle | tax.rcv.synced | tax.f29.* | tax.suggestion.* | tax.statement.imported |
ping | ping |