# 이메일 발신 도메인 목록 조회 (/docs/api/emaildomains/listEmailDomains)
**GET /v1/accounts/{accountId}/email-domains**
```json
{
  "operationId": "listEmailDomains",
  "summary": "이메일 발신 도메인 목록 조회",
  "description": "이 계정에 등록된 이메일 발신 도메인을 조회합니다. 다른 계정의 도메인은 나타나지 않습니다.\n\n**공급자 상태를 매번 확인하지는 않습니다.** 목록은 한국AI통신에 저장된 마지막 검증 결과를 그대로\n돌려주므로 빠릅니다. 지금 상태를 다시 확인하려면 검증 API 를 호출하세요.",
  "tags": [
    "EmailDomains"
  ],
  "parameters": [
    {
      "name": "accountId",
      "in": "path",
      "required": true,
      "schema": {
        "type": "string"
      },
      "description": "계정 ID",
      "example": "AC1a2b3c4d"
    },
    {
      "name": "page",
      "in": "query",
      "required": false,
      "schema": {
        "type": "integer",
        "default": 0
      },
      "description": "페이지 번호(0-based)",
      "example": 0
    },
    {
      "name": "pageSize",
      "in": "query",
      "required": false,
      "schema": {
        "type": "integer",
        "default": 20,
        "maximum": 100
      },
      "description": "페이지 크기(최대 100)",
      "example": 20
    },
    {
      "name": "page_size",
      "in": "query",
      "required": false,
      "deprecated": true,
      "schema": {
        "type": "integer",
        "maximum": 100
      },
      "description": "`pageSize` 의 별칭(하위호환). 신규 연동은 `pageSize` 를 사용하세요.",
      "example": 50
    },
    {
      "name": "limit",
      "in": "query",
      "required": false,
      "deprecated": true,
      "schema": {
        "type": "integer",
        "maximum": 100
      },
      "description": "`pageSize` 의 별칭(하위호환). 신규 연동은 `pageSize` 를 사용하세요.",
      "example": 100
    }
  ],
  "responses": {
    "200": {
      "description": "조회 성공",
      "content": {
        "application/json": {
          "schema": {
            "type": "object",
            "properties": {
              "data": {
                "type": "array",
                "description": "등록된 도메인 목록. 최근 등록순. 삭제된 도메인은 포함되지 않습니다.",
                "items": {
                  "type": "object",
                  "properties": {
                    "id": {
                      "type": "string",
                      "example": "clx9edm00001",
                      "description": "도메인 리소스 id. 조회·검증·삭제에 이 값을 사용합니다."
                    },
                    "domain": {
                      "type": "string",
                      "example": "mail.example.com",
                      "description": "정규화된 도메인. 대소문자·끝 점·한글 도메인(punycode 변환)이 모두 정규화되어 저장·응답됩니다. 루트 도메인과 하위 도메인은 서로 다른 리소스입니다."
                    },
                    "status": {
                      "type": "string",
                      "enum": [
                        "pending",
                        "verified",
                        "failed"
                      ],
                      "example": "pending",
                      "description": "pending=DNS 설정 또는 확인 대기, verified=DKIM 확인 완료(발신 가능), failed=DNS 레코드를 확인하지 못함(고객 DNS 를 고쳐야 풀립니다).\n\n**일시적인 공급자 장애로는 이 값이 내려가지 않습니다** — 그 경우 검증 요청이 503 을 반환하고 상태는 마지막 성공 결과를 유지합니다. 반대로 CNAME 을 지우면 `verified` 였던 도메인도 `failed` 로 내려갑니다. 다시 심으면 `verified` 로 돌아옵니다."
                    },
                    "dnsRecords": {
                      "type": "array",
                      "description": "심어야 하는 DNS 레코드. **순서는 계약이 아닙니다.**\n\n⛔ **여기 실린 레코드가 전부 필수인 것은 아닙니다.** 각 항목의 `requirement` 를 보고 나누십시오 — `required`(DKIM CNAME 3건)를 모두 심어야 발송이 열리고, `recommended` (반송 주소 `mail_from_*` · `dmarc`)는 없어도 발송은 되며 도달률에만 영향을 줍니다. `optional` 은 그 기능을 쓸 때만 심습니다.\n\n`receivingEnabled` 가 `true` 면 여기에 수신용 MX 1건(`purpose: inbound`)이 함께 실립니다. 꺼져 있으면 실리지 않습니다 — 수신을 쓰지 않는 도메인에 MX 를 심으면 그 도메인의 메일이 전부 한국AI통신으로 온 뒤 버려지기 때문입니다.\n\n⚠️ `dmarc` 는 **이미 심어 두신 것을 우리가 확인했으면 실리지 않습니다**(`dmarcStatus` 참고). 그 값은 고객 도메인 전체의 정책이라 우리가 제안하는 시작점(`p=none`)으로 덮어쓰면 안 됩니다.",
                      "items": {
                        "type": "object",
                        "description": "고객이 자기 DNS 에 심어야 하는 레코드. 공급자 중립 형식이라 한국AI통신이 나중에 다른 이메일 공급자를 쓰더라도 이 모양은 그대로입니다.",
                        "properties": {
                          "purpose": {
                            "type": "string",
                            "enum": [
                              "dkim",
                              "mail_from_mx",
                              "mail_from_spf",
                              "dmarc",
                              "inbound"
                            ],
                            "example": "dkim",
                            "description": "이 레코드가 무엇을 위한 것인지.\n\n| 값 | 뜻 | | --- | --- | | `dkim` | 발신 서명 검증(CNAME 3건) | | `mail_from_mx` | 반송 주소를 내 도메인으로 옮기기 위한 MX 1건 | | `mail_from_spf` | 그 반송 주소의 SPF TXT 1건 | | `dmarc` | 도메인 인증 정책 TXT 1건 — **이미 심어 두셨다면 안내되지 않습니다** | | `inbound` | 이 도메인으로 **메일을 받기 위한** MX 1건 |\n\n⚠️ `inbound` 레코드는 **수신을 켠 도메인에만** 포함됩니다. 수신을 쓰지 않는데 MX 를 심으면 그 도메인으로 오는 모든 메일이 한국AI통신으로 향한 뒤 버려집니다.\n\n⛔ `mail_from_*` 두 건은 **`bounce.<도메인>` 이라는 전용 이름**에 심습니다. 그 이름은 다른 용도로 쓰면 안 되고, **MX 가 정확히 하나**여야 합니다(둘 이상이면 반송 주소 설정이 실패합니다).\n\n⚠️ 값은 늘어날 수 있습니다. **모르는 값을 만나면 `requirement` 를 보고 판단**하십시오."
                          },
                          "requirement": {
                            "type": "string",
                            "enum": [
                              "required",
                              "recommended",
                              "optional"
                            ],
                            "example": "required",
                            "description": "이 레코드를 **안 심으면 무슨 일이 일어나는지**. 목록을 나눌 때는 `purpose` 가 아니라 이 값을 쓰십시오 — `purpose` 는 앞으로 늘어나지만 이 세 값은 늘어나지 않습니다.\n\n- `required` — 심지 않으면 **발송 자체가 열리지 않습니다.**\n- `recommended` — 없어도 발송은 됩니다. **도달률만 떨어집니다**(인증 실패·스팸 판정).\n- `optional` — 그 기능을 쓸 때만 필요합니다. 쓰지 않는다면 **심지 마십시오.**"
                          },
                          "type": {
                            "type": "string",
                            "enum": [
                              "CNAME",
                              "MX",
                              "TXT"
                            ],
                            "example": "CNAME",
                            "description": "DNS 레코드 타입.\n\n⚠️ `TXT` 값에는 **따옴표가 들어 있지 않습니다.** DNS 서비스 대부분이 입력한 값을 알아서 따옴표로 감싸므로, 따옴표를 직접 붙이면 이중이 되어 조용히 무효가 됩니다. 따옴표를 요구하는 서비스라면 그 화면의 안내를 따르십시오."
                          },
                          "name": {
                            "type": "string",
                            "example": "abc123._domainkey.mail.example.com",
                            "description": "레코드 이름(호스트). DNS 공급자에 따라 도메인 부분을 빼고 앞부분만 입력해야 할 수 있습니다."
                          },
                          "value": {
                            "type": "string",
                            "example": "abc123.dkim.amazonses.com",
                            "description": "레코드 값(대상)."
                          },
                          "priority": {
                            "type": "integer",
                            "nullable": true,
                            "example": null,
                            "description": "MX 우선순위. `CNAME` 에서는 항상 `null` 이고, `MX` 에서는 항상 값이 있습니다.\n\n⚠️ **이 값이 그 도메인 MX 중 단독으로 가장 낮아야 합니다.** 더 낮거나 **같은** 값의 다른 MX 가 있으면 메일이 그쪽으로 가거나 둘로 나뉩니다."
                          }
                        }
                      }
                    },
                    "receivingEnabled": {
                      "type": "boolean",
                      "example": false,
                      "description": "이 도메인으로 **메일을 받을지** 여부. `status` 가 `verified` 인 도메인만 켤 수 있습니다.\n\n⚠️ 켜는 것만으로 수신되지 않습니다 — `dnsRecords` 에 나타나는 MX 를 심어야 합니다. 반대로 **끄면 MX 가 남아 있어도 받지 않습니다.** 그 경우 메일은 한국AI통신까지 도착한 뒤 버려지고 **수신 요금은 청구됩니다.** 수신을 그만둘 때는 MX 도 함께 지우세요."
                    },
                    "receivingStatus": {
                      "type": "string",
                      "enum": [
                        "pending",
                        "verified",
                        "not_found",
                        "not_lowest_priority",
                        "unsupported_region",
                        null
                      ],
                      "nullable": true,
                      "example": null,
                      "description": "한국AI통신이 **실제로 조회한** 이 도메인의 MX 판정입니다. 수신을 켜지 않았으면 `null` 입니다.\n\n`pending`=켰지만 아직 확인하지 않음 · `verified`=우리 MX 가 있고 우선순위도 단독 최저 · `not_found`=MX 에 우리 호스트가 없음 · `not_lowest_priority`=더 낮거나 같은 우선순위의 다른 MX 가 있어 메일이 그쪽으로 가거나 나뉨 · `unsupported_region`=이 도메인이 등록된 리전은 수신을 지원하지 않음.\n\n⚠️ **DNS 조회 자체에 실패하면 이 값은 바뀌지 않습니다.** 확인 API 가 `200` 을 주는데 `receivingCheckedAt` 이 그대로라면 조회하지 못한 것입니다 — 잠시 뒤 다시 호출하세요. 우리 쪽 일시 장애가 `verified` 를 뒤집는 일은 없습니다."
                    },
                    "receivingCheckedAt": {
                      "type": "string",
                      "format": "date-time",
                      "nullable": true,
                      "example": null,
                      "description": "MX 를 마지막으로 **실제 조회한** 시각. 조회에 실패하면 갱신되지 않습니다."
                    },
                    "mailFromStatus": {
                      "type": "string",
                      "enum": [
                        "pending",
                        "verified",
                        "failed",
                        null
                      ],
                      "nullable": true,
                      "example": null,
                      "description": "반송 주소(`mail_from_*` 레코드)가 실제로 섰는지. 아직 시도한 적이 없으면 `null` 입니다.\n\n`pending`=레코드를 찾는 중 · `verified`=반송 주소가 내 도메인으로 섭니다 · `failed`=탐지를 포기했습니다(레코드를 심고 검증 API 를 다시 호출하면 재설정됩니다).\n\n⛔ **`status` 와 다른 축입니다.** 이 값이 `pending` 이나 `failed` 여도 **메일은 정상 발송됩니다** — 반송 주소만 한국AI통신 기본값으로 돌아갈 뿐입니다. 발송 가능 여부는 `status` 로 판단하십시오."
                    },
                    "dmarcStatus": {
                      "type": "string",
                      "enum": [
                        "not_found",
                        "spf_strict",
                        "monitor",
                        "enforced",
                        null
                      ],
                      "nullable": true,
                      "example": null,
                      "description": "한국AI통신이 **실제로 조회한** 이 도메인의 DMARC 정책입니다. 아직 조회한 적이 없으면 `null` 입니다(검증 API 를 호출하면 채워집니다).\n\n`not_found`=레코드가 없거나 `p` 태그가 없어 무효 · `spf_strict`=`aspf=s` 가 걸려 있음 · `monitor`=`p=none` · `enforced`=`p=quarantine` 또는 `p=reject`.\n\n⛔ **`spf_strict` 는 조치가 필요합니다.** 반송 주소(`mail_from_*`)를 모두 심어도 `aspf=s` 가 있으면 SPF 정렬이 서지 않아 그 설정이 **아무 효과도 내지 못합니다.** 그런데 메일은 계속 발송되고 DKIM 으로 DMARC 도 통과하므로, 이 값을 보지 않으면 알 방법이 없습니다. `aspf=s` 를 빼시면 됩니다(기본값이 relaxed 이고, 그때 정렬이 섭니다).\n\n⚠️ **DNS 조회 자체에 실패하면 이 값은 바뀌지 않습니다** — `receivingStatus` 와 같은 규칙입니다. 그리고 이 값은 **발송을 막지 않습니다.** DMARC 는 고객 도메인의 정책이지 한국AI통신의 요구사항이 아닙니다."
                    },
                    "lastCheckedAt": {
                      "type": "string",
                      "format": "date-time",
                      "nullable": true,
                      "example": "2026-09-02T00:00:00.000Z",
                      "description": "공급자 상태를 마지막으로 실제 조회한 시각. 조회 자체가 실패하면 갱신되지 않습니다."
                    },
                    "verifiedAt": {
                      "type": "string",
                      "format": "date-time",
                      "nullable": true,
                      "example": null,
                      "description": "**최초로** 검증된 시각. 이후 DKIM 이 깨졌다가 복구되어도 이 값은 바뀌지 않습니다. 지금 발신 가능한지는 `status` 로 판단하세요."
                    },
                    "pendingExpiresAt": {
                      "type": "string",
                      "format": "date-time",
                      "nullable": true,
                      "example": "2026-09-05T00:00:00.000Z",
                      "description": "⚠️ **이 시각까지 검증을 마치지 않으면 다른 계정이 이 도메인을 등록할 수 있습니다.** 한 도메인은 한국AI통신 전체에서 한 계정만 소유하는데, 등록만 해두고 소유를 증명하지 않은 도메인이 그 자리를 무기한 붙들면 실제 소유자가 등록할 방법이 없기 때문입니다.\n\n검증 API 를 호출할 때마다 이 시각은 뒤로 밀립니다 — DNS 전파를 기다리는 동안 계속 호출하고 있다면 회수되지 않습니다. `status` 가 `verified` 나 `failed` 면 회수 대상이 아니므로 `null` 입니다."
                    },
                    "createdAt": {
                      "type": "string",
                      "format": "date-time",
                      "example": "2026-09-02T00:00:00.000Z"
                    },
                    "updatedAt": {
                      "type": "string",
                      "format": "date-time",
                      "example": "2026-09-02T00:00:00.000Z"
                    }
                  }
                }
              },
              "meta": {
                "type": "object",
                "properties": {
                  "page": {
                    "type": "integer",
                    "description": "현재 페이지(0-based)"
                  },
                  "pageSize": {
                    "type": "integer",
                    "description": "페이지 크기"
                  },
                  "total": {
                    "type": "integer",
                    "description": "전체 건수"
                  }
                }
              }
            }
          }
        }
      }
    },
    "400": {
      "description": "입력 검증 실패 (VALIDATION)",
      "content": {
        "application/json": {
          "schema": {
            "type": "object",
            "properties": {
              "error": {
                "type": "string",
                "description": "사람이 읽을 수 있는 에러 메시지"
              },
              "code": {
                "type": "string",
                "description": "기계 판독용 에러 코드. **분기는 이 값으로 하세요** — `error` 문구는 안내를 다듬으면서\n바뀔 수 있지만 코드는 계약입니다.\n\n같은 상태 코드라도 대응이 갈리는 경우가 있습니다. 예를 들어 발신의 `422` 는\n  - `recipient_blocked`: 수신거부 명단에 있는 번호입니다. 재시도하지 말고 명단에서\n    해제해야 발신됩니다.\n  - `quota_exceeded`: 플랜 한도를 넘었습니다. 다음 주기에 다시 발신됩니다.\n\n전화번호 정규화 관련:\n  - `INVALID_PHONE_NUMBER`: 전화번호 포맷 오류 (한국 번호 형식 아님)\n  - `UNSUPPORTED_COUNTRY`: 국제 발신 미지원 (+82 외 국가코드)",
                "example": "recipient_blocked"
              },
              "ip": {
                "type": "string",
                "description": "`overseas_ip_blocked` 일 때만 옵니다. 국외 IP 라고 판정한 요청 IP 입니다.\n해외 리전 클라우드 서버에서 호출한다면 이 값이 그 서버의 공인 IP 이며, 콘솔\n「국외 접속 예외」에서 예외를 신청할 때 이 고정 IP 를 적습니다.",
                "example": "52.79.213.41"
              },
              "processedAt": {
                "type": "string",
                "format": "date-time",
                "description": "문자 발송 요청을 거부한 서버가 오류 응답을 생성한 시각(UTC). 콘솔은 이 값을 한국 시각으로 표시합니다. 인증·요청 형식 검증 등 발송 서비스 진입 전 오류에는 없을 수 있습니다.",
                "example": "2026-10-21T04:10:34.303Z"
              },
              "blockers": {
                "type": "array",
                "description": "`certificate_not_eligible` 일 때만 옵니다. 발급할 수 없는 번호와 그 이유입니다.",
                "items": {
                  "type": "object",
                  "description": "번호 하나가 발급되지 않는(또는 안내가 필요한) 이유.\n\n| code | 뜻 | 발급 |\n|---|---|---|\n| `number_not_owned` | 이 계정이 보유한 번호가 아님(반납·재배정 포함) | 막힘 |\n| `number_not_carrier_issued` | 한국AI통신이 개통한 070·대표번호가 아님(모바일 게이트웨이, 타사 번호) | 막힘 |\n| `business_info_incomplete` | 사업자 계정인데(관리번호 제외) 상호·사업자등록번호·대표자명·사업장 주소 중 빈 칸 | 막힘 |\n| `identity_unverified` | 개인 계정 번호 또는 관리번호인데 그 번호에 본인확인 정보가 없음 | 막힘 |\n| `account_restricted` | 이용 제한 계정 | 막힘 |\n| `business_recheck_pending` | 사업자 계정인데 사업자 정보 재확인이 진행 중(통과 전) — 관리번호를 뺀 계정의 모든 번호 | 막힘 |\n| `holder_is_personal` | 개인 명의로 찍힌다는 안내 | 가능 |",
                  "properties": {
                    "number": {
                      "type": "string",
                      "description": "422 응답의 blockers 에만 있다",
                      "example": "07012340002"
                    },
                    "code": {
                      "type": "string",
                      "enum": [
                        "number_not_owned",
                        "number_not_carrier_issued",
                        "business_info_incomplete",
                        "identity_unverified",
                        "account_restricted",
                        "business_recheck_pending",
                        "holder_is_personal"
                      ],
                      "example": "number_not_carrier_issued"
                    },
                    "message": {
                      "type": "string",
                      "example": "이용증명원은 한국AI통신이 개통한 070·대표번호만 발급됩니다."
                    }
                  },
                  "required": [
                    "code",
                    "message"
                  ]
                }
              }
            }
          }
        }
      }
    },
    "401": {
      "description": "인증 실패",
      "content": {
        "application/json": {
          "schema": {
            "type": "object",
            "properties": {
              "error": {
                "type": "string",
                "description": "사람이 읽을 수 있는 에러 메시지"
              },
              "code": {
                "type": "string",
                "description": "기계 판독용 에러 코드. **분기는 이 값으로 하세요** — `error` 문구는 안내를 다듬으면서\n바뀔 수 있지만 코드는 계약입니다.\n\n같은 상태 코드라도 대응이 갈리는 경우가 있습니다. 예를 들어 발신의 `422` 는\n  - `recipient_blocked`: 수신거부 명단에 있는 번호입니다. 재시도하지 말고 명단에서\n    해제해야 발신됩니다.\n  - `quota_exceeded`: 플랜 한도를 넘었습니다. 다음 주기에 다시 발신됩니다.\n\n전화번호 정규화 관련:\n  - `INVALID_PHONE_NUMBER`: 전화번호 포맷 오류 (한국 번호 형식 아님)\n  - `UNSUPPORTED_COUNTRY`: 국제 발신 미지원 (+82 외 국가코드)",
                "example": "recipient_blocked"
              },
              "ip": {
                "type": "string",
                "description": "`overseas_ip_blocked` 일 때만 옵니다. 국외 IP 라고 판정한 요청 IP 입니다.\n해외 리전 클라우드 서버에서 호출한다면 이 값이 그 서버의 공인 IP 이며, 콘솔\n「국외 접속 예외」에서 예외를 신청할 때 이 고정 IP 를 적습니다.",
                "example": "52.79.213.41"
              },
              "processedAt": {
                "type": "string",
                "format": "date-time",
                "description": "문자 발송 요청을 거부한 서버가 오류 응답을 생성한 시각(UTC). 콘솔은 이 값을 한국 시각으로 표시합니다. 인증·요청 형식 검증 등 발송 서비스 진입 전 오류에는 없을 수 있습니다.",
                "example": "2026-10-21T04:10:34.303Z"
              },
              "blockers": {
                "type": "array",
                "description": "`certificate_not_eligible` 일 때만 옵니다. 발급할 수 없는 번호와 그 이유입니다.",
                "items": {
                  "type": "object",
                  "description": "번호 하나가 발급되지 않는(또는 안내가 필요한) 이유.\n\n| code | 뜻 | 발급 |\n|---|---|---|\n| `number_not_owned` | 이 계정이 보유한 번호가 아님(반납·재배정 포함) | 막힘 |\n| `number_not_carrier_issued` | 한국AI통신이 개통한 070·대표번호가 아님(모바일 게이트웨이, 타사 번호) | 막힘 |\n| `business_info_incomplete` | 사업자 계정인데(관리번호 제외) 상호·사업자등록번호·대표자명·사업장 주소 중 빈 칸 | 막힘 |\n| `identity_unverified` | 개인 계정 번호 또는 관리번호인데 그 번호에 본인확인 정보가 없음 | 막힘 |\n| `account_restricted` | 이용 제한 계정 | 막힘 |\n| `business_recheck_pending` | 사업자 계정인데 사업자 정보 재확인이 진행 중(통과 전) — 관리번호를 뺀 계정의 모든 번호 | 막힘 |\n| `holder_is_personal` | 개인 명의로 찍힌다는 안내 | 가능 |",
                  "properties": {
                    "number": {
                      "type": "string",
                      "description": "422 응답의 blockers 에만 있다",
                      "example": "07012340002"
                    },
                    "code": {
                      "type": "string",
                      "enum": [
                        "number_not_owned",
                        "number_not_carrier_issued",
                        "business_info_incomplete",
                        "identity_unverified",
                        "account_restricted",
                        "business_recheck_pending",
                        "holder_is_personal"
                      ],
                      "example": "number_not_carrier_issued"
                    },
                    "message": {
                      "type": "string",
                      "example": "이용증명원은 한국AI통신이 개통한 070·대표번호만 발급됩니다."
                    }
                  },
                  "required": [
                    "code",
                    "message"
                  ]
                }
              }
            }
          }
        }
      }
    },
    "403": {
      "description": "접근 권한 없음",
      "content": {
        "application/json": {
          "schema": {
            "type": "object",
            "properties": {
              "error": {
                "type": "string",
                "description": "사람이 읽을 수 있는 에러 메시지"
              },
              "code": {
                "type": "string",
                "description": "기계 판독용 에러 코드. **분기는 이 값으로 하세요** — `error` 문구는 안내를 다듬으면서\n바뀔 수 있지만 코드는 계약입니다.\n\n같은 상태 코드라도 대응이 갈리는 경우가 있습니다. 예를 들어 발신의 `422` 는\n  - `recipient_blocked`: 수신거부 명단에 있는 번호입니다. 재시도하지 말고 명단에서\n    해제해야 발신됩니다.\n  - `quota_exceeded`: 플랜 한도를 넘었습니다. 다음 주기에 다시 발신됩니다.\n\n전화번호 정규화 관련:\n  - `INVALID_PHONE_NUMBER`: 전화번호 포맷 오류 (한국 번호 형식 아님)\n  - `UNSUPPORTED_COUNTRY`: 국제 발신 미지원 (+82 외 국가코드)",
                "example": "recipient_blocked"
              },
              "ip": {
                "type": "string",
                "description": "`overseas_ip_blocked` 일 때만 옵니다. 국외 IP 라고 판정한 요청 IP 입니다.\n해외 리전 클라우드 서버에서 호출한다면 이 값이 그 서버의 공인 IP 이며, 콘솔\n「국외 접속 예외」에서 예외를 신청할 때 이 고정 IP 를 적습니다.",
                "example": "52.79.213.41"
              },
              "processedAt": {
                "type": "string",
                "format": "date-time",
                "description": "문자 발송 요청을 거부한 서버가 오류 응답을 생성한 시각(UTC). 콘솔은 이 값을 한국 시각으로 표시합니다. 인증·요청 형식 검증 등 발송 서비스 진입 전 오류에는 없을 수 있습니다.",
                "example": "2026-10-21T04:10:34.303Z"
              },
              "blockers": {
                "type": "array",
                "description": "`certificate_not_eligible` 일 때만 옵니다. 발급할 수 없는 번호와 그 이유입니다.",
                "items": {
                  "type": "object",
                  "description": "번호 하나가 발급되지 않는(또는 안내가 필요한) 이유.\n\n| code | 뜻 | 발급 |\n|---|---|---|\n| `number_not_owned` | 이 계정이 보유한 번호가 아님(반납·재배정 포함) | 막힘 |\n| `number_not_carrier_issued` | 한국AI통신이 개통한 070·대표번호가 아님(모바일 게이트웨이, 타사 번호) | 막힘 |\n| `business_info_incomplete` | 사업자 계정인데(관리번호 제외) 상호·사업자등록번호·대표자명·사업장 주소 중 빈 칸 | 막힘 |\n| `identity_unverified` | 개인 계정 번호 또는 관리번호인데 그 번호에 본인확인 정보가 없음 | 막힘 |\n| `account_restricted` | 이용 제한 계정 | 막힘 |\n| `business_recheck_pending` | 사업자 계정인데 사업자 정보 재확인이 진행 중(통과 전) — 관리번호를 뺀 계정의 모든 번호 | 막힘 |\n| `holder_is_personal` | 개인 명의로 찍힌다는 안내 | 가능 |",
                  "properties": {
                    "number": {
                      "type": "string",
                      "description": "422 응답의 blockers 에만 있다",
                      "example": "07012340002"
                    },
                    "code": {
                      "type": "string",
                      "enum": [
                        "number_not_owned",
                        "number_not_carrier_issued",
                        "business_info_incomplete",
                        "identity_unverified",
                        "account_restricted",
                        "business_recheck_pending",
                        "holder_is_personal"
                      ],
                      "example": "number_not_carrier_issued"
                    },
                    "message": {
                      "type": "string",
                      "example": "이용증명원은 한국AI통신이 개통한 070·대표번호만 발급됩니다."
                    }
                  },
                  "required": [
                    "code",
                    "message"
                  ]
                }
              }
            }
          }
        }
      }
    }
  }
}
```