Emisión de DTE
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
}
}
}
}
}
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.
exampleson los datos del documento, tal como los enviarás para construirlo.expectedson 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).
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.