Configurar el DNS de un dominio
Si OpenEmail escribe por sí mismo los registros de un dominio, a través de qué zona conectada y en qué estado está cada tipo de registro.
Ejecuta cualquiera de las 3 llamadas en tu espacio de trabajo.
GET /domains/{id}/dns
Si OpenEmail escribe por sí mismo los registros de un dominio, a través de qué zona conectada y en qué estado está cada tipo de registro.
Leer la configuración
Requiere domains:read. managing es true mientras OpenEmail escribe por sí mismo los registros. zone indica qué zona conectada responde por el dominio: una sola da resolved, varias dan ambiguous y necesitan una elección, ninguna lo tiene (none), o no se pudo consultar a las conexiones (unusable). Añade ?refresh=true para volver a consultar a los proveedores.
curl "$OE/domains/b3e1f0a4-6c2d-4e8a-9f17-2d5c8a0b4e6f/dns" -H "$AUTH"{ "object": "domain_dns", "domainId": "b3e1f0a4-6c2d-4e8a-9f17-2d5c8a0b4e6f", "domain": "acme.com", "managing": true, "connectionId": "dnsl_3f9a1c2e7b4d4e6f8a0b2c3d", "connection": { "id": "dnsl_3f9a1c2e7b4d4e6f8a0b2c3d", "status": "active", "subject": "[email protected]", "accounts": [{ "id": "4f1c2b3a5d6e7f8091a2b3c4d5e6f708", "name": "Acme" }] }, "zoneId": "023e105f4ecef8ad9ca31a8372d0c353", "zoneName": "acme.com", "zoneHolder": "Acme", "state": "ready", "steps": [ { "purpose": "mx", "ok": true, "detail": "MX records are in place.", "visibility": "public", "records": [] } ], "leftovers": [], "probe": null, "error": null, "syncedAt": "2026-09-30T08:01:12.000Z", "zone": { "kind": "resolved", "checkedAt": "2026-10-01T09:00:00.000Z", "cached": true, "candidate": { "connectionId": "dnsl_3f9a1c2e7b4d4e6f8a0b2c3d", "subject": "[email protected]", "status": "active", "accounts": [{ "id": "4f1c2b3a5d6e7f8091a2b3c4d5e6f708", "name": "Acme" }], "account": { "id": "4f1c2b3a5d6e7f8091a2b3c4d5e6f708", "name": "Acme" }, "zone": { "id": "023e105f4ecef8ad9ca31a8372d0c353", "name": "acme.com", "accountId": "4f1c2b3a5d6e7f8091a2b3c4d5e6f708", "active": true, "status": "active", "type": "full", "nameServers": ["ana.ns.cloudflare.com", "bob.ns.cloudflare.com"], "covers": true } }, "candidates": [], "reason": null, "connected": null, "host": null, "blocked": [] }}leftovers lista los registros que OpenEmail escribió y no pudo retirar, para borrarlos a mano en el proveedor.
Elegir la zona
Requiere domains:write. PUT /domains/{id}/dns con { connectionId, zoneId } vincula el dominio a una zona cuando varias podrían responder por él. La zona tiene que cubrir el dominio, estar activa y aceptar un registro de prueba. Todavía no se escribe nada.
curl -X PUT "$OE/domains/b3e1f0a4-6c2d-4e8a-9f17-2d5c8a0b4e6f/dns" -H "$AUTH" \ -H "Content-Type: application/json" \ -d '{ "connectionId": "dnsl_3f9a1c2e7b4d4e6f8a0b2c3d", "zoneId": "023e105f4ecef8ad9ca31a8372d0c353" }'{ "object": "domain_dns", "domainId": "b3e1f0a4-6c2d-4e8a-9f17-2d5c8a0b4e6f", "domain": "acme.com", "managing": true, "connectionId": "dnsl_3f9a1c2e7b4d4e6f8a0b2c3d", "connection": { "id": "dnsl_3f9a1c2e7b4d4e6f8a0b2c3d", "status": "active", "subject": "[email protected]", "accounts": [{ "id": "4f1c2b3a5d6e7f8091a2b3c4d5e6f708", "name": "Acme" }] }, "zoneId": "023e105f4ecef8ad9ca31a8372d0c353", "zoneName": "acme.com", "zoneHolder": "Acme", "state": "awaiting-sync", "steps": [ { "purpose": "mx", "ok": true, "detail": "MX records are in place.", "visibility": "public", "records": [] } ], "leftovers": [], "probe": null, "error": null, "syncedAt": "2026-09-30T08:01:12.000Z", "zone": { "kind": "resolved", "checkedAt": "2026-10-01T09:00:00.000Z", "cached": true, "candidate": { "connectionId": "dnsl_3f9a1c2e7b4d4e6f8a0b2c3d", "subject": "[email protected]", "status": "active", "accounts": [{ "id": "4f1c2b3a5d6e7f8091a2b3c4d5e6f708", "name": "Acme" }], "account": { "id": "4f1c2b3a5d6e7f8091a2b3c4d5e6f708", "name": "Acme" }, "zone": { "id": "023e105f4ecef8ad9ca31a8372d0c353", "name": "acme.com", "accountId": "4f1c2b3a5d6e7f8091a2b3c4d5e6f708", "active": true, "status": "active", "type": "full", "nameServers": ["ana.ns.cloudflare.com", "bob.ns.cloudflare.com"], "covers": true } }, "candidates": [], "reason": null, "connected": null, "host": null, "blocked": [] }}Una zona que no cubre el dominio es un 422 invalid_parameter en zoneId. Un dominio configurado a través de otra zona da 409 dns_zone_conflict, y una zona que no está activa o rechaza el registro de prueba da 409 dns_zone_unusable.
Un token de acceso OAuth necesita un código de verificación para esta llamada. Hasta que la app haya verificado uno en los últimos 60 minutos, la llamada responde 403 step_up_required y no cambia nada. A una clave de API nunca se le pide. La página Autenticación muestra cómo pedir un código y verificarlo.
Escribir los registros
Requiere domains:write. POST /domains/{id}/dns/sync escribe o repara cada registro que necesita el dominio, como hace Sincronizar en la app, y vincula primero la zona cuando solo responde una. Envía { "purpose": "dmarc" } para escribir solo un tipo de registro.
curl -X POST "$OE/domains/b3e1f0a4-6c2d-4e8a-9f17-2d5c8a0b4e6f/dns/sync" -H "$AUTH"{ "object": "domain_dns_sync", "outcome": "synced", "message": null, "attached": false, "provision": { "outcome": "applied", "state": "ready", "connectionId": "dnsl_3f9a1c2e7b4d4e6f8a0b2c3d", "zoneId": "023e105f4ecef8ad9ca31a8372d0c353", "proven": true, "ownership": "The ownership record is in place.", "written": [{ "purpose": "dmarc", "name": "_dmarc.acme.com", "type": "TXT", "mode": "created" }], "adopted": 6, "conflicts": [], "failures": [], "steps": [], "retired": [], "leftovers": [], "probe": null, "error": null }, "dns": { "object": "domain_dns", "domain": "acme.com", "managing": true, "state": "ready", "…": "…" }, "zone": { "kind": "resolved", "cached": false, "…": "…" }}Cuando no responde una sola zona, no se escribe nada: outcome es refused, message dice por qué y zone lista las zonas entre las que elegir.
Una sincronización que ya está en marcha en el dominio da 409 dns_busy, y un proveedor que rechaza la solicitud da 502 dns_provider_error. Un dominio que espera sus registros se verifica en cuanto están en su sitio.
Un token de acceso OAuth necesita un código de verificación para esta llamada. Hasta que la app haya verificado uno en los últimos 60 minutos, la llamada responde 403 step_up_required y no cambia nada. A una clave de API nunca se le pide. La página Autenticación muestra cómo pedir un código y verificarlo.