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.
| Header | Descripciรณn |
|---|---|
| X-WA-Client | Tu Client ID (pรบblico) |
| X-WA-Timestamp | Timestamp Unix actual (segundos). La peticiรณn expira en ยฑ300 s. |
| X-WA-Digest | HMAC-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รกmetro | Tipo | Descripciรณn |
|---|---|---|
| key | INT o STRING | Clave 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
| Campo | Tipo | Req. | Descripciรณn |
|---|---|---|---|
| name | string | โ | 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รกmetro | Tipo | Descripciรณn |
|---|---|---|
| key | INT | Clave 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รกmetro | Tipo | Descripciรณn |
|---|---|---|
| key | INT | Clave de la zona donde se crea el registro |
Body JSON
| Campo | Tipo | Req. | Descripciรณn |
|---|---|---|---|
| name | string | โ | Nombre del registro. Usa @ para el apex (raรญz del dominio). |
| rrtype | string | โ | Tipo IANA: A, AAAA, MX, CNAME, TXT, NS, SRV, CAA, etc. Tambiรฉn acepta cรณdigo decimal. |
| ttl | int | โ | Time-to-live en segundos. 0 usa el TTL por defecto de la zona (1800 s). |
| data | string | โ | RDATA en sintaxis de zona. Ver tipos de registros. |
| priority | int | โ | Prioridad. Requerido para MX, SRV, SVCB, HTTPS. |
| weight | int | โ | Peso (SRV). |
| port | int | โ | Puerto (SRV). |
| tag | string | โ | 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)
| Campo | Tipo | Descripciรณn |
|---|---|---|
| name | string | Nuevo nombre del registro |
| ttl | int | Nuevo TTL en segundos |
| data | string | Nuevo valor RDATA |
| priority | int | Nueva prioridad (MX, SRVโฆ) |
| weight | int | Nuevo peso (SRV) |
| port | int | Nuevo puerto (SRV) |
| tag | string | Nueva etiqueta (CAA) |
| status | int | 1 = 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.
| Tipo | Uso tรญpico | Ejemplo de data |
|---|---|---|
| A | IPv4 del servidor | 1.2.3.4 |
| AAAA | IPv6 del servidor | 2001:db8::1 |
| CNAME | Alias a otro nombre | midominio.com. |
| MX | Servidor de correo | mail.midominio.com. + priority |
| TXT | Texto libre (SPF, DKIM, verificaciรณn) | v=spf1 include:... ~all |
| NS | Nameserver delegado | ns1.webability.info. |
| PTR | Reverso (IP โ nombre) | midominio.com. |
| SRV | Servicio genรฉrico (SIP, XMPPโฆ) | servidor.midominio.com. + priority/weight/port |
| CAA | Autoridad de emisiรณn de certificados | letsencrypt.org + tag |
| DNAME | Redirecciรณn de subรกrbol | target.example.com. |
| SOA | Registro de autoridad (generado automรกticamente) | โ |
| DS | Delegaciรณn segura (DNSSEC) | Keytag Alg DigestType Digest |
| TLSA | Certificado TLS asociado | Usage Selector MatchType CertHex |
| SSHFP | Huella SSH | Algorithm FPType Fingerprint |
| HTTPS / SVCB | Parรกmetros de servicio HTTPS | Priority Target Params |
| NAPTR | Reescritura de nombres (VoIP, ENUM) | Order Pref Flags Service Regexp Target |
| LOC | Geolocalizaciรณn | 19 24 N 99 9 W 2240m 1m |
| HINFO | Hardware/SO del host | Intel Linux |
| RP | Responsable del dominio | admin.dominio.com. info.dominio.com. |
| SPF | SPF legacy (recomendado usar TXT) | v=spf1 ... |
| URI | Mapeo de servicio a URI | Priority Weight URI |
| ANY | Consulta 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:
- Incremento de serial โ el campo serial de la zona sube en 1 (formato YYYYMMDDxx).
- Invalidaciรณn de cachรฉ โ se limpian las cachรฉs de zona, registro y respuesta en los servidores de la plataforma.
- 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.
- 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รณdigo | HTTP | Descripciรณn |
|---|---|---|
| 4001 | 401 | Faltan headers de autenticaciรณn (X-WA-Client / X-WA-Timestamp / X-WA-Digest) |
| 4002 | 401 | Firma HMAC invรกlida o timestamp expirado (ยฑ300 s) |
| 4003 | 401 | Token no encontrado |
| 4010 | 400 | Campo name faltante o body JSON invรกlido |
| 4011 | 409 | El dominio ya estรก registrado en tu cuenta |
| 4012 | 404 | Zona no encontrada (o no pertenece a tu cuenta) |
| 4013 | 400 | Clave de zona invรกlida |
| 4020 | 400 | Tipo de registro invรกlido o body JSON mal formado |
| 4021 | 400 | Valor data invรกlido para el tipo de registro (IP invรกlida, hostname invรกlidoโฆ) |
| 4022 | 404 | Registro no encontrado (o no pertenece a tu cuenta) |
| 4023 | 400 | Clave de registro invรกlida |
| 4030 | 400 | Error interno al crear la zona |
| 4031 | 400 | Error interno al crear el registro |
| 4032 | 400 | Error interno al actualizar el registro |
| 4033 | 400 | Error interno al eliminar el registro |
| 4034 | 400 | Error interno al eliminar la zona |
ยฉ 2025 WebAbility S.A.S. ยท Documentaciรณn ยท Soporte