> For clean Markdown of any page, append .md to the page URL.
> For a complete documentation index, see https://docs.claw-ops.com/llms.txt.
> For AI client integration (Claude Code, Cursor, etc.), connect to the MCP server at https://docs.claw-ops.com/_mcp/server.

# 표시 번호 등록 신청

POST https://api.claw-ops.com/v1/accounts/{accountId}/presentation-numbers
Content-Type: application/json

직접 보유한 유선번호·대표번호를 표시 번호로 신청합니다. 콘솔 신청과 같은 규칙이 적용되고, 한국AI통신의 심사를
거칩니다. 결과는 조회와 메일로 확인합니다.

통신가입증명원은 발급 1개월 이내여야 합니다. 증명원 명의가 계정 명의와 다르면 위임장, 인감증명서, 재직 증빙도
함께 냅니다. 계정 구성원에게 신청 알림 메일이 갑니다.

발신번호 범위를 지정한 API 키와 발급자를 확인할 수 없는 API 키로는 신청할 수 없습니다.

Reference: https://docs.claw-ops.com/api-reference/claw-ops-api/presentation-numbers/create-presentation-number

## Authentication

- `Authorization` header (bearer token, required) — API Key를 Bearer 토큰으로 전달

## Request

### Path parameters

- `accountId` (string, required) — 계정 ID

### Body (application/json)

This endpoint expects a PresentationNumberCreateRequest.

- `number` (string, required) — 표시할 유선번호 또는 대표번호
- `documents` (list of PresentationNumberCreateRequestDocumentsItems, required) — 제출 서류. 같은 종류의 파일을 여러 개 낼 수 있습니다.

## Response

### 201

신청 접수

- `id` (string, required) — 표시 번호 id. 070 번호에 걸 때 `presentationNumberId` 로 씁니다.
- `number` (string, required) — 표시 번호(숫자만)
- `type` (enum, required) — 번호 유형. landline=유선번호, representative=대표번호
  - Allowed values: `landline`, `representative`
- `verificationMethod` (enum, required) — 등록할 때 거친 확인 방법. own_provisioned=한국AI통신에서 개통한 번호, usage_cert=통신가입증명원 심사, usage_cert_ars=통신가입증명원 심사와 ARS
  - Allowed values: `own_provisioned`, `usage_cert`, `usage_cert_ars`
- `status` (enum, required) — pending=심사 중, approved=승인, rejected=반려
  - Allowed values: `pending`, `approved`, `rejected`
- `rejectedReason` (string, required, nullable) — 반려 사유. 반려되지 않았으면 null 입니다.
- `phoneNumbers` (list of string, required) — 이 표시 번호를 걸어 둔 번호
- `createdAt` (datetime, required)
- `updatedAt` (datetime, required)

## Errors

### 400 Bad Request Error

잘못된 요청

- `error` (string, optional) — 사람이 읽을 수 있는 에러 메시지
- `code` (string, optional) — 기계 판독용 에러 코드. **분기는 이 값으로 하세요** — `error` 문구는 안내를 다듬으면서 바뀔 수 있지만 코드는 계약입니다. 같은 상태 코드라도 대응이 갈리는 경우가 있습니다. 예를 들어 발신의 `422` 는 - `recipient_blocked`: 수신거부 명단에 있는 번호입니다. 재시도하지 말고 명단에서 해제해야 발신됩니다. - `quota_exceeded`: 플랜 한도를 넘었습니다. 다음 주기에 다시 발신됩니다. 전화번호 정규화 관련: - `INVALID_PHONE_NUMBER`: 전화번호 포맷 오류 (한국 번호 형식 아님) - `UNSUPPORTED_COUNTRY`: 국제 발신 미지원 (+82 외 국가코드)
- `ip` (string, optional) — `overseas_ip_blocked` 일 때만 옵니다. 국외 IP 라고 판정한 요청 IP 입니다. 해외 리전 클라우드 서버에서 호출한다면 이 값이 그 서버의 공인 IP 이며, 콘솔 「국외 접속 예외」에서 예외를 신청할 때 이 고정 IP 를 적습니다.
- `processedAt` (datetime, optional) — 문자 발송 요청을 거부한 서버가 오류 응답을 생성한 시각(UTC). 콘솔은 이 값을 한국 시각으로 표시합니다. 인증·요청 형식 검증 등 발송 서비스 진입 전 오류에는 없을 수 있습니다.
- `blockers` (list of CertificateBlocker, optional) — `certificate_not_eligible` 일 때만 옵니다. 발급할 수 없는 번호와 그 이유입니다.

