Facturador Pulsando — API de Facturación Electrónica SII (1.3.0)

Download OpenAPI specification:

Contacto Facturador Pulsando: contacto@pulsandotech.cl License: Propietario

API REST para emitir y consultar Documentos Tributarios Electrónicos (DTE) chilenos a través del SII: facturas, boletas, notas de crédito/débito y guías de despacho. Está pensada para integradores: tu ERP o sistema llama esta API y nosotros nos encargamos de folios (CAF), firma XMLDSig, timbre, envío al SII y la representación impresa (PDF).

Base URL: https://{host}/api/public/v1 (canal API Key). Antes de integrar, revisa la sección Guía de la barra lateral —empieza por Onboarding y requisitos del emisor y Autenticación—; la Referencia de la API documenta cada endpoint.

Onboarding y requisitos del emisor

Antes de emitir, cada centro debe estar habilitado como emisor electrónico ante el SII. Es un trámite del contribuyente (no del software) y depende de su situación tributaria:

  • Inicio de actividades vigente en el SII (primera categoría, afecto a IVA).
  • Certificado digital propio (.p12) del representante legal — con él se firman sus DTE. Es obligatorio e intransferible entre empresas.
  • Habilitación como emisor de DTE ante el SII, con los usuarios autorizados para firmar y enviar documentos.

Según el historial del centro:

Situación del centro Qué corresponde
Nunca emitió DTE Postular, obtener la verificación de actividades y aprobar el set de pruebas de certificación (ambiente maullin) antes de pasar a producción.
Ya emite con otro proveedor Solo migra: carga su certificado y solicita CAF nuevos. No recertifica.
Usa el sistema gratuito del SII (tipo 890) Primero debe desvincularse de ese sistema ante el SII.

La carga del certificado y de los CAF (folios) se realiza una sola vez por centro desde el portal web (no por esta API). Esta API es para emitir y consultar: una vez que el centro está habilitado y cuenta con folios, tu integración puede emitir y consultar sin restricciones.

Puesta en marcha asistida (servicio Pulsando). Dejamos a cada centro listo para emitir —acompañamiento en la postulación/certificación ante el SII y carga inicial de certificado y folios— como un servicio de onboarding. Escríbenos a contacto@pulsandotech.cl para coordinarlo.

Ambientes (desarrollo, certificación y producción)

Hay tres ambientes. Dos de ellos hablan con el SII; el de desarrollo no.

Ambiente Valor de ambiente Habla con el SII Validez tributaria
Desarrollo mock No No — el PDF lleva el sello SIN VALIDEZ TRIBUTARIA
Certificación certificacion Sí (maullin) No
Producción produccion Sí (palena)

En certificación y producción, el ambiente lo determina tu API Key:

  • sk_test_…certificación (maullin) — documentos de prueba, sin validez tributaria.
  • sk_live_…producción (palena) — documentos reales con validez tributaria.

Puedes usar una key sk_test_ aunque tu empresa ya esté en producción, para probar sin emitir documentos reales. Los listados y reportes quedan acotados al ambiente de la key (los documentos de prueba nunca se mezclan con los reales).

Ambiente de desarrollo

Al registrarte se crea automáticamente una empresa gemela en ambiente de desarrollo, que copia la identidad de tu empresa (razón social, giro, dirección, tipos de documento habilitados) sobre un RUT de prueba del rango 88.8xx.xxx, para no chocar con el RUT real de ningún contribuyente. La API Key sk_test_ de esa empresa llega por correo al email de contacto del registro.

Qué hace y qué no:

  • Emite de verdad: asigna folio, firma el XML (XMLDSig), genera el TED y el PDF417, y produce el PDF. El flujo que ejercitas es el mismo código de producción.
  • No envía nada al SII. No hay TrackID real ni respuesta del SII.
  • Folios sintéticos para los 12 tipos soportados (33, 34, 39, 41, 43, 46, 52, 56, 61, 110, 111, 112), así que no necesitas CAF ni certificado digital para probar.
  • El PDF lleva el sello SIN VALIDEZ TRIBUTARIA.

La empresa de desarrollo es dominante: aunque uses una key sk_live_ contra ella, el ambiente sigue siendo mock. Un documento de desarrollo no puede convertirse en uno real por equivocación.

Cuota y vigencia. El ambiente admite 200 documentos; superado el tope, la emisión responde 429 con el conteo (cuota.usados / cuota.limite) y un contacto para ampliarlo o pasar a producción. Un ambiente sin uso durante 30 días se da de baja, con aviso por correo a los 23 días.

Webhooks. Se disparan igual que en producción, con la misma firma HMAC. Distínguelos por el cuerpo del evento: livemode es false y ambiente vale mock (ver el esquema WebhookEvent). livemode es true solo en producción.

Probar el rechazo. La aceptación del SII es asíncrona y en desarrollo no hay SII, así que ningún documento se rechaza solo. Para ejercitar esa rama usa POST /dte/{id}/simular-estado, que fuerza el estado final y dispara los mismos webhooks y notificaciones. Solo existe en desarrollo: en certificación y producción responde 403.

Autenticación

Toda petición al canal de integradores va con tu API Key en el header X-Api-Key:

X-Api-Key: sk_live_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
  • sk_live_…producción (palena) · sk_test_…certificación (maullin). El prefijo decide el ambiente del DTE (ver Ambientes).

Antes de tener certificado y folios: el ambiente de desarrollo. Al registrarte recibes por correo una key sk_test_ de una empresa gemela en ambiente de desarrollo, que emite, firma y genera PDF sin tocar el SII y sin exigirte certificado digital ni CAF. Se usa igual que cualquier otra key, en el mismo header. Ver Ambientes.

Dos alcances de clave. Una API Key puede pertenecer a una empresa o a una organización (estudio contable, holding, partner) que administra varios RUT emisores:

Alcance RUT emisor Header X-Empresa-RUT
Empresa El de la clave — no se puede cambiar desde el request No se envía
Organización El que indiques en cada llamada Obligatorio

Si tu clave administra varias empresas, lee Varias empresas (estudios contables y holdings).

Gestión de keys. Se crean desde el portal web (Configuración → API Keys) y se muestran una sola vez al crearlas — guárdalas de forma segura. Cada key puede tener uno o varios de estos permisos (scopes):

Scope Permite
dte:create Emitir DTE (POST /dte)
dte:read Leer/listar DTE emitidos, resumen, autocompletar receptor
recepcion:read Leer DTE recibidos (intercambio)
recepcion:write Aceptar/reclamar DTE recibidos, subir XML manual
rcv:read Leer el Registro de Compras y Ventas
rcv:write Reclamar/marcar en el RCV (muta en el SII)
caf:read Ver estado de folios (CAF) disponibles
caf:write Solicitar nuevos folios al SII (vía RPA con tu certificado)
webhook:manage Registrar y administrar webhooks salientes

⚠️ Nunca pongas una API Key en el frontend, apps móviles ni en repositorios. Úsala solo desde tu backend. Si se filtra, revócala desde el portal y crea otra.

Las rutas de acceso por token para el receptor (/api/portal/…) son la única excepción: no usan API Key (ver Enlace para el receptor).

Varias empresas (estudios contables y holdings)

Sí: una sola cuenta puede emitir DTE para varios RUT emisores. Es el caso de un estudio contable que factura por sus empresas cliente, de un holding con varias sociedades, o de un SaaS que revende emisión.

Ese conjunto de RUT se llama cartera, y pertenece a una organización.

Las dos formas de indicar la empresa

1. Una clave por empresa (recomendada para emitir)

Creas una sk_live para cada RUT. La clave es la empresa: no envías ningún header extra. Si una se filtra, el daño se limita a esa empresa.

X-Api-Key: sk_live_...clave_de_la_panaderia...
POST /dte     → emite por la Panadería

2. Una clave de organización (necesaria para el MCP / agentes de IA)

Una sola clave para toda la cartera. En cada llamada indicas por qué empresa operas, con el header X-Empresa-RUT:

X-Api-Key: sk_live_...clave_del_estudio...
X-Empresa-RUT: 76354771-K
POST /dte     → emite por la Panadería

X-Empresa-RUT: 78211386-0
POST /dte     → emite por la Ferretería, con la MISMA clave

El RUT se acepta con o sin puntos y con o sin dígito verificador (76354771, 76354771-K y 76.354.771-K son equivalentes).

Elige con criterio. Una clave de organización es cómoda, pero si se filtra expone toda la cartera, no una empresa. Para emitir desde tu ERP, preferimos claves por empresa. Reserva la de organización para orquestación y para el MCP, que necesita poder elegir la empresa en cada instrucción.

¿Qué empresas administra mi clave?

GET /empresas responde la cartera. Es la única ruta que no exige haber elegido empresa (sería circular: es la llamada con la que la descubres). Sirve para los dos tipos de clave, con la misma forma de respuesta.

El emisor NUNCA se toma del cuerpo

El header selecciona la empresa; no la inventa. El RUT emisor, la razón social, el giro y el código de actividad del DTE se leen siempre del registro de esa empresa. Si mandas un bloque emisor en el cuerpo, se ignora. Así, una clave nunca puede facturar a nombre de un RUT que no le pertenece.

Errores propios del multi-empresa

Código Cuándo Qué hacer
400 Clave de organización sin X-Empresa-RUT Indica la empresa. GET /empresas te dice cuáles
403 El RUT no está en tu cartera (o está suspendido/retirado) Revisa la cartera en el portal
409 Reusaste una Idempotency-Key de otra empresa Usa claves de idempotencia distintas por empresa

Idempotencia por empresa. Si tu ERP numera las facturas por empresa, vas a repetir F-1001 en dos de ellas. Está previsto: la clave de idempotencia es por empresa emisora. Ante una colisión entre empresas respondemos 409 antes que devolverte el documento equivocado.

Cuotas

El plan de organización trae un cupo de DTE compartido por toda la cartera (no un tope por empresa): las que facturan poco le prestan cupo a las que facturan mucho. Al agotarse, la emisión responde 429 para todas las empresas de la cartera. El límite de peticiones por minuto, en cambio, se cuenta por empresa: el peak de una no le consume la cuota a las demás.

Emisión asíncrona y estados

Emitir un DTE es asíncrono: POST /dte responde 201 con el documento en estado pendiente y lo encola para envío al SII. El estado final llega después; consúltalo con GET /dte/{id} o suscríbete a webhooks.

Boletas y facturas se emiten sin esperar la validación del SII: ya son válidas con su folio y timbre (TED), y la aceptación del SII es posterior. La única excepción son las notas de crédito/débito, cuyo envío depende de que su documento referenciado exista en el SII (ver Notas de crédito y débito).

estado_local — el estado normalizado (úsalo para tu lógica)

