Zonas

Ver en Markdown

Añade, lista, comprueba y borra zonas (dominios), en modo DNS delegado o externo, y fusiona una zona en su padre.

En esta página

Una zona es un dominio dado de alta en OpenWAF. En modo delegated OpenWAF sirve su DNS cuando el registrador la delega en los servidores de nombres de la zona; en modo external el DNS se queda donde está y cada nombre con proxy apunta al borde con un CNAME a edge.openwaf.dev. Una zona sigue pending hasta que se verifica su delegación o, en una zona externa, el TXT que prueba su propiedad.

OperaciónRuta
Listar zonasGET /v1/orgs/{org}/zones
Crear una zonaPOST /v1/orgs/{org}/zones
Crear zonas en bloquePOST /v1/orgs/{org}/zones/bulk
Ver una zonaGET /v1/orgs/{org}/zones/{zone}
Borrar una zonaDELETE /v1/orgs/{org}/zones/{zone}
Ver el estado de la delegaciónGET /v1/orgs/{org}/zones/{zone}/delegation
Comprobar la delegación ahoraPOST /v1/orgs/{org}/zones/{zone}/delegation/check
Comprobar los nombres de una zona externaGET /v1/orgs/{org}/zones/{zone}/hosts
Fusionar una zona en su padrePOST /v1/orgs/{org}/zones/{zone}/merge
Deshacer la fusión de una zonaPOST /v1/orgs/{org}/zones/{zone}/unmerge

Listar zonas

GET /v1/orgs/{org}/zones

Lista las zonas de la organización. Las zonas fusionadas en otra se ocultan salvo con include=merged.

Rol necesario: readonly o superior. Un token limitado a una zona solo ve esa zona; uno limitado a un cliente solo ve las zonas de su cliente.

Parámetros

NombreEnTipoObligatorioDescripción
orgrutastring (uuid)SíId de la organización. Cada ruta comprueba que es la del token (si no, 404).
includeconsultastringNomerged lista también las zonas fusionadas en otra (ocultas por defecto). Uno de merged.

Respuesta

  • 200: Devuelve items, un array de Zone.
CampoTipoDescripción
items[].idstring (uuid)Id.
items[].org_idstring (uuid)Id de la organización.
items[].namestringNombre.
items[].statusstringUno de pending, active, moved, disabled.
items[].dns_modestringdelegated: NS de OpenWAF. external: el cliente conserva su DNS y apunta sus sitios al borde (CNAME/A). Uno de delegated, external. Por defecto delegated.
items[].ns_pairarray de stringServidores de nombres que usan las zonas delegadas. Exactamente 2 elementos.
items[].delegation_checked_atstring (date-time)Última comprobación de la delegación.
items[].delegationCheckResult o VerifyResultÚltima comprobación: CheckResult (delegada) o VerifyResult (externa).
items[].activated_atstring (date-time)Cuándo pasó a activa.
items[].moved_atstring (date-time)Cuándo dejó de estar delegada en OpenWAF.
items[].disabled_atstring (date-time)Cuándo se desactivó.
items[].verificationZoneVerification
items[].cname_targetstringSolo zonas externas: destino del CNAME de cada sitio.
items[].edge_addressesEdgeAddresses
items[].config_versionintegerVersión de configuración actual (también en ETag).
items[].proxied_namesintegerNombres con registro con proxy.
items[].merged_intostring (uuid)Solo zonas fusionadas (status disabled): zona padre.
items[].merged_atstring (date-time)Solo zonas fusionadas; se purgan a los 14 días.
items[].created_atstring (date-time)Fecha de creación.
items[].updated_atstring (date-time)Último cambio.
items[].client_idstring (uuid) o nullCliente de la organización al que pertenece la zona; null = ninguno.

Ejemplo

curl "https://dash.openwaf.dev/v1/orgs/$OPENWAF_ORG/zones" \
  -H "Authorization: Bearer $OPENWAF_TOKEN"
