---
title: "Webhook"
description: "Integración mediante Webhook"
type: "docs"
category: "doc"
tags: []
authors: [Anonymous]
date: "2026-09-16"
last_update: "2026-09-16"
time_minutes: 1
draft: false
unlisted: false
url: "https://www.libredte.cl/docs/integracion/webhook"
---

# Integración mediante Webhook



---

## Notificaciones de Pago

Envío de notificación al recibir un pago

# Recibir notificaciones de pagos de tus clientes

Puedes configurar un **servicio web** propio para recibir notificaciones automáticas cuando tus clientes realicen pagos en la plataforma de LibreDTE.

## ¿Cómo funciona?

Cuando se registra un pago, LibreDTE realiza una solicitud **HTTP POST** a la URL que definas. El cuerpo de la solicitud contiene un **JSON** con los datos del pago.

Ejemplo de URL de tu servicio:

```
https://example.com/api/pagos/notificar
```


Ejemplo de payload recibido:

```json
{
  &quot;emisor&quot;: 76192083,
  &quot;codigo&quot;: &quot;aWRfcGFnbwo=&quot;,
  &quot;receptor&quot;: 11222333,
  &quot;fecha&quot;: &quot;2020-04-01&quot;,
  &quot;pagado&quot;: &quot;2020-04-21&quot;,
  &quot;medio&quot;: &quot;webpay&quot;,
  &quot;datos&quot;: null
}
```

## Campos incluidos

| Campo     | Descripción                                             |
|-----------|---------------------------------------------------------|
| `emisor`  | RUT del emisor del cobro (sin dígito verificador)       |
| `codigo`  | Código único del cobro (útil para validación posterior) |
| `receptor`| RUT del receptor del cobro (sin DV)                     |
| `fecha`   | Fecha de emisión del cobro                              |
| `pagado`  | Fecha en que se realizó el pago                         |
| `medio`   | Medio de pago utilizado (ej. `webpay`)                  |
| `datos`   | Información adicional del medio de pago (opcional)      |

## Validación del cobro

&gt; [!WARNING] No confíes solo en la notificación
&gt;
&gt; Siempre debes validar el pago consultando directamente a LibreDTE usando el **código del cobro**.
&gt; Esto garantiza que la notificación sea auténtica y evita errores o fraudes.

## Ejemplo práctico

El siguiente código incluye cómo recibir el JSON, procesarlo y consultar a LibreDTE para verificar el estado del cobro.

```php
/**
 * Ejemplo básico de servicio web para recibir una notificación de pago
 * desde LibreDTE.
 */

// Se utiliza el API Client de LibreDTE, instalar dependencia con:
//   composer require libredte/libredte-api-client
use libredte\api_client\ApiClient;
use libredte\api_client\ApiException;

// Configuración de autenticación.
$emisor = 76192083; // RUT sin puntos ni DV.
$hash = &#039;&#039;;         // Se obtiene en el perfil del usuario.
$user = &#039;&#039;;         // Lo defines al configurar el webhook en LibreDTE.
$pass = &#039;&#039;;         // Lo defines al configurar el webhook en LibreDTE.

// Verificar si la consulta tiene las credenciales válidas.
if (!auth_check($user, $pass)) {
    throw new ApiException(
        &#039;Usuario no autenticado o credenciales incorrectas.&#039;
    );
}

// Recibir datos del servicio web y extraer EnvioDTE o EnvioBOLETA.
$payload = json_decode(file_get_contents(&#039;php://input&#039;), true);
if (!$payload) {
    throw new ApiException(&#039;No se recibieron datos del cobro.&#039;);
}

// Verificar que el cobro efectivamente esté pagado.
$libredte = new ApiClient($hash);
$resource = sprintf(
    &#039;/pagos/cobros/info/%s/%d&#039;,
    $payload[&#039;codigo&#039;] ?? throw new ApiException(
        &#039;No se recibió el código del cobro que fue pagado.&#039;
    ),
    $emisor
);
$response = $libredte-&gt;get($resource);
if (($response[&#039;status&#039;][&#039;code&#039;] ?? null) !== 200) {
    throw new ApiException((sprintf(
        &#039;Error al realizar la consulta del cobro: %s&#039;,
        $response[&#039;body&#039;]
    ));
}
$cobro = (object) $response[&#039;body&#039;];

// Revisar si el cobro está pagado realmente. Esto asegura que está
// pagado, ya que se consultó a LibreDTE previamente por el estado.
if ($cobro-&gt;pagado) {
    cobro_pagado($cobro);
}

// Función que verifica las credenciales utilizando HTTP Auth Basic.
function auth_check(string $user, string $pass): bool
{
    // Error si no se definen las credenciales en la configuración.
    if (empty($user) || empty($pass)) {
        return false;
    }

    // Obtener cabecera de HTTP Auth Basic.
    $headers = apache_request_headers();
    if (empty($headers[&#039;Authorization&#039;])) {
        return false;
    }

    // Validar credenciales.
    [$basic, $Authorization] = explode(&#039; &#039;, $headers[&#039;Authorization&#039;]);
    [$u, $p] = explode(&#039;:&#039;, base64_decode($Authorization));
    $status = $u === $user &amp;&amp; $p === $pass;

    return $status;
}

// Función para hacer lo que se requiera con el cobro pagado.
function cobro_pagado(object $cobro): mixed
{
    print_r($cobro);
}
```