### 401 Unauthorized Error

인증 실패

- `error` (string, optional) — 사람이 읽을 수 있는 에러 메시지
- `code` (string, optional) — 기계 판독용 에러 코드. **분기는 이 값으로 하세요** — `error` 문구는 안내를 다듬으면서 바뀔 수 있지만 코드는 계약입니다. 같은 상태 코드라도 대응이 갈리는 경우가 있습니다. 예를 들어 발신의 `422` 는 - `recipient_blocked`: 수신거부 명단에 있는 번호입니다. 재시도하지 말고 명단에서 해제해야 발신됩니다. - `quota_exceeded`: 플랜 한도를 넘었습니다. 다음 주기에 다시 발신됩니다. 전화번호 정규화 관련: - `INVALID_PHONE_NUMBER`: 전화번호 포맷 오류 (한국 번호 형식 아님) - `UNSUPPORTED_COUNTRY`: 국제 발신 미지원 (+82 외 국가코드)
- `ip` (string, optional) — `overseas_ip_blocked` 일 때만 옵니다. 국외 IP 라고 판정한 요청 IP 입니다. 해외 리전 클라우드 서버에서 호출한다면 이 값이 그 서버의 공인 IP 이며, 콘솔 「국외 접속 예외」에서 예외를 신청할 때 이 고정 IP 를 적습니다.
- `processedAt` (datetime, optional) — 문자 발송 요청을 거부한 서버가 오류 응답을 생성한 시각(UTC). 콘솔은 이 값을 한국 시각으로 표시합니다. 인증·요청 형식 검증 등 발송 서비스 진입 전 오류에는 없을 수 있습니다.
- `blockers` (list of CertificateBlocker, optional) — `certificate_not_eligible` 일 때만 옵니다. 발급할 수 없는 번호와 그 이유입니다.

### 403 Forbidden Error

접근 권한 없음 / 발신번호 범위를 지정한 API 키(api_key_presentation_numbers_restricted) / 발급자를 확인할 수 없는 API 키(api_key_presentation_number_issuer_unknown)

- `error` (string, optional) — 사람이 읽을 수 있는 에러 메시지
- `code` (string, optional) — 기계 판독용 에러 코드. **분기는 이 값으로 하세요** — `error` 문구는 안내를 다듬으면서 바뀔 수 있지만 코드는 계약입니다. 같은 상태 코드라도 대응이 갈리는 경우가 있습니다. 예를 들어 발신의 `422` 는 - `recipient_blocked`: 수신거부 명단에 있는 번호입니다. 재시도하지 말고 명단에서 해제해야 발신됩니다. - `quota_exceeded`: 플랜 한도를 넘었습니다. 다음 주기에 다시 발신됩니다. 전화번호 정규화 관련: - `INVALID_PHONE_NUMBER`: 전화번호 포맷 오류 (한국 번호 형식 아님) - `UNSUPPORTED_COUNTRY`: 국제 발신 미지원 (+82 외 국가코드)
- `ip` (string, optional) — `overseas_ip_blocked` 일 때만 옵니다. 국외 IP 라고 판정한 요청 IP 입니다. 해외 리전 클라우드 서버에서 호출한다면 이 값이 그 서버의 공인 IP 이며, 콘솔 「국외 접속 예외」에서 예외를 신청할 때 이 고정 IP 를 적습니다.
- `processedAt` (datetime, optional) — 문자 발송 요청을 거부한 서버가 오류 응답을 생성한 시각(UTC). 콘솔은 이 값을 한국 시각으로 표시합니다. 인증·요청 형식 검증 등 발송 서비스 진입 전 오류에는 없을 수 있습니다.
- `blockers` (list of CertificateBlocker, optional) — `certificate_not_eligible` 일 때만 옵니다. 발급할 수 없는 번호와 그 이유입니다.