estado_local ¿Final? Significado
pendiente No (en curso) Creado, aún no enviado al SII.
enviando No (en curso) Envío en marcha.
enviado No (en curso) En el SII, esperando el acuse del sobre.
error_envio No (reintentable) Falló por intermitencia de red/SII; se reintenta solo.
aceptado Aceptado por el SII. Documento válido.
aceptado_con_reparos Aceptado y VÁLIDO, con observaciones (SII RPR). NO es un rechazo.
rechazado Rechazado por el SII (validación). Corregir y re-emitir.
rechazado_sobre El sobre completo fue rechazado.
anulado Anulado (p. ej. por una NC que lo reversa).

Los estados en curso duran segundos; en la práctica observarás sobre todo los finales. Para decidir en caja, aceptado y aceptado_con_reparos son ambos documento válido.

estado_sii — el código crudo del SII (trazabilidad)

Aparte va estado_sii, el código tal cual lo entrega el SII (no es una lista cerrada nuestra). Los que verás en producción: EPR (envío procesado), DOK (documento aceptado), RPR (reparo → aceptado_con_reparos) y RCT/RCH/RFR (rechazos). Para tu lógica usa estado_local; estado_sii es para trazabilidad.

Errores operativos de emisión (HTTP)

Distinguibles por código HTTP, para avisar claro en caja —no un "falló" genérico:

HTTP Cuándo Body Qué mostrar
402 Suscripción impaga / trial vencido subscription_required: true "Regulariza el pago para seguir emitiendo."
503 Sin folios disponibles "Sin folios; se pidió reposición automática." Reintenta luego.
422 Datos del documento inválidos message con el detalle Corregir el documento (no quema folio).
429 Límite de peticiones / cupo de la cartera agotado Reintenta con backoff.
409 Idempotency-Key en curso o reusada entre empresas Reintenta en unos segundos / usa otra clave.

El certificado vencido no da error inmediato: se detecta al firmar/enviar (asíncrono), así que aparece como el documento quedando en rechazado con el detalle del certificado, no en la respuesta del POST.

<code>estado_local</code> — el estado normalizado (úsalo para tu lógica)

<code>estado_sii</code> — el código crudo del SII (trazabilidad)

Emitir un DTE es asíncrono: POST /dte responde 201 con el documento en estado pendiente y lo encola para envío al SII. El estado final llega después; consúltalo con GET /dte/{id} o suscríbete a webhooks.

Boletas y facturas se emiten sin esperar la validación del SII: ya son válidas con su folio y timbre (TED), y la aceptación del SII es posterior. La única excepción son las notas de crédito/débito, cuyo envío depende de que su documento referenciado exista en el SII (ver Notas de crédito y débito).

estado_local — el estado normalizado (úsalo para tu lógica)

estado_local ¿Final? Significado
pendiente No (en curso) Creado, aún no enviado al SII.
enviando No (en curso) Envío en marcha.
enviado No (en curso) En el SII, esperando el acuse del sobre.
error_envio No (reintentable) Falló por intermitencia de red/SII; se reintenta solo.
aceptado Aceptado por el SII. Documento válido.
aceptado_con_reparos Aceptado y VÁLIDO, con observaciones (SII RPR). NO es un rechazo.
rechazado Rechazado por el SII (validación). Corregir y re-emitir.
rechazado_sobre El sobre completo fue rechazado.
anulado Anulado (p. ej. por una NC que lo reversa).

Los estados en curso duran segundos; en la práctica observarás sobre todo los finales. Para decidir en caja, aceptado y aceptado_con_reparos son ambos documento válido.

estado_sii — el código crudo del SII (trazabilidad)

Aparte va estado_sii, el código tal cual lo entrega el SII (no es una lista cerrada nuestra). Los que verás en producción: EPR (envío procesado), DOK (documento aceptado), RPR (reparo → aceptado_con_reparos) y RCT/RCH/RFR (rechazos). Para tu lógica usa estado_local; estado_sii es para trazabilidad.

Errores operativos de emisión (HTTP)

Distinguibles por código HTTP, para avisar claro en caja —no un "falló" genérico:

HTTP Cuándo Body Qué mostrar
402 Suscripción impaga / trial vencido subscription_required: true "Regulariza el pago para seguir emitiendo."
503 Sin folios disponibles "Sin folios; se pidió reposición automática." Reintenta luego.
422 Datos del documento inválidos message con el detalle Corregir el documento (no quema folio).
429 Límite de peticiones / cupo de la cartera agotado Reintenta con backoff.
409 Idempotency-Key en curso o reusada entre empresas Reintenta en unos segundos / usa otra clave.

El certificado vencido no da error inmediato: se detecta al firmar/enviar (asíncrono), así que aparece como el documento quedando en rechazado con el detalle del certificado, no en la respuesta del POST.

Representación impresa (PDF)

Todo DTE tiene una representación impresa generada on-demand desde el XML firmado (no se almacena), con el timbre electrónico (TED) impreso como código PDF417:

  • Boletas (39/41) → formato ticket 80mm (impresora de caja).
  • Resto (factura, NC/ND, guía) → formato carta.

Dos formas de obtenerla:

  • GET /dte/{id}/pdf → devuelve el PDF binario (application/pdf).
  • POST /dte?incluir=pdf → el 201 de la emisión incluye pdf_base64 (sin segunda llamada).

Enlace para el receptor

POST /dte/{id}/portal-link genera un enlace de acceso directo mediante un token único que el receptor abre sin inicio de sesión ni API Key para ver y descargar el documento. No es un recurso abierto ni indexable: el acceso se controla por el token, que es opaco y no enumerable (64 caracteres aleatorios, nunca expone IDs secuenciales). El enlace lleva X-Robots-Tag: noindex y su vigencia está atada a la retención legal del XML del documento (6 años). Llamadas repetidas reutilizan el token vigente.

Notas de crédito y débito

Antes de enviar al SII, validamos las referencias de una NC (61) o ND (56) a un documento propio ya emitido, para evitar rechazos del SII:

  • Mismo receptor. Una NC/ND debe ir al mismo receptor que el documento que corrige. Si el RUT difiere, la emisión se rechaza con 422 antes de enviar al SII (previene el código SII REF-3-751).
  • Timing automático. Si la NC/ND referencia un documento propio que el SII aún no ha recibido, el envío se retrasa automáticamente hasta que el SII lo registre (previene REF-3-750). Emites y el sistema gestiona el orden; no tienes que esperar.

Errores del SII

Cuando el SII rechaza o repara un DTE, la respuesta de GET /dte/{id} (y GET /dte) trae el objeto detalle_sii con la causa traducida a lenguaje de negocio (codigo, glosa, causa, solucion). Códigos frecuentes:

Código Significado
REF-3-750 Documento referenciado aún no recibido por el SII (NC/ND).
REF-3-751 RUT receptor distinto al del documento referenciado (NC/ND).
HED-2-210 Monto neto no cuadra con el detalle (ítems deben ir netos).
HED-2-260 Monto total no cuadra con los parciales (boletas: ítems con IVA).
TED-2-510 Error en el timbre electrónico (TED/CAF).
CRT-3-18 RUT receptor de la carátula inválido (boletas: 60803000-K).

Integración con IA (MCP)

Esta API es AI-native: puedes conectar un agente de IA (Claude, Cursor, etc.) directamente a tu facturación mediante nuestro servidor MCP (Model Context Protocol), y darle contexto a cualquier LLM con llms.txt.

1) Servidor MCP — local (npx):

{
  "mcpServers": {
    "facturador-pulsando": {
      "command": "npx",
      "args": ["-y", "@facturador-mcp-sii.cl/mcp"],
      "env": { "PULSANDO_API_KEY": "sk_test_..." }
    }
  }
}

2) Servidor MCP — remoto (OAuth 2.1): agrega un conector remoto apuntando a https://mcp.facturador.pulsandotech.cl/mcp; el cliente descubre el OAuth y el usuario autoriza con su API Key.

Herramientas expuestas: listar_empresas, emitir_dte, consultar_dte, listar_dtes, consultar_contribuyente, estado_folios, documentos_recibidos, sincronizar_rcv, listar_rcv. El agente actúa con los permisos (scopes) de la API Key, así que el paywall y los scopes por empresa se respetan.

Varias empresas (estudios contables). Si la clave es de una organización, el agente puede operar toda la cartera: cada herramienta acepta un parámetro empresa con el RUT emisor, y listar_empresas le dice cuáles administra. Así funciona "emite la factura de este mes para la Panadería" sin que el agente tenga que adivinar el RUT.

→ listar_empresas
← Panadería Don Pedro (76354771-K) · Ferretería La Clave (78211386-0)

→ emitir_dte  empresa="76354771-K"  tipo_dte=33 …
← Folio 1042, estado pendiente — emitido por la Panadería

Requiere el paquete @facturador-mcp-sii.cl/mcp 0.3.0 o superior.

3) llms.txt: resumen de la API para LLMs en https://www.facturador.pulsandotech.cl/llms.txt. Pégalo como contexto o úsalo con herramientas que lo carguen automáticamente.

4) Prompt de integración listo para copiar en tu asistente: ver AI-INTEGRATION.md en el repositorio de la documentación.

Seguridad y datos personales (Ley 21.719)

Esta API procesa datos personales (RUT, razón social, direcciones, correos). Consulta la sección "Seguridad y cumplimiento" del README para tus obligaciones como responsable de datos y las medidas que aplicamos.

Sandbox (probar sin cuenta)

Prueba tu integración sin registrarte y sin API Key. Valida el payload con las mismas reglas que la emisión real, pero no crea nada ni envía al SII.

Validar/simular una emisión sin cuenta

Prueba sin registrarte ni usar API Key. Envía el mismo cuerpo que a POST /dte: se valida con las mismas reglas (mismos 422) que la emisión real, pero no se crea ningún documento, no se consumen folios y no se envía al SII. Ideal para verificar la forma de tu payload antes de integrar. El emisor lo inyecta el sandbox (no lo envíes). Rate limit: 30 req/min por IP.

Request Body schema: application/json
required
tipo_dte
required
integer
Enum: 33 34 39 41 43 46 52 56 61 110 111 112

33 factura afecta · 34 factura exenta · 39 boleta · 41 boleta exenta · 43 liquidación · 46 factura de compra · 52 guía de despacho · 56 nota de débito · 61 nota de crédito · 110/111/112 exportación

fecha_emision
required
string <date>

Fecha de emisión (YYYY-MM-DD) en hora de Chile. No puede ser futura: una fecha mayor a hoy (hora Chile) devuelve 422, porque el SII rechaza el DTE (RCT).

ind_traslado
integer [ 1 .. 9 ]

Obligatorio para guía (52). 1=venta, 2=ventas por efectuar, 3=consignación, 4=entrega gratuita, 5=traslado interno, 6=otros, 7=devolución, 8=traslado exportación, 9=venta exportación

tipo_despacho
integer [ 1 .. 3 ]

Guía (52). 1=por cuenta del receptor, 2/3=por cuenta del emisor

forma_pago
integer
Enum: 1 2 3

