CNF API · v1

面向 c.nf 的一套 API:DNS 区域与记录、个人文件、软件包、已保存的凭据、域名查询,以及若干完全不需要账号的公共工具。任何需要认证的操作,都只作用于发起调用的那把密钥所属的账号。

概览

第 1 版提供你通过 DNS 管理认领之区域的 DNS 操作。请在 账户 → API 密钥下建立及撤销令牌。

信任边界与控制台相同。 API 使用控制台的已验证区域拥有权检查。控制台账户可用的区域也可供 API 密钥使用;其他区域均返回 403 forbidden_zone
如需机器可读的端点目录,请请求 GET /v1?format=json,或将 Accept: application/json 传送至 /v1

基础 URL 及版本管理

https://api.c.nf/v1

所有端点均位于 /v1 之下。破坏兼容性的变更会使用新的主要版本路径。v1 可新增向后兼容的字段及端点,并会记录于变更记录。

身份验证及范围

每项读取或更改账户数据的请求都必须包含 Bearer 令牌。令牌以 cnf_ 开头,后接 32 个十六进制字符。

curl https://api.c.nf/v1/dns/zones \
  -H "Authorization: Bearer cnf_a1b2c3d4e5f60718293a4b5c6d7e8f90"

令牌会以单向哈希形式存储,完整值只在建立时显示。如果丢失令牌,请撤销并另行建立。

只使用 Authorization 标头。 不接受基本身份验证及查询字符串令牌。URL 中的令牌可能会通过记录、Referrer 标头及浏览器记录泄露。

每个令牌都带有范围。未设置范围的令牌默认获得 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 验证 — 用于有争议的认领。请在 _cnfdns-verify.<zone> 新增返回的 TXT 值,然后调用 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 立即把文件从边缘缓存中移除。

短信转发

从手机转发过来的消息,以及放行它的密钥。

方法路径范围用途
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 删除站点及其文件。

部署

你已部署的表单、Webhook 与短链接端点。

方法路径范围用途
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 — 区域管理

  • 新增以 API 认领区域,包括即时及 TXT 验证流程。
  • 新增单个区域状态及幂等验证端点。
  • 新增撤销认领功能,而不会一并删除记录。
  • 在区域清单新增已验证、待处理及全部筛选器。

v1.0.0 — 首次发布

  • 新增 Bearer 令牌身份验证及按用户隔离区域。
  • 新增读取及写入范围。
  • 新增账户、区域清单及记录管理端点。
  • 新增包含请求识别码的一致响应封装。