---
title: "Paso 2: Validar antes de enviar (opcional)"
description: "Cómo revisar el esquema, los datos y la firma de un DTE antes de enviarlo al SII."
type: "academy"
category: "lesson"
tags: []
authors: [Anonymous]
date: "2026-11-05"
last_update: "2026-11-05"
time_minutes: 4
draft: false
unlisted: false
url: "https://www.apigateway.cl/academy/emision-de-dte/emision/paso-2-validar"
---

# Paso 2: Validar antes de enviar (opcional)

Este paso es opcional, pero muy recomendable mientras desarrollas: detecta en segundos los errores que el SII te diría recién al procesar el envío. Hay tres validaciones, y las tres reciben el mismo dato: el XML que construiste en el paso 1.

Las validaciones son **las mismas para todos los documentos, incluidas las boletas**: la API reconoce el tipo de documento y, si es una boleta, la revisa con el esquema de boletas del SII.

| Operación | Qué revisa |
|-----------|------------|
| `billing/document/validator/validateSchema` | Que el XML cumpla el **esquema oficial del SII** (campos, tipos de datos, largos, orden). |
| `billing/document/validator/validate` | Que los **datos** del documento sean coherentes (por ejemplo, que una nota tenga referencia). |
| `billing/document/validator/validateSignature` | Que la **firma** del XML sea válida. |

## Qué dato usar del paso 1

De la respuesta de [`builder/build`](https://www.apigateway.cl/academy/emision-de-dte/emision/paso-1-construir-el-dte#la-respuesta) solo necesitas el campo **`document_xml`**:

```json
{
    "data": {
        "document_id": "88888888-8_T033F000000001",
        "document_xml": "PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iSVNPLTg4NTktMSI/Pgo8RFRF...",
        "...": "los demás campos de la respuesta"
    }
}
```

Copia ese valor **tal cual**, en base64 y sin decodificarlo, en el parámetro `source` de cada validación:

```json
{
    "parameters": {
        "source": "<el document_xml del paso 1>"
    }
}
```

> [!WARNING] Valida el mismo XML que vas a enviar
>
> No vuelvas a construir el documento para validarlo: cada construcción genera un XML con otra firma. Valida el `document_xml` que guardaste, que es el mismo que usarás en el [paso 3](https://www.apigateway.cl/academy/emision-de-dte/emision/paso-3-armar-el-sobre).

## Validar el esquema

```bash
curl -X POST https://app.apigateway.cl/api/v2/libredte/billing/document/validator/validateSchema \
  -H "Authorization: Token $API_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"parameters": {"source": "PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iSVNPLTg4NTktMSI/Pgo8RFRF..."}}'
```

Si el XML es válido, la respuesta es `200` con el documento leído como JSON dentro de `data`. Si no lo es, es un `422` con el motivo en `detail`.

## Validar los datos

```bash
curl -X POST https://app.apigateway.cl/api/v2/libredte/billing/document/validator/validate \
  -H "Authorization: Token $API_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"parameters": {"source": "PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iSVNPLTg4NTktMSI/Pgo8RFRF..."}}'
```

Si no hay problemas, la respuesta es `{"data": null}` con código `200`.

## Validar la firma

```bash
curl -X POST https://app.apigateway.cl/api/v2/libredte/billing/document/validator/validateSignature \
  -H "Authorization: Token $API_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"parameters": {"source": "PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iSVNPLTg4NTktMSI/Pgo8RFRF..."}}'
```

La respuesta siempre es `200`, y el resultado está en `data.valid`. Si la firma es válida, `valid` es `true` y `signature` trae los datos de la firma, incluido quién firmó (`signer`):

```json
{
    "data": {
        "valid": true,
        "error": null,
        "signature": {
            "reference": "LibreDTE_88888888-8_T033F000000000001",
            "digestValue": "YMnSHe2YViJQh/GdUuLB66wOM3M=",
            "signer": {
                "id": "11222333-9",
                "name": "Daniel Bot",
                "to": "2027-10-29T11:38:23",
                "isActive": true,
                "...": "..."
            },
            "...": "..."
        }
    }
}
```

Si no es válida, `valid` es `false` y el motivo está en `error.message`. Por ejemplo, si el XML se modificó después de firmarlo:

```json
{
    "data": {
        "valid": false,
        "error": {
            "message": "The DigestValue that comes in the XML \"76PnCAaCZb2XiWjKywMj4K3Qvko=\" for the reference \"LibreDTE_88888888-8_T033F000000000001\" does not match the calculated value when validating \"KRgsXYrcUs+tmoE7Tg9UiOgWiSQ=\". The data of the reference could have been manipulated after being signed.",
            "code": 0,
            "errors": []
        },
        "signature": { "...": "..." }
    }
}
```

Revisa siempre `valid`: el código `200` solo indica que la validación se hizo, no que la firma sea válida.

Para no romper la firma, guarda y envía el `document_xml` tal como lo entrega la API.

## ¿Cuándo validar?

| Etapa | Recomendación |
|-------|---------------|
| Desarrollo y pruebas | Valida el esquema de **todos** los documentos. |
| Producción | Valida al menos el esquema. Cuesta pocos créditos y te evita rechazos del SII. |

> [!TIP] El sobre también se valida
>
> En el siguiente paso armarás el sobre. Para el sobre existen las mismas validaciones: `billing/document/dispatcher/validate`, `billing/document/dispatcher/validateSchema` y `billing/document/dispatcher/validateSignature`. Esta última responde una lista, con un resultado por cada firma del sobre: la de cada documento y la del sobre.

> [!INFO] La validación no reemplaza al SII
>
> Estas validaciones revisan el formato y los datos. Hay reglas que solo el SII puede verificar, como que el folio esté autorizado o que el certificado esté autorizado para la empresa. La respuesta final siempre la da el SII en el [paso 5](https://www.apigateway.cl/academy/emision-de-dte/emision/paso-5-consultar-el-estado).


---
Última actualización el 05/11/2026