1=contado, 2=crédito, 3=sin costo

ind_servicio
integer
Enum: 1 2 3 4

Indicador de servicio. Facturas: 1=servicios periódicos domiciliarios, 2=otros servicios periódicos, 3=factura de servicio. Boletas (39/41) admiten además 4=espectáculo por cuenta de terceros. Un valor fuera de rango devuelve 422.

fecha_vencimiento
string <date>
object (Receptor)

Opcional para boletas y NC/ND de boleta; obligatorio para el resto. En factura de compra (46) el receptor es el proveedor y direccion + comuna son estrictamente obligatorias: si faltan, el SII RECHAZA (HED-3-845 / HED-3-846) y el folio se pierde.

required
Array of objects (Item) non-empty
required
object (Totales)
Array of objects (Referencia)
object (Transportista)

Solo para guía (52). dir_dest y cmna_dest son obligatorios para 52.

object (Impresion)

Datos que se imprimen en el documento pero NO viajan al SII: su esquema no los tiene. Se guardan junto al documento y aparecen en el ticket. Todo opcional.

Pensado para retail: identificar quién atendió, en qué local y con qué medio pagó el cliente.

medio_pago NO es forma_pago. forma_pago es el FmaPago del SII (1=Contado, 2=Crédito, 3=Sin costo) y describe la condición de venta: "Efectivo", "Débito" y "Transferencia" son los tres forma_pago: 1. Son dos cosas distintas y usar una por la otra declararía mal la condición de venta ante el SII.

Para el código de caja y de vendedor —que sí viajan al SII— usa referencias[].cod_caja y referencias[].cod_vendedor, disponibles solo en boletas.

object (Exportacion)

Solo para tipos 110/111/112 (factura, nota de débito y nota de crédito de exportación). Nuestra API no bloquea con 422 los campos marcados "el SII exige" más abajo (a diferencia de tipo_moneda, que sí valida), pero omitirlos hace que el SII rechace o reparé el DTE — se descubre recién en el estado asíncrono (estado_local, glosa_sii), no en la respuesta del POST /dte.

Dos escenarios típicos:

  • Exportación de mercadería: via_transporte, pais_receptor, pais_destino y normalmente clausula/tot_clausula (Incoterm).
  • Exportación de servicios (sin embarque físico): basta tipo_moneda + monto_moneda (+ nacionalidad del prestatario en vez de país receptor/destino).

Responses

Request samples

Content type
application/json
{
  • "tipo_dte": 33,
  • "fecha_emision": "2019-08-24",
  • "ind_traslado": 1,
  • "tipo_despacho": 1,
  • "forma_pago": 1,
  • "ind_servicio": 1,
  • "fecha_vencimiento": "2019-08-24",
  • "receptor": {
    },
  • "items": [
    ],
  • "totales": {
    },
  • "referencias": [
    ],
  • "transportista": {
    },
  • "impresion": {
    },
  • "exportacion": {
    }
}

Response samples

Content type
application/json
{
  • "sandbox": true,
  • "message": "string",
  • "simulacion": {
    }
}

Empresas (multi-RUT)

Qué empresas emisoras administra tu API Key. Punto de partida para las claves de organización (estudios contables, holdings): responde la cartera sin exigir que hayas elegido una empresa.

Empresas que administra tu API Key

Responde por qué RUT emisores puede operar esta clave.

Es la única ruta del canal que no exige haber seleccionado empresa: pedirte el RUT que justamente vienes a averiguar sería circular. Por eso es el punto de partida de cualquier integración de estudio contable — y lo que llama la herramienta listar_empresas del MCP.

Responde con la misma forma para los dos tipos de clave; mira requiere_seleccion para saber cómo seguir:

  • false → clave de una empresa. No envíes X-Empresa-RUT.
  • true → clave de organización. Envía X-Empresa-RUT en cada llamada.

El campo ambiente de cada empresa importa: certificacion emite contra maullin con folios de prueba; produccion factura de verdad en palena.

Authorizations:
ApiKeyAuth

Responses

Response samples

Content type
application/json
Example
{
  • "alcance": "organizacion",
  • "organizacion": {
    },
  • "requiere_seleccion": true,
  • "como_seleccionar": "Envía el header X-Empresa-RUT con el RUT de la empresa emisora en cada llamada.",
  • "data": [
    ]
}

Emisión y consulta de DTE

Emisión y consulta de documentos tributarios electrónicos

Emitir un DTE

Crea y encola un DTE para envío al SII. El bloque emisor se toma automáticamente de tu empresa ("Mi empresa"); no lo envíes.

Reglas por tipo de documento:

  • Boletas (39/41): receptor es opcional (consumidor final).
  • NC/ND (56/61) de una boleta: receptor opcional (hereda consumidor final).
  • Guía de despacho (52): ind_traslado obligatorio y destino (transportista.dir_dest + transportista.cmna_dest) obligatorio.
  • NC/ND (56/61): el motivo (cod_ref) se deriva automáticamente del monto si referencias un documento propio (anula / corrige texto / corrige monto).
  • Factura de compra (46): el receptor es el proveedor (típicamente extranjero). direccion y comuna son obligatorias — sin ellas el SII RECHAZA (HED-3-845 / HED-3-846) y el folio se pierde. El giro es recomendado (si falta, el SII observa con REPARO HED-1-844, pero el documento es válido). El IVA lo retiene el comprador (retención total).

Validación de notas (NC/ND) que referencian un documento propio:

  • El receptor de la nota debe coincidir con el del documento referenciado. Si difiere, se devuelve 422 (con el mensaje en message) antes de enviar al SII (previene el código SII REF-3-751).
  • Si el documento referenciado aún no fue recibido por el SII, el envío se retrasa automáticamente hasta que el SII lo registre (previene REF-3-750). No es necesario que esperes: el sistema gestiona el orden de envío.

PDF en la misma respuesta (paridad caja, 1 sola llamada): agrega ?incluir=pdf para que el 201 incluya pdf_base64 + pdf_mime con la representación impresa lista para imprimir. Si la generación del PDF falla, el DTE igual se crea y el 201 trae pdf_error en vez de pdf_base64 (puedes reintentar con GET /dte/{id}/pdf).

Idempotencia (recomendado en producción): envía el header Idempotency-Key con un valor único por emisión (ej. un UUID). Si un reintento de red repite la petición con la MISMA clave, no se emite un segundo DTE ni se consume otro folio: se devuelve la respuesta original con el header Idempotent-Replayed: true. Si el original aún está en curso se responde 409 (reintenta en unos segundos); si reutilizas la misma clave con un cuerpo distinto, 422. La clave es única por empresa.

Authorizations:
ApiKeyAuth
query Parameters
incluir
string
Value: "pdf"

Si vale pdf, la respuesta 201 adjunta la representación impresa como pdf_base64 (+ pdf_mime). Se acepta también el alias include=pdf.

header Parameters
X-Empresa-RUT
string
Example: 76354771-K

RUT de la empresa emisora. Se acepta en TODOS los endpoints de este canal.

  • Clave de organización (estudio contable, holding): obligatorio. Sin él la respuesta es 400. Usa GET /empresas para ver cuáles administras.
  • Clave de empresa: no lo envíes. Si lo mandas se ignora — el RUT emisor lo fija la clave y no se puede cambiar desde el request.

Formato libre: 76354771, 76354771-K o 76.354.771-K son equivalentes.

Este header selecciona la empresa; no la inventa. Los datos del emisor (RUT, razón social, giro, actividad económica) se leen siempre del registro de esa empresa, nunca del cuerpo de la petición.

Idempotency-Key
string <= 255 characters

Clave única por emisión (ej. UUID) para hacer la petición idempotente. Un reintento con la misma clave devuelve el mismo DTE (header Idempotent-Replayed: true) sin emitir uno nuevo.

La clave es por empresa emisora. Si tu ERP numera las facturas por empresa y repite F-1001 en dos de ellas, no hay problema. Si una clave colisiona entre empresas distintas respondemos 409 antes que devolverte el documento equivocado.

Request Body schema: application/json
required
tipo_dte
required
integer
Enum: 33 34 39 41 43 46 52 56 61 110 111 112

33 factura afecta · 34 factura exenta · 39 boleta · 41 boleta exenta · 43 liquidación · 46 factura de compra · 52 guía de despacho · 56 nota de débito · 61 nota de crédito · 110/111/112 exportación

fecha_emision
required
string <date>

Fecha de emisión (YYYY-MM-DD) en hora de Chile. No puede ser futura: una fecha mayor a hoy (hora Chile) devuelve 422, porque el SII rechaza el DTE (RCT).

ind_traslado
integer [ 1 .. 9 ]

Obligatorio para guía (52). 1=venta, 2=ventas por efectuar, 3=consignación, 4=entrega gratuita, 5=traslado interno, 6=otros, 7=devolución, 8=traslado exportación, 9=venta exportación

tipo_despacho
integer [ 1 .. 3 ]

Guía (52). 1=por cuenta del receptor, 2/3=por cuenta del emisor

forma_pago
integer
Enum: 1 2 3

1=contado, 2=crédito, 3=sin costo

ind_servicio
integer
Enum: 1 2 3 4

Indicador de servicio. Facturas: 1=servicios periódicos domiciliarios, 2=otros servicios periódicos, 3=factura de servicio. Boletas (39/41) admiten además 4=espectáculo por cuenta de terceros. Un valor fuera de rango devuelve 422.

fecha_vencimiento
string <date>
object (Receptor)

Opcional para boletas y NC/ND de boleta; obligatorio para el resto. En factura de compra (46) el receptor es el proveedor y direccion + comuna son estrictamente obligatorias: si faltan, el SII RECHAZA (HED-3-845 / HED-3-846) y el folio se pierde.

required
Array of objects (Item) non-empty
required
object (Totales)
Array of objects (Referencia)
object (Transportista)

Solo para guía (52). dir_dest y cmna_dest son obligatorios para 52.

object (Impresion)

Datos que se imprimen en el documento pero NO viajan al SII: su esquema no los tiene. Se guardan junto al documento y aparecen en el ticket. Todo opcional.

Pensado para retail: identificar quién atendió, en qué local y con qué medio pagó el cliente.

medio_pago NO es forma_pago. forma_pago es el FmaPago del SII (1=Contado, 2=Crédito, 3=Sin costo) y describe la condición de venta: "Efectivo", "Débito" y "Transferencia" son los tres forma_pago: 1. Son dos cosas distintas y usar una por la otra declararía mal la condición de venta ante el SII.

Para el código de caja y de vendedor —que sí viajan al SII— usa referencias[].cod_caja y referencias[].cod_vendedor, disponibles solo en boletas.

object (Exportacion)

Solo para tipos 110/111/112 (factura, nota de débito y nota de crédito de exportación). Nuestra API no bloquea con 422 los campos marcados "el SII exige" más abajo (a diferencia de tipo_moneda, que sí valida), pero omitirlos hace que el SII rechace o reparé el DTE — se descubre recién en el estado asíncrono (estado_local, glosa_sii), no en la respuesta del POST /dte.