200
{
  "items": [
    {
      "id": "6f1d2c3b-8a4e-4b7d-9c21-5e3f7a8b9c0d",
      "org_id": "1e7c9a3b-5d2f-4b8a-9c6e-0f2a4b6c8d1e",
      "name": "example.com",
      "status": "active",
      "dns_mode": "delegated",
      "ns_pair": [
        "ns1.example-dns.net",
        "ns2.example-dns.net"
      ],
      "delegation_checked_at": "2026-10-27T09:00:00Z",
      "activated_at": "2026-03-02T11:40:00Z",
      "config_version": 12,
      "proxied_names": 3,
      "client_id": null,
      "created_at": "2026-03-02T10:20:00Z",
      "updated_at": "2026-10-27T09:00:00Z"
    }
  ]
}

Crear una zona

POST /v1/orgs/{org}/zones

Da de alta una zona y crea la versión 1 de su configuración (el motivo por defecto es el alta de la zona).

  • delegated (por defecto): OpenWAF sirve el DNS de la zona. La zona sigue pending hasta que el registrador la delega en sus servidores de nombres (ns_pair). Por defecto se importan enseguida los registros encontrados en el DNS público (import).
  • external: el DNS se queda en su proveedor actual. Apunta cada nombre con proxy al borde con un CNAME a cname_target (o registros A/AAAA a edge_addresses en el ápice) y publica el TXT de verification para probar la propiedad; una vez verificada, la zona pasa a active. Las zonas externas solo admiten registros A/AAAA/CNAME con proxy.

Se rechaza un dominio que sea padre o subdominio de una zona de otra organización (o, con una credencial limitada a un cliente, de otro cliente). Una zona que sigue pending demasiado tiempo se borra sola.

Rol necesario: tech o superior. No disponible para tokens limitados a una zona.

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

Parámetros

NombreEnTipoObligatorioDescripción
orgrutastring (uuid)SíId de la organización. Cada ruta comprueba que es la del token (si no, 404).
X-Change-ReasoncabecerastringNoMotivo del cambio (1-500 caracteres UTF-8, sin caracteres de control); por defecto, el alta de la zona. De 1 a 500 caracteres.
If-MatchcabecerastringNoVersión de configuración esperada, p. ej. "12" (se admite W/). 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
namestringSíNombre.
dns_modestringNodelegated: NS de OpenWAF. external: el cliente conserva su DNS y apunta sus sitios al borde (CNAME/A). Uno de delegated, external. Por defecto delegated.
client_idstring (uuid)NoAsigna la zona a un cliente. Con una credencial limitada a un cliente, la zona es siempre de ese cliente.
importbooleanNoZonas delegadas: crea justo después del alta los registros encontrados en el DNS público. Por defecto true.

Respuesta

  • 200: Con dry_run=1, el plan del cambio (Applied); no se guarda nada.
  • 201: Creada. Devuelve CreatedZone.
CampoTipoDescripción
idstring (uuid)Id.
org_idstring (uuid)Id de la organización.
namestringNombre.
statusstringUno de pending, active, moved, disabled.
dns_modestringdelegated: NS de OpenWAF. external: el cliente conserva su DNS y apunta sus sitios al borde (CNAME/A). Uno de delegated, external. Por defecto delegated.
ns_pairarray de stringServidores de nombres que usan las zonas delegadas. Exactamente 2 elementos.
delegation_checked_atstring (date-time)Última comprobación de la delegación.
delegationCheckResult o VerifyResultÚltima comprobación: CheckResult (delegada) o VerifyResult (externa).
activated_atstring (date-time)Cuándo pasó a activa.
moved_atstring (date-time)Cuándo dejó de estar delegada en OpenWAF.
disabled_atstring (date-time)Cuándo se desactivó.
verificationZoneVerification
cname_targetstringSolo zonas externas: destino del CNAME de cada sitio.
edge_addressesEdgeAddresses
config_versionintegerVersión de configuración actual (también en ETag).
proxied_namesintegerNombres con registro con proxy.
merged_intostring (uuid)Solo zonas fusionadas (status disabled): zona padre.
merged_atstring (date-time)Solo zonas fusionadas; se purgan a los 14 días.
created_atstring (date-time)Fecha de creación.
updated_atstring (date-time)Último cambio.
client_idstring (uuid) o nullCliente de la organización al que pertenece la zona; null = ninguno.
detected_recordsintegerRegistros encontrados en el DNS público.
imported_recordsintegerRegistros creados en la zona.
import_warningsarray de stringAvisos de la importación.

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

