Emisión de DTE

Aprende desde cero a emitir facturas, boletas, notas de crédito, guías de despacho y otros documentos tributarios electrónicos desde tu software con API Gateway V2.

Tu primera llamada

Antes de construir documentos, haz una llamada sencilla que no necesita certificado ni folios: pedir los ejemplos de documentos que trae la biblioteca. Te sirve para confirmar que el token funciona y, además, te entrega documentos de ejemplo listos para adaptar.

Listar los ejemplos

curl -X POST https://app.apigateway.cl/api/v2/libredte/billing/document/examples/list \
  -H "Authorization: Token $API_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"parameters": {}}'

Esta operación no tiene parámetros, por eso parameters va vacío. La respuesta es la lista de ejemplos disponibles:

{
    "data": [
        {
            "id": "033_factura_afecta/033_001_simple",
            "category": "033_factura_afecta",
            "case": "033_001_simple"
        },
        {
            "id": "052_guia_despacho/052_001_constituye_venta",
            "category": "052_guia_despacho",
            "case": "052_001_constituye_venta"
        }
    ]
}

La categoría empieza con el código del tipo de documento: 033 factura, 052 guía de despacho, 061 nota de crédito, etc.

Obtener un ejemplo

curl -X POST https://app.apigateway.cl/api/v2/libredte/billing/document/examples/get \
  -H "Authorization: Token $API_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"parameters": {"id": "033_factura_afecta/033_001_simple"}}'

Respuesta:

{
    "data": {
        "id": "033_factura_afecta/033_001_simple",
        "example": {
            "Encabezado": {
                "IdDoc": {
                    "TipoDTE": 33,
                    "Folio": 1
                },
                "Emisor": {
                    "RUTEmisor": "88888888-8",
                    "RznSoc": "Mi Empresa SpA",
                    "GiroEmis": "Venta de software",
                    "Acteco": 620200,
                    "DirOrigen": "Av. Siempre Viva 742",
                    "CmnaOrigen": "Providencia"
                },
                "Receptor": {
                    "RUTRecep": "60803000-K",
                    "RznSocRecep": "Servicio de Impuestos Internos",
                    "GiroRecep": "Gobierno",
                    "DirRecep": "Santiago",
                    "CmnaRecep": "Santiago"
                }
            },
            "Detalle": [
                {
                    "NmbItem": "Conectores RJ45",
                    "QtyItem": 450,
                    "PrcItem": 70
                }
            ]
        },
        "expected": {
            "Encabezado": {
                "Totales": {
                    "MntNeto": 31500,
                    "IVA": 5985,
                    "MntTotal": 37485
                }
            }
        }
    }
}
Datos de ejemplo

Los ejemplos de la API traen los datos de un emisor de demostración. En este extracto los reemplazamos por datos ficticios. Cuando emitas, usa siempre los datos de tu empresa.

  • example son los datos del documento, tal como los enviarás para construirlo.
  • expected son los totales que debería calcular la API. Fíjate que el ejemplo no trae totales: la API los calcula (450 × $70 = $31.500 neto, más 19% de IVA = $5.985).
Usa los ejemplos como plantilla

Cuando tengas que emitir un caso nuevo (una factura con descuento, una guía de devolución, una nota que corrige montos), busca primero si existe un ejemplo parecido. Es la forma más rápida de saber qué campos lleva.

Qué revisar si falla

Respuesta Causa probable
401 El token está mal escrito o falta la palabra Token antes del token.
402 La conexión no tiene créditos o tiene un problema de pago.
404 Hay un error en la URL.
200 con data ¡Todo bien! Sigue con la siguiente lección.

En Python

La API es HTTP y JSON, así que funciona con cualquier lenguaje. En Python, con requests:

import os
import requests

API_URL = 'https://app.apigateway.cl/api/v2/libredte'
HEADERS = {
    'Authorization': f'Token {os.environ["API_TOKEN"]}',
    'Content-Type': 'application/json',
}

def libredte(operacion: str, parameters: dict) -> dict | list | None:
    """Ejecuta una operación de LibreDTE y entrega el contenido de `data`."""
    response = requests.post(
        f'{API_URL}/{operacion}',
        json={'parameters': parameters},
        headers=HEADERS,
        timeout=120,
    )
    if response.status_code != 200:
        try:
            detalle = response.json().get('detail', response.text)
        except ValueError:  # La respuesta de error no viene en JSON.
            detalle = response.text
        raise RuntimeError(f'{operacion}: HTTP {response.status_code}: {detalle}')
    return response.json()['data']

ejemplos = libredte('billing/document/examples/list', {})
print(len(ejemplos), 'ejemplos disponibles')

Usaremos esta función libredte() en el resto del curso.

En esta página

Última actualización el 05/11/2026 por Anonymous