CNF API · v1

Один API для c.nf: зоны и записи 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 может попасть в журналы, заголовки источника перехода и историю браузера.

У каждого токена есть области доступа. Токен без настроенной области по умолчанию получает 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 заявляет права на зону, сервер выбирает один из следующих вариантов:

  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.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 Регистрационные сведения о домене.

Для ИИ-агентов

Направьте агента на /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. Создайте ключ API с областью dns:write на странице Учётная запись → Ключи API и скопируйте его при показе.
  2. Сохраните токен в защищённой переменной среды на своём компьютере.
  3. Вызовите GET /v1/account/me, чтобы проверить токен и его области доступа.
  4. Заявите права на зону. В ответе будет указано, требуется ли мгновенное подтверждение, подтверждение TXT или устаревшее подтверждение NS.
  5. Если требуется DNS-доказательство, выполните возвращённые инструкции, затем вызовите эндпоинт подтверждения.
  6. Создавайте, читайте, обновляйте и удаляйте записи только после подтверждения заявки.

Журнал изменений

v1.1.0 — управление зонами

  • Добавлены заявки на зоны через API, включая мгновенное подтверждение и подтверждение TXT.
  • Добавлены эндпоинты статуса одной зоны и идемпотентного подтверждения.
  • Добавлен отзыв заявки без неявного удаления записей.
  • В список зон добавлены фильтры подтверждённых, ожидающих и всех заявок.

v1.0.0 — первый выпуск

  • Добавлена аутентификация по Bearer-токену и изоляция зон по пользователям.
  • Добавлены области доступа для чтения и записи.
  • Добавлены эндпоинты учётной записи, списка зон и управления записями.
  • Добавлена единообразная оболочка ответа с идентификатором запроса.