Errores

EstadoDescripción
400Petición mal formada (bad_request).
403Sin permiso (forbidden) o límite de zonas de la organización alcanzado (zone_limit).
409El dominio ya está dado de alta (zone_exists) o es padre o subdominio de una zona de otra organización o de otro cliente (zone_overlaps).
412version_conflict: If-Match no coincide con la versión actual.
422Error de validación (invalid) o motivo ausente/no válido (reason_required).
503Las zonas delegadas no están disponibles ahora (unavailable): solo se admiten zonas external.

Ejemplo

curl -X POST "https://dash.openwaf.dev/v1/orgs/$OPENWAF_ORG/zones" \
  -H "Authorization: Bearer $OPENWAF_TOKEN" \
  -H "X-Change-Reason: Add example.com" \
  -H "Content-Type: application/json" \
  --data '{
    "name": "example.com",
    "dns_mode": "delegated"
  }'
201
{
  "id": "6f1d2c3b-8a4e-4b7d-9c21-5e3f7a8b9c0d",
  "org_id": "1e7c9a3b-5d2f-4b8a-9c6e-0f2a4b6c8d1e",
  "name": "example.com",
  "status": "pending",
  "dns_mode": "delegated",
  "ns_pair": [
    "ns1.example-dns.net",
    "ns2.example-dns.net"
  ],
  "delegation_checked_at": "2026-10-27T09:00:00Z",
  "activated_at": null,
  "config_version": 1,
  "proxied_names": 2,
  "client_id": null,
  "created_at": "2026-03-02T10:20:00Z",
  "updated_at": "2026-10-27T09:00:00Z",
  "detected_records": 6,
  "imported_records": 6,
  "import_warnings": []
}

Crear zonas en bloque

POST /v1/orgs/{org}/zones/bulk

Da de alta hasta 1000 zonas desde un cuerpo CSV: un dominio por línea en la primera columna y, si se quiere, el nombre de un cliente en la segunda (los clientes que no existen se crean). Una cabecera domain o name es opcional y # empieza un comentario.

Cada línea es independiente y sigue las reglas de Crear una zona; la respuesta da el resultado de cada línea. dry_run no está disponible. Los registros públicos solo se importan en altas de hasta 50 dominios.

Rol necesario: tech o superior. No disponible para tokens limitados a una zona.

Controles de cambio: X-Change-Reason (opcional)

Parámetros

NombreEnTipoObligatorioDescripción
orgrutastring (uuid)SíId de la organización. Cada ruta comprueba que es la del token (si no, 404).
X-Change-ReasoncabecerastringNoMotivo del cambio (1-500 caracteres UTF-8, sin caracteres de control); por defecto, el alta de la zona. De 1 a 500 caracteres.
importconsultabooleanNoImporta los registros públicos de cada zona delegada (solo en altas de hasta 50 dominios). Por defecto true.

Cuerpo de la petición

Tipo de contenido text/csv.

Respuesta

  • 200: Resultado por línea. Devuelve un objeto con los campos de abajo.
CampoTipoDescripción
createdinteger
failedinteger
resultsarray de object
results[].lineinteger
results[].namestringNombre.
results[].zoneCreatedZone
results[].errorstring
results[].codestringCódigo del error de la línea. Uno de invalid, zone_exists, zone_overlaps, zone_limit, forbidden, not_found.
results[].clientstringCliente de la línea (segunda columna).
clients_createdarray de stringClientes creados a partir de la segunda columna.