### 409 Conflict Error

이미 신청했거나 승인된 번호(presentation_number_already_registered) / 한국AI통신에서 개통한 번호(presentation_number_own_carrier_number)

- `error` (string, optional) — 사람이 읽을 수 있는 에러 메시지
- `code` (string, optional) — 기계 판독용 에러 코드. **분기는 이 값으로 하세요** — `error` 문구는 안내를 다듬으면서 바뀔 수 있지만 코드는 계약입니다. 같은 상태 코드라도 대응이 갈리는 경우가 있습니다. 예를 들어 발신의 `422` 는 - `recipient_blocked`: 수신거부 명단에 있는 번호입니다. 재시도하지 말고 명단에서 해제해야 발신됩니다. - `quota_exceeded`: 플랜 한도를 넘었습니다. 다음 주기에 다시 발신됩니다. 전화번호 정규화 관련: - `INVALID_PHONE_NUMBER`: 전화번호 포맷 오류 (한국 번호 형식 아님) - `UNSUPPORTED_COUNTRY`: 국제 발신 미지원 (+82 외 국가코드)
- `ip` (string, optional) — `overseas_ip_blocked` 일 때만 옵니다. 국외 IP 라고 판정한 요청 IP 입니다. 해외 리전 클라우드 서버에서 호출한다면 이 값이 그 서버의 공인 IP 이며, 콘솔 「국외 접속 예외」에서 예외를 신청할 때 이 고정 IP 를 적습니다.
- `processedAt` (datetime, optional) — 문자 발송 요청을 거부한 서버가 오류 응답을 생성한 시각(UTC). 콘솔은 이 값을 한국 시각으로 표시합니다. 인증·요청 형식 검증 등 발송 서비스 진입 전 오류에는 없을 수 있습니다.
- `blockers` (list of CertificateBlocker, optional) — `certificate_not_eligible` 일 때만 옵니다. 발급할 수 없는 번호와 그 이유입니다.

### 422 Unprocessable Entity Error

등록할 수 없는 번호 또는 서류 오류 (presentation_number_not_registrable, presentation_number_protected, presentation_number_documents_missing, presentation_number_authority_documents_incomplete, presentation_number_document_stale, presentation_number_document_invalid 등)

- `error` (string, optional) — 사람이 읽을 수 있는 에러 메시지
- `code` (string, optional) — 기계 판독용 에러 코드. **분기는 이 값으로 하세요** — `error` 문구는 안내를 다듬으면서 바뀔 수 있지만 코드는 계약입니다. 같은 상태 코드라도 대응이 갈리는 경우가 있습니다. 예를 들어 발신의 `422` 는 - `recipient_blocked`: 수신거부 명단에 있는 번호입니다. 재시도하지 말고 명단에서 해제해야 발신됩니다. - `quota_exceeded`: 플랜 한도를 넘었습니다. 다음 주기에 다시 발신됩니다. 전화번호 정규화 관련: - `INVALID_PHONE_NUMBER`: 전화번호 포맷 오류 (한국 번호 형식 아님) - `UNSUPPORTED_COUNTRY`: 국제 발신 미지원 (+82 외 국가코드)
- `ip` (string, optional) — `overseas_ip_blocked` 일 때만 옵니다. 국외 IP 라고 판정한 요청 IP 입니다. 해외 리전 클라우드 서버에서 호출한다면 이 값이 그 서버의 공인 IP 이며, 콘솔 「국외 접속 예외」에서 예외를 신청할 때 이 고정 IP 를 적습니다.
- `processedAt` (datetime, optional) — 문자 발송 요청을 거부한 서버가 오류 응답을 생성한 시각(UTC). 콘솔은 이 값을 한국 시각으로 표시합니다. 인증·요청 형식 검증 등 발송 서비스 진입 전 오류에는 없을 수 있습니다.
- `blockers` (list of CertificateBlocker, optional) — `certificate_not_eligible` 일 때만 옵니다. 발급할 수 없는 번호와 그 이유입니다.

