Docs · API DTE
Referencia de la API

API de DTE: emite facturas y boletas electrónicas al SII

Emite facturas, boletas, notas de crédito/débito y guías de despacho del SII directamente desde tu ERP, e-commerce o POS. YAMT genera el XML, lo firma con tu certificado, añade el timbre PDF417 y lo envía al SII — tú solo mandas JSON. Una API REST de facturación electrónica para Chile, sin SOAP ni manejo de XML de tu lado.

REST · JSON Sin SOAP ni XML Certificado custodiado Sandbox incluido

Introducción #

Si tienes un sistema propio necesitas emitir DTE desde tu aplicación. La API de YAMT integra la facturación electrónica del SII con endpoints JSON simples, sin que tengas que manejar SOAP, XML ni almacenar certificados en tu servidor.

Todos los endpoints viven bajo https://app.yamt.com/api y se enrutan por el RUT del emisor:

https://app.yamt.com/api/{rut}/{endpoint}

El {rut} es el del emisor (empresa que factura), con guión y dígito verificador — por ejemplo 76123456-7. Todas las respuestas son JSON con un campo ok booleano.

Autenticación #

La API usa API keys con formato yamt_…. Genéralas y revócalas desde tu dashboard (máximo 5 activas por cuenta). Cada key se asocia a un emisor y a un rol.

Envía la key en el header Authorization como Bearer token:

Headers
Authorization: Bearer yamt_a1b2c3d4e5f6...
Content-Type: application/json
RolPuede leerPuede emitir
owner
editor
viewerNo
🔑

Tu certificado digital .p12 queda custodiado en YAMT. Nunca viaja en las requests: la firma ocurre en nuestros servidores. El ambiente (producción o sandbox) lo define la configuración SII del emisor, no la key.

Quickstart #

Emitir una factura electrónica (tipo 33) en una sola llamada:

cURL
curl -X POST https://app.yamt.com/api/76123456-7/emitir \
  -H "Authorization: Bearer yamt_TU_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "type": 33,
    "receiver": {
      "rut": "12345678-9",
      "name": "Comercial Ejemplo Ltda",
      "activity": "Venta al por menor",
      "address": "Av. Siempre Viva 742",
      "city": "Santiago",
      "email": "pagos@ejemplo.cl"
    },
    "items": [
      { "name": "Asesoría mensual", "qty": 1, "price": 150000 },
      { "name": "Hosting", "qty": 12, "price": 8000 }
    ]
  }'

YAMT calcula neto, IVA y total automáticamente, consume un folio del CAF, firma y envía al SII. La respuesta incluye el folio asignado, el track_id y las URLs del PDF y XML.

Ambientes y sandbox #

El ambiente lo determina la configuración SII del emisor (sii_ambiente), no la API key.

  • Sandbox (emisor en ambiente de prueba): la emisión valida y guarda el documento localmente, sin enviarlo al SII. La respuesta trae env: "sandbox", sii: null y no genera track_id. Ideal para validar tu integración sin costo.
  • Producción / live: valida certificado y folios, firma, envía al SII y devuelve env: "live" con el bloque sii (estado y track id).

El mismo código funciona en ambos ambientes. Empieza en sandbox y cambia el emisor a producción desde el dashboard cuando estés listo — no tienes que tocar tu integración.


Emitir un DTE #

POST /api/{rut}/emitir

Un único endpoint emite cualquier tipo de documento; el campo type decide cuál. También puedes usar POST /api/emitir pasando issuer_rut en el body.

Requiere rol owner o editor. En producción, antes de emitir se valida que el emisor tenga certificado digital vigente y folios CAF disponibles para ese tipo.

Tipos de documento #

Valores válidos para type:

typeDocumentoNotas
33Factura electrónicaAfecta a IVA
34Factura exentaSin IVA
39Boleta electrónicaReceptor opcional
41Boleta exentaReceptor opcional, sin IVA
46Factura de compraRetención
52Guía de despachoAdmite shipping
56Nota de débitoRequiere refs
61Nota de créditoRequiere refs (usada para anular)

Cuerpo del request #

Todos los campos van en JSON. Los montos son enteros en pesos (CLP); YAMT calcula neto, IVA, exento y total por ti.

Campos raíz

