# Crear un registro DNS

> Añade un registro DNS con proxy desde código con el SDK, simulándolo antes, revisando las diferencias y confirmándolo contra la versión de la zona.

Este ejemplo añade `www.example.com` como registro A con proxy, servido a través del borde de OpenWAF, con el protocolo completo de simular y después confirmar. El token necesita el rol **Técnico**.

**TypeScript**

```ts
import { OpenWAF, OpenWAFError, type Applied } from "./openwaf.ts";

const owf = new OpenWAF();

// 1. Busca el id de la zona.
const { items: zones = [] } = await owf.listZones();
const zone = zones.find((z) => z.name === "example.com");
if (!zone?.id) throw new Error("no se encuentra example.com");

const record = { type: "A", name: "www", content: "203.0.113.10", proxied: true } as const;
const reason = "Poner www detrás del WAF";

// 2. Simula: no se aplica nada.
const plan = (await owf.createRecord({ zone: zone.id, body: record }, { reason, dryRun: true })) as Applied;
for (const c of plan.diff?.changes ?? []) console.log(c.op, c.path);
console.log(`versión ${plan.from_version} → ${plan.to_version}`, plan.warnings);

// 3. Confirma con la versión contra la que se hizo el plan.
try {
  const created = await owf.createRecord({ zone: zone.id, body: record }, { reason, ifMatch: plan.from_version! });
  console.log("creado", created);
} catch (err) {
  if (err instanceof OpenWAFError && err.code === "version_conflict") {
    console.error("La zona ha cambiado mientras tanto: vuelve a ejecutarlo y revisa el plan nuevo.");
  } else {
    throw err;
  }
}
```
**Python**

```py
from openwaf import OpenWAF, OpenWAFError

owf = OpenWAF()

# 1. Busca el id de la zona.
zone = next(z for z in owf.list_zones()["items"] if z["name"] == "example.com")

record = {"type": "A", "name": "www", "content": "203.0.113.10", "proxied": True}
reason = "Poner www detrás del WAF"

# 2. Simula: no se aplica nada.
plan = owf.create_record(zone=zone["id"], body=record, reason=reason, dry_run=True)
for change in plan["diff"]["changes"]:
    print(change["op"], change["path"])
print("versión %d -> %d" % (plan["from_version"], plan["to_version"]), plan["warnings"])

# 3. Confirma con la versión contra la que se hizo el plan.
try:
    created = owf.create_record(zone=zone["id"], body=record, reason=reason, if_match=plan["from_version"])
    print("creado", created)
except OpenWAFError as e:
    if e.code != "version_conflict":
        raise
    print("La zona ha cambiado mientras tanto: vuelve a ejecutarlo y revisa el plan nuevo.")
```


La simulación imprime un cambio, `add records[id=…]`, y la versión que crearía el registro. La llamada confirmada devuelve el registro nuevo con su `id`.

## Varios registros en un solo cambio

Para crear, cambiar y borrar varios registros como **una** sola versión, usa `batchRecords` / `batch_records` (hasta 500 operaciones, todo o nada), con un cuerpo de listas `create`, `update` y `delete`. Recibe las mismas opciones `reason`, `dryRun` e `ifMatch`.

## Campos del registro

`type` y `content` son obligatorios; `name`, `ttl`, `priority` (solo MX y SRV), `proxied` (solo A, AAAA y CNAME), `comment` y `tags` son opcionales. La [referencia de records de la CLI](https://developers.openwaf.dev/es/cli/reference/records/#records-add) describe cada campo; la [referencia de la API](https://developers.openwaf.dev/es/api/) tiene el esquema completo.
