API хостингаВсё, что делает конфигуратор, — через HTTP.

Bearer-токены с выбираемыми вами областями доступа, идемпотентность на каждой записи, курсорная пагинация и эндпоинт статуса, для которого вообще не нужен ключ — потому что в момент, когда вам больше всего нужно его опросить, сломанным может оказаться как раз ваш аккаунт.

конечные точки13

Быстрый старт

SDK не нужен · Сюрпризов с версиями нет · Лимит запросов вы не встретите

Быстрый старт

Сервер с нуля — за два запроса.

Создайте ключ в личном кабинете, выберите его области действия — он покажется один раз. На этом аккаунте нет мастер-ключа и нет способа расширить права ключа задним числом — вместо этого создайте новый.

1 — посмотрите, что можно купить

curl -s https://api.dediprivacy.com/v1/plans?family=vps \
  -H "Authorization: Bearer $DP_KEY"

2 — разверните его

curl -s -X POST https://api.dediprivacy.com/v1/servers \
  -H "Authorization: Bearer $DP_KEY" \
  -H "Idempotency-Key: $(uuidgen)" \
  -H "Content-Type: application/json" \
  -d '{
        "plan":   "vps-4",
        "region": "ams",
        "image":  "debian-13",
        "cycle":  "12"
      }'

Развёртывание списывает средства с баланса аккаунта. Запрос, который увёл бы баланс в минус, завершается ошибкой с 402 и точную нехватку суммы, а не наполовину собранную машину — нет частично развёрнутого состояния, которое нужно было бы подчищать, и счёт потом не приходит.

Соглашения

Части, одинаковые для каждого обращения, решены один раз, чтобы не искать их снова.

Базовый URL
https://api.dediprivacy.com/v1 Только TLS, HTTP/2, без незашифрованного порта для редиректа. Незашифрованный запрос отклоняется, а не апгрейдится — апгрейд означает, что запрос уже один раз прошёл по сети.
Аутентификация
Bearer-токен на каждый ключ Ключи создаются в личном кабинете с выбранными вами правами доступа, показываются один раз и хранятся в виде хеша. Мастер-ключа и парольной аутентификации в этом API нет.
Тип контента
application/json На запросы и ответы. Время — в формате RFC 3339 по UTC, деньги — целое число центов, и нигде нет форматов, зависящих от локали.
Идемпотентность
Idempotency-Key в каждом POST Повторный ключ возвращает исходный ответ, а не запускает развёртывание дважды. Ключи хранятся 24 часа — дольше, чем должен работать любой цикл повторов.
Ограничение частоты запросов
600 запросов в минуту На ключ, значение возвращается в X-RateLimit-Remaining. Вызовы provisioning ограничены отдельно — 60 в час; напишите нам, если это реально мешает.
Постраничная навигация
Курсор, а не номер страницы next_cursor в каждом ответе со списком. Постраничная навигация по смещению незаметно пропускает строки при изменении набора данных, а такую ошибку мы предпочитаем вам не отдавать.

Идентификаторы

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

регион

  • kefРейкьявик
  • otpБухарест
  • sofСофия
  • kivКишинёв
  • zrhЦюрих
  • amsАмстердам
  • ptyПанама (город)
  • sinСингапур

семейство

  • vpsОблачный VPS
  • rdpWindows RDP
  • выделенныйВыделенные серверы
  • gpuGPU-вычисления
  • частное облакоЧастное облако
  • web-hostingВеб-хостинг
  • хранилищеОбъектное и блочное хранилище
  • колокацияКолокация
  • пользовательскийИндивидуальная сборка

цикл

  • 11 месяц
  • 33 месяцs, −5 %
  • 1212 месяцs, −20 %
  • 2424 месяцs, −35 %

Конечные точки

Каталог

Всё, что можно заказать, с ценами в реальном времени. Авторизация не нужна — это те же цифры, из которых строятся публичные прайс-листы.

GET /regions Список регионов

Каждый регион со своим идентификатором, городом, страной и текущим состоянием работы.

Ответ

{
  "data": [
    { "id": "ams", "city": "Амстердам", "country": "Нидерланды",
      "status": "operational", "uplink_gbit": 600 }
  ]
}
GET /plans Список тарифов

Фильтр по семейству через ?family=vps. Цены указаны за месяц в центах, без скидки за срок оплаты.

Ответ

{
  "data": [
    { "id": "vps-4", "family": "vps", "cores": 4, "ram_gb": 8,
      "disk_gb": 160, "price_cents": 1100, "regions": ["ams","kef"] }
  ],
  "next_cursor": null
}
GET /images Список образов

Образы ОС доступны для целого семейства, с указанием лицензионного статуса каждого.

Ответ

{
  "data": [
    { "id": "debian-13", "name": "Debian 13", "licence": "included" },
    { "id": "win-2025", "name": "Windows Server 2025", "licence": "included" }
  ]
}

Конечные точки

Серверы

Создавайте, просматривайте и управляйте машинами. Развёртывание списывается с баланса аккаунта; запрос, который ушёл бы в минус, завершается ошибкой 402 с точной суммой нехватки, а не наполовину построенным сервером.

POST /servers Развернуть сервер

Немедленно возвращает статус «provisioning». Опрашивайте ресурс или используйте webhook.

