# Versiones de la zona

> Cada cambio de DNS crea una versión nueva de la zona con autor, motivo y diferencias. Simula antes, aplica sobre la versión esperada y vuelve atrás.

La configuración de una zona (registros, ajustes del borde, reglas y cliente) tiene un número de **versión**. Cada
cambio crea la versión siguiente, con su autor, su motivo y las diferencias con la anterior. Las versiones son la forma
en que los cambios llegan al borde y la forma de deshacerlos.

Esta página cubre lo que importa para el DNS; [Control de cambios](https://developers.openwaf.dev/es/change-control/) trata a fondo el historial, las
diferencias, la propagación y la marcha atrás.

## Un cambio, una versión

- Crear, cambiar o borrar un registro es una versión.
- Un [lote](https://developers.openwaf.dev/es/dns/batch-changes/) (hasta 500 operaciones), un cambio de proxy masivo en el panel, una importación BIND o
  el asistente de correo son **una** versión, que se aplica entera o no se aplica.
- Dar de alta una zona crea la versión 1; los registros importados del DNS público justo después son la versión 2.
- Borrar una zona deja una última versión en su historial, que sigue pudiendo consultarse por su id.

## Cada cambio necesita un motivo

Cada cambio lleva un motivo de 1 a 500 caracteres, que se guarda en la versión y en la auditoría.

| Interfaz | Cómo |
|---|---|
| Panel | Lo rellena por ti a partir del cambio (por ejemplo «Añadir registro A www») |
| API | Cabecera `X-Change-Reason`. Si falta: `422 reason_required` |
| CLI | `--reason "…"` |
| MCP | Argumento `reason` |

## Simular y luego aplicar

Cualquier cambio se puede simular antes: misma validación, nada aplicado. La simulación devuelve las versiones
(`from_version`, `to_version`), las diferencias (`diff`) y los avisos (`warnings`).

```sh
# 1. Simular
curl -X POST "https://dash.openwaf.dev/v1/orgs/$ORG/zones/$ZONE/records?dry_run=1" \
  -H "Authorization: Bearer $OPENWAF_TOKEN" -H "Content-Type: application/json" \
  -H "X-Change-Reason: Alta de www" \
  -d '{"type": "A", "name": "www", "content": "203.0.113.10", "proxied": true}'

# 2. Aplicar, solo si la zona sigue en la versión que simulaste
curl -X POST "https://dash.openwaf.dev/v1/orgs/$ORG/zones/$ZONE/records" \
  -H "Authorization: Bearer $OPENWAF_TOKEN" -H "Content-Type: application/json" \
  -H "X-Change-Reason: Alta de www" -H 'If-Match: "41"' \
  -d '{"type": "A", "name": "www", "content": "203.0.113.10", "proxied": true}'
```

- Un cambio aplicado responde con la versión nueva en `X-Config-Version` y en `ETag`.
- Con `If-Match`, el cambio se rechaza con `412 version_conflict` (y la `current_version`) si alguien ha cambiado la
  zona entretanto: vuelve a simular y revisa las nuevas diferencias.
- La CLI simula, enseña las diferencias y pide confirmación antes de cada cambio (`--dry-run` se queda en la
  simulación y `--yes` no pregunta). Las herramientas MCP de escritura simulan con `confirm: false` y aplican con
  `confirm: true` y `expected_version`.

## Historial y marcha atrás

**Cambios › Historial** del dominio lista cada versión con sus diferencias. Volver a una versión anterior crea una
versión nueva con esa configuración, registros incluidos, así que la vuelta atrás también queda en el historial.

```sh
openwaf-cloud ctl zones history example.com
openwaf-cloud ctl zones diff example.com 40 41
openwaf-cloud ctl zones revert example.com 40 --reason "Deshacer el cambio de www"
```

En [Control de cambios](https://developers.openwaf.dev/es/change-control/) tienes la propagación al borde y los detalles de la vuelta atrás.