Dos escenarios típicos:

  • Exportación de mercadería: via_transporte, pais_receptor, pais_destino y normalmente clausula/tot_clausula (Incoterm).
  • Exportación de servicios (sin embarque físico): basta tipo_moneda + monto_moneda (+ nacionalidad del prestatario en vez de país receptor/destino).

Responses

Request samples

Content type
application/json
Example
{
  • "tipo_dte": 33,
  • "fecha_emision": "2026-06-11",
  • "receptor": {
    },
  • "items": [
    ],
  • "totales": {
    }
}

Response samples

Content type
application/json
{
  • "id": 123,
  • "tipo_dte": 33,
  • "folio": 45,
  • "estado_local": "pendiente",
  • "monto_total": 119000,
  • "message": "DTE creado y encolado para envío al SII.",
  • "advertencias": [
    ],
  • "pdf_base64": "string",
  • "pdf_mime": "application/pdf",
  • "pdf_error": "No se pudo generar el PDF en línea. Obténgalo con GET /dte/123/pdf."
}

Listar DTEs

Authorizations:
ApiKeyAuth
query Parameters
q
string <= 200 characters

Búsqueda libre por razón social o RUT del receptor

rut_receptor
string <= 20 characters
tipo_dte
string

Un tipo o CSV, ej. "33,34"

grupo
string
Enum: "facturas" "boletas" "todos"
estado_local
string
Enum: "pendiente" "enviando" "enviado" "error_envio" "aceptado" "aceptado_con_reparos" "rechazado" "rechazado_sobre" "anulado"

Estado normalizado. Finales: aceptado, aceptado_con_reparos (ambos VÁLIDOS), rechazado, rechazado_sobre, anulado. En curso: pendiente, enviando, enviado, error_envio.

estado_sii
string

Un estado SII o CSV

desde
string <date>

Filtra por fecha de emisión (no por hora de creación). Rango INCLUSIVO: desde=hasta=2026-07-01 devuelve el día 1 completo.

hasta
string <date>

Inclusivo, ver desde.

monto_min
integer >= 0
monto_max
integer >= 0
sort
string
Enum: "fecha_emision" "monto_total" "folio" "created_at"
dir
string
Enum: "asc" "desc"
per_page
integer [ 1 .. 200 ]
Default: 50
page
integer >= 1
Default: 1
header Parameters
X-Empresa-RUT
string
Example: 76354771-K

RUT de la empresa emisora. Se acepta en TODOS los endpoints de este canal.

  • Clave de organización (estudio contable, holding): obligatorio. Sin él la respuesta es 400. Usa GET /empresas para ver cuáles administras.
  • Clave de empresa: no lo envíes. Si lo mandas se ignora — el RUT emisor lo fija la clave y no se puede cambiar desde el request.

Formato libre: 76354771, 76354771-K o 76.354.771-K son equivalentes.

Este header selecciona la empresa; no la inventa. Los datos del emisor (RUT, razón social, giro, actividad económica) se leen siempre del registro de esa empresa, nunca del cuerpo de la petición.

Responses

Response samples

Content type
application/json
{
  • "data": [
    ],
  • "meta": {
    }
}

Resumen agregado de DTEs

Totales y desglose por tipo y estado sobre el conjunto filtrado (mismos filtros que el listado).

Authorizations:
ApiKeyAuth
query Parameters
desde
string <date>

Inclusivo, igual que en el listado.

hasta
string <date>

Inclusivo, igual que en el listado.

tipo_dte
string

Un tipo o CSV, ej. "33,34"

estado_local
string

Mismos valores que en el listado.

header Parameters
X-Empresa-RUT
string
Example: 76354771-K

RUT de la empresa emisora. Se acepta en TODOS los endpoints de este canal.

  • Clave de organización (estudio contable, holding): obligatorio. Sin él la respuesta es 400. Usa GET /empresas para ver cuáles administras.
  • Clave de empresa: no lo envíes. Si lo mandas se ignora — el RUT emisor lo fija la clave y no se puede cambiar desde el request.

Formato libre: 76354771, 76354771-K o 76.354.771-K son equivalentes.

Este header selecciona la empresa; no la inventa. Los datos del emisor (RUT, razón social, giro, actividad económica) se leen siempre del registro de esa empresa, nunca del cuerpo de la petición.

Responses

Response samples

Content type
application/json
{
  • "total_documentos": 0,
  • "suma_total": 0,
  • "suma_neto": 0,
  • "suma_iva": 0,
  • "suma_exento": 0,
  • "por_tipo": [
    ],
  • "por_estado": [
    ]
}

Obtener un DTE

Authorizations:
ApiKeyAuth
path Parameters
id
required
integer
header Parameters
X-Empresa-RUT
string
Example: 76354771-K

RUT de la empresa emisora. Se acepta en TODOS los endpoints de este canal.

  • Clave de organización (estudio contable, holding): obligatorio. Sin él la respuesta es 400. Usa GET /empresas para ver cuáles administras.
  • Clave de empresa: no lo envíes. Si lo mandas se ignora — el RUT emisor lo fija la clave y no se puede cambiar desde el request.

Formato libre: 76354771, 76354771-K o 76.354.771-K son equivalentes.

Este header selecciona la empresa; no la inventa. Los datos del emisor (RUT, razón social, giro, actividad económica) se leen siempre del registro de esa empresa, nunca del cuerpo de la petición.

Responses

Response samples

Content type
application/json
{
  • "id": 0,
  • "tipo_dte": 0,
  • "tipo_nombre": "string",
  • "folio": 0,
  • "fecha_emision": "2019-08-24",
  • "rut_receptor": "string",
  • "dv_receptor": "string",
  • "razon_receptor": "string",
  • "giro_receptor": "string",
  • "direccion_receptor": "string",
  • "comuna_receptor": "string",
  • "ciudad_receptor": "string",
  • "email_receptor": "string",
  • "monto_neto": 0,
  • "monto_iva": 0,
  • "monto_exento": 0,
  • "monto_total": 0,
  • "estado_sii": "string",
  • "estado_local": "string",
  • "glosa_sii": "string",
  • "detalle_sii": {
    },
  • "track_id": "string",
  • "ambiente": "string",
  • "anulado_por": {
    },
  • "notas_credito": [
    ],
  • "items": [
    ]
}

Descargar el XML firmado del DTE

Authorizations:
ApiKeyAuth
path Parameters
id
required
integer
header Parameters
X-Empresa-RUT
string
Example: 76354771-K

RUT de la empresa emisora. Se acepta en TODOS los endpoints de este canal.

  • Clave de organización (estudio contable, holding): obligatorio. Sin él la respuesta es 400. Usa GET /empresas para ver cuáles administras.
  • Clave de empresa: no lo envíes. Si lo mandas se ignora — el RUT emisor lo fija la clave y no se puede cambiar desde el request.

Formato libre: 76354771, 76354771-K o 76.354.771-K son equivalentes.

Este header selecciona la empresa; no la inventa. Los datos del emisor (RUT, razón social, giro, actividad económica) se leen siempre del registro de esa empresa, nunca del cuerpo de la petición.

Responses

Response samples

Content type
application/json
{
  • "message": "string"
}

Descargar la representación impresa (PDF) del DTE

Devuelve el PDF binario (application/pdf, no JSON), listo para imprimir, con el timbre electrónico (TED) impreso como código PDF417:

  • Boletas (39/41) → formato ticket 80mm, ideal para impresora de caja.
  • Resto (factura, NC/ND, guía) → formato carta.

El PDF se genera on-demand desde el XML firmado (no se almacena). Se puede pedir apenas emitido (tras el 201 de POST /dte): la boleta ya tiene folio y timbre. El estado del SII (aceptado/rechazado) no es necesario para imprimir. El TED también viaja en el XML (/dte/{id}/xml) si prefieres renderizar tu propia representación.

Authorizations:
ApiKeyAuth
path Parameters
id
required
integer
header Parameters
X-Empresa-RUT
string
Example: 76354771-K

RUT de la empresa emisora. Se acepta en TODOS los endpoints de este canal.

  • Clave de organización (estudio contable, holding): obligatorio. Sin él la respuesta es 400. Usa GET /empresas para ver cuáles administras.
  • Clave de empresa: no lo envíes. Si lo mandas se ignora — el RUT emisor lo fija la clave y no se puede cambiar desde el request.

Formato libre: 76354771, 76354771-K o 76.354.771-K son equivalentes.

Este header selecciona la empresa; no la inventa. Los datos del emisor (RUT, razón social, giro, actividad económica) se leen siempre del registro de esa empresa, nunca del cuerpo de la petición.

Responses

Response samples

Content type
application/json
{
  • "message": "string"
}

Forzar el estado final de un DTE (solo ambiente de desarrollo)

Solo funciona en el ambiente de desarrollo. En certificación y producción el estado lo determina el SII, y este endpoint responde 403.

La emisión es asíncrona: POST /dte devuelve 201 pendiente y el estado final llega después, cuando el SII responde. En desarrollo no hay SII, así que ningún documento se rechaza ni se repara por su cuenta y nunca ves la rama de error de tu código. Este endpoint la dispara.

El estado no se escribe a mano: pasa por el mismo servicio que usa la respuesta real del SII, así que produce los mismos efectos que en producción — webhook firmado con HMAC (dte.aceptado, dte.rechazado o dte.reparado), notificaciones según tu política y asiento contable.

Esto cubre solo lo que el ambiente no puede producir por sí mismo: la respuesta del SII. Los errores de integración (payload mal armado, campo faltante, tipo de dato equivocado) ya salen solos con los mismos 422 que en producción, porque es exactamente el mismo código de validación.

Requiere el scope dte:read.

Authorizations:
ApiKeyAuth
path Parameters
id
required
integer
header Parameters
X-Empresa-RUT
string
Example: 76354771-K

RUT de la empresa emisora. Se acepta en TODOS los endpoints de este canal.

  • Clave de organización (estudio contable, holding): obligatorio. Sin él la respuesta es 400. Usa GET /empresas para ver cuáles administras.
  • Clave de empresa: no lo envíes. Si lo mandas se ignora — el RUT emisor lo fija la clave y no se puede cambiar desde el request.

Formato libre: 76354771, 76354771-K o 76.354.771-K son equivalentes.

Este header selecciona la empresa; no la inventa. Los datos del emisor (RUT, razón social, giro, actividad económica) se leen siempre del registro de esa empresa, nunca del cuerpo de la petición.

Request Body schema: application/json
required
estado
required
string
Enum: "aceptado" "rechazado" "reparado"

Estado final a forzar. Se traduce al estado del SII correspondiente: aceptadoDOK, rechazadoRCH, reparadoRPR. Recuerda que un reparo (RPR) es un documento válido con observaciones, no un rechazo.

codigo
string or null <= 20 characters