Errores

EstadoDescripción
400CSV inválido o dry_run (no disponible en el alta en bloque).
422Error de validación (invalid) o motivo ausente/no válido (reason_required).

Ejemplo

curl -X POST "https://dash.openwaf.dev/v1/orgs/$OPENWAF_ORG/zones/bulk" \
  -H "Authorization: Bearer $OPENWAF_TOKEN" \
  -H "X-Change-Reason: Onboard new domains" \
  -H "Content-Type: text/csv" \
  --data-binary $'domain,client\nexample.com,Acme Retail\nexample.org\n'
200
{
  "created": 0,
  "failed": 0,
  "results": [
    {
      "line": 0,
      "name": "example.com",
      "zone": {
        "id": "6f1d2c3b-8a4e-4b7d-9c21-5e3f7a8b9c0d",
        "org_id": "1e7c9a3b-5d2f-4b8a-9c6e-0f2a4b6c8d1e",
        "name": "example.com",
        "status": "pending",
        "dns_mode": "delegated",
        "ns_pair": [
          "ns1.example-dns.net",
          "ns2.example-dns.net"
        ],
        "delegation_checked_at": "2026-10-27T09:00:00Z",
        "activated_at": null,
        "config_version": 1,
        "proxied_names": 2,
        "client_id": null,
        "created_at": "2026-03-02T10:20:00Z",
        "updated_at": "2026-10-27T09:00:00Z",
        "detected_records": 6,
        "imported_records": 6,
        "import_warnings": []
      },
      "error": "",
      "code": "invalid",
      "client": "example"
    }
  ],
  "clients_created": []
}

Ver una zona

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

Devuelve una zona. La cabecera ETag lleva su versión de configuración actual.

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

CampoTipoDescripción
idstring (uuid)Id.
org_idstring (uuid)Id de la organización.
namestringNombre.
statusstringUno de pending, active, moved, disabled.
dns_modestringdelegated: NS de OpenWAF. external: el cliente conserva su DNS y apunta sus sitios al borde (CNAME/A). Uno de delegated, external. Por defecto delegated.
ns_pairarray de stringServidores de nombres que usan las zonas delegadas. Exactamente 2 elementos.
delegation_checked_atstring (date-time)Última comprobación de la delegación.
delegationCheckResult o VerifyResultÚltima comprobación: CheckResult (delegada) o VerifyResult (externa).
activated_atstring (date-time)Cuándo pasó a activa.
moved_atstring (date-time)Cuándo dejó de estar delegada en OpenWAF.
disabled_atstring (date-time)Cuándo se desactivó.
verificationZoneVerification
cname_targetstringSolo zonas externas: destino del CNAME de cada sitio.
edge_addressesEdgeAddresses
config_versionintegerVersión de configuración actual (también en ETag).
proxied_namesintegerNombres con registro con proxy.
merged_intostring (uuid)Solo zonas fusionadas (status disabled): zona padre.
merged_atstring (date-time)Solo zonas fusionadas; se purgan a los 14 días.
created_atstring (date-time)Fecha de creación.
updated_atstring (date-time)Último cambio.
client_idstring (uuid) o nullCliente de la organización al que pertenece la zona; null = ninguno.

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" \
  -H "Authorization: Bearer $OPENWAF_TOKEN"
200
{
  "id": "6f1d2c3b-8a4e-4b7d-9c21-5e3f7a8b9c0d",
  "org_id": "1e7c9a3b-5d2f-4b8a-9c6e-0f2a4b6c8d1e",
  "name": "example.com",
  "status": "active",
  "dns_mode": "delegated",
  "ns_pair": [
    "ns1.example-dns.net",
    "ns2.example-dns.net"
  ],
  "delegation_checked_at": "2026-10-27T09:00:00Z",
  "activated_at": "2026-03-02T11:40:00Z",
  "config_version": 12,
  "proxied_names": 3,
  "client_id": null,
  "created_at": "2026-03-02T10:20:00Z",
  "updated_at": "2026-10-27T09:00:00Z"
}