CampoTipoDescripción
typeintreqCódigo del DTE (ver tabla de tipos).
receiverobjectreq*Datos del receptor. Opcional en boletas 39/41.
itemsarrayreqLíneas del documento (mín. 1).
refsarraycondReferencias. Obligatorio para notas 56 y 61.
shippingobjectoptDatos de transporte para guías (52).
datestringoptFecha de emisión YYYY-MM-DD. Default: hoy.
payment_methodintoptForma de pago (1 contado, 2 crédito…).
signer_rutstringoptRUT del firmante si el emisor tiene más de un certificado.
issuer_rutstringoptRUT emisor (solo si usas /api/emitir sin RUT en la URL).

receiver — receptor

CampoTipoDescripción
rutstringreq*RUT del receptor, formato 12345678-9.
namestringreq*Razón social.
activitystringoptGiro.
addressstringoptDirección.
citystringoptComuna.
statestringoptCiudad.
emailstringoptCorreo para envío del DTE.

req*rut y name son obligatorios salvo en boletas (39/41), donde el receptor puede omitirse.

items[] — líneas

CampoTipoDescripción
namestringreqNombre / glosa del ítem.
priceintreqPrecio unitario en CLP (> 0).
qtynumberoptCantidad. Default 1.
discountintoptDescuento en CLP sobre la línea.
exemptbooloptMarca la línea como exenta de IVA.

refs[] — referencias (obligatorio en NC/ND)

CampoTipoDescripción
typeintreqTipo del documento referenciado.
foliointreqFolio del documento referenciado.
datestringoptFecha del documento referenciado.
reasonstringoptMotivo / glosa de la referencia.

shipping — transporte (guías 52)

CampoTipoDescripción
dispatch_typeintTipo de despacho SII.
addressstringDirección de destino.
citystringComuna de destino.
statestringCiudad de destino.

Respuesta #

Respuesta 200 al emitir en producción. En sandbox, sii es null.

200 · JSON
{
  "ok": true,
  "env": "live",
  "document": {
    "id": 4821,
    "type": 33,
    "type_name": "Factura electrónica",
    "folio": 137,
    "date": "2026-07-25",
    "issuer": { "rut": "76123456-7", "name": "Mi Empresa SpA" },
    "receiver": { "rut": "12345678-9", "name": "Comercial Ejemplo Ltda", "email": "pagos@ejemplo.cl" },
    "amounts": { "net": 246000, "tax": 46740, "tax_rate": 19, "exempt": 0, "total": 292740 },
    "items": [ { "name": "Asesoría mensual", "qty": 1, "price": 150000, "subtotal": 150000, "exempt": false } ],
    "refs": null,
    "shipping": null
  },
  "sii": { "status": "enviado", "track_id": "9182736450", "response": "..." },
  "pdf_url": "https://app.yamt.com/api/76123456-7/pdf/33/137?tk=abc123",
  "xml_url": "https://app.yamt.com/api/76123456-7/xml/33/137?tk=abc123"
}
CampoDescripción
envsandbox o live.
document.idIdentificador único del DTE en YAMT.
document.folioFolio asignado del CAF.
document.amountsMontos calculados: net, tax, tax_rate, exempt, total.
sii.statusEstado del envío: enviado, error_envio. null en sandbox.
sii.track_idTrack ID del SII para seguimiento.
pdf_url / xml_urlURLs de descarga con token público tk (no requieren API key).
⚠︎

Si el DTE se guardó pero falló el envío al SII, la respuesta incluye warning y sii.track_id vacío. Reintenta el envío con POST /api/emision_reenviar.


Consultar estado en el SII #

POST/api/{rut}/emision_estado_dte

Consulta el estado de un DTE ya emitido en el SII. Body: type y folio.

cURL
curl -X POST https://app.yamt.com/api/76123456-7/emision_estado_dte \
  -H "Authorization: Bearer yamt_TU_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{ "type": 33, "folio": 137 }'

Listar emisiones #

GET/api/{rut}/emisiones

Lista los documentos emitidos, con filtros y paginación. Query params:

ParamDescripción
tipo_dteFiltra por tipo de documento.
estado_siiFiltra por estado SII.
desde / hastaRango de fechas YYYY-MM-DD.
qBúsqueda libre (receptor, folio…).
page / limitPaginación. Default 30 por página.

Respuesta: { "ok": true, "data": [...], "total": N, "page": 1, "limit": 30 }.

Descargar PDF y XML #

