Versiones de configuración

Ver en Markdown

Recorre el historial de versiones de una zona, compara dos versiones, vuelve a una anterior y sigue su propagación al borde.

En esta página

Cada cambio de la configuración de una zona (registros, ajustes de borde, reglas) crea una versión numerada con su autor y su motivo. Las versiones se pueden comparar y restaurar, y la propagación muestra qué versión ha aplicado cada nodo del borde. Consulta Cambios de configuración.

OperaciónRuta
Listar versionesGET /v1/orgs/{org}/zones/{zone}/versions
Ver una versiónGET /v1/orgs/{org}/zones/{zone}/versions/{version}
Comparar versionesGET /v1/orgs/{org}/zones/{zone}/diff
Volver a una versiónPOST /v1/orgs/{org}/zones/{zone}/revert
Ver la propagaciónGET /v1/orgs/{org}/zones/{zone}/propagation

Listar versiones

GET /v1/orgs/{org}/zones/{zone}/versions

Lista las versiones de configuración de una zona, de la más reciente a la más antigua, sin sus instantáneas. También funciona con una zona borrada, cuya última versión es zone.delete; el ETag es entonces su versión final.

Rol necesario: readonly o superior.

Parámetros

NombreEnTipoObligatorioDescripción
orgrutastring (uuid)SíId de la organización. Cada ruta comprueba que es la del token (si no, 404).
zonerutastring (uuid)SíId de la zona (consulta Listar zonas).
limitconsultaintegerNoNúmero máximo de elementos. Por defecto 50. De 1 a 500.
beforeconsultaintegerNoSolo versiones anteriores a esta (paginación). Mínimo 0.

Respuesta

CampoTipoDescripción
items[].versionintegerNúmero de versión.
items[].created_atstring (date-time)Fecha de creación.
items[].actorstringQuién hizo el cambio: un token, un usuario u OpenWAF.
items[].actionstring
items[].reasonstringMotivo del cambio.
items[].restored_frominteger o nullVersión restaurada por una reversión (null en otro caso).
items[].channelstringCanal del cambio cuando no es la API ni la CLI (mcp); ausente si no hay.
items[].snapshot_sha256stringSHA-256 de la forma canónica de la instantánea.
items[].snapshotZoneSnapshot

Cabeceras de la respuesta: ETag.

Errores

EstadoDescripción
400Petición mal formada (bad_request).
404No existe o el token no lo ve (not_found).

Ejemplo

curl "https://dash.openwaf.dev/v1/orgs/$OPENWAF_ORG/zones/6f1d2c3b-8a4e-4b7d-9c21-5e3f7a8b9c0d/versions?limit=20" \
  -H "Authorization: Bearer $OPENWAF_TOKEN"
200
{
  "items": [
    {
      "version": 12,
      "created_at": "2026-10-27T09:30:00Z",
      "actor": "token:11111111-2222-4333-8444-555555555555",
      "action": "block",
      "reason": "Point www at the new origin",
      "restored_from": 0,
      "channel": "mcp",
      "snapshot_sha256": "example",
      "snapshot": {
        "schema": "openwaf-cloud/zone-config/v1",
        "zone": {},
        "settings": {},
        "rules": [],
        "records": [],
        "certificates": []
      }
    }
  ]
}

Ver una versión

GET /v1/orgs/{org}/zones/{zone}/versions/{version}

Devuelve una versión de la zona con la instantánea completa de su configuración (snapshot).

Rol necesario: readonly o superior.

Parámetros

NombreEnTipoObligatorioDescripción
orgrutastring (uuid)SíId de la organización. Cada ruta comprueba que es la del token (si no, 404).
zonerutastring (uuid)SíId de la zona (consulta Listar zonas).
versionrutaintegerSíNúmero de versión. Mínimo 1.

Respuesta

CampoTipoDescripción
versionintegerNúmero de versión.
created_atstring (date-time)Fecha de creación.
actorstringQuién hizo el cambio: un token, un usuario u OpenWAF.
actionstring
reasonstringMotivo del cambio.
restored_frominteger o nullVersión restaurada por una reversión (null en otro caso).
channelstringCanal del cambio cuando no es la API ni la CLI (mcp); ausente si no hay.
snapshot_sha256stringSHA-256 de la forma canónica de la instantánea.
snapshotZoneSnapshot

Errores

EstadoDescripción
404No existe o el token no lo ve (not_found).

Ejemplo

curl "https://dash.openwaf.dev/v1/orgs/$OPENWAF_ORG/zones/6f1d2c3b-8a4e-4b7d-9c21-5e3f7a8b9c0d/versions/11" \
  -H "Authorization: Bearer $OPENWAF_TOKEN"