Borrar una zona

DELETE /v1/orgs/{org}/zones/{zone}

Borra una zona con sus registros, ajustes de borde y reglas; OpenWAF deja de servir su DNS y sus sitios. Antes se registra una última versión, así que el historial de la zona borrada se sigue pudiendo leer con Listar versiones.

Rol necesario: tech o superior.

Controles de cambio: dry_run · If-Match (opcional) · 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-MatchcabecerastringNoVersión de configuración esperada, p. ej. "12" (se admite W/). 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.

Respuesta

  • 200: Con dry_run=1, el plan del cambio (Applied); no se guarda nada.
  • 204: Borrada. Sin cuerpo.

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

Errores

EstadoDescripción
400Petición mal formada (bad_request).
404No existe o el token no lo ve (not_found).
412version_conflict: If-Match no coincide con la versión actual.
422Error de validación (invalid) o motivo ausente/no válido (reason_required).

Ejemplo

curl -X DELETE "https://dash.openwaf.dev/v1/orgs/$OPENWAF_ORG/zones/6f1d2c3b-8a4e-4b7d-9c21-5e3f7a8b9c0d" \
  -H "Authorization: Bearer $OPENWAF_TOKEN" \
  -H "X-Change-Reason: Domain no longer used"

Ver el estado de la delegación

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

Devuelve el estado de la delegación de una zona delegada (los servidores de nombres que hay que poner en el registrador) o, en una zona externa, el de la verificación de su propiedad.

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

CampoTipoDescripción
zone_idstring (uuid)Id de la zona.
namestringNombre.
statusstringUno de pending, active, moved, disabled.
dns_modestringdelegated: NS de OpenWAF. external: el cliente conserva su DNS y apunta sus sitios al borde (CNAME/A). Uno de delegated, external. Por defecto delegated.
nameserversarray de stringLos NS que hay que poner en el registrador.
checked_atstring (date-time)Última comprobación.
activated_atstring (date-time)Cuándo pasó a activa.
moved_atstring (date-time)Cuándo dejó de estar delegada en OpenWAF.
verificationZoneVerification
observationCheckResult o VerifyResultCheckResult en zonas delegadas, VerifyResult en externas.

Ejemplo

curl "https://dash.openwaf.dev/v1/orgs/$OPENWAF_ORG/zones/6f1d2c3b-8a4e-4b7d-9c21-5e3f7a8b9c0d/delegation" \
  -H "Authorization: Bearer $OPENWAF_TOKEN"
200
{
  "zone_id": "6f1d2c3b-8a4e-4b7d-9c21-5e3f7a8b9c0d",
  "name": "example.com",
  "status": "pending",
  "dns_mode": "delegated",
  "nameservers": [
    "ns1.example-dns.net",
    "ns2.example-dns.net"
  ],
  "checked_at": "2026-10-27T09:30:00Z",
  "activated_at": "2026-10-27T09:30:00Z",
  "moved_at": "2026-10-27T09:30:00Z",
  "verification": {
    "name": "_openwaf.example.com",
    "type": "A",
    "value": "openwaf-verify=3f9c0a1e5b7d4c2a8e6f1b0d9c7a5e3f"
  },
  "observation": {
    "zone": "example.com",
    "expected": [
      "ns1.example-dns.net",
      "ns2.example-dns.net"
    ],
    "parent_zone": "com",
    "verdict": "delegated",
    "error": "",
    "checked_at": "2026-10-27T09:30:00Z",
    "sources": [
      {
        "kind": "parent",
        "server": "example",
        "host": "www.example.com",
        "ns": [
          "ns1.example-dns.net",
          "ns2.example-dns.net"
        ],
        "rcode": "NOERROR",
        "error": "",
        "match": false
      }
    ]
  }
}

Comprobar la delegación ahora

POST /v1/orgs/{org}/zones/{zone}/delegation/check

