CNF API · v1

c.nf를 위한 하나의 API입니다. DNS 영역과 레코드, 개인 파일, 패키지, 저장된 자격 증명, 도메인 조회, 그리고 계정이 필요 없는 공개 유틸리티를 다룹니다. 인증이 필요한 작업은 호출에 쓰인 키의 계정으로만 제한됩니다.

개요

버전 1은 DNS 관리에서 소유권을 확인한 영역의 DNS 작업을 제공합니다. 토큰은 계정 → API 키에서 생성하고 폐기할 수 있습니다.

콘솔과 동일한 신뢰 경계 API는 콘솔과 동일한 영역 소유권 확인을 사용합니다. 콘솔 계정에서 사용할 수 있는 영역은 API 키로도 사용할 수 있으며, 그 밖의 영역에는 403 forbidden_zone이 반환됩니다.
기계가 읽을 수 있는 엔드포인트 카탈로그가 필요하면 GET /v1?format=json을 요청하거나 /v1Accept: 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"

토큰은 단방향 해시로 저장되며 전체 값은 생성 시 한 번만 표시됩니다. 토큰을 잃어버리면 폐기하고 새 토큰을 만드세요.

Authorization 헤더만 사용하세요. 기본 인증과 쿼리 문자열 토큰은 허용되지 않습니다. URL에 포함된 토큰은 로그, 리퍼러 헤더, 브라우저 기록을 통해 유출될 수 있습니다.

각 토큰에는 범위가 있습니다. 범위가 설정되지 않은 토큰에는 기본적으로 dns:read가 부여됩니다. 쓰기 범위에는 읽기 권한도 포함됩니다.

적용 범위권한
dns:read 영역과 레코드를 나열하고 개별 레코드를 읽습니다.
dns:write DNS 레코드와 영역 소유권 요청을 읽고 만들고 수정하고 삭제합니다.
* 모든 범위를 허용합니다. 반드시 필요한 경우에만 사용하세요.

범위가 일치하지 않으면 403 forbidden_scope가 반환되며, 진단을 위해 required_scopestoken_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로 영역 소유권을 요청하면 서버는 다음 경로 중 하나를 선택합니다.

  1. 즉시 확인(method: "auto") — 다른 계정이 해당 영역의 소유권을 요청하지 않은 경우 사용합니다. 소유권 요청은 즉시 확인됩니다. 레코드는 소유자가 등록기관의 NS 위임을 반환된 네임서버로 변경한 후에만 권한을 갖습니다.
  2. TXT 확인 — 소유권 요청이 경합하는 경우 사용합니다. 반환된 TXT 값을 _cnfdns-verify.<zone>에 추가한 다음 POST /v1/dns/zones/{zone}/verify를 호출하세요.
  3. 기존 NS 확인 — 이전에 대기 중이던 소유권 요청은 verify_method: "ns"를 사용할 수 있습니다. 확인 과정에서는 영역의 실제 NS 응답을 예상 네임서버 집합과 비교합니다.
즉시 확인이 안전한 이유 c.nf에 저장된 레코드는 도메인 소유자가 등록기관에서 권한 NS 위임을 변경할 때까지 작동하지 않습니다. 최초 소유권 요청만으로는 해당 레코드를 제공할 수 없습니다.
역방향 영역 in-addr.arpaip6.arpa에도 같은 모델이 적용됩니다. 영역 소유권을 요청하고 expected_ns를 받은 다음 해당 위임 대상을 관련 등록기관에 제출하세요.

확인 작업은 멱등성을 보장합니다. 확인된 요청에 대해 반복하면 소유권 요청을 변경하지 않고 verified: true를 반환합니다.

레코드 유형 및 제한

지원되는 레코드 유형

A, AAAA, CNAME, MX, TXT, NS, SRV, CAA, PTR, SPF.

priorityMXSRV에 필요하며 다른 유형에서는 무시됩니다. 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"}'

빠른 시작

  1. dns:write 범위의 API 키를 계정 → API 키에서 만들고 표시될 때 복사합니다.
  2. 토큰을 기기의 보호된 환경 변수에 저장합니다.
  3. GET /v1/account/me를 호출하여 토큰과 범위를 확인합니다.
  4. 영역 소유권을 요청합니다. 응답에서 즉시 확인, TXT 기반 확인, 기존 NS 기반 확인 중 어떤 방식인지 알려 줍니다.
  5. DNS 증명이 필요하면 반환된 증명을 설정한 다음 확인 엔드포인트를 호출합니다.
  6. 소유권 요청이 확인된 후에만 레코드를 만들고 읽고 수정하거나 삭제합니다.

변경 기록

v1.1.0 — 영역 관리

  • 즉시 및 TXT 확인 경로를 포함한 API 기반 영역 소유권 요청을 추가했습니다.
  • 단일 영역 상태 및 멱등 확인 엔드포인트를 추가했습니다.
  • 레코드를 자동으로 삭제하지 않는 소유권 요청 취소 기능을 추가했습니다.
  • 영역 목록에 확인됨, 대기 중, 전체 필터를 추가했습니다.

v1.0.0 — 최초 릴리스

  • Bearer 토큰 인증과 사용자별 영역 격리를 추가했습니다.
  • 읽기 및 쓰기 범위를 추가했습니다.
  • 계정, 영역 목록, 레코드 관리 엔드포인트를 추가했습니다.
  • 요청 식별자를 포함한 일관된 응답 구조를 추가했습니다.