Código de error del SII a simular (ver Errores del SII). Si lo envías y está en el catálogo, la glosa del documento queda con el texto real de esa causa, para que puedas probar tu manejo por código. Opcional.

Responses

Request samples

Content type
application/json
Example
{
  • "estado": "rechazado",
  • "codigo": "HED-2-210"
}

Response samples

Content type
application/json
{
  • "message": "string",
  • "id": 0,
  • "estado_local": "string",
  • "estado_sii": "RCH",
  • "glosa_sii": "string",
  • "simulado": true
}

Contribuyentes

Consulta del padrón público del SII (razón social, giros/actividades) para autocompletar y validar el receptor. Requiere el scope dte:read.

Consultar contribuyente en el SII (padrón)

Consulta la Situación Tributaria de un contribuyente en el padrón público del SII (datos abiertos: razón social, giros/actividades económicas, cumplimiento). Úsalo para autocompletar y validar el receptor antes de emitir un DTE.

Los datos provienen directamente del SII (no de terceros) y se cachean 24h. Si el SII no responde (cola virtual / mantención) o pide captcha, se devuelve 503 o captcha_requerido: true para que hagas fallback a carga manual. Requiere el scope dte:read.

Authorizations:
ApiKeyAuth
path Parameters
rut
required
string

RUT con o sin puntos y DV, ej. "76354771-K" o "76.354.771-K".

header Parameters
X-Empresa-RUT
string
Example: 76354771-K

RUT de la empresa emisora. Se acepta en TODOS los endpoints de este canal.

  • Clave de organización (estudio contable, holding): obligatorio. Sin él la respuesta es 400. Usa GET /empresas para ver cuáles administras.
  • Clave de empresa: no lo envíes. Si lo mandas se ignora — el RUT emisor lo fija la clave y no se puede cambiar desde el request.

Formato libre: 76354771, 76354771-K o 76.354.771-K son equivalentes.

Este header selecciona la empresa; no la inventa. Los datos del emisor (RUT, razón social, giro, actividad económica) se leen siempre del registro de esa empresa, nunca del cuerpo de la petición.

Responses

Response samples

Content type
application/json
{
  • "registrado": true,
  • "razon_social": "string",
  • "fecha_inicio": "string",
  • "cumple_obligacion": true,
  • "captcha_requerido": true,
  • "giros": [
    ]
}

Recepción

Documentos que otros contribuyentes te emiten (intercambio). Léelos y acéptalos/recházalos comercialmente por API — la API deja de ser "solo emisión". Lectura con recepcion:read; aceptar/rechazar/ingesta con recepcion:write.

Listar documentos recibidos

Lista los DTE que otros contribuyentes te emitieron (recibidos por intercambio). Paginado. Requiere el scope recepcion:read.

Authorizations:
ApiKeyAuth
query Parameters
pendientes
boolean

Solo los sin decisión comercial

estado_comercial
integer

0=aceptado, 2=rechazado

rut_emisor
string
per_page
integer
Default: 50
header Parameters
X-Empresa-RUT
string
Example: 76354771-K

RUT de la empresa emisora. Se acepta en TODOS los endpoints de este canal.

  • Clave de organización (estudio contable, holding): obligatorio. Sin él la respuesta es 400. Usa GET /empresas para ver cuáles administras.
  • Clave de empresa: no lo envíes. Si lo mandas se ignora — el RUT emisor lo fija la clave y no se puede cambiar desde el request.

Formato libre: 76354771, 76354771-K o 76.354.771-K son equivalentes.

Este header selecciona la empresa; no la inventa. Los datos del emisor (RUT, razón social, giro, actividad económica) se leen siempre del registro de esa empresa, nunca del cuerpo de la petición.

Responses

Response samples

Content type
application/json
{ }

Detalle de un documento recibido

Authorizations:
ApiKeyAuth
path Parameters
id
required
integer
header Parameters
X-Empresa-RUT
string
Example: 76354771-K

RUT de la empresa emisora. Se acepta en TODOS los endpoints de este canal.

  • Clave de organización (estudio contable, holding): obligatorio. Sin él la respuesta es 400. Usa GET /empresas para ver cuáles administras.
  • Clave de empresa: no lo envíes. Si lo mandas se ignora — el RUT emisor lo fija la clave y no se puede cambiar desde el request.

Formato libre: 76354771, 76354771-K o 76.354.771-K son equivalentes.

Este header selecciona la empresa; no la inventa. Los datos del emisor (RUT, razón social, giro, actividad económica) se leen siempre del registro de esa empresa, nunca del cuerpo de la petición.

Responses

Response samples

Content type
application/json
{ }

Ingresar un sobre EnvioDTE recibido

Persiste un EnvioDTE que recibiste por fuera del intercambio automático. Acepta multipart (envioDte), xml_base64 en JSON, o el XML crudo en el cuerpo. Requiere el scope recepcion:write.

Authorizations:
ApiKeyAuth
header Parameters
X-Empresa-RUT
string
Example: 76354771-K

RUT de la empresa emisora. Se acepta en TODOS los endpoints de este canal.

  • Clave de organización (estudio contable, holding): obligatorio. Sin él la respuesta es 400. Usa GET /empresas para ver cuáles administras.
  • Clave de empresa: no lo envíes. Si lo mandas se ignora — el RUT emisor lo fija la clave y no se puede cambiar desde el request.

Formato libre: 76354771, 76354771-K o 76.354.771-K son equivalentes.

Este header selecciona la empresa; no la inventa. Los datos del emisor (RUT, razón social, giro, actividad económica) se leen siempre del registro de esa empresa, nunca del cuerpo de la petición.

Request Body schema: application/json
required
xml_base64
string
email_remitente
string
email_message_id
string

Responses

Request samples

Content type
application/json
{
  • "xml_base64": "string",
  • "email_remitente": "string",
  • "email_message_id": "string"
}

Response samples

Content type
application/json
{
  • "message": "string"
}

Aceptar comercialmente un documento

Marca el documento como aceptado y genera el ResultadoDTE firmado (base64) para el emisor; si tienes casilla configurada, se le envía. Requiere el scope recepcion:write.

Authorizations:
ApiKeyAuth
path Parameters
id
required
integer
header Parameters
X-Empresa-RUT
string
Example: 76354771-K

RUT de la empresa emisora. Se acepta en TODOS los endpoints de este canal.

  • Clave de organización (estudio contable, holding): obligatorio. Sin él la respuesta es 400. Usa GET /empresas para ver cuáles administras.
  • Clave de empresa: no lo envíes. Si lo mandas se ignora — el RUT emisor lo fija la clave y no se puede cambiar desde el request.

Formato libre: 76354771, 76354771-K o 76.354.771-K son equivalentes.

Este header selecciona la empresa; no la inventa. Los datos del emisor (RUT, razón social, giro, actividad económica) se leen siempre del registro de esa empresa, nunca del cuerpo de la petición.

Responses

Response samples

Content type
application/json
{
  • "message": "string",
  • "estado_comercial": 0,
  • "resultado_xml_b64": "string",
  • "acuse_enviado": true
}

Rechazar comercialmente un documento

Marca el documento como rechazado (requiere motivo) y genera el ResultadoDTE firmado para el emisor. Requiere el scope recepcion:write.

Authorizations:
ApiKeyAuth
path Parameters
id
required
integer
header Parameters
X-Empresa-RUT
string
Example: 76354771-K

RUT de la empresa emisora. Se acepta en TODOS los endpoints de este canal.

  • Clave de organización (estudio contable, holding): obligatorio. Sin él la respuesta es 400. Usa GET /empresas para ver cuáles administras.
  • Clave de empresa: no lo envíes. Si lo mandas se ignora — el RUT emisor lo fija la clave y no se puede cambiar desde el request.

Formato libre: 76354771, 76354771-K o 76.354.771-K son equivalentes.

Este header selecciona la empresa; no la inventa. Los datos del emisor (RUT, razón social, giro, actividad económica) se leen siempre del registro de esa empresa, nunca del cuerpo de la petición.

Request Body schema: application/json
required
motivo
required
string <= 256 characters
cod_rch_dsc
integer

Código SII de rechazo (opcional)

Responses

Request samples

Content type
application/json
{
  • "motivo": "string",
  • "cod_rch_dsc": 0
}

Response samples

Content type
application/json
{
  • "message": "string",
  • "estado_comercial": 2,
  • "resultado_xml_b64": "string"
}

RCV (Registro de Compras y Ventas)

Sincroniza y consulta el Registro de Compras y Ventas que el SII mantiene (para conciliación contable). Scope rcv:read.

Sincronizar el RCV de un periodo desde el SII

Encola la sincronización del Registro de Compras y Ventas del SII para un periodo tributario. Es asíncrono (202): un periodo puede traer muchas filas. Consulta el resultado con GET /rcv. Idempotente: re-sincronizar un periodo no duplica. Requiere el scope rcv:read.

Requiere una API key sk_live_. El RCV son documentos reales del SII y no tiene contraparte de prueba, asi que una key sk_test_ recibe 409.

Authorizations:
ApiKeyAuth
header Parameters
X-Empresa-RUT
string
Example: 76354771-K

RUT de la empresa emisora. Se acepta en TODOS los endpoints de este canal.

  • Clave de organización (estudio contable, holding): obligatorio. Sin él la respuesta es 400. Usa GET /empresas para ver cuáles administras.
  • Clave de empresa: no lo envíes. Si lo mandas se ignora — el RUT emisor lo fija la clave y no se puede cambiar desde el request.

Formato libre: 76354771, 76354771-K o 76.354.771-K son equivalentes.

Este header selecciona la empresa; no la inventa. Los datos del emisor (RUT, razón social, giro, actividad económica) se leen siempre del registro de esa empresa, nunca del cuerpo de la petición.

Request Body schema: application/json
required
periodo
required
string

Periodo tributario YYYYMM

operacion
string
Default: "ambas"
Enum: "compra" "venta" "ambas"

Responses

Request samples

Content type
application/json
{
  • "periodo": "202607",
  • "operacion": "compra"
}

Response samples

Content type
application/json
{
  • "message": "string",
  • "periodo": "string",
  • "operaciones": [
    ]
}

Consultar el RCV ya sincronizado

El Registro de Compras y Ventas tal como lo tiene el SII.

Requiere una API key sk_live_: son documentos reales y no existe una version de prueba de este registro. Una key sk_test_ recibe 409. El motivo no es de permisos — es que actuar sobre estos documentos (aceptar o reclamar) tiene efecto legal bajo la Ley 19.983 y no se deshace.

Ademas del listado, la respuesta puede traer aviso: el motivo por el cual no hay documentos que mostrar (por ejemplo, falta cargar el certificado digital). Es null cuando no hay nada que advertir.

Authorizations:
ApiKeyAuth
query Parameters
periodo
string

YYYYMM

operacion
string
Enum: "compra" "venta"
tipo_dte
integer
rut_contraparte
string
solo_reclamadas
boolean

