Configurar o DNS de um domínio
Se o OpenEmail escreve ele próprio os registos de um domínio, através de que zona ligada, e em que ponto está cada tipo de registo.
Executa qualquer uma das 3 chamadas no seu espaço de trabalho.
GET /domains/{id}/dns
Se o OpenEmail escreve ele próprio os registos de um domínio, através de que zona ligada, e em que ponto está cada tipo de registo.
Ler a configuração
Requer domains:read. managing é true enquanto o OpenEmail escreve ele próprio os registos. zone diz que zona ligada responde pelo domínio: uma só dá resolved, várias dão ambiguous e precisam de uma escolha, nenhuma o detém (none), ou não foi possível consultar as ligações (unusable). Acrescente ?refresh=true para voltar a consultar os fornecedores.
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 os registos que o OpenEmail escreveu e não conseguiu retirar, para apagar à mão no fornecedor.
Escolher a zona
Requer domains:write. PUT /domains/{id}/dns com { connectionId, zoneId } associa o domínio a uma zona quando várias poderiam responder por ele. A zona tem de abranger o domínio, estar ativa e aceitar um registo de teste. Ainda não se escreve 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": [] }}Uma zona que não abrange o domínio é um 422 invalid_parameter em zoneId. Um domínio configurado através de outra zona dá 409 dns_zone_conflict, e uma zona que não está ativa ou recusa o registo de teste dá 409 dns_zone_unusable.
Um token de acesso OAuth precisa de um código de verificação para esta chamada. Até a aplicação ter verificado um nos últimos 60 minutos, a chamada responde 403 step_up_required e não altera nada. A uma chave de API nunca é pedido. A página Autenticação mostra como pedir um código e verificá-lo.
Escrever os registos
Requer domains:write. POST /domains/{id}/dns/sync escreve ou repara cada registo de que o domínio precisa, como faz Sincronizar na aplicação, e associa primeiro a zona quando só uma responde. Envie { "purpose": "dmarc" } para escrever só um tipo de registo.
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, "…": "…" }}Quando nenhuma zona responde sozinha, nada é escrito: outcome é refused, message diz porquê, e zone lista as zonas entre as quais escolher.
Uma sincronização que já está a decorrer no domínio dá 409 dns_busy, e um fornecedor que recusa o pedido dá 502 dns_provider_error. Um domínio à espera dos seus registos é verificado assim que estes estiverem no lugar.
Um token de acesso OAuth precisa de um código de verificação para esta chamada. Até a aplicação ter verificado um nos últimos 60 minutos, a chamada responde 403 step_up_required e não altera nada. A uma chave de API nunca é pedido. A página Autenticação mostra como pedir um código e verificá-lo.