200
{
  "version": 12,
  "created_at": "2026-10-27T09:30:00Z",
  "actor": "token:11111111-2222-4333-8444-555555555555",
  "action": "block",
  "reason": "Point www at the new origin",
  "restored_from": 0,
  "channel": "mcp",
  "snapshot_sha256": "example",
  "snapshot": {
    "schema": "openwaf-cloud/zone-config/v1",
    "zone": {
      "id": "a5614527-0ce6-43be-ad1d-d012b7394867",
      "name": "example.com",
      "dns_mode": "delegated"
    },
    "settings": {
      "zone_id": "6f1d2c3b-8a4e-4b7d-9c21-5e3f7a8b9c0d",
      "mode": "active",
      "waf_level": "medium",
      "rate_limit_rpm": 0,
      "timeout_ms": 0,
      "enable_feed": true,
      "stack": "generic",
      "block_page_mode": "branded",
      "fake_server_header": "",
      "block_page_html": "",
      "access_gate": {
        "enabled": false,
        "path": "/checkout",
        "ttl_hours": 0,
        "emails": []
      },
      "max_body_mb": 0,
      "redirect_allow_hosts": [
        "www.example.com"
      ],
      "cors_allow_origins": [
        "https://app.example.com"
      ],
      "hsts": {
        "max_age": 0,
        "include_subdomains": false,
        "preload": false
      },
      "compression": false,
      "origin": {
        "scheme": "https",
        "port": 0,
        "tls_verify": "full",
        "server_name": "",
        "client_cert": false
      },
      "hosts": {},
      "redirects": [
        {}
      ],
      "cache": {
        "enabled": false,
        "dev_mode_until": "2026-10-27T09:30:00Z",
        "query": {},
        "browser_ttl": 0,
        "deception_armor": true,
        "serve_stale": {},
        "max_object_mb": 100,
        "rules": []
      },
      "early_hints": {
        "enabled": false,
        "mode": "both",
        "extra_origins": []
      },
      "ai_agents": {
        "enabled": false,
        "mode": "log",
        "spoofed_challenge": "log",
        "template": "search_ok_block_training",
        "policy": {},
        "bot_overrides": [],
        "trap": {},
        "tarpit": {},
        "robots": {},
        "markdown": {},
        "block_response": {},
        "endpoints": []
      },
      "rum": {
        "enabled": false,
        "sample_rate": 1,
        "exclude_paths": []
      },
      "rate_rules": [
        {}
      ],
      "updated_at": "2026-10-27T09:30:00Z"
    },
    "rules": [
      {
        "id": 3,
        "zone_id": "6f1d2c3b-8a4e-4b7d-9c21-5e3f7a8b9c0d",
        "kind": "ip",
        "ip": "203.0.113.0/24",
        "action": "block",
        "note": "Abusive scanner",
        "hosts": [],
        "created_at": "2026-10-27T09:30:00Z"
      }
    ],
    "records": [
      {
        "id": "a5614527-0ce6-43be-ad1d-d012b7394867",
        "seq": 0,
        "name": "example.com",
        "type": "A",
        "content": "203.0.113.10",
        "ttl": 0,
        "proxied": false,
        "priority": 0
      }
    ],
    "certificates": [
      {
        "id": "a5614527-0ce6-43be-ad1d-d012b7394867",
        "hostname": "www.example.com",
        "source": "example",
        "fingerprint_sha256": "example",
        "not_after": "2026-10-27T09:30:00Z"
      }
    ]
  }
}

Comparar versiones

GET /v1/orgs/{org}/zones/{zone}/diff

Devuelve qué cambió entre dos versiones de la zona. Por defecto, la versión actual frente a la anterior.

Rol necesario: readonly o superior.

Parámetros

NombreEnTipoObligatorioDescripción
orgrutastring (uuid)SíId de la organización. Cada ruta comprueba que es la del token (si no, 404).
zonerutastring (uuid)SíId de la zona (consulta Listar zonas).
fromconsultaintegerNoVersión origen (por defecto to - 1). Mínimo 0.
toconsultaintegerNoVersión destino (por defecto la actual). Mínimo 0.

Respuesta

CampoTipoDescripción
frominteger
tointeger
changesarray de DiffChange

Errores

EstadoDescripción
400Petición mal formada (bad_request).
404No existe o el token no lo ve (not_found).

Ejemplo

curl "https://dash.openwaf.dev/v1/orgs/$OPENWAF_ORG/zones/6f1d2c3b-8a4e-4b7d-9c21-5e3f7a8b9c0d/diff?from=10&to=12" \
  -H "Authorization: Bearer $OPENWAF_TOKEN"
200
{
  "from": 0,
  "to": 0,
  "changes": [
    {
      "path": "rules[id=12]",
      "op": "add",
      "from": "example",
      "to": "example"
    }
  ]
}

Volver a una versión

POST /v1/orgs/{org}/zones/{zone}/revert

Restaura la configuración (registros, ajustes de borde y reglas) de to_version como una versión nueva; se deshacen los cambios posteriores. If-Match es obligatorio. Si algún sitio de la versión restaurada quedaría sin certificado válido, la respuesta es 409 missing_certs con los hostnames, salvo con allow_missing_certs a true.