Solo los documentos que la contraparte RECLAMO ante el SII.

Combinado con operacion=venta responde "que me rechazaron de lo que emiti". OJO: esto no es el rechazo del SII (ese es el estado del DTE, RCH); es el RECEPTOR reclamando comercialmente un documento que ante el SII es valido. Consecuencia distinta: se cae la aceptacion tacita y la factura deja de ser titulo ejecutivo (Ley 19.983).

El filtro usa fecha_reclamo, no el codigo del evento: el RCV devuelve letras sueltas (A, C, P, null) y no los ACD/RCD/ERM, que son los que se ENVIAN al registrar una accion, no los que se leen.

per_page
integer
Default: 50
header Parameters
X-Empresa-RUT
string
Example: 76354771-K

RUT de la empresa emisora. Se acepta en TODOS los endpoints de este canal.

  • Clave de organización (estudio contable, holding): obligatorio. Sin él la respuesta es 400. Usa GET /empresas para ver cuáles administras.
  • Clave de empresa: no lo envíes. Si lo mandas se ignora — el RUT emisor lo fija la clave y no se puede cambiar desde el request.

Formato libre: 76354771, 76354771-K o 76.354.771-K son equivalentes.

Este header selecciona la empresa; no la inventa. Los datos del emisor (RUT, razón social, giro, actividad económica) se leen siempre del registro de esa empresa, nunca del cuerpo de la petición.

Responses

Response samples

Content type
application/json
{
  • "data": [
    ],
  • "total": 0,
  • "last_page": 0,
  • "aviso": {
    }
}

Resumen del periodo — credito fiscal y facturas por vencer

Lo que un ERP necesita para poner un semaforo, sin tener que recorrer y clasificar 330 documentos por su cuenta.

  • credito_fiscal — el IVA de tus compras: lo que DESCUENTAS en el F29. No lo confundas con el debito fiscal, que es el IVA de tus ventas y es lo que PAGAS. El F29 resta uno del otro.
  • por_vencer — facturas a las que les quedan 3 dias o menos de plazo para reclamar. Pasado el plazo se aceptan solas y se vuelven titulo ejecutivo (Ley 19.983).
  • aceptadas_por_plazo + pendientes + reclamadas suman el total. Las reclamadas NO otorgan credito fiscal.

El plazo de reclamo (por_vencer) corre desde la RECEPCION del documento, no desde su emision (Ley 19.983).

Scope rcv:read. Requiere una API key sk_live_: agrega documentos reales del SII y no existe una version de prueba. Una key sk_test_ recibe 409 (igual que GET /rcv).

Authorizations:
ApiKeyAuth
query Parameters
periodo
string

YYYYMM (default: mes en curso)

header Parameters
X-Empresa-RUT
string
Example: 76354771-K

RUT de la empresa emisora. Se acepta en TODOS los endpoints de este canal.

  • Clave de organización (estudio contable, holding): obligatorio. Sin él la respuesta es 400. Usa GET /empresas para ver cuáles administras.
  • Clave de empresa: no lo envíes. Si lo mandas se ignora — el RUT emisor lo fija la clave y no se puede cambiar desde el request.

Formato libre: 76354771, 76354771-K o 76.354.771-K son equivalentes.

Este header selecciona la empresa; no la inventa. Los datos del emisor (RUT, razón social, giro, actividad económica) se leen siempre del registro de esa empresa, nunca del cuerpo de la petición.

Responses

Response samples

Content type
application/json
{
  • "periodo": "202607",
  • "documentos": 0,
  • "credito_fiscal": 0,
  • "por_vencer": 0,
  • "monto_por_vencer": 0,
  • "aceptadas_por_plazo": 0,
  • "pendientes": 0,
  • "reclamadas": 0,
  • "dias_de_plazo": 8
}

Catalogo de acciones sobre una factura recibida

Las cinco acciones del SII y cual de ellas detiene la aceptacion tacita.

Solo lectura (rcv:read): poder LEER que acciones existen no habilita a ejecutarlas — eso exige rcv:write.

Incluye enlaces_sii, para mandar al contribuyente al portal del SII a ver el documento. Ojo: el RCV entrega el RESUMEN de cada factura, no el documento — ni XML ni PDF, ni el detalle de productos. Para las lineas de la factura hace falta el XML, y ese llega por el intercambio por correo (el emisor esta obligado a enviarlo) o bajandolo a mano del portal del SII. Y el SII no permite enlazar a un documento puntual: el enlace va al modulo.

Authorizations:
ApiKeyAuth
header Parameters
X-Empresa-RUT
string
Example: 76354771-K

RUT de la empresa emisora. Se acepta en TODOS los endpoints de este canal.

  • Clave de organización (estudio contable, holding): obligatorio. Sin él la respuesta es 400. Usa GET /empresas para ver cuáles administras.
  • Clave de empresa: no lo envíes. Si lo mandas se ignora — el RUT emisor lo fija la clave y no se puede cambiar desde el request.

Formato libre: 76354771, 76354771-K o 76.354.771-K son equivalentes.

Este header selecciona la empresa; no la inventa. Los datos del emisor (RUT, razón social, giro, actividad económica) se leen siempre del registro de esa empresa, nunca del cuerpo de la petición.

Responses

Response samples

Content type
application/json
{
  • "acciones": [
    ],
  • "dias_de_plazo": 8,
  • "advertencia": "string",
  • "enlaces_sii": {}
}

Aceptar o RECLAMAR ante el SII una factura que te emitieron

Esta es la unica defensa de tu cliente contra una factura que no corresponde.

Cuando recibes una factura de un proveedor, empieza a correr un plazo de 8 dias corridos desde su recepcion (no desde la emision: el proveedor puede emitir el 1 y el sobre llegar el 18). Si nadie la reclama, opera la aceptacion tacita (Ley 19.983) y la factura se convierte en titulo ejecutivo: el proveedor puede cobrarla judicialmente aunque nunca haya entregado la mercaderia, aunque el monto este malo, aunque sea falsa. No hacer nada tiene consecuencias irreversibles.

No confundir con el acuse comercial de POST /dte/recibidos/{id}/aceptar, que es un correo al proveedor. Un correo no detiene la aceptacion tacita. Esto si.

Acciones (accion):

Codigo Que hace Detiene la aceptacion tacita
ACD Acepta el contenido No — renuncia al reclamo
RCD Reclama el CONTENIDO (monto/detalle malo, no reconozco la compra) Si
RFP Reclama por falta PARCIAL de mercaderias Si
RFT Reclama por falta TOTAL (llego la factura, no la mercaderia) Si
ERM Otorga recibo de mercaderias No — deja el documento cedible y cierra el plazo

Cuidado con ERM: es lo contrario de un reclamo y es irreversible.

Requiere el scope rcv:write (no rcv:read): esto MUTA en el SII. El {id} es el del registro devuelto por GET /rcv.

Requiere una API key sk_live_. Reclamar tiene efecto legal e irreversible (Ley 19.983) sobre documentos reales del SII; una key sk_test_ recibe 409 (igual que GET /rcv), para que un flujo "de prueba" no reclame una factura real creyendola de juguete.

Authorizations:
ApiKeyAuth
path Parameters
id
required
integer
header Parameters
X-Empresa-RUT
string
Example: 76354771-K

RUT de la empresa emisora. Se acepta en TODOS los endpoints de este canal.

  • Clave de organización (estudio contable, holding): obligatorio. Sin él la respuesta es 400. Usa GET /empresas para ver cuáles administras.
  • Clave de empresa: no lo envíes. Si lo mandas se ignora — el RUT emisor lo fija la clave y no se puede cambiar desde el request.

Formato libre: 76354771, 76354771-K o 76.354.771-K son equivalentes.

Este header selecciona la empresa; no la inventa. Los datos del emisor (RUT, razón social, giro, actividad económica) se leen siempre del registro de esa empresa, nunca del cuerpo de la petición.

Request Body schema: application/json
required
accion
required
string
Enum: "ACD" "RCD" "ERM" "RFP" "RFT"

Responses

Request samples

Content type
application/json
Example
{
  • "accion": "RCD"
}

Response samples

Content type
application/json
{
  • "ok": true,
  • "accion": "RCD",
  • "descripcion": "string",
  • "es_reclamo": true,
  • "glosa_sii": "string",
  • "dias_de_plazo_restantes": 0
}

Que se hizo con este documento, segun el SII

Historial de eventos del documento tal como lo tiene el SII — no nuestra base. En un juicio ejecutivo lo que vale es su registro: esto es lo que prueba que el reclamo entro dentro de los 8 dias.

Scope rcv:write. Requiere una API key sk_live_: es el historial de un documento real del SII y no existe una version de prueba. Una key sk_test_ recibe 409 (igual que GET /rcv).

Authorizations:
ApiKeyAuth
path Parameters
id
required
integer
header Parameters
X-Empresa-RUT
string
Example: 76354771-K

RUT de la empresa emisora. Se acepta en TODOS los endpoints de este canal.

  • Clave de organización (estudio contable, holding): obligatorio. Sin él la respuesta es 400. Usa GET /empresas para ver cuáles administras.
  • Clave de empresa: no lo envíes. Si lo mandas se ignora — el RUT emisor lo fija la clave y no se puede cambiar desde el request.

Formato libre: 76354771, 76354771-K o 76.354.771-K son equivalentes.

Este header selecciona la empresa; no la inventa. Los datos del emisor (RUT, razón social, giro, actividad económica) se leen siempre del registro de esa empresa, nunca del cuerpo de la petición.

Responses

Response samples

Content type
application/json
{
  • "documento": { },
  • "dias_de_plazo_restantes": 0,
  • "eventos": [
    ]
}

Folios (CAF)

Estado de folios disponibles (CAF) con el scope caf:read, y solicitud de nuevos folios al SII (vía robot/RPA con tu certificado) con el scope caf:write.

Estado de folios por tipo de DTE

Authorizations:
ApiKeyAuth
header Parameters
X-Empresa-RUT
string
Example: 76354771-K

RUT de la empresa emisora. Se acepta en TODOS los endpoints de este canal.

  • Clave de organización (estudio contable, holding): obligatorio. Sin él la respuesta es 400. Usa GET /empresas para ver cuáles administras.
  • Clave de empresa: no lo envíes. Si lo mandas se ignora — el RUT emisor lo fija la clave y no se puede cambiar desde el request.

Formato libre: 76354771, 76354771-K o 76.354.771-K son equivalentes.

Este header selecciona la empresa; no la inventa. Los datos del emisor (RUT, razón social, giro, actividad económica) se leen siempre del registro de esa empresa, nunca del cuerpo de la petición.

Responses

Response samples

Content type
application/json
{
  • "data": [
    ]
}

Historial de solicitudes de folios al SII

Las ultimas ejecuciones del robot que pide folios (CAF) al SII, con lo que se solicito, lo que el SII autorizo y el error si lo hubo.