### 429 Too Many Requests Error

계정별 요청 한도 초과 (presentation_number_rate_limited)

- `error` (string, optional) — 사람이 읽을 수 있는 에러 메시지
- `code` (string, optional) — 기계 판독용 에러 코드. **분기는 이 값으로 하세요** — `error` 문구는 안내를 다듬으면서 바뀔 수 있지만 코드는 계약입니다. 같은 상태 코드라도 대응이 갈리는 경우가 있습니다. 예를 들어 발신의 `422` 는 - `recipient_blocked`: 수신거부 명단에 있는 번호입니다. 재시도하지 말고 명단에서 해제해야 발신됩니다. - `quota_exceeded`: 플랜 한도를 넘었습니다. 다음 주기에 다시 발신됩니다. 전화번호 정규화 관련: - `INVALID_PHONE_NUMBER`: 전화번호 포맷 오류 (한국 번호 형식 아님) - `UNSUPPORTED_COUNTRY`: 국제 발신 미지원 (+82 외 국가코드)
- `ip` (string, optional) — `overseas_ip_blocked` 일 때만 옵니다. 국외 IP 라고 판정한 요청 IP 입니다. 해외 리전 클라우드 서버에서 호출한다면 이 값이 그 서버의 공인 IP 이며, 콘솔 「국외 접속 예외」에서 예외를 신청할 때 이 고정 IP 를 적습니다.
- `processedAt` (datetime, optional) — 문자 발송 요청을 거부한 서버가 오류 응답을 생성한 시각(UTC). 콘솔은 이 값을 한국 시각으로 표시합니다. 인증·요청 형식 검증 등 발송 서비스 진입 전 오류에는 없을 수 있습니다.
- `blockers` (list of CertificateBlocker, optional) — `certificate_not_eligible` 일 때만 옵니다. 발급할 수 없는 번호와 그 이유입니다.

## Types

### PresentationNumberCreateRequestDocumentsItems

- `uri` (string, required) — 업로드 주소 발급에서 받은 `documentUri`
- `kind` (enum, required) — usage_certificate=통신가입증명원, delegation_letter=위임장, seal_certificate=인감증명서, employment_proof=재직 증빙
  - Allowed values: `usage_certificate`, `delegation_letter`, `seal_certificate`, `employment_proof`
- `issuedOn` (date, optional) — 서류 발급일. 통신가입증명원은 필수입니다.

### CertificateBlocker

번호 하나가 발급되지 않는(또는 안내가 필요한) 이유. | code | 뜻 | 발급 | |---|---|---| | `number_not_owned` | 이 계정이 보유한 번호가 아님(반납·재배정 포함) | 막힘 | | `number_not_carrier_issued` | 한국AI통신이 개통한 070·대표번호가 아님(모바일 게이트웨이, 타사 번호) | 막힘 | | `business_info_incomplete` | 사업자 계정인데(관리번호 제외) 상호·사업자등록번호·대표자명·사업장 주소 중 빈 칸 | 막힘 | | `identity_unverified` | 개인 계정 번호 또는 관리번호인데 그 번호에 본인확인 정보가 없음 | 막힘 | | `account_restricted` | 이용 제한 계정 | 막힘 | | `business_recheck_pending` | 사업자 계정인데 사업자 정보 재확인이 진행 중(통과 전) — 관리번호를 뺀 계정의 모든 번호 | 막힘 | | `holder_is_personal` | 개인 명의로 찍힌다는 안내 | 가능 |

