Docs / Mรณdulo / DNS

Mรณdulo de DNS

Servicio de DNS autoritativo. Gestiona zonas y registros DNS directamente desde tu cรณdigo. Los cambios se propagan en segundos a los servidores de la plataforma sin necesidad de editar archivos de zona. Soporta mรกs de 35 tipos de registros.

Introducciรณn

La API de DNS de Webability te permite gestionar de manera programรกtica los registros DNS de tus dominios: crear zonas, agregar registros A, MX, TXT y mรกs, y eliminar lo que ya no necesitas. Cada operaciรณn actualiza automรกticamente el serial de la zona y notifica a los servidores para que la propagaciรณn sea inmediata.

ยฟPara quรฉ sirve?

  • โ€ข Automatizar la configuraciรณn de dominios
  • โ€ข Integrar DNS en flujos de CI/CD o de aprovisionamiento
  • โ€ข Crear registros TXT para validaciones (Let's Encrypt, GSuite, etc.)
  • โ€ข Gestionar mรบltiples dominios desde un mismo token

Caracterรญsticas

  • โ€ข 35+ tipos de registros soportados
  • โ€ข Propagaciรณn en < 5 segundos
  • โ€ข Autenticaciรณn HMAC-SHA256
  • โ€ข Notificaciones por correo en cada cambio

Para gestionar tu DNS desde la consola web, visita Consola โ†’ DNS. Esta documentaciรณn cubre รบnicamente la API programรกtica.

Quickstart

En tres llamadas tienes un dominio apuntando a tu servidor. Necesitas tu token de API disponible en Configuraciรณn de la consola.

??connected:yes:

Tus credenciales (copia directo)

Client ID: [IDCliente]

Token (secreto): [TokenCliente]

??:

Paso 1 โ€” Crear la zona (el dominio)

CLIENTID="[IDCliente]"
TOKEN="[TokenCliente]"
TS=$(date +%s)
PATH="/v1/dns/zone"
MSG="POST|${PATH}|${TS}|${CLIENTID}"
DIG=$(echo -n "$MSG" | openssl dgst -sha256 -hmac "$TOKEN" | awk '{print $2}')

curl -s -X POST https://api.webability.info${PATH} \
  -H "X-WA-Client: $CLIENTID" \
  -H "X-WA-Timestamp: $TS" \
  -H "X-WA-Digest: $DIG" \
  -H "Content-Type: application/json" \
  -d '{"name":"midominio.com"}'
{ "status": "ok", "key": 42, "name": "midominio.com" }

Paso 2 โ€” Agregar un registro A

PATH="/v1/dns/zone/42/record"
MSG="POST|${PATH}|$(date +%s)|${CLIENTID}"
DIG=$(echo -n "$MSG" | openssl dgst -sha256 -hmac "$TOKEN" | awk '{print $2}')

curl -s -X POST https://api.webability.info${PATH} \
  -H "X-WA-Client: $CLIENTID" \
  -H "X-WA-Timestamp: $(date +%s)" \
  -H "X-WA-Digest: $DIG" \
  -H "Content-Type: application/json" \
  -d '{"name":"@","rrtype":"A","ttl":1800,"data":"1.2.3.4"}'
{ "status": "ok", "key": 101, "zone": 42 }

Paso 3 โ€” Configurar los nameservers en tu registrar

Obtรฉn los servidores NS asignados a tu cuenta consultando la zona creada y configรบralos en el panel de tu registrador de dominio (GoDaddy, Namecheap, Cloudflare, etc.).

PATH="/v1/dns/zone/42"
MSG="GET|${PATH}|$(date +%s)|${CLIENTID}"
DIG=$(echo -n "$MSG" | openssl dgst -sha256 -hmac "$TOKEN" | awk '{print $2}')

curl -s https://api.webability.info${PATH} \
  -H "X-WA-Client: $CLIENTID" \
  -H "X-WA-Timestamp: $(date +%s)" \
  -H "X-WA-Digest: $DIG"
{ "status":"ok", "zone":{...}, "records":[...],
  "ns":["ns1.webability.info","ns2.webability.info"] }

Apunta el campo ns en los servidores de nombres de tu registrador.

Autenticaciรณn

Todas las peticiones requieren tres headers HTTP. El digest es un HMAC-SHA256 del mensaje canรณnico firmado con tu token secreto. Tu Client ID es pรบblico y viaja en cada request; tu Token es secreto y nunca se transmite โ€” solo se usa localmente para calcular el digest.

HeaderDescripciรณn
X-WA-ClientTu Client ID (pรบblico)
X-WA-TimestampTimestamp Unix actual (segundos). La peticiรณn expira en ยฑ300 s.
X-WA-DigestHMAC-SHA256 del mensaje canรณnico (firmado con tu Token secreto), en hexadecimal.

Mensaje canรณnico

{METHOD}|{PATH}|{TIMESTAMP}|{CLIENTID}

Ejemplo para POST /v1/dns/zone: POST|/v1/dns/zone|1720000000|miclientid

Ejemplo de firma en Bash

CLIENTID="[IDCliente]"
TOKEN="[TokenCliente]"
TS=$(date +%s)
METHOD="POST"
PATH="/v1/dns/zone"
MSG="${METHOD}|${PATH}|${TS}|${CLIENTID}"
DIG=$(echo -n "$MSG" | openssl dgst -sha256 -hmac "$TOKEN" | awk '{print $2}')

Ejemplo de firma en Go

import (
  "crypto/hmac"
  "crypto/sha256"
  "fmt"
  "time"
)

func sign(clientid, secret, method, path string) (ts, digest string) {
  ts = fmt.Sprintf("%d", time.Now().Unix())
  msg := method + "|" + path + "|" + ts + "|" + clientid
  mac := hmac.New(sha256.New, []byte(secret))
  mac.Write([]byte(msg))
  digest = fmt.Sprintf("%x", mac.Sum(nil))
  return
}

Si la diferencia entre X-WA-Timestamp y el reloj del servidor supera los 300 segundos, la peticiรณn serรก rechazada con error 4002.

1. Zonas DNS

Una zona DNS equivale a un dominio (p. ej. miempresa.com). Agrupa todos sus registros: A, MX, TXT, CNAME, etc. Cada zona tiene un registro SOA que define los parรกmetros de propagaciรณn.

Listar zonas

GET /v1/dns/zone

Devuelve todas las zonas (dominios) registradas en tu cuenta.

Respuesta

{
  "status": "ok",
  "count": 2,
  "zones": [
    {
      "key": 42,
      "name": "midominio.com",
      "status": 1,
      "primaryns": "ns1.webability.info",
      "adminemail": "dns.webability.info.",
      "serial": 2025070101,
      "refresh": 7200,
      "retry": 3600,
      "expire": 1209600,
      "minimum": 300,
      "defaultttl": 1800,
      "dnssec": 0,
      "creationdate": "2025-07-01T10:00:00Z"
    }
  ]
}

Ver zona y registros

GET /v1/dns/zone/{key}  tambiรฉn acepta nombre de dominio

Devuelve el detalle SOA de la zona y su lista completa de registros. Acepta la clave numรฉrica o el nombre del dominio directamente.

Parรกmetros de ruta

ParรกmetroTipoDescripciรณn
keyINT o STRINGClave numรฉrica de la zona, o su nombre (p. ej. midominio.com)

Respuesta

{
  "status": "ok",
  "zone": { "key":42, "name":"midominio.com", "status":1, ... },
  "records": [
    { "key":101, "zone":42, "name":"@", "rrtype":1, "rrtypename":"A",
      "ttl":1800, "data":"1.2.3.4", "status":1, "priority":0 },
    { "key":102, "zone":42, "name":"www", "rrtype":5, "rrtypename":"CNAME",
      "ttl":1800, "data":"midominio.com.", "status":1, "priority":0 }
  ],
  "ns": ["ns1.webability.info", "ns2.webability.info"]
}

Crear zona

POST /v1/dns/zone

Registra un nuevo dominio en tu cuenta. Se generan automรกticamente los registros NS apuntando a los servidores de Webability asignados a tu cuenta. Devuelve HTTP 201 en caso de รฉxito.

Body JSON

CampoTipoReq.Descripciรณn
namestringโœ“Nombre del dominio (minรบsculas, sin punto final). Ej: midominio.com

Ejemplo

POST /v1/dns/zone
Content-Type: application/json

{ "name": "midominio.com" }

Respuesta (201 Created)

{ "status": "ok", "key": 42, "name": "midominio.com" }

โšก Tras crear la zona, configura los nameservers de tu registrador con los hostnames del campo ns que obtengas al consultar la zona. La propagaciรณn DNS tarda entre 24 y 48 horas dependiendo del TTL del registrador.

Eliminar zona

DELETE /v1/dns/zone/{key}

Elimina la zona y todos sus registros. Esta operaciรณn es irreversible. Se envรญa un correo de notificaciรณn al titular de la cuenta con los datos completos de la zona eliminada.

Parรกmetros de ruta

ParรกmetroTipoDescripciรณn
keyINTClave numรฉrica de la zona

Respuesta (200 OK)

{ "status": "ok", "key": 42, "name": "midominio.com" }

2. Registros DNS

Un registro DNS asocia un nombre dentro de la zona con un valor: una IP, un hostname, texto, etc. Cada operaciรณn de escritura incrementa el serial de la zona y propaga el cambio a los servidores.

Agregar registro

POST /v1/dns/zone/{key}/record

Crea un registro DNS dentro de la zona indicada. Devuelve HTTP 201 en caso de รฉxito.

Parรกmetros de ruta

ParรกmetroTipoDescripciรณn
keyINTClave de la zona donde se crea el registro

Body JSON

CampoTipoReq.Descripciรณn
namestringโœ“Nombre del registro. Usa @ para el apex (raรญz del dominio).
rrtypestringโœ“Tipo IANA: A, AAAA, MX, CNAME, TXT, NS, SRV, CAA, etc. Tambiรฉn acepta cรณdigo decimal.
ttlintโ€“Time-to-live en segundos. 0 usa el TTL por defecto de la zona (1800 s).
datastringโœ“RDATA en sintaxis de zona. Ver tipos de registros.
priorityintโ€“Prioridad. Requerido para MX, SRV, SVCB, HTTPS.
weightintโ€“Peso (SRV).
portintโ€“Puerto (SRV).
tagstringโ€“Etiqueta (CAA): issue, issuewild, iodef.

Ejemplos

Registro A (IP del servidor):

POST /v1/dns/zone/42/record
{ "name":"@", "rrtype":"A", "ttl":1800, "data":"1.2.3.4" }

Correo (MX):

{ "name":"@", "rrtype":"MX", "ttl":3600, "data":"mail.midominio.com.", "priority":10 }

Verificaciรณn de dominio (TXT):

{ "name":"@", "rrtype":"TXT", "ttl":300, "data":"v=spf1 include:_spf.midominio.com ~all" }

Subdominio (CNAME):

{ "name":"www", "rrtype":"CNAME", "ttl":1800, "data":"midominio.com." }

Respuesta (201 Created)

{ "status": "ok", "key": 101, "zone": 42 }

Modificar registro

PUT /v1/dns/record/{key}

Actualiza uno o mรกs campos de un registro. Solo se modifican los campos que se envรญan; los campos omitidos conservan su valor actual.

Body JSON (todos opcionales)

CampoTipoDescripciรณn
namestringNuevo nombre del registro
ttlintNuevo TTL en segundos
datastringNuevo valor RDATA
priorityintNueva prioridad (MX, SRVโ€ฆ)
weightintNuevo peso (SRV)
portintNuevo puerto (SRV)
tagstringNueva etiqueta (CAA)
statusint1 = activo, 0 = inactivo

Ejemplo โ€” cambiar la IP de un registro A

PUT /v1/dns/record/101
{ "data": "5.6.7.8" }

Respuesta (200 OK)

{ "status": "ok", "key": 101 }

Eliminar registro

DELETE /v1/dns/record/{key}

Elimina un registro de la zona. La clave de registro se obtiene de la respuesta de GET /v1/dns/zone/{key}.

Respuesta (200 OK)

{ "status": "ok", "key": 101 }

Tipos de registros soportados

El campo rrtype acepta el nombre IANA (case-insensitive) o su cรณdigo decimal.

TipoUso tรญpicoEjemplo de data
AIPv4 del servidor1.2.3.4
AAAAIPv6 del servidor2001:db8::1
CNAMEAlias a otro nombremidominio.com.
MXServidor de correomail.midominio.com. + priority
TXTTexto libre (SPF, DKIM, verificaciรณn)v=spf1 include:... ~all
NSNameserver delegadons1.webability.info.
PTRReverso (IP โ†’ nombre)midominio.com.
SRVServicio genรฉrico (SIP, XMPPโ€ฆ)servidor.midominio.com. + priority/weight/port
CAAAutoridad de emisiรณn de certificadosletsencrypt.org + tag
DNAMERedirecciรณn de subรกrboltarget.example.com.
SOARegistro de autoridad (generado automรกticamente)โ€”
DSDelegaciรณn segura (DNSSEC)Keytag Alg DigestType Digest
TLSACertificado TLS asociadoUsage Selector MatchType CertHex
SSHFPHuella SSHAlgorithm FPType Fingerprint
HTTPS / SVCBParรกmetros de servicio HTTPSPriority Target Params
NAPTRReescritura de nombres (VoIP, ENUM)Order Pref Flags Service Regexp Target
LOCGeolocalizaciรณn19 24 N 99 9 W 2240m 1m
HINFOHardware/SO del hostIntel Linux
RPResponsable del dominioadmin.dominio.com. info.dominio.com.
SPFSPF legacy (recomendado usar TXT)v=spf1 ...
URIMapeo de servicio a URIPriority Weight URI
ANYConsulta de todos los tiposโ€”

Tambiรฉn soportados: KX, CERT, RRSIG, NSEC, DNSKEY, NSEC3, NSEC3PARAM, SMIMEA, CDS, CDNSKEY, OPENPGPKEY, CSYNC.

Propagaciรณn de cambios

Cada operaciรณn de escritura (crear, modificar o eliminar una zona o registro) dispara automรกticamente:

  1. Incremento de serial โ€” el campo serial de la zona sube en 1 (formato YYYYMMDDxx).
  2. Invalidaciรณn de cachรฉ โ€” se limpian las cachรฉs de zona, registro y respuesta en los servidores de la plataforma.
  3. Flush en servidores โ€” se notifica a cada servidor autoritativo asignado a tu cuenta (timeout 5 s, fire-and-forget). El cambio estรก activo en segundos.
  4. Notificaciรณn por correo โ€” se envรญa un resumen del cambio al titular de la cuenta, incluyendo los datos anteriores en caso de modificaciรณn o eliminaciรณn.

Propagaciรณn interna

La plataforma aplica el cambio en < 5 segundos.

Propagaciรณn global

El TTL de los registros determina cuรกnto tardan los resolutores externos en actualizar su cachรฉ. Con TTL de 300 s el cambio llega globalmente en 5 minutos.

Consejo: baja el TTL de los registros a 300 s antes de hacer cambios importantes (migraciรณn de servidor, cambio de IP) y aumรฉntalo de vuelta a 1800 s una vez confirmado el cambio.

Cรณdigos de error

Todas las respuestas de error siguen el formato: {"status":"error","code":N,"message":"..."}

CรณdigoHTTPDescripciรณn
4001401Faltan headers de autenticaciรณn (X-WA-Client / X-WA-Timestamp / X-WA-Digest)
4002401Firma HMAC invรกlida o timestamp expirado (ยฑ300 s)
4003401Token no encontrado
4010400Campo name faltante o body JSON invรกlido
4011409El dominio ya estรก registrado en tu cuenta
4012404Zona no encontrada (o no pertenece a tu cuenta)
4013400Clave de zona invรกlida
4020400Tipo de registro invรกlido o body JSON mal formado
4021400Valor data invรกlido para el tipo de registro (IP invรกlida, hostname invรกlidoโ€ฆ)
4022404Registro no encontrado (o no pertenece a tu cuenta)
4023400Clave de registro invรกlida
4030400Error interno al crear la zona
4031400Error interno al crear el registro
4032400Error interno al actualizar el registro
4033400Error interno al eliminar el registro
4034400Error interno al eliminar la zona

ยฉ 2025 WebAbility S.A.S. ยท Documentaciรณn ยท Soporte