Existe para que la solicitud de folios no sea una caja negra: el SII puede autorizar MENOS de lo pedido (acotado: true) segun el comportamiento tributario del contribuyente, y sin este historial esa diferencia no se puede explicar ni auditar.

Scope caf:read.

Authorizations:
ApiKeyAuth
query Parameters
limit
integer <= 50
Default: 20

Cuantas ejecuciones traer (tope 50).

header Parameters
X-Empresa-RUT
string
Example: 76354771-K

RUT de la empresa emisora. Se acepta en TODOS los endpoints de este canal.

  • Clave de organización (estudio contable, holding): obligatorio. Sin él la respuesta es 400. Usa GET /empresas para ver cuáles administras.
  • Clave de empresa: no lo envíes. Si lo mandas se ignora — el RUT emisor lo fija la clave y no se puede cambiar desde el request.

Formato libre: 76354771, 76354771-K o 76.354.771-K son equivalentes.

Este header selecciona la empresa; no la inventa. Los datos del emisor (RUT, razón social, giro, actividad económica) se leen siempre del registro de esa empresa, nunca del cuerpo de la petición.

Responses

Response samples

Content type
application/json
{
  • "data": [
    ]
}

Tipos de DTE con folios en alerta o agotados

Authorizations:
ApiKeyAuth
header Parameters
X-Empresa-RUT
string
Example: 76354771-K

RUT de la empresa emisora. Se acepta en TODOS los endpoints de este canal.

  • Clave de organización (estudio contable, holding): obligatorio. Sin él la respuesta es 400. Usa GET /empresas para ver cuáles administras.
  • Clave de empresa: no lo envíes. Si lo mandas se ignora — el RUT emisor lo fija la clave y no se puede cambiar desde el request.

Formato libre: 76354771, 76354771-K o 76.354.771-K son equivalentes.

Este header selecciona la empresa; no la inventa. Los datos del emisor (RUT, razón social, giro, actividad económica) se leen siempre del registro de esa empresa, nunca del cuerpo de la petición.

Responses

Response samples

Content type
application/json
{
  • "data": [
    ]
}

Tipos de DTE que el SII autoriza al contribuyente

Solo lectura: los tipos de documento que el SII tiene habilitados para el contribuyente, tal como el robot de folios los fue registrando. No pide ni aloca folios: solo lee la memoria de autorizaciones.

autorizado_max (cupo maximo que el SII deja pedir) puede venir null: hoy suele venir null en produccion porque el extractor del formulario del SII quedo roto. Si un tipo entro en backoff por fallos, se expone bloqueado_hasta y ultimo_error.

Scope caf:read.

Authorizations:
ApiKeyAuth
header Parameters
X-Empresa-RUT
string
Example: 76354771-K

RUT de la empresa emisora. Se acepta en TODOS los endpoints de este canal.

  • Clave de organización (estudio contable, holding): obligatorio. Sin él la respuesta es 400. Usa GET /empresas para ver cuáles administras.
  • Clave de empresa: no lo envíes. Si lo mandas se ignora — el RUT emisor lo fija la clave y no se puede cambiar desde el request.

Formato libre: 76354771, 76354771-K o 76.354.771-K son equivalentes.

Este header selecciona la empresa; no la inventa. Los datos del emisor (RUT, razón social, giro, actividad económica) se leen siempre del registro de esa empresa, nunca del cuerpo de la petición.

Responses

Response samples

Content type
application/json
{
  • "data": [
    ]
}

Solicitar folios (CAF) de un tipo de DTE al SII

Pide folios (CAF) al SII y los deja cargados y listos para emitir.

Por qué esto existe

El SII no tiene API de folios. No es una limitacion nuestra: no existe. La unica puerta es su portal web, y ahi se entra con el certificado digital (.p12) del contribuyente. Nosotros automatizamos ese tramite con un robot, y te lo damos como un endpoint.

Es el unico punto de toda la integracion donde hay un robot de por medio. Todo lo demas (emitir, consultar estado, RCV, reclamar) va por servicios.

Requisitos

  1. Certificado cargado. Sin el no hay como entrar al portal del SII. Sin certificado: 422 con codigo: "sin_certificado".

    Estudios contables: el certificado en Chile es de una persona (el representante legal), no de la empresa. NO existe un certificado "del estudio" que sirva para toda la cartera: cada empresa necesita el suyo. Cargalos por empresa antes de integrar.

  2. Que el SII le tenga ese tipo autorizado a ese contribuyente. El SII autoriza los tipos de documento uno por uno. Si el tuyo no lo tiene, respondemos 422 con codigo: "tipo_no_solicitable" y te decimos que el tramite se hace en el portal del SII. No mandamos al robot a pelear con el portal: cada sesion perdida acerca el bloqueo por "maximo de sesiones" del SII.

  3. Scope caf:write.

Cuantos folios

cantidad es opcional, y lo normal es NO mandarla. Si la omites, decidimos nosotros: tu consumo real, acotado por lo que el SII te autoriza (a un emisor nuevo el SII suele autorizar entre 1 y 5).

Si la mandas, la respetamos — pero nunca por encima del techo del SII. Pedir 500 cuando el SII autoriza 5 no da 500 folios: da un rechazo y una sesion perdida. La respuesta te dice cuantos se pidieron de verdad.

Los folios son un recurso secuencial y finito del contribuyente: los que no se usan hay que declararselos al SII. Pedir de mas no desperdicia CPU, le quema algo suyo.

Ambiente

Lo define tu API Key: sk_test_… baja folios de certificacion (maullin) y sk_live_… de produccion (palena). Nunca un default global — mezclar ambientes hace que el SII rechace el DTE con CAF-3-516.

Varias empresas

Con una clave de organizacion, elige la empresa con X-Empresa-RUT. Los folios son del contribuyente, no de quien lo administra.

Authorizations:
ApiKeyAuth
header Parameters
X-Empresa-RUT
string
Example: 76354771-K

RUT de la empresa emisora. Se acepta en TODOS los endpoints de este canal.

  • Clave de organización (estudio contable, holding): obligatorio. Sin él la respuesta es 400. Usa GET /empresas para ver cuáles administras.
  • Clave de empresa: no lo envíes. Si lo mandas se ignora — el RUT emisor lo fija la clave y no se puede cambiar desde el request.

Formato libre: 76354771, 76354771-K o 76.354.771-K son equivalentes.

Este header selecciona la empresa; no la inventa. Los datos del emisor (RUT, razón social, giro, actividad económica) se leen siempre del registro de esa empresa, nunca del cuerpo de la petición.

Request Body schema: application/json
required
tipo_dte
required
integer
Enum: 33 34 39 41 52 56 61

Tipo de documento para el que se solicitan folios.

cantidad
integer [ 1 .. 500 ]
Default: 100

Cantidad de folios a solicitar.

Responses

Request samples

Content type
application/json
Example
{
  • "tipo_dte": 39
}

Response samples

Content type
application/json
{
  • "tipo_dte": 0,
  • "tipo_nombre": "string",
  • "desde": 0,
  • "hasta": 0,
  • "total_folios": 0,
  • "fecha_autorizacion": "string",
  • "caf_id": 0,
  • "message": "string"
}

Solicitar folios (CAF) de varios tipos en una sola sesión

Solicita CAF de varios tipos de documento en un solo ingreso al SII (una sola sesión del robot/RPA), usando el certificado digital (.p12) de tu empresa. Por defecto solicita los tipos habilitados de tu empresa; puedes acotarlos con tipos.

El ambiente lo define tu API Key (sk_test_…→certificación / sk_live_…→producción); opcionalmente puedes forzarlo por documento con el campo ambiente del body (por ejemplo para bajar folios de producción sin cambiar el ambiente por defecto). Nunca se usa un default global.

Requiere el scope caf:write. Sin certificado cargado responde 422. La respuesta lista los CAF cargados y los errores por tipo (carga parcial: algunos tipos pueden cargarse aunque otros fallen).

Authorizations:
ApiKeyAuth
header Parameters
X-Empresa-RUT
string
Example: 76354771-K

RUT de la empresa emisora. Se acepta en TODOS los endpoints de este canal.

  • Clave de organización (estudio contable, holding): obligatorio. Sin él la respuesta es 400. Usa GET /empresas para ver cuáles administras.
  • Clave de empresa: no lo envíes. Si lo mandas se ignora — el RUT emisor lo fija la clave y no se puede cambiar desde el request.

Formato libre: 76354771, 76354771-K o 76.354.771-K son equivalentes.

Este header selecciona la empresa; no la inventa. Los datos del emisor (RUT, razón social, giro, actividad económica) se leen siempre del registro de esa empresa, nunca del cuerpo de la petición.

Request Body schema: application/json
optional
cantidad
integer [ 1 .. 500 ]
Default: 1

Folios a solicitar por cada tipo.

tipos
Array of integers
Items Enum: 33 34 39 41 52 56 61

Tipos de documento a solicitar. Omitir = los tipos habilitados de tu empresa (o boleta 39 si no hay configuración).

ambiente
string
Enum: "certificacion" "produccion"

Override opcional del ambiente por documento. Si se omite, manda el ambiente de la API Key (sk_test_/sk_live_) o el de tu empresa.

Responses

Request samples

Content type
application/json
Example
{ }

Response samples

Content type
application/json
{
  • "message": "string",
  • "cargados": [
    ],
  • "errores": [
    ]
}

Reportes

Agregados de ventas

Serie temporal de ventas

Authorizations:
ApiKeyAuth
query Parameters
group_by
string
Default: "mes"
Enum: "dia" "mes"
desde
string <date>
hasta
string <date>
header Parameters
X-Empresa-RUT
string
Example: 76354771-K

RUT de la empresa emisora. Se acepta en TODOS los endpoints de este canal.

  • Clave de organización (estudio contable, holding): obligatorio. Sin él la respuesta es 400. Usa GET /empresas para ver cuáles administras.
  • Clave de empresa: no lo envíes. Si lo mandas se ignora — el RUT emisor lo fija la clave y no se puede cambiar desde el request.

Formato libre: 76354771, 76354771-K o 76.354.771-K son equivalentes.

Este header selecciona la empresa; no la inventa. Los datos del emisor (RUT, razón social, giro, actividad económica) se leen siempre del registro de esa empresa, nunca del cuerpo de la petición.

Responses

Response samples

Content type
application/json
{
  • "group_by": "string",
  • "serie": [
    ]
}

Top receptores por monto

Authorizations:
ApiKeyAuth
query Parameters
limit
integer [ 1 .. 100 ]
Default: 10
desde
string <date>
hasta
string <date>
header Parameters
X-Empresa-RUT
string
Example: 76354771-K

RUT de la empresa emisora. Se acepta en TODOS los endpoints de este canal.

  • Clave de organización (estudio contable, holding): obligatorio. Sin él la respuesta es 400. Usa GET /empresas para ver cuáles administras.
  • Clave de empresa: no lo envíes. Si lo mandas se ignora — el RUT emisor lo fija la clave y no se puede cambiar desde el request.