Comprueba ahora la delegación de una zona delegada (en los servidores de la zona padre y en resolvedores públicos), o el TXT de verificación de una zona externa, y activa la zona si queda verificada. Lo observado se devuelve en observation.

Rol necesario: tech 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

CampoTipoDescripción
zone_idstring (uuid)Id de la zona.
namestringNombre.
statusstringUno de pending, active, moved, disabled.
dns_modestringdelegated: NS de OpenWAF. external: el cliente conserva su DNS y apunta sus sitios al borde (CNAME/A). Uno de delegated, external. Por defecto delegated.
nameserversarray de stringLos NS que hay que poner en el registrador.
checked_atstring (date-time)Última comprobación.
activated_atstring (date-time)Cuándo pasó a activa.
moved_atstring (date-time)Cuándo dejó de estar delegada en OpenWAF.
verificationZoneVerification
observationCheckResult o VerifyResultCheckResult en zonas delegadas, VerifyResult en externas.

Ejemplo

curl -X POST "https://dash.openwaf.dev/v1/orgs/$OPENWAF_ORG/zones/6f1d2c3b-8a4e-4b7d-9c21-5e3f7a8b9c0d/delegation/check" \
  -H "Authorization: Bearer $OPENWAF_TOKEN"
200
{
  "zone_id": "6f1d2c3b-8a4e-4b7d-9c21-5e3f7a8b9c0d",
  "name": "example.com",
  "status": "pending",
  "dns_mode": "delegated",
  "nameservers": [
    "ns1.example-dns.net",
    "ns2.example-dns.net"
  ],
  "checked_at": "2026-10-27T09:30:00Z",
  "activated_at": "2026-10-27T09:30:00Z",
  "moved_at": "2026-10-27T09:30:00Z",
  "verification": {
    "name": "_openwaf.example.com",
    "type": "A",
    "value": "openwaf-verify=3f9c0a1e5b7d4c2a8e6f1b0d9c7a5e3f"
  },
  "observation": {
    "zone": "example.com",
    "expected": [
      "ns1.example-dns.net",
      "ns2.example-dns.net"
    ],
    "parent_zone": "com",
    "verdict": "delegated",
    "error": "",
    "checked_at": "2026-10-27T09:30:00Z",
    "sources": [
      {
        "kind": "parent",
        "server": "example",
        "host": "www.example.com",
        "ns": [
          "ns1.example-dns.net",
          "ns2.example-dns.net"
        ],
        "rcode": "NOERROR",
        "error": "",
        "match": false
      }
    ]
  }
}

Comprobar los nombres de una zona externa

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

En una zona externa, comprueba en resolvedores públicos si cada nombre con proxy apunta al borde de OpenWAF:

  • ok: la cadena CNAME llega a cname_target o todas las direcciones son del borde.
  • proxied_elsewhere: todas las direcciones son de otro proxy (por ejemplo Cloudflare); funciona si el origen de ese proxy es el borde de OpenWAF, pero no se puede confirmar.
  • missing: el nombre no existe o no tiene datos (con error si ningún resolvedor respondió).
  • wrong: cualquier otra cosa.

El resultado es informativo: no cambia cómo se sirve una zona verificada. Se guarda al menos 30 segundos por zona.

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

CampoTipoDescripción
checked_atstring (date-time)Última comprobación.
itemsarray de object
items[].namestringNombre.
items[].statusstringUno de ok, proxied_elsewhere, wrong, missing.
items[].viastringUno de cname, a, "".
items[].answersarray de stringDestinos de la cadena CNAME y después las direcciones.
items[].errorstring

Errores

EstadoDescripción
404No existe o el token no lo ve (not_found).
409zone_not_external: la zona es delegada (sus nombres los sirve el DNS de OpenWAF).
503La comprobación no está disponible ahora.

Ejemplo