&gt; [!TIP]
&gt;
&gt; Puedes usar este sistema para automatizar acciones como activar servicios, enviar correos o generar documentos tras el pago.




---

## Obtener ítems desde tu aplicación

Productos y servicios desde API externa

# Obtener ítems desde tu aplicación

Puedes integrar tu sistema con LibreDTE para que la plataforma consulte automáticamente los datos de un ítem desde tu servicio web.

## Requisitos del endpoint

Debes exponer un recurso `GET` que permita obtener la información del ítem a partir de su código.

Ejemplos de URL válidas:

- `https://example.com/items/CODIGO`
- `https://example.com/items?codigo=CODIGO`

## Formato de respuesta

Tu servicio debe devolver un objeto JSON con los datos del ítem, utilizando la siguiente estructura:

```json
{
  &quot;TpoCodigo&quot;: &quot;INT1&quot;,
  &quot;VlrCodigo&quot;: &quot;dte-cert&quot;,
  &quot;NmbItem&quot;: &quot;Asesoría DTE&quot;,
  &quot;DscItem&quot;: &quot;Certificación DTE&quot;,
  &quot;IndExe&quot;: 1,
  &quot;UnmdItem&quot;: &quot;&quot;,
  &quot;PrcItem&quot;: 125000,
  &quot;ValorDR&quot;: 0,
  &quot;TpoValor&quot;: &quot;%&quot;,
  &quot;CodImpAdic&quot;: null
}
```

## Campos esperados

| Campo        | Descripción                                         |
|--------------|-----------------------------------------------------|
| `TpoCodigo`  | Tipo de código (ej: `INT1` para interno)            |
| `VlrCodigo`  | Valor del código (ej: SKU o identificador)          |
| `NmbItem`    | Nombre del ítem                                     |
| `DscItem`    | Descripción del ítem                                |
| `IndExe`     | Indicador de exención (`1` si está exento)          |
| `UnmdItem`   | Unidad de medida (puede estar vacío)                |
| `PrcItem`    | Precio unitario del ítem                            |
| `ValorDR`    | Valor de descuento o recargo (si aplica)            |
| `TpoValor`   | Tipo de valor (`%` o monto fijo)                    |
| `CodImpAdic` | Código de impuesto adicional (si corresponde)       |

&gt; [!CHECK] DRY: Don&#039;t Repeat Yourself
&gt;
&gt; Este mecanismo permite mantener la información de ítems sincronizada entre tu sistema y LibreDTE sin necesidad de cargas manuales.




---

## Respuesta a DTE recibidos

Generar una respuesta automática

# Responder automáticamente DTE recibidos

LibreDTE permite automatizar la recepción o reclamo de documentos electrónicos (DTE) que llegan por intercambio, mediante un **servicio web propio**.

Este sistema permite automatizar gran parte del flujo de intercambio, mejorando tiempos de respuesta y reduciendo errores manuales.

## ¿Cómo funciona?

Debes crear un endpoint HTTP que reciba solicitudes `POST`. LibreDTE enviará en el cuerpo un JSON que contiene el archivo `EnvioDTE` codificado en base64.

### Ejemplo de endpoint

```text
https://example.com/api/intercambios/procesar
```

### Ejemplo de payload recibido

```json
{
  &quot;xml&quot;: &quot;aWRfcGFnbwo=&quot;
}
```

## Tipos de respuesta esperada

Tu servicio debe responder con JSON. Hay múltiples opciones dependiendo del comportamiento deseado:

### 1. Recibir todos los documentos (estado **ERM**)

```json
true
```

### 2. Reclamar todos los documentos (estado **RCD**)

```json
false
```

### 3. No procesar (deja el intercambio sin respuesta automática)

Cualquier valor de tipo **string** en la respuesta se interpreta como que no se logró determinar qué hacer, y se omite la acción (el intercambio queda pendiente de procesamiento manual). El string puede usarse, de hecho, para **reportar el motivo** por el cual no se está procesando la respuesta:

```json
&quot;null&quot;
```

o, por ejemplo:

```json
&quot;Sin stock para validar recepción.&quot;
```

&gt; [!WARNING]
&gt;
&gt; La respuesta debe ser un **string** (con comillas), no el literal JSON `null`. Un `null` sin comillas no equivale a &quot;no procesar&quot;: se interpreta como un valor booleano falso, es decir, como **reclamar todo el intercambio**.

### 4. Procesar por documento (recibir y reclamar según DTE)

Si el intercambio tiene más de un DTE, se puede indicar qué documentos se deben recibir o reclamar:

```json
{
    &quot;recibir&quot;: [
        {
            &quot;TipoDTE&quot;: 33,
            &quot;Folio&quot;: 1
        }
    ],
    &quot;reclamar&quot;: [
        {
            &quot;TipoDTE&quot;: 33,
            &quot;Folio&quot;: 2
        }
    ]
}
```

Los índices `recibir` y `reclamar` son arreglos de arreglos (objetos) que pueden tener los siguientes índices:

```json
// esto no es una respuesta válida, es sólo un ejemplo de cómo asignar datos de un DTE
{
    &quot;TipoDTE&quot;: 31,
    &quot;Folio&quot;: 1,
    &quot;FchEmis&quot;: &quot;2018-05-21&quot;,
    &quot;RUTEmisor&quot;: &quot;76192083-9&quot;,
    &quot;RUTRecep&quot;: &quot;88777666-5&quot;,
    &quot;MntTotal&quot;: 1000,
    &quot;EstadoRecepDTE&quot;: &quot;ERM&quot;,
    &quot;RecepDTEGlosa&quot;: &quot;Otorga recibo de mercaderías o servicios&quot;
}
```

&gt; [!INFO]
&gt;
&gt; Solo `TipoDTE` y `Folio` son obligatorios. Sin embargo, se recomienda incluir `RUTEmisor`, `EstadoRecepDTE` y `RecepDTEGlosa` si hay más de un DTE. Los índices `EstadoRecepDTE` y `RecepDTEGlosa` permiten definir los estados que se asignarán (por defecto es `ERM` para recibidos y `RCD` para reclamados).

---

## Configuración general opcional

También puedes incluir un bloque `config` con información adicional, por ejemplo la sucursal que recibe el DTE o el período donde se debe asignar:

```json
{
    &quot;accion&quot;: true,
    &quot;config&quot;: {
        &quot;NmbContacto&quot;: &quot;Esteban&quot;,
        &quot;MailContacto&quot;: &quot;usuario@empresa.cl&quot;,
        &quot;sucursal&quot;: 0,
        &quot;Recinto&quot;: &quot;Casa matriz&quot;,
        &quot;responder_a&quot;: &quot;dte@proveedor.cl&quot;,
        &quot;periodo&quot;: &quot;202509&quot;
    }
}
```

En el índice `accion` se puede indicar cualquiera de las respuestas antes vistas (`true`, `false`, o el objeto con `recibir`/`reclamar`).

En el índice `config`, todos los campos son opcionales; si no se indica alguno, será determinado automáticamente por el sistema.

| Campo          | Descripción                                      |
|----------------|--------------------------------------------------|
| `NmbContacto`  | Nombre del contacto para consultas                |
| `MailContacto` | Email del contacto                               |
| `sucursal`     | Código de sucursal (0 = casa matriz)             |
| `Recinto`      | Nombre del lugar de recepción                    |
| `responder_a`  | Email del proveedor (recomendado: no asignar)    |
| `periodo`      | Período tributario en formato `AAAAMM`; debería ser siempre el actual |

---

&gt; [!WARNING] Tus Documentos, Tu Responsabilidad
&gt;
&gt; Aunque puedas responder automáticamente, **es tu responsabilidad validar el contenido del EnvioDTE** y establecer políticas claras de aceptación o reclamo.
&gt;





---
Última actualización el 16/09/2026