- `code` (enum, required)
  - Allowed values: `number_not_owned`, `number_not_carrier_issued`, `business_info_incomplete`, `identity_unverified`, `account_restricted`, `business_recheck_pending`, `holder_is_personal`
- `message` (string, required)
- `number` (string, optional) — 422 응답의 blockers 에만 있다

## Examples

**Request**

```json
{
  "number": "02-1234-5678",
  "documents": [
    {
      "uri": "gs://bucket/presentation-number-documents/AC1a2b3c4d/file.pdf",
      "kind": "usage_certificate",
      "issuedOn": "2026-11-01"
    }
  ]
}
```

**Response**

```json
{
  "id": "cmh1pn0000001",
  "number": "0212345678",
  "type": "landline",
  "verificationMethod": "usage_cert",
  "status": "approved",
  "rejectedReason": null,
  "phoneNumbers": [
    "07012340001"
  ],
  "createdAt": "2026-11-04T01:12:30.000Z",
  "updatedAt": "2026-11-04T03:20:11.000Z"
}
```

**SDK Code**

```python PresentationNumbers_createPresentationNumber_example
import requests

url = "https://api.claw-ops.com/v1/accounts/AC1a2b3c4d/presentation-numbers"

payload = {
    "number": "02-1234-5678",
    "documents": [
        {
            "uri": "gs://bucket/presentation-number-documents/AC1a2b3c4d/file.pdf",
            "kind": "usage_certificate",
            "issuedOn": "2026-11-01"
        }
    ]
}
headers = {
    "Authorization": "Bearer <token>",
    "Content-Type": "application/json"
}

response = requests.post(url, json=payload, headers=headers)

print(response.json())
```

```javascript PresentationNumbers_createPresentationNumber_example
const url = 'https://api.claw-ops.com/v1/accounts/AC1a2b3c4d/presentation-numbers';
const options = {
  method: 'POST',
  headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
  body: '{"number":"02-1234-5678","documents":[{"uri":"gs://bucket/presentation-number-documents/AC1a2b3c4d/file.pdf","kind":"usage_certificate","issuedOn":"2026-11-01"}]}'
};

try {
  const response = await fetch(url, options);
  const data = await response.json();
  console.log(data);
} catch (error) {
  console.error(error);
}
```

```go PresentationNumbers_createPresentationNumber_example
package main

import (
	"fmt"
	"strings"
	"net/http"
	"io"
)

func main() {

	url := "https://api.claw-ops.com/v1/accounts/AC1a2b3c4d/presentation-numbers"

	payload := strings.NewReader("{\n  \"number\": \"02-1234-5678\",\n  \"documents\": [\n    {\n      \"uri\": \"gs://bucket/presentation-number-documents/AC1a2b3c4d/file.pdf\",\n      \"kind\": \"usage_certificate\",\n      \"issuedOn\": \"2026-11-01\"\n    }\n  ]\n}")

	req, _ := http.NewRequest("POST", url, payload)

	req.Header.Add("Authorization", "Bearer <token>")
	req.Header.Add("Content-Type", "application/json")

	res, _ := http.DefaultClient.Do(req)

	defer res.Body.Close()
	body, _ := io.ReadAll(res.Body)

	fmt.Println(res)
	fmt.Println(string(body))

}
```

