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.
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:
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:
Authorization: Bearer yamt_a1b2c3d4e5f6...
Content-Type: application/json
| Rol | Puede leer | Puede emitir |
|---|---|---|
owner | Sí | Sí |
editor | Sí | Sí |
viewer | Sí | No |
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 -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: nully no generatrack_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 bloquesii(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 #
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:
| type | Documento | Notas |
|---|---|---|
| 33 | Factura electrónica | Afecta a IVA |
| 34 | Factura exenta | Sin IVA |
| 39 | Boleta electrónica | Receptor opcional |
| 41 | Boleta exenta | Receptor opcional, sin IVA |
| 46 | Factura de compra | Retención |
| 52 | Guía de despacho | Admite shipping |
| 56 | Nota de débito | Requiere refs |
| 61 | Nota de crédito | Requiere 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
| Campo | Tipo | Descripción | |
|---|---|---|---|
type | int | req | Código del DTE (ver tabla de tipos). |
receiver | object | req* | Datos del receptor. Opcional en boletas 39/41. |
items | array | req | Líneas del documento (mín. 1). |
refs | array | cond | Referencias. Obligatorio para notas 56 y 61. |
shipping | object | opt | Datos de transporte para guías (52). |
date | string | opt | Fecha de emisión YYYY-MM-DD. Default: hoy. |
payment_method | int | opt | Forma de pago (1 contado, 2 crédito…). |
signer_rut | string | opt | RUT del firmante si el emisor tiene más de un certificado. |
issuer_rut | string | opt | RUT emisor (solo si usas /api/emitir sin RUT en la URL). |
receiver — receptor
| Campo | Tipo | Descripción | |
|---|---|---|---|
rut | string | req* | RUT del receptor, formato 12345678-9. |
name | string | req* | Razón social. |
activity | string | opt | Giro. |
address | string | opt | Dirección. |
city | string | opt | Comuna. |
state | string | opt | Ciudad. |
email | string | opt | Correo para envío del DTE. |
req* — rut y name son obligatorios salvo en boletas (39/41), donde el receptor puede omitirse.
items[] — líneas
| Campo | Tipo | Descripción | |
|---|---|---|---|
name | string | req | Nombre / glosa del ítem. |
price | int | req | Precio unitario en CLP (> 0). |
qty | number | opt | Cantidad. Default 1. |
discount | int | opt | Descuento en CLP sobre la línea. |
exempt | bool | opt | Marca la línea como exenta de IVA. |
refs[] — referencias (obligatorio en NC/ND)
| Campo | Tipo | Descripción | |
|---|---|---|---|
type | int | req | Tipo del documento referenciado. |
folio | int | req | Folio del documento referenciado. |
date | string | opt | Fecha del documento referenciado. |
reason | string | opt | Motivo / glosa de la referencia. |
shipping — transporte (guías 52)
| Campo | Tipo | Descripción |
|---|---|---|
dispatch_type | int | Tipo de despacho SII. |
address | string | Dirección de destino. |
city | string | Comuna de destino. |
state | string | Ciudad de destino. |
Respuesta #
Respuesta 200 al emitir en producción. En sandbox, sii es null.
{
"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"
}
| Campo | Descripción |
|---|---|
env | sandbox o live. |
document.id | Identificador único del DTE en YAMT. |
document.folio | Folio asignado del CAF. |
document.amounts | Montos calculados: net, tax, tax_rate, exempt, total. |
sii.status | Estado del envío: enviado, error_envio. null en sandbox. |
sii.track_id | Track ID del SII para seguimiento. |
pdf_url / xml_url | URLs 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 #
Consulta el estado de un DTE ya emitido en el SII. Body: type y folio.
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 #
Lista los documentos emitidos, con filtros y paginación. Query params:
| Param | Descripción |
|---|---|
tipo_dte | Filtra por tipo de documento. |
estado_sii | Filtra por estado SII. |
desde / hasta | Rango de fechas YYYY-MM-DD. |
q | Búsqueda libre (receptor, folio…). |
page / limit | Paginación. Default 30 por página. |
Respuesta: { "ok": true, "data": [...], "total": N, "page": 1, "limit": 30 }.
Descargar PDF y XML #
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 #
Consulta los folios CAF disponibles por tipo de documento.
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.
{
"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ódigo | Significado | Causas típicas |
|---|---|---|
400 | Bad Request | type inválido, falta items, receiver.rut mal formado, refs ausente en NC/ND. |
401 | No autenticado | API key ausente, inválida o revocada. |
403 | Sin permiso | Rol viewer intentando emitir, o key sin acceso a ese emisor. |
404 | No encontrado | Emisor inexistente/inactivo o endpoint desconocido. |
405 | Método no permitido | Verbo HTTP incorrecto para el endpoint. |
422 | No procesable | Sin certificado vigente, certificado vencido o sin folios CAF disponibles. |
{ "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.