GET/api/{rut}/pdf/{type}/{folio}
GET/api/{rut}/xml/{type}/{folio}

Descarga el PDF con timbre PDF417 o el XML firmado. Autenticación por API key o por el token público tk que viene en pdf_url / xml_url (útil para compartir el documento sin exponer la key).

  • ?download=1 — fuerza descarga como adjunto.
  • ?base64=1 — devuelve el archivo en base64 dentro de un JSON.

Folios CAF #

GET/api/{rut}/folios

Consulta los folios CAF disponibles por tipo de documento.

POST/api/{rut}/folios_sii

Solicita nuevos rangos de folios al SII. Body: tipo_dte y cantidad.

Anular un DTE #

No existe un endpoint de anulación. Para dejar sin efecto un documento, emite una nota de crédito (type: 61) que lo referencie en refs.

Body · JSON
{
  "type": 61,
  "receiver": { "rut": "12345678-9", "name": "Comercial Ejemplo Ltda" },
  "items": [ { "name": "Anulación factura 137", "qty": 1, "price": 292740 } ],
  "refs": [
    { "type": 33, "folio": 137, "date": "2026-07-25", "reason": "Anula documento" }
  ]
}

Errores #

Los errores devuelven { "ok": false, "error": "mensaje" } con el código HTTP correspondiente.

CódigoSignificadoCausas típicas
400Bad Requesttype inválido, falta items, receiver.rut mal formado, refs ausente en NC/ND.
401No autenticadoAPI key ausente, inválida o revocada.
403Sin permisoRol viewer intentando emitir, o key sin acceso a ese emisor.
404No encontradoEmisor inexistente/inactivo o endpoint desconocido.
405Método no permitidoVerbo HTTP incorrecto para el endpoint.
422No procesableSin certificado vigente, certificado vencido o sin folios CAF disponibles.
422 · JSON
{ "ok": false, "error": "Sin folios disponibles para Factura electrónica. Solicita folios CAF al SII." }

Preguntas frecuentes #

Dudas habituales al integrar la API de facturación electrónica.

¿Qué documentos tributarios puedo emitir con la API?

Facturas (33), facturas exentas (34), boletas (39), boletas exentas (41), facturas de compra (46), guías de despacho (52), notas de débito (56) y notas de crédito (61). El tipo se indica en el campo type del mismo endpoint POST /api/{rut}/emitir.

¿Necesito instalar mi certificado digital en mi servidor?

No. Tu certificado .p12 queda custodiado en YAMT y la firma electrónica ocurre en nuestros servidores. El certificado nunca viaja en las peticiones de la API.

¿Cómo me autentico en la API?

Con una API key con formato yamt_… enviada en el header Authorization: Bearer. Generas y revocas tus keys desde el dashboard; cada key se asocia a un emisor y a un rol (owner, editor o viewer).

¿La API calcula el IVA automáticamente?

Sí. Envías los ítems con su precio unitario en pesos y YAMT calcula neto, IVA, monto exento y total según el tipo de documento y la tasa de IVA del emisor.

¿Hay un ambiente de pruebas o sandbox?

Sí. Si el emisor está en ambiente de prueba, la emisión valida y guarda el documento localmente sin enviarlo al SII (la respuesta incluye env: "sandbox" y sii: null). El mismo código funciona luego en producción sin cambios.

¿Cómo anulo una factura electrónica emitida?

No existe un endpoint de anulación. Para dejar sin efecto un documento se emite una nota de crédito (type: 61) que lo referencia en el arreglo refs con su tipo y folio original.

¿Qué pasa si falla el envío al SII?

El DTE se guarda igualmente y la respuesta incluye un campo warning con track_id vacío. Puedes reintentar el envío con POST /api/emision_reenviar.

¿En qué lenguaje de programación puedo integrar la API?

En cualquiera que pueda hacer peticiones HTTP con cuerpo JSON: PHP, Python, Node.js, Java, .NET, Go, etc. La API es REST estándar, sin SOAP ni manejo de XML de tu lado.

Roadmap #

  • Webhooks de estado SII — notificación a tu URL cuando el SII acepta, rechaza u observa un DTE.
  • SDKs oficiales — PHP, Python y Node.js.
✉︎

¿Dudas o quieres acceso anticipado? Escríbenos desde el formulario de contacto o genera tus API keys en app.yamt.com.