```ruby PresentationNumbers_createPresentationNumber_example
require 'uri'
require 'net/http'

url = URI("https://api.claw-ops.com/v1/accounts/AC1a2b3c4d/presentation-numbers")

http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true

request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n  \"number\": \"02-1234-5678\",\n  \"documents\": [\n    {\n      \"uri\": \"gs://bucket/presentation-number-documents/AC1a2b3c4d/file.pdf\",\n      \"kind\": \"usage_certificate\",\n      \"issuedOn\": \"2026-11-01\"\n    }\n  ]\n}"

response = http.request(request)
puts response.read_body
```

```java PresentationNumbers_createPresentationNumber_example
import com.mashape.unirest.http.HttpResponse;
import com.mashape.unirest.http.Unirest;

HttpResponse<String> response = Unirest.post("https://api.claw-ops.com/v1/accounts/AC1a2b3c4d/presentation-numbers")
  .header("Authorization", "Bearer <token>")
  .header("Content-Type", "application/json")
  .body("{\n  \"number\": \"02-1234-5678\",\n  \"documents\": [\n    {\n      \"uri\": \"gs://bucket/presentation-number-documents/AC1a2b3c4d/file.pdf\",\n      \"kind\": \"usage_certificate\",\n      \"issuedOn\": \"2026-11-01\"\n    }\n  ]\n}")
  .asString();
```

```php PresentationNumbers_createPresentationNumber_example
<?php
require_once('vendor/autoload.php');

$client = new \GuzzleHttp\Client();

$response = $client->request('POST', 'https://api.claw-ops.com/v1/accounts/AC1a2b3c4d/presentation-numbers', [
  'body' => '{
  "number": "02-1234-5678",
  "documents": [
    {
      "uri": "gs://bucket/presentation-number-documents/AC1a2b3c4d/file.pdf",
      "kind": "usage_certificate",
      "issuedOn": "2026-11-01"
    }
  ]
}',
  'headers' => [
    'Authorization' => 'Bearer <token>',
    'Content-Type' => 'application/json',
  ],
]);

echo $response->getBody();
```

```csharp PresentationNumbers_createPresentationNumber_example
using RestSharp;

var client = new RestClient("https://api.claw-ops.com/v1/accounts/AC1a2b3c4d/presentation-numbers");
var request = new RestRequest(Method.POST);
request.AddHeader("Authorization", "Bearer <token>");
request.AddHeader("Content-Type", "application/json");
request.AddParameter("application/json", "{\n  \"number\": \"02-1234-5678\",\n  \"documents\": [\n    {\n      \"uri\": \"gs://bucket/presentation-number-documents/AC1a2b3c4d/file.pdf\",\n      \"kind\": \"usage_certificate\",\n      \"issuedOn\": \"2026-11-01\"\n    }\n  ]\n}", ParameterType.RequestBody);
IRestResponse response = client.Execute(request);
```

```swift PresentationNumbers_createPresentationNumber_example
import Foundation

let headers = [
  "Authorization": "Bearer <token>",
  "Content-Type": "application/json"
]
let parameters = [
  "number": "02-1234-5678",
  "documents": [
    [
      "uri": "gs://bucket/presentation-number-documents/AC1a2b3c4d/file.pdf",
      "kind": "usage_certificate",
      "issuedOn": "2026-11-01"
    ]
  ]
] as [String : Any]

let postData = JSONSerialization.data(withJSONObject: parameters, options: [])

let request = NSMutableURLRequest(url: NSURL(string: "https://api.claw-ops.com/v1/accounts/AC1a2b3c4d/presentation-numbers")! as URL,
                                        cachePolicy: .useProtocolCachePolicy,
                                    timeoutInterval: 10.0)
request.httpMethod = "POST"
request.allHTTPHeaderFields = headers
request.httpBody = postData as Data

let session = URLSession.shared
let dataTask = session.dataTask(with: request as URLRequest, completionHandler: { (data, response, error) -> Void in
  if (error != nil) {
    print(error as Any)
  } else {
    let httpResponse = response as? HTTPURLResponse
    print(httpResponse)
  }
})

dataTask.resume()
```