CNF API · v1
c.nf를 위한 하나의 API입니다. DNS 영역과 레코드, 개인 파일, 패키지, 저장된 자격 증명, 도메인 조회, 그리고 계정이 필요 없는 공개 유틸리티를 다룹니다. 인증이 필요한 작업은 호출에 쓰인 키의 계정으로만 제한됩니다.
개요
버전 1은 DNS 관리에서 소유권을 확인한 영역의 DNS 작업을 제공합니다. 토큰은 계정 → API 키에서 생성하고 폐기할 수 있습니다.
403 forbidden_zone이 반환됩니다.GET /v1?format=json을 요청하거나 /v1에 Accept: application/json 헤더를 보내세요.기본 URL 및 버전 관리
https://api.c.nf/v1
모든 엔드포인트는 /v1 아래에 있습니다. 호환성을 깨는 변경에는 새 주 버전 경로를 사용합니다. 이전 버전과 호환되는 필드와 엔드포인트는 v1에 추가될 수 있으며 변경 기록에 남습니다.
인증 및 범위
계정 데이터를 읽거나 변경하는 모든 요청에는 Bearer 토큰이 필요합니다. 토큰은 cnf_로 시작하고 32자리 16진수 문자가 이어집니다.
curl https://api.c.nf/v1/dns/zones \
-H "Authorization: Bearer cnf_a1b2c3d4e5f60718293a4b5c6d7e8f90"
토큰은 단방향 해시로 저장되며 전체 값은 생성 시 한 번만 표시됩니다. 토큰을 잃어버리면 폐기하고 새 토큰을 만드세요.
각 토큰에는 범위가 있습니다. 범위가 설정되지 않은 토큰에는 기본적으로 dns:read가 부여됩니다. 쓰기 범위에는 읽기 권한도 포함됩니다.
| 적용 범위 | 권한 |
|---|---|
dns:read |
영역과 레코드를 나열하고 개별 레코드를 읽습니다. |
dns:write |
DNS 레코드와 영역 소유권 요청을 읽고 만들고 수정하고 삭제합니다. |
* |
모든 범위를 허용합니다. 반드시 필요한 경우에만 사용하세요. |
범위가 일치하지 않으면 403 forbidden_scope가 반환되며, 진단을 위해 required_scopes와 token_scopes가 모두 포함됩니다.
사용자별 격리
Bearer 토큰 하나는 정확히 하나의 user_id에 연결됩니다. 각 영역 처리기는 읽기나 쓰기 전에 해당 사용자가 확인한 소유권 요청인지 검사합니다. 관리자 우회, 가장 경로 또는 사용자 간 우회 수단은 없습니다.
* 권한이 있는 토큰도 해당 사용자가 확인한 영역에서만 작업할 수 있습니다. 다른 계정의 영역에 접근하면 403 forbidden_zone이 반환됩니다.
응답 구조
성공 응답
{
"success": true,
"data": { "zones": [] },
"request_id": "req_abc123def456abcd"
}
오류 응답
{
"success": false,
"error": "forbidden_zone",
"message": "zone not verified for this account (or does not exist)",
"request_id": "req_abc123def456abcd",
"zone": "example.com"
}
request_id는 모든 응답에 포함되며 클라이언트 측 로그에 안전하게 기록할 수 있습니다.
오류 코드
| HTTP | 오류 코드 | 의미 |
|---|---|---|
| 400 | bad_request |
필수 필드가 없거나, 본문 형식이 잘못되었거나, 입력값이 유효하지 않습니다. |
| 401 | unauthorized |
Bearer 토큰이 없거나 유효하지 않거나 폐기되었습니다. |
| 403 | forbidden_scope |
토큰에 필요한 범위가 없습니다. |
| 403 | forbidden_zone |
이 계정에서 영역이 확인되지 않았거나 영역이 존재하지 않습니다. |
| 404 | not_found |
요청한 영역, 레코드 또는 사용자를 찾을 수 없습니다. |
| 405 | method_not_allowed |
이 엔드포인트는 해당 HTTP 메서드를 지원하지 않습니다. |
| 502 | upstream_error |
DNS 공급자가 오류를 반환했습니다. |
영역 확인
POST /v1/dns/zones로 영역 소유권을 요청하면 서버는 다음 경로 중 하나를 선택합니다.
-
즉시 확인(
method: "auto") — 다른 계정이 해당 영역의 소유권을 요청하지 않은 경우 사용합니다. 소유권 요청은 즉시 확인됩니다. 레코드는 소유자가 등록기관의 NS 위임을 반환된 네임서버로 변경한 후에만 권한을 갖습니다. -
TXT 확인 — 소유권 요청이 경합하는 경우 사용합니다. 반환된 TXT 값을
_cnfdns-verify.<zone>에 추가한 다음POST /v1/dns/zones/{zone}/verify를 호출하세요. -
기존 NS 확인 — 이전에 대기 중이던 소유권 요청은
verify_method: "ns"를 사용할 수 있습니다. 확인 과정에서는 영역의 실제 NS 응답을 예상 네임서버 집합과 비교합니다.
in-addr.arpa와 ip6.arpa에도 같은 모델이 적용됩니다. 영역 소유권을 요청하고 expected_ns를 받은 다음 해당 위임 대상을 관련 등록기관에 제출하세요.확인 작업은 멱등성을 보장합니다. 확인된 요청에 대해 반복하면 소유권 요청을 변경하지 않고 verified: true를 반환합니다.
레코드 유형 및 제한
지원되는 레코드 유형
A, AAAA, CNAME, MX, TXT, NS, SRV, CAA, PTR, SPF.
priority는 MX와 SRV에 필요하며 다른 유형에서는 무시됩니다. ttl은 60초에서 2,592,000초 사이여야 합니다.
엔드포인트
공개 유틸리티
계정 없이 쓰는 작고 안정적인 엔드포인트. 시간, 주소, 국가, 환율, 해시.
| 메서드 | 경로 | 적용 범위 | 목적 |
|---|---|---|---|
| GET | /v1/public/time |
공개 | 현재 UTC 시각을 ISO 8601, RFC 2822, Unix 형식으로 반환합니다. |
| GET | /v1/public/timestamp |
공개 | 현재 Unix 타임스탬프를 초와 밀리초로 반환합니다. |
| GET | /v1/public/ip |
공개 | 이 요청이 들어온 주소. |
| GET | /v1/public/geo |
공개 | 엣지에서 판별한 이 요청의 국가. |
| GET | /v1/public/fx |
공개 | 기준 통화에 대한 환율. 매시간 갱신됩니다. |
| GET | /v1/public/hash |
공개 | 문자열을 SHA-256 등 지원되는 알고리즘으로 해시합니다. |
계정
토큰이 누구의 것이고 무엇을 할 수 있는지.
| 메서드 | 경로 | 적용 범위 | 목적 |
|---|---|---|---|
| GET | /v1/account/me |
모든 토큰 | 토큰의 계정, 스코프, 그리고 사용할 수 있는 엔드포인트. |
| GET | /v1/account/sessions |
account:read |
이 계정에 로그인되어 있는 모든 브라우저 세션. |
| POST | /v1/account/sessions/revoke |
account:write |
세션 하나를 로그아웃합니다. |
| POST | /v1/account/sessions/revoke-all |
account:write |
모든 세션을 로그아웃합니다. |
| POST | /v1/account/profile |
account:write |
표시 이름을 바꿉니다. |
DNS
도메인을 신청하고 통제권을 증명한 뒤 레코드를 관리합니다.
| 메서드 | 경로 | 적용 범위 | 목적 |
|---|---|---|---|
| GET | /v1/dns/zones |
dns:read |
이 계정이 신청한 모든 영역. |
| POST | /v1/dns/zones |
dns:write |
영역을 신청합니다. 경합이 없으면 즉시, 있으면 TXT 확인이 필요합니다. |
| GET | /v1/dns/zones/{zone} |
dns:read |
영역 하나. 아직 대기 중이면 확인 절차도 함께 반환합니다. |
| POST | /v1/dns/zones/{zone}/verify |
dns:write |
확인 조회를 실행하고 일치하면 영역을 확인 완료로 표시합니다. |
| DELETE | /v1/dns/zones/{zone} |
dns:write |
신청을 해제합니다. 레코드 자체는 그대로 둡니다. |
| GET | /v1/dns/zones/{zone}/records |
dns:read |
확인된 영역의 모든 레코드. |
| POST | /v1/dns/zones/{zone}/records |
dns:write |
확인된 영역에 레코드를 추가합니다. |
| GET | /v1/dns/zones/{zone}/records/{id} |
dns:read |
레코드 하나. |
| PATCH | /v1/dns/zones/{zone}/records/{id} |
dns:write |
레코드 일부를 변경합니다. 생략한 항목은 값을 유지합니다. |
| DELETE | /v1/dns/zones/{zone}/records/{id} |
dns:write |
레코드를 삭제합니다. |
자격 증명
자격 증명 도구 뒤의 비공개 보관소.
| 메서드 | 경로 | 적용 범위 | 목적 |
|---|---|---|---|
| GET | /v1/cred |
cred:read cred:write |
저장된 자격 증명. 플랫폼으로 걸러낼 수 있습니다. |
| POST | /v1/cred |
cred:write |
자격 증명을 저장합니다. |
파일
개인 파일 저장소. 목록, 업로드, 편집, 공유, 삭제.
| 메서드 | 경로 | 적용 범위 | 목적 |
|---|---|---|---|
| GET | /v1/files |
files:read files:write |
저장된 파일을 최신순으로. |
| GET | /v1/files/{id} |
files:read files:write |
파일 하나. 공유 링크가 있으면 함께 반환합니다. |
| GET | /v1/files/download |
files:read files:write |
파일을 내려받습니다. |
| POST | /v1/files/upload |
files:write |
파일을 올립니다. |
| POST | /v1/files/update |
files:write |
공유 여부를 포함해 파일 정보를 수정합니다. |
| POST | /v1/files/rename |
files:write |
내려받을 때 쓰이는 파일 이름을 바꿉니다. |
| POST | /v1/files/delete |
files:write |
파일과 그 내용을 삭제합니다. |
| POST | /v1/files/upload-chunk |
files:write |
큰 업로드의 한 조각을 보냅니다. |
| POST | /v1/files/upload-finalize |
files:write |
조각들을 하나의 파일로 합칩니다. |
CDN
공유한 파일의 엣지 캐시와 트래픽.
| 메서드 | 경로 | 적용 범위 | 목적 |
|---|---|---|---|
| GET | /v1/cdn/stats |
cdn:read |
공유한 파일의 캐시 설정과 요청 수. |
| POST | /v1/cdn/config |
cdn:write |
엣지가 파일을 얼마나 보관할지 정하거나 제공을 중단합니다. |
| POST | /v1/cdn/purge |
cdn:write |
엣지 캐시에서 파일을 즉시 내립니다. |
SMS 전달
휴대폰에서 전달된 메시지와 이를 허용하는 키.
| 메서드 | 경로 | 적용 범위 | 목적 |
|---|---|---|---|
| GET | /v1/sms/messages |
sms:read |
계정으로 전달된 메시지. |
| GET | /v1/sms/keys |
sms:read sms:write |
기기가 사용하는 전달 키. |
| POST | /v1/sms/keys |
sms:write |
전달 키를 발급합니다. 최대 다섯 개. |
| DELETE | /v1/sms/keys |
sms:write |
전달 키를 해지합니다. |
정적 사이트
zip을 올리면 사이트가 됩니다.
| 메서드 | 경로 | 적용 범위 | 목적 |
|---|---|---|---|
| GET | /v1/sites |
sites:read sites:write |
정적 사이트 목록. 최근 배포한 순서입니다. |
| POST | /v1/sites/deploy |
sites:write |
zip을 사이트로 배포합니다. |
| POST | /v1/sites/delete |
sites:write |
사이트와 파일을 삭제합니다. |
배포
배포한 폼, 웹훅, 단축 링크 엔드포인트.
| 메서드 | 경로 | 적용 범위 | 목적 |
|---|---|---|---|
| GET | /v1/deployments |
deploy:read deploy:write |
배포 목록과 각각의 사용 횟수. |
| POST | /v1/deployments/toggle |
deploy:write |
배포를 켜거나 끕니다. |
| POST | /v1/deployments/delete |
deploy:write |
배포를 삭제합니다. |
도메인
도메인 포트폴리오와 등록 정보.
| 메서드 | 경로 | 적용 범위 | 목적 |
|---|---|---|---|
| GET | /v1/domains |
domain:read domain:write |
도메인 목록. 만료가 가까운 순서입니다. |
| POST | /v1/domains/whois-sync |
domain:write |
레지스트리 기록으로 도메인 하나를 갱신합니다. |
패키지
릴리스를 게시하고 버전과 다운로드 수를 조회합니다.
| 메서드 | 경로 | 적용 범위 | 목적 |
|---|---|---|---|
| GET | /v1/packages |
packages:read packages:write |
내 패키지. 버전 수와 총 다운로드 수 포함. |
| GET | /v1/packages/{slug} |
packages:read packages:write |
패키지 하나. 모든 버전과 산출물 포함. |
| POST | /v1/packages/publish |
packages:write |
버전을 게시합니다. 새 패키지면 함께 만듭니다. |
| POST | /v1/packages/update |
packages:write |
패키지 정보를 수정합니다. |
| POST | /v1/packages/delete |
packages:write |
패키지와 모든 버전, 모든 산출물을 삭제합니다. |
WHOIS
도메인 등록 정보. 캐시되어 도메인 도구와 공유됩니다.
| 메서드 | 경로 | 적용 범위 | 목적 |
|---|---|---|---|
| GET | /v1/whois |
whois:read |
도메인 등록 정보. |
AI 에이전트용
에이전트에게는 /v1/ai를 알려주세요. 프롬프트에 그대로 붙여 넣도록 쓴 요약입니다. /v1/ai?format=json은 같은 엔드포인트를 도구 정의로 돌려줍니다. /v1/openapi.json은 완전한 OpenAPI 3.1 계약이고 /llms.txt는 크롤러용 안내입니다. 넷 다 이 페이지와 같은 라우팅 표에서 생성되므로 없는 엔드포인트를 설명할 수 없습니다.
curl https://api.c.nf/v1/ai
curl https://api.c.nf/v1/ai?format=json
curl https://api.c.nf/v1/openapi.json
요청 필드
영역 소유권 요청 만들기
| 필드 | 유형 | 요구 사항 | 참고 |
|---|---|---|---|
zone |
string |
필수 | 영역 최상위 이름입니다. 서버가 소문자로 변환하며 역방향 영역도 허용됩니다. |
DNS 레코드 만들기
| 필드 | 유형 | 요구 사항 | 참고 |
|---|---|---|---|
type |
string |
필수 | A, AAAA, CNAME, MX, TXT, NS, SRV, CAA, PTR, SPF 중 하나입니다. |
host |
string |
선택 사항 | 하위 도메인만 입력합니다. 영역 최상위에는 빈 문자열 또는 @를 사용하세요. |
value |
string |
필수 | IP 주소, 대상 이름, 텍스트 값 등의 레코드 내용입니다. |
ttl |
integer |
선택 사항 | 60~2,592,000초 사이이며 기본값은 3,600초입니다. |
priority |
integer |
선택 사항 | MX와 SRV에는 필수이며 다른 유형에서는 무시됩니다. |
DNS 레코드 수정
| 필드 | 유형 | 요구 사항 | 참고 |
|---|---|---|---|
host |
string |
선택 사항 | 새 하위 도메인입니다. |
value |
string |
선택 사항 | 현재 기록과 통합된 후 비어서는 안 됩니다. |
ttl |
integer |
선택 사항 | 60~2,592,000초 사이입니다. |
priority |
integer |
선택 사항 | MX와 SRV에만 사용됩니다. |
PATCH로는 레코드 유형을 변경할 수 없습니다. 유형을 변경하려면 레코드를 삭제하고 새로 만드세요.예제
영역 목록
curl -H "Authorization: Bearer $CNF_TOKEN" \
https://api.c.nf/v1/dns/zones영역 소유권 요청
curl -X POST https://api.c.nf/v1/dns/zones \
-H "Authorization: Bearer $CNF_TOKEN" \
-H "Content-Type: application/json" \
-d '{"zone":"example.com"}'영역 확인
curl -X POST https://api.c.nf/v1/dns/zones/example.com/verify \
-H "Authorization: Bearer $CNF_TOKEN"레코드 만들기
curl -X POST https://api.c.nf/v1/dns/zones/example.com/records \
-H "Authorization: Bearer $CNF_TOKEN" \
-H "Content-Type: application/json" \
-d '{"type":"A","host":"api","value":"192.0.2.10"}'빠른 시작
dns:write범위의 API 키를 계정 → API 키에서 만들고 표시될 때 복사합니다.- 토큰을 기기의 보호된 환경 변수에 저장합니다.
GET /v1/account/me를 호출하여 토큰과 범위를 확인합니다.- 영역 소유권을 요청합니다. 응답에서 즉시 확인, TXT 기반 확인, 기존 NS 기반 확인 중 어떤 방식인지 알려 줍니다.
- DNS 증명이 필요하면 반환된 증명을 설정한 다음 확인 엔드포인트를 호출합니다.
- 소유권 요청이 확인된 후에만 레코드를 만들고 읽고 수정하거나 삭제합니다.
변경 기록
v1.1.0 — 영역 관리
- 즉시 및 TXT 확인 경로를 포함한 API 기반 영역 소유권 요청을 추가했습니다.
- 단일 영역 상태 및 멱등 확인 엔드포인트를 추가했습니다.
- 레코드를 자동으로 삭제하지 않는 소유권 요청 취소 기능을 추가했습니다.
- 영역 목록에 확인됨, 대기 중, 전체 필터를 추가했습니다.
v1.0.0 — 최초 릴리스
- Bearer 토큰 인증과 사용자별 영역 격리를 추가했습니다.
- 읽기 및 쓰기 범위를 추가했습니다.
- 계정, 영역 목록, 레코드 관리 엔드포인트를 추가했습니다.
- 요청 식별자를 포함한 일관된 응답 구조를 추가했습니다.