문서로 건너뛰기
API

도메인 DNS 설정

OpenEmail이 도메인의 레코드를 직접 작성하는지, 연결된 어느 존을 통해 작성하는지, 그리고 각 종류의 레코드가 어떤 상태인지.

GET/domains/{id}/dns

3개 호출을 워크스페이스에 실제로 실행합니다.

GET /domains/{id}/dns

OpenEmail이 도메인의 레코드를 직접 작성하는지, 연결된 어느 존을 통해 작성하는지, 그리고 각 종류의 레코드가 어떤 상태인지.

설정 조회

domains:read가 필요합니다. OpenEmail이 레코드를 직접 작성하는 동안 managing은 true입니다. zone은 연결된 어느 존이 도메인을 맡는지 알려 줍니다. 하나면 resolved, 여럿이라 선택이 필요하면 ambiguous, 어느 존도 맡지 않으면 none, 연결에 물어볼 수 없었으면 unusable입니다. 제공업체에 다시 물어보려면 ?refresh=true를 붙이세요.

curl
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
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": []  }}

도메인을 포함하지 않는 존은 zoneId에 대한 422 invalid_parameter입니다. 다른 존을 통해 설정된 도메인은 409 dns_zone_conflict이고, 활성 상태가 아니거나 테스트 레코드를 거부하는 존은 409 dns_zone_unusable입니다.

OAuth 액세스 토큰으로 이 호출을 하려면 인증 코드가 필요합니다. 앱이 최근 60분 안에 코드를 인증하기 전까지 호출은 403 step_up_required로 응답하고 아무것도 바꾸지 않습니다. API 키는 요구받지 않습니다. 코드를 요청하고 인증하는 방법은 인증 페이지에 있습니다.

레코드 작성

domains:write가 필요합니다. POST /domains/{id}/dns/sync는 앱의 Sync처럼 도메인에 필요한 모든 레코드를 작성하거나 복구하며, 맡을 수 있는 존이 하나뿐이면 먼저 그 존을 지정합니다. 한 종류의 레코드만 작성하려면 { "purpose": "dmarc" }를 보내세요.

curl
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 키는 요구받지 않습니다. 코드를 요청하고 인증하는 방법은 인증 페이지에 있습니다.

레퍼런스