---
title: "Integración con la API"
description: "Sigue los pasos para conectar tu propio software a la API de LibreDTE y empezar a facturar."
type: "academy"
category: "course"
tags: [api, espanol]
authors: [LibreDTE]
date: "2026-08-25"
last_update: "2026-08-25"
time_minutes: 55
draft: false
unlisted: false
image: "https://www.libredte.cl/img/content/academy/integracion-con-la-api/academy-integracion-api.jpg"
url: "https://www.stage.libredte.cl/academy/integracion"
---

# Integración con la API




---

## Introducción



---

### Generalidades

Generalidades

# Generalidades

LibreDTE provee una API (interfaz de programación de aplicaciones) que permite a los usuarios interactuar con algunas funcionalidades del sistema directamente desde sus propios programas. Esto permite automatizar procesos como la emisión de documentos tributarios electrónicos (DTE), ver estados, cargar datos de manera masiva, entre otros.

👉 Puedes revisar la documentación oficial completa en [este enlace](https://www.libredte.cl/docs/api).

---

## ¿Qué se puede hacer con la API?

Puedes automatizar tareas como:

- Emitir boletas y facturas electrónicas (y todos los DTE).
- Obtener resúmenes de ventas y compras.
- Acceder a datos de clientes, productos, usuarios, etc.
- Consultar intercambios de DTE con proveedores o clientes.
- Recibir notificaciones de pagos.

Entre otras funciones que enontrarás en la [documentación de la API](https://www.libredte.cl/docs/api).

---

## ¿Qué **NO** se puede hacer con la API?

⚠️ La API **no expone todas las funcionalidades** de la plataforma web. Está pensada para integraciones y automatización de lo más usado.

No puedes, por ejemplo:

- Administrar usuarios o permisos desde la API.
- Cambiar la configuración de la empresa (certificados, folios, etc.).
- Modificar plantillas de documentos.

&gt; [!NOTE] Importante
&gt;
&gt; Se espera que la API se use en conjunto con la plataforma web de LibreDTE.

---

## ¿Qué hago si necesito ayuda?

1. Revisa en detalle este curso.

2. Revisa la [específicación técnica de la API](https://www.libredte.cl/docs/api).

3. Revisa la [documentación adicional de integración con la API](https://www.libredte.cl/docs/integracion/api).

4. Si no encuentras la respuesta que buscas, puedes abrir un [ticket de soporte](https://www.libredte.cl/help).


    
---

### Autenticación

Autenticación

# Autenticación

Para usar la API de LibreDTE necesitas autenticarte con un **hash personal** que obtienes desde tu perfil de usuario. Este hash actúa como contraseña y te identifica en todas tus solicitudes.

---

## ¿Dónde obtengo el hash?

Debes ingresar a tu perfil en la plataforma LibreDTE:

🔗 [https://libredte.cl/usuarios/perfil#datos:hashField](https://libredte.cl/usuarios/perfil#datos:hashField)

Ahí verás un campo que contiene tu **hash de autenticación**.

![Campo API Hash en LibreDTE.](https://www.libredte.cl/img/content/academy/integracion-con-la-api/guia-de-integracion-para-emision-de-dte/api_hash_field.jpg)

---

## ¿Cómo se usa el hash?

Se utiliza en la cabecera HTTP `Authorization` con el método de autenticación **Basic Auth**.

- **Usuario:** `X` (una letra equis mayúscula)
- **Contraseña:** tu hash de autenticación

---

## Ejemplo práctico

Si tu hash es `mihash123`, debes codificar lo siguiente en base64:

```
X:mihash123
```

El resultado es:

```
WDptaWhhc2gxMjM=
```

Y esa cadena la incluyes en la cabecera HTTP de esta forma:

```
Authorization: Basic WDptaWhhc2gxMjM=
```

---

## En PHP (u otros lenguajes)

Ejemplo en PHP para generar la cabecera:

```php
$hash = &#039;mihash123&#039;;
$auth = base64_encode(&#039;X:&#039; . $hash);
$headers = [&#039;Authorization: Basic &#039; . $auth];
```

---

## Usando el API Key directamente

En tu perfil también encontrarás un campo llamado **API Key**. Este valor ya viene codificado en base64, listo para ser usado directamente.

Solo debes hacer esto:

```
Authorization: Basic APIKEY
```

Donde `APIKEY` es el valor copiado desde tu perfil.

![Campo API Key en LibreDTE](https://www.libredte.cl/img/content/academy/integracion-con-la-api/guia-de-integracion-para-emision-de-dte/api_key_field.jpg)


    
---

### Realizando peticiones

Realizando peticiones

# Realizando peticiones

La API de LibreDTE usa 2 verbos HTTP:

- `GET` para, principalmente, consultar datos.
- `POST` para enviar datos (crear o ejecutar acciones).

&gt; [!WARNING] No uses otros verbos HTTP
&gt;
&gt; No uses `PUT`, `PATCH` ni `DELETE`. No están soportados oficialmente.

---

## ¿Dónde se envían los parámetros?

Hay **3 ubicaciones posibles** para los parámetros:

### 1. En el PATH

Se usan para identificar directamente el recurso.

**Ejemplo**:

```
GET /dte/dte_emitidos/info/33/1234/12345678
```

**Significa**: buscar DTEs emitidos por el RUT 12345678, tipo 33, con folio 1234, en ambiente configurado.

---

### 2. En la URL (query string)

Permiten modificar el comportamiento, formato de salida, filtros, etc.

**Ejemplo**:

```
GET /dte/dte_emitidos/info/33/1234/12345678?_contribuyente_certificacion=1
```

**Significa**: buscar DTEs emitidos por el RUT 12345678, tipo 33, con folio 1234, en ambiente de certificación.

---

### 3. En el cuerpo (`POST`)

Datos que se envían con una solicitud POST deben ir como JSON.

**Ejemplo**:

```
POST /dte/dte_emitidos/buscar/12345678
```

```json
{
  &quot;cedido&quot;: null,
  &quot;dte&quot;: 33,
  &quot;fecha&quot;: null,
  &quot;fecha_desde&quot;: null,
  &quot;fecha_hasta&quot;: null,
  &quot;folio&quot;: 1234,
  &quot;periodo&quot;: null,
  &quot;razon_social&quot;: null,
  &quot;receptor&quot;: null,
  &quot;receptor_evento&quot;: null,
  &quot;sucursal_sii&quot;: null,
  &quot;total&quot;: null,
  &quot;total_desde&quot;: null,
  &quot;total_hasta&quot;: null,
  &quot;usuario&quot;: null,
  &quot;xml&quot;: {
    &quot;Detalle/NmbItem&quot;: &quot;abono&quot;
  }
}
```

**Significa**: buscar DTEs emitidos por el RUT 12345678, tipo 33, con folio 1234 y que el detalle del DTE contenga &quot;abono&quot;.

---

## Cabeceras HTTP necesarias

Todas las solicitudes deben incluir:

```
Content-Type: application/json
Accept: application/json
```

Las únicas excepciones son cuando se solicita un formato de salida diferente a JSON, por ejemplo un PDF.

---

## Parámetros especiales

### `_contribuyente_rut`

Permite actuar en nombre del usuario administrador si estás usando el hash de un usuario con permisos delegados.

**Ejemplo**:

```
?_contribuyente_rut=12345678-9
```

Si usas el hash del usuario administrador, **no necesitas** este parámetro.

---

### `_contribuyente_certificacion`

Permite elegir entre ambiente de **producción** y **certificación (pruebas)**.

- Omitido → Usa el valor por defecto configurado en la plataforma.
- `0` → Producción.
- `1` → Certificación.

**Ejemplo**:

```
?_contribuyente_certificacion=1
```

---

## Ejemplo completo de solicitud

```
GET /dte/dte_emitidos/info/33/1234/12345678?_contribuyente_rut=12345678-9&amp;_contribuyente_certificacion=1
```


    
---

### Errores

Errores

# Errores

Cuando ocurre un problema al usar la API de LibreDTE, se devuelve:

- Un **código de estado HTTP**.
- Un **mensaje legible en formato JSON** con el detalle del error.

---

## Ejemplo de error típico

Cabecera HTTP:

```http
HTTP/1.1 401 Unauthorized
Content-Type: application/json
```

Cuerpo JSON:

```json
{
  &quot;error&quot;: &quot;Hash de autenticación incorrecto.&quot;
}
```

---

## Códigos de error frecuentes

| Código | Descripción HTTP         | Significado en LibreDTE                              |
|--------|---------------------------|------------------------------------------------------|
| 400    | Bad Request               | Petición inválida (faltan campos, JSON mal formado) |
| 401    | Unauthorized              | Hash incorrecto o faltante                          |
| 403    | Forbidden                 | No tienes permiso para ese recurso                  |
| 404    | Not Found                 | Recurso no encontrado                               |
| 405    | Method Not Allowed        | Método no soportado (ej. `PUT`)                     |
| 406    | Not Acceptable            | Formato de respuesta inválido                       |
| 410    | Gone                      | El recurso ya no existe                             |
| 429    | Too Many Requests         | Límite de uso excedido                              |
| 500    | Internal Server Error     | Error inesperado del servidor                       |
| 503    | Service Unavailable       | Servicio en mantención                              |

---

## Error clásico: No autorizado

Este error ocurre cuando el hash de autenticación no es válido o no tienes permisos para operar con la empresa solicitada.

```json
{
  &quot;error&quot;: &quot;No está autorizado a operar con la empresa solicitada.&quot;
}
```

Posibles causas:

1. El hash corresponde a un usuario que **no tiene permisos** en la empresa.
2. Estás usando un usuario con permisos delegados y **no incluiste `_contribuyente_rut`**.

Debes revisar que el hash sea correcto y que el usuario tenga permisos para operar con la empresa solicitada mediante la plataforma web de LibreDTE.

👉 Solución recomendada: usar el hash del administrador o incluir `_contribuyente_rut` en la URL.

---

&gt; [!TIP] Consejo
&gt;
&gt; Para facilitar el diagnóstico, tu aplicación debería mostrar el mensaje devuelto por la API.


    
---

### Límites de uso

Límites de uso

# Límites de uso

LibreDTE impone límites de uso a su API para proteger la infraestructura y garantizar un rendimiento constante.

---

## ¿Qué pasa si excedes el límite?

Recibirás una respuesta HTTP 429 con un cuerpo JSON que indica que has excedido el límite de solicitudes.

Cabecera HTTP:

```http
HTTP/1.1 429 Too Many Requests
Content-Type: application/json
```

Cuerpo JSON:

```json
{
  &quot;error&quot;: &quot;Too Many Attempts&quot;
}
```

Y aparecerán cabeceras adicionales en la respuesta HTTP:

| Cabecera                 | Descripción                                                   |
|--------------------------|---------------------------------------------------------------|
| `X-RateLimit-Limit`      | Máximo de solicitudes permitidas en el período                |
| `X-RateLimit-Remaining`  | Cuántas solicitudes aún puedes hacer                          |
| `Retry-After`            | Segundos que debes esperar para volver a intentarlo           |
| `X-RateLimit-Reset`      | Timestamp (Unix) cuando se reinicia el contador de peticiones |

---

## ¿Cuánto puedo usar?

En general es suficiente para un uso normal y controlado de tu integración.


---

## Recomendaciones

- No hagas *polling* innecesario.
- Usa caché en tu sistema.
- Maneja errores 429 con lógica de reintento exponencial.

&gt; [!TIP] Consejo
&gt;
&gt; Si automatizas llamadas, asegúrate de distribuirlas en el tiempo.


    
---

### Clientes de la API

Clientes de la API

# Clientes de la API

LibreDTE ofrece **clientes oficiales** y la comunidad ha creado otros **no oficiales** para facilitar el consumo de la API desde distintos lenguajes de programación.

---

## ¿Debo usar un cliente?

No. Puedes consumir la API directamente con HTTP, pero un cliente te puede ahorrar trabajo y errores.

---

## Tipos de clientes

| Tipo                  | Soporte | Descripción                                                     |
|-----------------------|---------|-----------------------------------------------------------------|
| Oficial con soporte   | ✅      | Mantenidos por LibreDTE y con soporte en caso de problemas.     |
| Oficial sin soporte   | ❌      | Creados por LibreDTE, pero sin mantenimiento ni soporte.        |
| No oficiales          | ❌      | Hechos por usuarios, útiles como referencia o punto de partida. |

---

## Clientes disponibles

| Lenguaje | Autor        | Soporte | Repositorio                                                                          |
|----------|--------------|---------|--------------------------------------------------------------------------------------|
| PHP      | LibreDTE     | ✅      | [libredte-api-client-php](https://github.com/LibreDTE/libredte-api-client-php)       |
| Python   | LibreDTE     | ✅      | [libredte-api-client-python](https://github.com/LibreDTE/libredte-api-client-python) |
| Java     | LibreDTE     | ❌      | [libredte-sdk-java](https://github.com/LibreDTE/libredte-sdk-java)                   |
| Perl     | LibreDTE     | ❌      | [libredte-sdk-perl](https://github.com/LibreDTE/libredte-sdk-perl)                   |
| C        | LibreDTE     | ❌      | [libredte-sdk-c](https://github.com/LibreDTE/libredte-sdk-c)                         |
| C++      | LibreDTE     | ❌      | [libredte-sdk-cpp](https://github.com/LibreDTE/libredte-sdk-cpp)                     |
| curl     | LibreDTE     | ❌      | [libredte-sdk-curl](https://github.com/LibreDTE/libredte-sdk-curl)                   |
| Ruby     | @crilam      | ❌      | [libredte-sdk-ruby](https://github.com/LibreDTE/libredte-sdk-ruby)                   |
| C#       | @petermajewski | ❌    | [libredte-sdk-c_sharp](https://github.com/LibreDTE/libredte-sdk-c_sharp)             |

---

## ¿Y si no hay cliente para mi lenguaje?

No hay problema. Puedes crear uno propio. Solo necesitas:

- Consumir `GET` y `POST` con JSON.
- Autenticación HTTP Basic.

## Creación de un nuevo cliente de la API

Si estás interesado en crear o mantener un cliente de la API, puedes hacerlo. Puedes colaborar con LibreDTE para crear uno nuevo, o solicitar acceso a mantener uno existente. Solo necesitas cumplir con algunas condiciones básicas.

### ¿Qué necesitas?

- Tener conocimientos básicos de HTTP, JSON y autenticación HTTP Basic.
- Conocer el lenguaje en el que quieras crear el cliente.
- Seguir la interfaz estándar que usamos en nuestros clientes oficiales.

---

### Requisitos

1. **Licencia libre**: el código debe estar bajo licencia [LGPL](https://www.gnu.org/licenses/lgpl-3.0.en.html).
2. **Interfaz compatible**: debe seguir la interfaz de nuestros clientes oficiales.
3. **Casos de prueba**: al menos los de [facturación](https://github.com/LibreDTE/libredte-api-client-php/tree/master/tests/dte_facturacion) deben estar implementados.

---

### Estructura mínima esperada

#### Orientado a objetos (ejemplo en PHP)

```php
class LibreDTE
{
    public function __construct($hash, $url = &#039;https://libredte.cl&#039;)
    {
        // Inicializa la conexión.
    }

    public function post($resource, $data = null)
    {
        // Realiza POST a /recurso con datos JSON.
    }

    public function get($resource)
    {
        // Realiza GET a /recurso.
    }
}
```

---

#### Versión funcional (ejemplo en PHP)

```php
function libredte_init($hash, $url = &#039;https://libredte.cl&#039;)
{
    // Retorna estructura para conexión.
}

function libredte_post($libredte, $resource, $data = null)
{
    // Realiza POST.
}

function libredte_get($libredte, $resource)
{
    // Realiza GET.
}
```
---

¡Con esto has terminado el módulo de Introducción! 🎉


    
---

## Emisión de DTE



---

### Requisitos

Requisitos para emisión de DTE

# Requisitos para emisión de DTE

Para la integración y emisión de Documentos Tributarios Electrónicos (DTE) se deben de cumplir con los siguientes requisitos:

1. **Tener una cuenta de usuario y registrar una empresa en LibreDTE.**

   Puedes registrarte y solicitar acceso a la prueba del **Servicio Plus** en el siguiente enlace:

   👉 [https://www.libredte.cl/trial](https://www.libredte.cl/trial)

   El período de prueba tiene una duración de 10 días desde el registro y sólo podrás emitir documentos temporales/borradores.

2. **Subir la Firma Electrónica Simple del representante legal.**

   Esta firma es obligatoria para emitir documentos válidos (no requerido en periodo de prueba).

   👉 Puedes cargarla en: [https://libredte.cl/dte/admin/firma_electronicas](https://libredte.cl/dte/admin/firma_electronicas)

3. **Configurar los folios (CAF) en el sistema.**

   Debes crear los mantenedores de folios y subir los archivos CAF autorizados por el SII (no requerido en periodo de prueba).

   👉 Gestiona esto en: [https://libredte.cl/dte/admin/dte_folios](https://libredte.cl/dte/admin/dte_folios)

&gt; [!NOTE] Período de prueba
&gt;
&gt; Al registrar la cuenta tendrás un período de prueba de 10 días, donde sólo podrás realizar pruebas de emisión con documentos temporales/borradores.
&gt;
&gt; Por lo anterior, el punto 2 y 3 sólo son requeridos cuando ya no estés en periodo de pruebas y quieras emitir documentos reales.


    
---

### Flujo general

Flujo general de integración

# Flujo general de integración

Emitir un Documento Tributario Electrónico (DTE) en LibreDTE sigue un proceso estructurado y claro que puedes dividir en tres etapas:

1. Preparación de datos en JSON u otro de los formatos soportados.
2. Consumo de los servicios web enviando los datos preparados.
3. Ejecución del flujo mínimo de emisión.

---

## 1. Preparación de datos

Antes de consumir los servicios web, debes estructurar los datos del DTE que vas a emitir.

- Puedes apoyarte en ejemplos funcionales disponibles en este repositorio:

  [https://github.com/LibreDTE/libredte-lib-core/tree/master/tests/fixtures/yaml/documentos_ok](https://github.com/LibreDTE/libredte-lib-core/tree/master/tests/fixtures/yaml/documentos_ok)

- Otros casos más complejos pueden requerir revisar la documentación oficial del SII para el formato XML.

---

## 2. Consumir los servicios web de LibreDTE

Tienes distintas formas de interactuar con los servicios web de LibreDTE:

- Utilizar alguno de los clientes oficiales de la API disponibles en [nuestro repositorio](https://github.com/LibreDTE?q=api-client).

- Crear tu propio cliente de la API usando una librería HTTP del lenguaje de programación que prefieras. Por ejemplo, [Guzzle](https://github.com/guzzle/guzzle) en PHP o [Requests](https://github.com/psf/requests) en Python.

&gt; [!NOTE] Cliente oficial de PHP
&gt;
&gt; Para este curso, asumimos que vas a construir la integración con el cliente oficial de PHP.

---

## 3. Flujo básico de emisión

El flujo mínimo para emitir un DTE es:

1. Emitir un DTE **temporal**.
2. Generar un DTE **real** a partir del temporal.
3. Obtener el **PDF** del DTE real.
4. Verificar el estado ante el SII.

Estos pasos están explicados en detalle en la siguiente lección.

---

## Diagrama secuencial

A continuación puedes ver el flujo general de emisión representado como secuencia:

![Diagrama secuencial LibreDTE](https://www.libredte.cl/img/content/academy/integracion-con-la-api/guia-de-integracion-para-emision-de-dte/diagrama_secuencial_libredte.jpg)

También puedes revisar el siguiente video donde se explica el flujo con ejemplos reales:

[Ver video Requisitos facturación y características técnicas de LibreDTE](https://youtu.be/hFM7UbQQ9kw?t=32m43s)


    
---

### Normalización

Normalización de DTE

# Normalización de DTE

LibreDTE incluye un proceso de **normalización** de los DTE que permite reducir la cantidad de datos necesarios para emitir un documento, automatizando varios cálculos y estructuras.

## ¿Qué hace la normalización?

El sistema se encarga de:

- Agregar números a descuentos, recargos y referencias si faltan.
- Normalizar el detalle (ítems, descuentos por ítem).
- Aplicar descuentos y recargos globales (y calcular sus montos).
- Calcular IVA y totales si no vienen especificados.
- Aplicar impuestos adicionales y/o retenciones.

&gt; [!IMPORTANT] Importante
&gt;
&gt; Si estás usando la normalización, **no debes enviar los montos ya calculados**, ya que LibreDTE los genera automáticamente.

---

## Ejemplo práctico

Supongamos que envías solo el monto neto. LibreDTE calculará el IVA y total automáticamente si usas `normalizar=1` en la petición, que es la opción por defecto.

Esto simplifica la integración y reduce errores humanos en los cálculos.

---

## ¿Qué DTE se pueden normalizar?

La normalización está oficialmente soportada para los siguientes documentos:

- Factura electrónica
- Factura exenta electrónica
- Nota de débito electrónica
- Nota de crédito electrónica
- Guía de despacho electrónica
- Factura de compra electrónica
- Boleta electrónica
- Boleta exenta electrónica
- Factura de exportación electrónica
- Nota de débito de exportación electrónica
- Nota de crédito de exportación electrónica

&gt; [!BUG] Documentos no soportados
&gt;
&gt; La normalización no está soportada para los siguientes documentos:
&gt;
&gt; - Liquidación de factura electrónica

---

## ¿Y si necesito emitir un DTE no soportado?

Puedes desactivar la normalización con `normalizar=0` y enviar todos los datos completos. Por ejemplo, esto es útil si deseas emitir una **Liquidación de factura electrónica**.

---

## ¿Cómo se aplican los descuentos?

Se aplican siguiendo lo indicado por el SII (página 40 del documento del [formato DTE](https://www.sii.cl/factura_electronica/factura_mercado/formato_dte_202602.pdf)). Se considera el campo `IndExeDR`, que determina si el descuento afecta:


- Solo el neto (por defecto).
- Solo lo exento (`IndExeDR = 1`).
- Solo lo no facturable (`IndExeDR = 2`).

&gt; [!TIP] Descuentos a neto y exento
&gt;
&gt; Si necesitas aplicar descuentos a neto y exento, debes enviar dos descuentos por separado: uno sin `IndExeDR` y otro con `IndExeDR = 1`.

---

## Codificación obligatoria: UTF-8

Todos los datos deben estar codificados en **UTF-8**, tanto para los envíos como para la lectura de respuestas.

&gt; [!BUG] Codificación obligatoria
&gt;
&gt; Si usas ISO-8859-1 tendrás errores en el timbre electrónico del XML.

---

¿Listo para comenzar a emitir DTE? En la siguiente lección abordaremos paso a paso cómo hacerlo con la API.


    
---

### Emisión en 3 pasos

Emisión en 3 pasos

# Emisión en 3 pasos

En esta lección aprenderás cómo emitir un Documento Tributario Electrónico (DTE) paso a paso utilizando la API de LibreDTE. El flujo general consta de 3 pasos obligatorios para crear el DTE:

1. Emitir un DTE **temporal**.
2. Generar el DTE **real** desde el temporal.
3. Obtener el **PDF** del documento.
4. (Opcional) Enviar el DTE por **correo electrónico** o **verificar su estado**.

---

## Paso 1: Emitir un DTE temporal

Este paso permite crear un DTE en estado de borrador o cotización, sin enviarlo aún al SII.

### Endpoint

```http
POST https://libredte.cl/api/dte/documentos/emitir?normalizar=1&amp;formato=json&amp;links=0&amp;email=0
```

### Parámetros disponibles

| Parámetro    | Tipo   | Descripción                                                                |
|--------------|--------|----------------------------------------------------------------------------|
| `normalizar` | int    | `1` para activar la normalización automática de montos (recomendado).      |
| `formato`    | string | Formato de los datos: `json` (por defecto), `xml` o `yaml`.                |
| `links`      | int    | `1` si quieres que se retornen enlaces asociados al documento.             |
| `email`      | int    | `1` si quieres que se envíe el DTE automáticamente por correo electrónico. |

### Ejemplo de JSON para boleta electrónica

```json
{
  &quot;Encabezado&quot;: {
    &quot;IdDoc&quot;: {
      &quot;TipoDTE&quot;: 39
    },
    &quot;Emisor&quot;: {
      &quot;RUTEmisor&quot;: &quot;76123456-9&quot;
    },
    &quot;Receptor&quot;: {
      &quot;RUTRecep&quot;: &quot;11222333-4&quot;,
      &quot;RznSocRecep&quot;: &quot;Juan Pérez&quot;,
      &quot;GiroRecep&quot;: &quot;Informática&quot;,
      &quot;DirRecep&quot;: &quot;Domicilio de Juan 123&quot;,
      &quot;CmnaRecep&quot;: &quot;Santa Cruz&quot;
    }
  },
  &quot;Detalle&quot;: [
    {
      &quot;NmbItem&quot;: &quot;Conectores RJ45&quot;,
      &quot;QtyItem&quot;: 450,
      &quot;PrcItem&quot;: 70
    }
  ]
}
```

&gt; [!NOTE] Totales e IVA
&gt;
&gt; En este ejemplo no se incluyen totales ni IVA. Si tienes activada la opción `normalizar=1`, estos se calcularán automáticamente.

---

## Paso 2: Generar DTE real desde el temporal

Este paso toma el documento temporal creado en el paso anterior y lo convierte en un DTE **real y válido ante el SII**.

### Endpoint

```http
POST https://libredte.cl/api/dte/documentos/generar?getXML=0&amp;links=0&amp;email=0&amp;retry=10&amp;gzip=0
```

### Parámetros disponibles

| Parámetro    | Tipo   | Descripción |
|--------------|--------|-------------|
| `getXML`     | int    | `1` si deseas recibir el XML en la respuesta. |
| `links`      | int    | `1` para incluir enlaces al DTE. |
| `email`      | int    | `1` para enviar el documento por correo. |

### Body esperado

```json
{
  &quot;emisor&quot;: 76123456,
  &quot;receptor&quot;: 66666666,
  &quot;dte&quot;: 39,
  &quot;codigo&quot;: &quot;557ccc1706a77a212354d0f1734fd0adc&quot;
}
```

&gt; [!TIP] Body esperado
&gt;
&gt; Este body corresponde a la respuesta del endpoint de emisión temporal.

---

## Paso 3: Obtener el PDF del DTE

Una vez generado el documento real, puedes obtener su representación visual en PDF.

### Endpoint

```http
GET https://libredte.cl/api/dte/dte_emitidos/pdf/:dte/:folio/:emisor?formato=general&amp;papelContinuo=0
```

### Parámetros importantes

- `formato`: puede ser `estandar`, `general` o `servicios_basicos`.

- `papelContinuo`: define el tipo de hoja:

  - `0`: hoja carta
  - `80`: rollo 80mm
  - `57`: rollo 57mm

La respuesta será el **binario del PDF**.

---

## Agregar datos personalizados

LibreDTE te permite agregar información adicional al DTE que **no se envía al SII**, pero sí aparece en el PDF. Ejemplos:

- Condiciones de pago.
- Gráficos.
- Información interna o personalizada.

### Ejemplo de datos extra

```json
{
  &quot;LibreDTE&quot;: {
    &quot;extra&quot;: {
      &quot;dte&quot;: {
        &quot;Encabezado&quot;: {
          &quot;IdDoc&quot;: {
            &quot;TermPagoGlosa&quot;: &quot;OBSERVACIONES&quot;
          }
        }
      },
      &quot;historial&quot;: {
        &quot;titulo&quot;: &quot;Consumo de Agua Potable&quot;,
        &quot;datos&quot;: {
          &quot;Feb&quot;: 12,
          &quot;Mar&quot;: 11,
          &quot;Abr&quot;: 12,
          &quot;May&quot;: 10.5,
          &quot;Jun&quot;: 4,
          &quot;Jul&quot;: 5
        }
      },
      &quot;servicios_basicos&quot;: {
        &quot;consumos&quot;: {
          &quot;unidad&quot;: &quot;M3&quot;,
          &quot;lectura_actual&quot;: 9,
          &quot;lectura_anterior&quot;: 5.9,
          &quot;consumo_calculado&quot;: 3.1,
          &quot;consumo_facturado&quot;: 3,
          &quot;limite_sobreconsumo&quot;: 40
        }
      }
    }
  }
}
```


    
---

### Ejemplo en PHP

Ejemplo en PHP

# Ejemplo en PHP

En esta lección verás un ejemplo completo de cómo generar un Documento Tributario Electrónico (DTE) utilizando **PHP** y el **cliente oficial de la API de LibreDTE**.

Este ejemplo incluye:

1. Crear el cliente autenticado.
2. Emitir un DTE temporal.
3. Generar el DTE real.
4. Obtener el PDF.
5. Guardar el PDF en disco.

---

## Requisitos previos

Debes tener:

- El paquete `libredte/api-client` instalado (vía Composer).
- Tu `hash` de autenticación y `url` base de la API.
- Los datos del DTE que deseas emitir en un array.

Puedes instalar el cliente con:

```bash
composer require libredte/libredte-api-client
```

---

## Código completo del flujo

```php
&lt;?php

require &#039;vendor/autoload.php&#039;;

use libredte\api_client\ApiClient;

// 1. Crear cliente autenticado.
$hash = &#039;tu_hash_aqui&#039;;
$url = &#039;https://libredte.cl/api&#039;;
$client = new ApiClient($hash, $url);

// 2. Datos del DTE.
$datos_dte = [
    &quot;Encabezado&quot; =&gt; [
        &quot;IdDoc&quot; =&gt; [
            &quot;TipoDTE&quot; =&gt; 33,
        ],
        &quot;Emisor&quot; =&gt; [
            &quot;RUTEmisor&quot; =&gt; &quot;76123456-9&quot;,
        ],
        &quot;Receptor&quot; =&gt; [
            &quot;RUTRecep&quot; =&gt; &quot;11222333-4&quot;,
            &quot;RznSocRecep&quot; =&gt; &quot;Cliente de Prueba&quot;,
            &quot;GiroRecep&quot; =&gt; &quot;Servicios Informáticos&quot;,
            &quot;DirRecep&quot; =&gt; &quot;Calle Falsa 123&quot;,
            &quot;CmnaRecep&quot; =&gt; &quot;Santiago&quot;,
        ],
    ],
    &quot;Detalle&quot; =&gt; [
        [
            &quot;NmbItem&quot; =&gt; &quot;Servicio de desarrollo&quot;,
            &quot;QtyItem&quot; =&gt; 1,
            &quot;PrcItem&quot; =&gt; 100000,
        ],
    ],
];

// 3. Emitir DTE temporal.
$emitir = $client-&gt;post(&#039;/dte/documentos/emitir&#039;, $datos_dte);

// 4. Generar DTE real.
$generar = $client-&gt;post(&#039;/dte/documentos/generar&#039;, $emitir[&#039;body&#039;]);

// 5. Obtener el PDF del DTE real.
$generar_pdf = $client-&gt;get(sprintf(
    &#039;/dte/dte_emitidos/pdf/%d/%d/%d&#039;,
    $generar[&#039;body&#039;][&#039;dte&#039;],
    $generar[&#039;body&#039;][&#039;folio&#039;],
    $generar[&#039;body&#039;][&#039;emisor&#039;]
));

// 6. Guardar el PDF en disco.
file_put_contents(&#039;factura.pdf&#039;, $generar_pdf[&#039;body&#039;]);

echo &quot;Factura generada y guardada como factura.pdf\n&quot;;
```

---

## Consideraciones

- Este ejemplo usa `TipoDTE 33`, que corresponde a **Factura electrónica**.
- Si deseas emitir una **boleta**, cambia el tipo a `39` y recuerda que los montos van brutos en boletas.
- Puedes añadir más campos al DTE, como descuentos, referencias o datos extras (`LibreDTE.extra`).
- Todos los pasos están desacoplados, por lo que puedes manejar errores por separado.


    
---

## ¡Ponte a prueba!



---

### Autoevaluación




## Test de Integración con la API de LibreDTE

Autoevaluación completa para validar conocimientos del curso de integración con la API de LibreDTE.

### 1. La API de LibreDTE permite reemplazar completamente el uso de la plataforma web.

- [ ] True
- [x] False

> La API permite solo una parte de las funcionalidades más comunes, el resto requiere uso de la web.

### 2. ¿Dónde se obtiene el hash necesario para autenticarte contra la API?

- [ ] En el panel de control del SII
- [x] Desde tu perfil en LibreDTE
- [ ] Desde tu certificado digital
- [ ] No es necesario un hash

> El hash de autenticación está disponible en el perfil del usuario en LibreDTE.

### 3. ¿Qué métodos HTTP son aceptados por los servicios web de LibreDTE?

- [x] GET y POST
- [ ] POST y PUT
- [ ] GET y DELETE
- [ ] POST y PATCH

> Solo se permiten métodos GET y POST.

### 4. El parámetro `_contribuyente_certificacion` permite seleccionar entre ambiente de certificación y producción.

- [x] True
- [ ] False

> Este parámetro define si se usa el ambiente de pruebas o el de producción.

### 5. ¿Cuál de los siguientes códigos indica un error de autenticación?

- [ ] 400
- [x] 401
- [ ] 404
- [ ] 500

> El código 401 significa Unauthorized.

### 6. ¿Qué cabecera HTTP indica cuántas peticiones quedan disponibles en el período actual?

- [ ] Retry-After
- [x] X-RateLimit-Remaining
- [ ] X-RateLimit-Reset
- [ ] X-RateLimit-Limit

> X-RateLimit-Remaining indica cuántas solicitudes aún puedes realizar.

### 7. ¿Cuál de los siguientes lenguajes tiene un cliente oficial con soporte?

- [x] PHP
- [ ] Ruby
- [ ] C#
- [ ] Java

> Solo PHP y Python tienen clientes oficiales con soporte activo.


    

---

Last updated on 25/08/2026
#api, #espanol