Запрос

{
  "plan": "vps-4",
  "region": "ams",
  "image": "debian-13",
  "cycle": "12",
  "label": "edge-01",
  "ssh_keys": ["ssh-ed25519 AAAA..."]
}

Ответ

{
  "id": "srv_8Kq2",
  "status": "provisioning",
  "region": "ams",
  "ipv4": null,
  "charged_cents": 10560,
  "renews_at": "2027-07-28T00:00:00Z"
}
GET /servers Список серверов

Всё по аккаунту, сначала новое.

Ответ

{
  "data": [
    { "id": "srv_8Kq2", "label": "edge-01", "status": "active",
      "region": "ams", "ipv4": "203.0.113.10",
      "ipv6": "2001:db8:1234:5678::2" }
  ],
  "next_cursor": null
}
GET /servers/{id} Получить сервер

Полная информация, включая спецификацию, адреса и дату следующего продления.

Ответ

{
  "id": "srv_8Kq2",
  "status": "active",
  "plan": "vps-4",
  "image": "debian-13",
  "cycle": "12",
  "renews_at": "2027-07-28T00:00:00Z"
}
POST /servers/{id}/actions Действие на сервере

Один эндпоинт, поле действия: reboot, shutdown, start, rebuild, resize, rdns.

Запрос

{
  "action": "rebuild",
  "image": "ubuntu-26-04"
}

Ответ

{
  "id": "act_3Xf9",
  "action": "rebuild",
  "status": "running"
}
DELETE /servers/{id} Отменить сервер

Действует до конца уже оплаченного срока. Передайте ?immediate=true, чтобы уничтожить сейчас и перестать платить с сегодняшнего дня.

Ответ

{
  "id": "srv_8Kq2",
  "status": "cancelled",
  "ends_at": "2027-07-28T00:00:00Z"
}

Конечные точки

Оплата

Один баланс покрывает всё. Объекта «счёт» не существует, потому что гнаться не за чем — услуга списывается с баланса в дату продления.

GET /balance Получить баланс

Текущий баланс, сумма, зарезервированная под продления, и на сколько её хватит при нынешнем расходе.

Ответ

{
  "balance_cents": 48250,
  "committed_cents": 12400,
  "runway_days": 117
}
POST /topups Открыть пополнение

Возвращает адрес для оплаты выбранным активом. Бонус, если есть, применяется в момент подтверждения платежа.

Запрос

{
  "amount_cents": 100000,
  "asset": "XMR"
}

Ответ

{
  "id": "top_5Wc1",
  "asset": "XMR",
  "address": "4A...",
  "amount": "3.417",
  "bonus_cents": 30000,
  "expires_at": "2026-07-28T18:00:00Z"
}
GET /ledger Показать записи журнала

Каждое пополнение и списание с указанием услуги, к которой оно относится. Это всё, что мы храним о ваших платежах.

Ответ

{
  "data": [
    { "at": "2026-07-28T16:04:00Z", "cents": -1100,
      "kind": "renewal", "ref": "srv_8Kq2" }
  ]
}

Конечные точки

Статус

Публичный и не требует авторизации, поэтому его может опрашивать что угодно, не имеющее вашего ключа, — и он всё равно отвечает, даже если сломан именно ваш аккаунт.

GET /status Текущее состояние

Те же цифры, что на странице статуса, вычисленные из того же журнала инцидентов.

Ответ

{
  "state": "operational",
  "open_incidents": 0,
  "uptime_90d": 99.9971,
  "regions": { "ams": "operational", "kef": "operational" }
}
GET /incidents Список инцидентов

Сам реестр с фильтром по региону и дате.

Ответ

{
  "data": [
    { "id": "inc_71", "region": "otp", "severity": "partial",
      "started_at": "2026-06-07T02:14:00Z",
      "unreachable_seconds": 1080 }
  ]
}

Ошибки

У каждого сбоя есть стабильный код и сообщение, написанное для человека. Совпадение — по коду; текст сообщения можно улучшать.

400 invalid_request Тело запроса не разобралось, или поле имеет неверный тип. В сообщении указано, какое именно.
401 без аутентификации Отсутствие ключа, некорректный ключ или ключ, который отозван.
403 scope_missing Ключ действителен, но создан без области доступа, необходимой для этого вызова. Область задаётся при создании ключа и не расширяется постфактум.
402 insufficient_funds Баланса не хватает. В ответе передаются required_cents и balance_cents, так что действовать можно без повторного запроса.
404 not_found Такого ресурса на этом аккаунте нет. Ответ намеренно идентичен ответу для ресурса на чужом аккаунте.
409 конфликт Ресурс занят — обычно на этом сервере уже выполняется другое действие.
422 недоступно Допустимо, но сейчас невозможно: тариф закончился в этом регионе, либо образ не предлагается для этого семейства.
429 rate_limited Retry-After установлен, и это точное значение, а не константа.
5xx server_error Наш. Повтор с тем же Idempotency-Key безопасен — именно для этого он и нужен.

A 404 для ресурса на чужом аккаунте побайтово совпадает с ответом для ресурса, которого никогда не существовало. Это сделано намеренно: различимые ответы превращают API в оракул для перебора чужой инфраструктуры.