curl "https://dash.openwaf.dev/v1/orgs/$OPENWAF_ORG/zones/6f1d2c3b-8a4e-4b7d-9c21-5e3f7a8b9c0d/hosts" \
  -H "Authorization: Bearer $OPENWAF_TOKEN"
200
{
  "checked_at": "2026-10-27T09:30:00Z",
  "items": [
    {
      "name": "example.com",
      "status": "ok",
      "via": "cname",
      "answers": [
        "example"
      ],
      "error": ""
    }
  ]
}

Fusionar una zona en su padre

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

Fusiona una zona (por ejemplo tienda.example.com) en su zona padre (into, por ejemplo example.com): sus registros (con los mismos ids) y certificados pasan al padre, los ajustes que difieren pasan a ajustes por nombre en hosts del padre y sus reglas pasan al padre limitadas a los nombres de la hija. Las dos zonas deben estar activas y tener el mismo modo DNS. El padre hereda el cliente de la hija si no tiene; no se fusionan zonas de clientes distintos.

Solo se aplica si cada nombre se sigue sirviendo exactamente igual; si no, responde 409 merge_not_equivalent con el plan. La zona hija queda desactivada (merged_into) y se purga a los 14 días; el padre recibe una versión nueva. En zonas delegadas los nombres se publican en el padre antes de quitar la zona hija, así que nunca dejan de resolver. reason y dry_run del cuerpo tienen prioridad sobre la cabecera y el parámetro de consulta.

Rol necesario: admin o superior. De toda la organización.

Controles de cambio: dry_run · 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.
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. Esquema: MergeInput.

CampoTipoObligatorioDescripción
intostringSíId o nombre de la zona padre.
reasonstringNoGana sobre X-Change-Reason.
dry_runbooleanNoGana sobre ?dry_run. Por defecto false.
expected_versionsmapa de integerNoId o nombre de zona → versión esperada (como If-Match).

Respuesta

  • 200: Plan (simulación, también si no es aplicable) o fusión aplicada (X-Config-Version y ETag = nueva versión del padre). Devuelve MergeResult.
CampoTipoDescripción
dry_runbooleantrue en una simulación.
equivalentbooleanTodos los nombres se sirven igual antes y después.
childMergeZoneRef
parentMergeZoneRef
movedobject
moved.recordsarray de object
moved.certificatesarray de object
moved.rulesarray de ZoneRuleReglas creadas en el padre (solo al aplicar).
moved.hostsHostSettingsMap
moved.clientobject
hostsarray de objectInforme de equivalencia por nombre.
hosts[].hoststring
hosts[].from_zonestringUno de child, parent.
hosts[].equivalentboolean
hosts[].nodesobject
hosts[].certificatesobject
problemsarray de stringMotivos por los que no se puede aplicar.
warningsarray de stringAvisos (el cambio sigue siendo válido).
diffDiffCambios.

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).
409merge_not_equivalent: no se aplica; plan lleva el informe.
412version_conflict: If-Match no coincide con la versión actual.
422Error de validación (invalid) o motivo ausente/no válido (reason_required).

Ejemplo

curl -X POST "https://dash.openwaf.dev/v1/orgs/$OPENWAF_ORG/zones/6f1d2c3b-8a4e-4b7d-9c21-5e3f7a8b9c0d/merge" \
  -H "Authorization: Bearer $OPENWAF_TOKEN" \
  -H "X-Change-Reason: Merge shop.example.com into example.com" \
  -H "Content-Type: application/json" \
  --data '{
    "into": "example.com",
    "dry_run": true
  }'
