Настройка DNS домена
Пишет ли OpenEmail записи домена сам, через какую подключённую зону и в каком состоянии записи каждого вида.
Выполняет любой из 3 запросов в вашем рабочем пространстве.
GET /domains/{id}/dns
Пишет ли OpenEmail записи домена сам, через какую подключённую зону и в каком состоянии записи каждого вида.
Прочитать настройку
Требуется domains:read. managing равен true, пока OpenEmail сам пишет записи. zone говорит, какая подключённая зона отвечает за домен: resolved, если одна, ambiguous, если их несколько и нужен выбор, none, если ни одна, или unusable, если подключения не удалось опросить. Добавьте ?refresh=true, чтобы снова опросить провайдеров.
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 перечисляет записи, которые OpenEmail создал и не смог снять, чтобы вы удалили их вручную у провайдера.
Выбрать зону
Требуется domains:write. PUT /domains/{id}/dns с { connectionId, zoneId } привязывает домен к зоне, когда за него могут отвечать несколько. Зона должна охватывать домен, быть активной и принять тестовую запись. Пока ничего не записывается.
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": [] }}Зона, которая не охватывает домен, даёт 422 invalid_parameter на zoneId. Домен, настроенный через другую зону, даёт 409 dns_zone_conflict, а зона, которая не активна или отклоняет тестовую запись, даёт 409 dns_zone_unusable.
Токену доступа OAuth для этого вызова нужен код подтверждения. Пока приложение не подтвердило код за последние 60 минут, вызов отвечает 403 step_up_required и ничего не меняет. У API-ключа его никогда не спрашивают. Страница «Аутентификация» показывает, как запросить код и подтвердить его.
Создать записи
Требуется domains:write. POST /domains/{id}/dns/sync создаёт или исправляет все записи, которые нужны домену, как это делает «Синхронизировать» в приложении, и сначала привязывает зону, если отвечает только одна. Передайте { "purpose": "dmarc" }, чтобы создать только один вид записей.
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, "…": "…" }}Если не отвечает ровно одна зона, ничего не записывается: outcome равен refused, message объясняет почему, а zone перечисляет зоны, из которых нужно выбрать.
Синхронизация, которая уже идёт на домене, даёт 409 dns_busy, а провайдер, отклонивший запрос, даёт 502 dns_provider_error. Домен, который ждёт своих записей, подтверждается, как только они на месте.
Токену доступа OAuth для этого вызова нужен код подтверждения. Пока приложение не подтвердило код за последние 60 минут, вызов отвечает 403 step_up_required и ничего не меняет. У API-ключа его никогда не спрашивают. Страница «Аутентификация» показывает, как запросить код и подтвердить его.