Formato libre: 76354771, 76354771-K o 76.354.771-K son equivalentes.

Este header selecciona la empresa; no la inventa. Los datos del emisor (RUT, razón social, giro, actividad económica) se leen siempre del registro de esa empresa, nunca del cuerpo de la petición.

Responses

Response samples

Content type
application/json
{
  • "data": [
    ]
}

Enlace al receptor (portal)

Acceso por token para que el receptor consulte y descargue el DTE, sin inicio de sesión ni API Key. El token se obtiene con POST /dte/{id}/portal-link.

Metadatos del DTE por token (acceso del receptor, sin API Key)

Acceso por token (sin inicio de sesión ni API Key) que abre el receptor con el token generado por POST /dte/{id}/portal-link. El token es opaco y no enumerable, y su vigencia es de 6 años (la retención legal del XML). Ruta real: GET /api/portal/dte/{token}.

path Parameters
token
required
string

Token opaco de 64 caracteres

Responses

Response samples

Content type
application/json
{
  • "folio": 0,
  • "tipo_dte": 0,
  • "tipo_nombre": "string",
  • "fecha_emision": "2019-08-24",
  • "razon_emisor": "string",
  • "rut_emisor": "78211386-0",
  • "razon_receptor": "string",
  • "rut_receptor": "12345678-5",
  • "monto_total": 0,
  • "estado_sii": "string",
  • "pdf_url": "http://example.com"
}

PDF del DTE por token (acceso del receptor, sin API Key)

Devuelve el PDF binario del documento (ticket 80mm para boletas, carta para el resto). Acceso por token (sin inicio de sesión ni API Key) con el token de POST /dte/{id}/portal-link; vigencia de 6 años (la retención legal del XML). Ruta real: GET /api/portal/dte/{token}/pdf.

path Parameters
token
required
string

Responses

Webhooks

Registro y gestión de webhooks salientes (requiere el scope webhook:manage). También gestionables desde el portal. La plataforma envía un POST firmado (HMAC-SHA256) a tu endpoint cuando el SII responde.

Listar webhooks

Lista los endpoints de webhook registrados por tu empresa. También se pueden gestionar desde el portal (Configuración → Webhooks).

Requiere una API Key con el scope webhook:manage.

Authorizations:
ApiKeyAuth
header Parameters
X-Empresa-RUT
string
Example: 76354771-K

RUT de la empresa emisora. Se acepta en TODOS los endpoints de este canal.

  • Clave de organización (estudio contable, holding): obligatorio. Sin él la respuesta es 400. Usa GET /empresas para ver cuáles administras.
  • Clave de empresa: no lo envíes. Si lo mandas se ignora — el RUT emisor lo fija la clave y no se puede cambiar desde el request.

Formato libre: 76354771, 76354771-K o 76.354.771-K son equivalentes.

Este header selecciona la empresa; no la inventa. Los datos del emisor (RUT, razón social, giro, actividad económica) se leen siempre del registro de esa empresa, nunca del cuerpo de la petición.

Responses

Response samples

Content type
application/json
{
  • "data": [
    ]
}

Registrar un webhook

Registra un endpoint al que enviaremos un POST firmado cuando ocurran los eventos suscritos. El secret se devuelve una sola vez en esta respuesta — guárdalo para verificar la firma X-Webhook-Signature.

La url debe ser https y no puede apuntar a hosts internos o a direcciones privadas/reservadas. Máximo 10 endpoints por empresa.

Requiere una API Key con el scope webhook:manage.

Authorizations:
ApiKeyAuth
header Parameters
X-Empresa-RUT
string
Example: 76354771-K

RUT de la empresa emisora. Se acepta en TODOS los endpoints de este canal.

  • Clave de organización (estudio contable, holding): obligatorio. Sin él la respuesta es 400. Usa GET /empresas para ver cuáles administras.
  • Clave de empresa: no lo envíes. Si lo mandas se ignora — el RUT emisor lo fija la clave y no se puede cambiar desde el request.

Formato libre: 76354771, 76354771-K o 76.354.771-K son equivalentes.

Este header selecciona la empresa; no la inventa. Los datos del emisor (RUT, razón social, giro, actividad económica) se leen siempre del registro de esa empresa, nunca del cuerpo de la petición.

Request Body schema: application/json
required
url
required
string <uri>

URL https a la que enviaremos los POST. No puede apuntar a hosts internos ni a direcciones privadas/reservadas.

eventos
Array of strings
Items Enum: "dte.aceptado" "dte.rechazado" "dte.reparado" "dte.anulado" "dte.enviado" "dte.reclamado" "factura_compra.recibida" "folios.por_agotarse"

Eventos a los que suscribirse. Omitir (o null) = todos.

descripcion
string or null <= 200 characters

Responses

Request samples

Content type
application/json
{}

Response samples

Content type
application/json
{
  • "message": "string",
  • "data": {
    }
}

Actualizar un webhook

Actualiza la url, los eventos, la descripcion o el estado activo. Requiere una API Key con el scope webhook:manage.

Authorizations:
ApiKeyAuth
path Parameters
id
required
integer
header Parameters
X-Empresa-RUT
string
Example: 76354771-K

RUT de la empresa emisora. Se acepta en TODOS los endpoints de este canal.

  • Clave de organización (estudio contable, holding): obligatorio. Sin él la respuesta es 400. Usa GET /empresas para ver cuáles administras.
  • Clave de empresa: no lo envíes. Si lo mandas se ignora — el RUT emisor lo fija la clave y no se puede cambiar desde el request.

Formato libre: 76354771, 76354771-K o 76.354.771-K son equivalentes.

Este header selecciona la empresa; no la inventa. Los datos del emisor (RUT, razón social, giro, actividad económica) se leen siempre del registro de esa empresa, nunca del cuerpo de la petición.

Request Body schema: application/json
url
required
string <uri>

URL https a la que enviaremos los POST. No puede apuntar a hosts internos ni a direcciones privadas/reservadas.

eventos
Array of strings
Items Enum: "dte.aceptado" "dte.rechazado" "dte.reparado" "dte.anulado" "dte.enviado" "dte.reclamado" "factura_compra.recibida" "folios.por_agotarse"

Eventos a los que suscribirse. Omitir (o null) = todos.

descripcion
string or null <= 200 characters

Responses

Request samples

Content type
application/json
{}

Response samples

Content type
application/json
{
  • "message": "Esta función requiere un plan superior.",
  • "feature": "webhooks",
  • "plan_actual": "Emprendedor",
  • "upgrade_required": true
}

Eliminar un webhook

Elimina el endpoint y su historial de entregas. Requiere una API Key con el scope webhook:manage.

Authorizations:
ApiKeyAuth
path Parameters
id
required
integer
header Parameters
X-Empresa-RUT
string
Example: 76354771-K

RUT de la empresa emisora. Se acepta en TODOS los endpoints de este canal.

  • Clave de organización (estudio contable, holding): obligatorio. Sin él la respuesta es 400. Usa GET /empresas para ver cuáles administras.
  • Clave de empresa: no lo envíes. Si lo mandas se ignora — el RUT emisor lo fija la clave y no se puede cambiar desde el request.

Formato libre: 76354771, 76354771-K o 76.354.771-K son equivalentes.

Este header selecciona la empresa; no la inventa. Los datos del emisor (RUT, razón social, giro, actividad económica) se leen siempre del registro de esa empresa, nunca del cuerpo de la petición.

Responses

Response samples

Content type
application/json
{
  • "message": "Esta función requiere un plan superior.",
  • "feature": "webhooks",
  • "plan_actual": "Emprendedor",
  • "upgrade_required": true
}

Enviar un evento de prueba

Dispara un evento dte.aceptado de prueba al endpoint para verificar que recibe y valida la firma. Requiere el scope webhook:manage.

Authorizations:
ApiKeyAuth
path Parameters
id
required
integer
header Parameters
X-Empresa-RUT
string
Example: 76354771-K

RUT de la empresa emisora. Se acepta en TODOS los endpoints de este canal.

  • Clave de organización (estudio contable, holding): obligatorio. Sin él la respuesta es 400. Usa GET /empresas para ver cuáles administras.
  • Clave de empresa: no lo envíes. Si lo mandas se ignora — el RUT emisor lo fija la clave y no se puede cambiar desde el request.

Formato libre: 76354771, 76354771-K o 76.354.771-K son equivalentes.

Este header selecciona la empresa; no la inventa. Los datos del emisor (RUT, razón social, giro, actividad económica) se leen siempre del registro de esa empresa, nunca del cuerpo de la petición.

Responses

Response samples

Content type
application/json
{
  • "message": "Esta función requiere un plan superior.",
  • "feature": "webhooks",
  • "plan_actual": "Emprendedor",
  • "upgrade_required": true
}

Historial de entregas

Últimas 50 entregas del endpoint (evento, intento, status HTTP, éxito). Requiere el scope webhook:manage.

Authorizations:
ApiKeyAuth
path Parameters
id
required
integer
header Parameters
X-Empresa-RUT
string
Example: 76354771-K

RUT de la empresa emisora. Se acepta en TODOS los endpoints de este canal.

  • Clave de organización (estudio contable, holding): obligatorio. Sin él la respuesta es 400. Usa GET /empresas para ver cuáles administras.
  • Clave de empresa: no lo envíes. Si lo mandas se ignora — el RUT emisor lo fija la clave y no se puede cambiar desde el request.

Formato libre: 76354771, 76354771-K o 76.354.771-K son equivalentes.

Este header selecciona la empresa; no la inventa. Los datos del emisor (RUT, razón social, giro, actividad económica) se leen siempre del registro de esa empresa, nunca del cuerpo de la petición.

Responses

Response samples

Content type
application/json
{
  • "message": "Esta función requiere un plan superior.",
  • "feature": "webhooks",
  • "plan_actual": "Emprendedor",
  • "upgrade_required": true
}

Eventos disponibles

Lista los eventos a los que un webhook puede suscribirse.

Authorizations:
ApiKeyAuth
header Parameters
X-Empresa-RUT
string
Example: 76354771-K

RUT de la empresa emisora. Se acepta en TODOS los endpoints de este canal.

  • Clave de organización (estudio contable, holding): obligatorio. Sin él la respuesta es 400. Usa GET /empresas para ver cuáles administras.
  • Clave de empresa: no lo envíes. Si lo mandas se ignora — el RUT emisor lo fija la clave y no se puede cambiar desde el request.

Formato libre: 76354771, 76354771-K o 76.354.771-K son equivalentes.

Este header selecciona la empresa; no la inventa. Los datos del emisor (RUT, razón social, giro, actividad económica) se leen siempre del registro de esa empresa, nunca del cuerpo de la petición.

Responses

Response samples

Content type
application/json
{
  • "data": [
    ]
}