200
{
  "dry_run": false,
  "equivalent": false,
  "child": {
    "zone_id": "6f1d2c3b-8a4e-4b7d-9c21-5e3f7a8b9c0d",
    "name": "example.com",
    "from_version": 12,
    "to_version": 12
  },
  "parent": {
    "zone_id": "6f1d2c3b-8a4e-4b7d-9c21-5e3f7a8b9c0d",
    "name": "example.com",
    "from_version": 12,
    "to_version": 12
  },
  "moved": {
    "records": [
      {
        "id": "a5614527-0ce6-43be-ad1d-d012b7394867",
        "type": "A",
        "name": "example.com",
        "content": "203.0.113.10",
        "proxied": false
      }
    ],
    "certificates": [
      {
        "id": "a5614527-0ce6-43be-ad1d-d012b7394867",
        "hostname": "www.example.com",
        "source": "example",
        "fingerprint_sha256": "example",
        "not_after": "2026-10-27T09:30:00Z",
        "moved": false
      }
    ],
    "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"
      }
    ],
    "hosts": {
      "www.example.com": {
        "mode": "active",
        "waf_level": "off",
        "rate_limit_rpm": 0,
        "timeout_ms": 0,
        "enable_feed": false,
        "stack": "generic",
        "block_page_mode": "nginx",
        "fake_server_header": "example",
        "block_page_html": "",
        "access_gate": {},
        "max_body_mb": 0,
        "redirect_allow_hosts": [
          "www.example.com"
        ],
        "cors_allow_origins": [
          "https://app.example.com"
        ],
        "hsts": {},
        "compression": false,
        "origin": {},
        "cache": {},
        "early_hints": {},
        "rum": {},
        "ai_agents": {},
        "rate_rules": []
      }
    },
    "client": {
      "from": "75857a45-8999-45be-ac4d-941e90b6b396",
      "to": "663ea1bf-ffe5-438f-af0c-f667f14c4257"
    }
  },
  "hosts": [
    {
      "host": "www.example.com",
      "from_zone": "child",
      "equivalent": false,
      "nodes": {
        "before": [],
        "after": [],
        "lost": [],
        "gained": []
      },
      "certificates": {
        "before": [],
        "after": []
      }
    }
  ],
  "problems": [],
  "warnings": [],
  "diff": {
    "from": 0,
    "to": 0,
    "changes": [
      {
        "path": "rules[id=12]",
        "op": "add",
        "from": "example",
        "to": "example"
      }
    ]
  }
}

Deshacer la fusión de una zona

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

Deshace una fusión: el padre vuelve a su versión anterior a la fusión y la zona hija a la suya (registros y certificados vuelven a la hija, que vuelve a estar activa). Si el padre cambió después de la fusión hay que revertir antes esos cambios; si no, la respuesta es 409 merge_not_reversible.

Rol necesario: admin o superior. De toda la organización.

Controles de cambio: dry_run · 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.
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. Esquema: UnmergeInput.

CampoTipoObligatorioDescripción
reasonstringNoMotivo del cambio.
expected_versionintegerNoVersión del padre que dejó la fusión.
dry_runbooleanNotrue en una simulación. Por defecto false.

Respuesta

CampoTipoDescripción
dry_runbooleantrue en una simulación.
childMergeZoneRef
parentMergeZoneRef
warningsarray de stringAvisos (el cambio sigue siendo válido).

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).
409merge_not_reversible.
422Error de validación (invalid) o motivo ausente/no válido (reason_required).

Ejemplo

curl -X POST "https://dash.openwaf.dev/v1/orgs/$OPENWAF_ORG/zones/6f1d2c3b-8a4e-4b7d-9c21-5e3f7a8b9c0d/unmerge" \
  -H "Authorization: Bearer $OPENWAF_TOKEN" \
  -H "X-Change-Reason: Undo the merge" \
  -H "Content-Type: application/json" \
  --data '{
    "expected_version": 14
  }'
200
{
  "dry_run": false,
  "child": {
    "zone_id": "6f1d2c3b-8a4e-4b7d-9c21-5e3f7a8b9c0d",
    "name": "example.com",
    "from_version": 12,
    "to_version": 12
  },
  "parent": {
    "zone_id": "6f1d2c3b-8a4e-4b7d-9c21-5e3f7a8b9c0d",
    "name": "example.com",
    "from_version": 12,
    "to_version": 12
  },
  "warnings": []
}

Última actualización:

↑↓ para moverte↵ para abriresc para cerrar