Rol necesario: tech o superior.

Controles de cambio: dry_run · If-Match (obligatorio) · X-Change-Reason (obligatorio)

Parámetros

NombreEnTipoObligatorioDescripción
orgrutastring (uuid)SíId de la organización. Cada ruta comprueba que es la del token (si no, 404).
zonerutastring (uuid)SíId de la zona (consulta Listar zonas).
X-Change-ReasoncabecerastringSíMotivo del cambio: 1-500 caracteres UTF-8 tras recortar espacios, sin caracteres de control. Si falta o no es válido: 422 reason_required. De 1 a 500 caracteres.
If-MatchcabecerastringSíVersión de configuración esperada, p. ej. "12". Obligatorio (428 if_match_required); si no es la actual: 412 version_conflict.
dry_runconsultastringNo1/true simula el cambio: responde 200 con el plan (Applied) y no guarda nada. Admite 0/false; otro valor: 400. Uno de 1, true, 0, false.

Cuerpo de la petición

Tipo de contenido application/json.

CampoTipoObligatorioDescripción
to_versionintegerSíVersión que crea el cambio (la misma si no cambia nada). Mínimo 1.
allow_missing_certsbooleanNoPor defecto false.

Respuesta

  • 200: Revertida (RevertResult, con X-Config-Version y ETag) o, con dry_run, el plan (Applied). Devuelve RevertResult o Applied.
CampoTipoDescripción
versionintegerVersión nueva creada por la reversión.
restored_fromintegerVersión restaurada por una reversión (null en otro caso).
diffDiffCambios.
warningsarray de stringAvisos (el cambio sigue siendo válido).

Cabeceras de la respuesta: ETag, X-Config-Version.

Errores

EstadoDescripción
400Petición mal formada (bad_request).
403El rol o los límites del token no lo permiten (forbidden).
404No existe o el token no lo ve (not_found).
409missing_certs: sitios que quedarían sin certificado válido · conflict: la zona está desactivada (también una zona fusionada).
412version_conflict: If-Match no coincide con la versión actual.
422Error de validación (invalid) o motivo ausente/no válido (reason_required).
428if_match_required: la operación exige If-Match.

Ejemplo

curl -X POST "https://dash.openwaf.dev/v1/orgs/$OPENWAF_ORG/zones/6f1d2c3b-8a4e-4b7d-9c21-5e3f7a8b9c0d/revert" \
  -H "Authorization: Bearer $OPENWAF_TOKEN" \
  -H "X-Change-Reason: Undo the last change" \
  -H 'If-Match: "12"' \
  -H "Content-Type: application/json" \
  --data '{
    "to_version": 11
  }'
200
{
  "version": 12,
  "restored_from": 0,
  "diff": {
    "from": 0,
    "to": 0,
    "changes": [
      {
        "path": "rules[id=12]",
        "op": "add",
        "from": "example",
        "to": "example"
      }
    ]
  },
  "warnings": []
}

Ver la propagación

GET /v1/orgs/{org}/zones/{zone}/propagation

Muestra qué versión de configuración ha aplicado cada nodo del borde que sirve la zona, frente a la versión deseada (la actual) del ETag. Los nodos que están dejando de servir la zona aparecen con estado retiring hasta que aplican una configuración sin ella.

Rol necesario: readonly o superior.

Parámetros

NombreEnTipoObligatorioDescripción
orgrutastring (uuid)SíId de la organización. Cada ruta comprueba que es la del token (si no, 404).
zonerutastring (uuid)SíId de la zona (consulta Listar zonas).

Respuesta

  • 200: OK (ETag = versión deseada). Devuelve Propagation.
CampoTipoDescripción
zone_idstring (uuid)Id de la zona.
desired_versioninteger
nodesarray de NodePropagation

Cabeceras de la respuesta: ETag.

Errores

EstadoDescripción
404No existe o el token no lo ve (not_found).

Ejemplo

curl "https://dash.openwaf.dev/v1/orgs/$OPENWAF_ORG/zones/6f1d2c3b-8a4e-4b7d-9c21-5e3f7a8b9c0d/propagation" \
  -H "Authorization: Bearer $OPENWAF_TOKEN"
200
{
  "zone_id": "6f1d2c3b-8a4e-4b7d-9c21-5e3f7a8b9c0d",
  "desired_version": 12,
  "nodes": [
    {
      "node_id": "edge-node-1",
      "status": "converged",
      "applied_version": 12,
      "applied_serial": 0,
      "current_serial": 0,
      "pending_since": "2026-10-27T09:30:00Z",
      "lag_seconds": 0,
      "last_seen_at": "2026-10-27T09:30:00Z"
    }
  ]
}

Última actualización:

↑↓ para moverte↵ para abriresc para cerrar