Документация / Справочник API

Справочник API. Всё, что можно сделать токеном.

92 ручек: проекты, сервисы, деплои, переменные, логи, откат. Список собирается из кода платформы при каждом релизе, поэтому совпадает с тем, что API принимает на самом деле.

Основы

Адрес API — https://prichal.tech/api. Токен выпускается в «Настройки → Интеграции → API-токены» и передаётся заголовком Authorization: Bearer pat_…. Тела запросов и ответов — JSON. Как выпустить токен и задеплоить из CI — в быстром старте.

Проверка токена
curl -H "Authorization: Bearer $PRICHAL_TOKEN" https://prichal.tech/api/projects/

Токен с правом «только чтение» вызывает только GET. Токен, ограниченный проектом, видит только этот проект: остальные для него не существуют (404). Аккаунт, оплата, админка и сами токены токену недоступны — только через панель.

Ошибки

Ответ с ошибкой — JSON с полем detail: строка для человека или, при 422, список полей с причинами.

403
{ "detail": "Токен только для чтения." }
400Запрос понятен, но действие сейчас невозможно: сервис выключен, не настроен и т. п. Причина — в detail.
401Нет токена, токен отозван или истёк срок.
403Токен только для чтения, а запрос меняет данные; раздел закрыт для токенов; мало прав в проекте.
404Объекта нет — или он в проекте, к которому у токена нет доступа (существование не подтверждаем).
409Конфликт состояния: например, имя уже занято или идёт другая операция.
422Неверные параметры или тело запроса. В detail — какое поле и что не так.
429Слишком часто: общий предел — 300 запросов в минуту с одного адреса; у сборок — своя квота.
503Кластер временно недоступен или в нём нет места. Повторите позже.

Аккаунт

GET/auth/me

Кто владелец токена: id, email, имя. Удобно проверить, что токен рабочий.

Токен: чтение или запись · Ответ 200 · Ошибки: 401, 403, 429

Пример ответа 200
200 · application/json
{
  "id": 1,
  "username": "dev",
  "email": "dev@studio.ru",
  "is_admin": false,
  "is_demo": false,
  "email_verified": false,
  "two_factor_enabled": false
}

Проекты

GET/projects/

Список проектов, доступных токену (токен одного проекта видит только его).

Токен: чтение или запись · Ответ 200 · Ошибки: 401, 403, 429

Пример ответа 200
200 · application/json
[
  {
    "id": 1,
    "name": "api",
    "repo_url": "https://…",
    "branch": "main",
    "runtime": "python",
    "service_count": 0,
    "services_enabled": 0,
    "services_running": 0,
    "k3s_namespace": "…",
    "url": "https://shop-api.prichal.app",
    "last_deploy_status": "…",
    "last_deploy_at": "2026-10-19T12:00:00Z",
    "deploy_count": 0,
    "success_rate": 0,
    "manifest_analyzed": false,
    "manifest_confirmed": false,
    "is_monorepo": false,
    "auto_deploy": true,
    "bot": {
      "service_id": 1,
      "username": "dev",
      "mode": "…",
      "health": "…",
      "enabled": true
    },
    "update_available": false,
    "awaiting_payment": false,
    "pending_commit_sha": "…",
    "pending_update_at": "2026-10-19T12:00:00Z",
    "recent_releases": [],
    "my_role": "…"
  }
]

POST/projects/

Создать проект из репозитория GitHub.

Токен: только с правом записи · Ответ 201 · Ошибки: 401, 403, 422, 429

ПараметрГдеТип
name *телоstring
source_typeтелоstring
repo_urlтелоstring
branchтелоstring
image_refтелоstring
runtimeтелоstring
portтелоint
sizeтелоstring
service_kindтелоstring
storage_gbтелоint
is_publicтелоbool
env_varsтелоobject
server_idтелоint
Тело запроса, пример
{
  "name": "api",
  "source_type": "repo",
  "repo_url": "https://…",
  "branch": "main",
  "image_ref": "…",
  "runtime": "python",
  "port": 8080,
  "size": "standard",
  "service_kind": "stateless",
  "storage_gb": 0,
  "is_public": true,
  "env_vars": {
    "KEY": "…"
  },
  "server_id": 1
}
Пример ответа 201
201 · application/json
{
  "id": 1,
  "name": "api",
  "repo_url": "https://…",
  "branch": "main",
  "runtime": "python",
  "service_count": 0,
  "services_enabled": 0,
  "services_running": 0,
  "k3s_namespace": "…",
  "url": "https://shop-api.prichal.app",
  "last_deploy_status": "…",
  "last_deploy_at": "2026-10-19T12:00:00Z",
  "deploy_count": 0,
  "success_rate": 0,
  "manifest_analyzed": false,
  "manifest_confirmed": false,
  "is_monorepo": false,
  "auto_deploy": true,
  "bot": {
    "service_id": 1,
    "username": "dev",
    "mode": "…",
    "health": "…",
    "enabled": true
  },
  "update_available": false,
  "awaiting_payment": false,
  "pending_commit_sha": "…",
  "pending_update_at": "2026-10-19T12:00:00Z",
  "recent_releases": [],
  "my_role": "…"
}

POST/projects/bot

Создать проект Telegram-бота (устаревший мастер, оставлен для совместимости).

Токен: только с правом записи · Ответ 201 · Ошибки: 401, 403, 422, 429, 502

ПараметрГдеТип
name *телоstring
repo_url *телоstring
branchтелоstring
token *телоstring
server_idтелоint
Тело запроса, пример
{
  "name": "api",
  "repo_url": "https://…",
  "branch": "main",
  "token": "…",
  "server_id": 1
}
Пример ответа 201
201 · application/json
{
  "id": 1,
  "name": "api",
  "repo_url": "https://…",
  "branch": "main",
  "runtime": "python",
  "service_count": 0,
  "services_enabled": 0,
  "services_running": 0,
  "k3s_namespace": "…",
  "url": "https://shop-api.prichal.app",
  "last_deploy_status": "…",
  "last_deploy_at": "2026-10-19T12:00:00Z",
  "deploy_count": 0,
  "success_rate": 0,
  "manifest_analyzed": false,
  "manifest_confirmed": false,
  "is_monorepo": false,
  "auto_deploy": true,
  "bot": {
    "service_id": 1,
    "username": "dev",
    "mode": "…",
    "health": "…",
    "enabled": true
  },
  "update_available": false,
  "awaiting_payment": false,
  "pending_commit_sha": "…",
  "pending_update_at": "2026-10-19T12:00:00Z",
  "recent_releases": [],
  "my_role": "…"
}

GET/projects/showcase

Демо-проект для аккаунтов без тарифа и признак, можно ли этому аккаунту деплоить.

Токен: чтение или запись · Ответ 200 · Ошибки: 401, 403, 429

Схема ответа 200 пока не описана — смотрите ответ на живом запросе.

DELETE/projects/{project_id}

Удалить проект со всеми сервисами и базами. Необратимо.

Токен: только с правом записи · Ответ 204 · Ошибки: 401, 403, 404, 422, 429

ПараметрГдеТип
project_id *путьint

Ответ 204 — без тела.

GET/projects/{project_id}

Проект: репозиторий, ветка, статус последнего деплоя, сервисы.

Токен: чтение или запись · Ответ 200 · Ошибки: 401, 403, 404, 422, 429

ПараметрГдеТип
project_id *путьint
Пример ответа 200
200 · application/json
{
  "id": 1,
  "name": "api",
  "repo_url": "https://…",
  "branch": "main",
  "runtime": "python",
  "service_count": 0,
  "services_enabled": 0,
  "services_running": 0,
  "k3s_namespace": "…",
  "url": "https://shop-api.prichal.app",
  "last_deploy_status": "…",
  "last_deploy_at": "2026-10-19T12:00:00Z",
  "deploy_count": 0,
  "success_rate": 0,
  "manifest_analyzed": false,
  "manifest_confirmed": false,
  "is_monorepo": false,
  "auto_deploy": true,
  "bot": {
    "service_id": 1,
    "username": "dev",
    "mode": "…",
    "health": "…",
    "enabled": true
  },
  "update_available": false,
  "awaiting_payment": false,
  "pending_commit_sha": "…",
  "pending_update_at": "2026-10-19T12:00:00Z",
  "recent_releases": [],
  "my_role": "…"
}

PUT/projects/{project_id}

Изменить настройки проекта: имя, ветку, автодеплой.

Токен: только с правом записи · Ответ 200 · Ошибки: 401, 403, 404, 409, 422, 429

ПараметрГдеТип
project_id *путьint
nameтелоstring
branchтелоstring
runtimeтелоstring
auto_deployтелоbool
Тело запроса, пример
{
  "name": "api",
  "branch": "main",
  "runtime": "python",
  "auto_deploy": true
}
Пример ответа 200
200 · application/json
{
  "id": 1,
  "name": "api",
  "repo_url": "https://…",
  "branch": "main",
  "runtime": "python",
  "service_count": 0,
  "services_enabled": 0,
  "services_running": 0,
  "k3s_namespace": "…",
  "url": "https://shop-api.prichal.app",
  "last_deploy_status": "…",
  "last_deploy_at": "2026-10-19T12:00:00Z",
  "deploy_count": 0,
  "success_rate": 0,
  "manifest_analyzed": false,
  "manifest_confirmed": false,
  "is_monorepo": false,
  "auto_deploy": true,
  "bot": {
    "service_id": 1,
    "username": "dev",
    "mode": "…",
    "health": "…",
    "enabled": true
  },
  "update_available": false,
  "awaiting_payment": false,
  "pending_commit_sha": "…",
  "pending_update_at": "2026-10-19T12:00:00Z",
  "recent_releases": [],
  "my_role": "…"
}

POST/projects/{project_id}/deploy

Собрать и выкатить все включённые сервисы проекта.

Токен: только с правом записи · Ответ 201 · Ошибки: 400, 401, 403, 404, 422, 429, 503

ПараметрГдеТип
project_id *путьint
Пример ответа 201
201 · application/json
{
  "deployment_ids": [
    812,
    813
  ],
  "services_count": 2,
  "skipped_unconfirmed": []
}

GET/projects/{project_id}/deployments

История деплоев проекта; service_id сужает до одного сервиса.

Токен: чтение или запись · Ответ 200 · Ошибки: 401, 403, 404, 422, 429

ПараметрГдеТип
project_id *путьint
service_idзапросint
limitзапросintпо умолчанию 20
Пример ответа 200
200 · application/json
[
  {
    "id": 1,
    "project_id": 1,
    "service_id": 1,
    "commit_sha": "3f9c2a17",
    "status": "running",
    "logs": "…",
    "pod_name": "…",
    "url": "https://shop-api.prichal.app",
    "pipeline_steps": [],
    "created_at": "2026-10-19T12:00:00Z",
    "updated_at": "2026-10-19T12:00:00Z",
    "project_name": "shop",
    "service_name": "api",
    "kind": "deploy",
    "actor_name": "…",
    "commit_message": "…",
    "queue_position": 1
  }
]

POST/projects/{project_id}/duplicate

Копия проекта (например, для staging): те же сервисы и настройки, пустые базы, без деплоя.

Токен: только с правом записи · Ответ 201 · Ошибки: 401, 403, 404, 422, 429

ПараметрГдеТип
project_id *путьint
name *телоstring
branchтелоstring
copy_envтелоbool
Тело запроса, пример
{
  "name": "api",
  "branch": "main",
  "copy_env": false
}
Пример ответа 201
201 · application/json
{
  "id": 1,
  "name": "api",
  "repo_url": "https://…",
  "branch": "main",
  "runtime": "python",
  "service_count": 0,
  "services_enabled": 0,
  "services_running": 0,
  "k3s_namespace": "…",
  "url": "https://shop-api.prichal.app",
  "last_deploy_status": "…",
  "last_deploy_at": "2026-10-19T12:00:00Z",
  "deploy_count": 0,
  "success_rate": 0,
  "manifest_analyzed": false,
  "manifest_confirmed": false,
  "is_monorepo": false,
  "auto_deploy": true,
  "bot": {
    "service_id": 1,
    "username": "dev",
    "mode": "…",
    "health": "…",
    "enabled": true
  },
  "update_available": false,
  "awaiting_payment": false,
  "pending_commit_sha": "…",
  "pending_update_at": "2026-10-19T12:00:00Z",
  "recent_releases": [],
  "my_role": "…"
}

GET/projects/{project_id}/env

Общие переменные проекта, значения скрыты.

Токен: чтение или запись · Ответ 200 · Ошибки: 401, 403, 404, 422, 429

ПараметрГдеТип
project_id *путьint
Пример ответа 200
200 · application/json
{
  "env_vars_masked": {
    "SENTRY_DSN": "••••••"
  },
  "count": 1
}

PUT/projects/{project_id}/env

Заменить общие переменные проекта целиком (не слияние).

Токен: только с правом записи · Ответ 200 · Ошибки: 401, 403, 404, 422, 429

ПараметрГдеТип
project_id *путьint
env_varsтелоobject
dotenvтелоstring
Тело запроса, пример
{
  "env_vars": {
    "KEY": "…"
  },
  "dotenv": "…"
}

Схема ответа 200 пока не описана — смотрите ответ на живом запросе.

GET/projects/{project_id}/env/reveal

Общие переменные проекта с открытыми значениями.

Токен: чтение или запись · Ответ 200 · Ошибки: 401, 403, 404, 422, 429

ПараметрГдеТип
project_id *путьint
Пример ответа 200
200 · application/json
{
  "env_vars": {
    "SENTRY_DSN": "https://…"
  }
}

POST/projects/{project_id}/update

Выкатить коммиты, пришедшие при выключенном автодеплое.

Токен: только с правом записи · Ответ 201 · Ошибки: 400, 401, 403, 404, 422, 429, 503

ПараметрГдеТип
project_id *путьint

Схема ответа 201 пока не описана — смотрите ответ на живом запросе.

Сервисы

GET/projects/{project_id}/services/

Сервисы проекта: имя, размер, адрес, статус.

Токен: чтение или запись · Ответ 200 · Ошибки: 401, 403, 404, 422, 429

ПараметрГдеТип
project_id *путьint
Пример ответа 200
200 · application/json
[
  {
    "id": 1,
    "project_id": 1,
    "name": "api",
    "k8s_name": "…",
    "dns_name": "",
    "subdomain": "",
    "subdomain_taken": false,
    "url": "https://shop-api.prichal.app",
    "is_public": true,
    "internal_host": "",
    "internal_address": "",
    "internal_url": "",
    "source_type": "…",
    "repo_url": "https://…",
    "branch": "main",
    "image_ref": "…",
    "path": "…",
    "dockerfile_path": "…",
    "entrypoint": "…",
    "entrypoint_command": "…",
    "runtime": "python",
    "framework": "fastapi",
    "port": 1,
    "enabled": true,
    "deploy_order": 1,
    "size": "standard",
    "service_kind": "…",
    "storage_gb": 1,
    "storage_path": "…",
    "monthly_cost": 1,
    "env_vars_masked": {},
    "manifest_analyzed": false,
    "manifest_confirmed": false,
    "auto_deploy": true,
    "update_available": false,
    "pending_commit_sha": "…",
    "pending_update_at": "2026-10-19T12:00:00Z",
    "app_type": "web",
    "bot_mode": "…",
    "bot_username": "…",
    "bot_health": "…",
    "bot_health_hint": "…",
    "bot_restart_count": 0,
    "bot_last_log_at": "2026-10-19T12:00:00Z",
    "healthcheck_path": "…",
    "auto_rollback": false,
    "auto_rollback_minutes": 5,
    "migrate_command": "…",
    "confirm_migrations": true
  }
]

POST/projects/{project_id}/services/

Добавить сервис: из другого репозитория, из папки того же или из готового образа.

Токен: только с правом записи · Ответ 201 · Ошибки: 401, 403, 404, 409, 422, 429, 503

ПараметрГдеТип
project_id *путьint
name *телоstring
source_typeтелоstring
repo_urlтелоstring
branchтелоstring
image_refтелоstring
pathтелоstring
dockerfile_pathтелоstring
portтелоint
is_publicтелоbool
sizeтелоstring
service_kindтелоstring
storage_gbтелоint
storage_pathтелоstring
env_varsтелоobject
Тело запроса, пример
{
  "name": "api",
  "source_type": "repo",
  "repo_url": "https://…",
  "branch": "main",
  "image_ref": "…",
  "path": ".",
  "dockerfile_path": "…",
  "port": 8080,
  "is_public": true,
  "size": "standard",
  "service_kind": "stateless",
  "storage_gb": 0,
  "storage_path": "/data",
  "env_vars": {}
}
Пример ответа 201
201 · application/json
{
  "id": 1,
  "project_id": 1,
  "name": "api",
  "k8s_name": "…",
  "dns_name": "",
  "subdomain": "",
  "subdomain_taken": false,
  "url": "https://shop-api.prichal.app",
  "is_public": true,
  "internal_host": "",
  "internal_address": "",
  "internal_url": "",
  "source_type": "…",
  "repo_url": "https://…",
  "branch": "main",
  "image_ref": "…",
  "path": "…",
  "dockerfile_path": "…",
  "entrypoint": "…",
  "entrypoint_command": "…",
  "runtime": "python",
  "framework": "fastapi",
  "port": 1,
  "enabled": true,
  "deploy_order": 1,
  "size": "standard",
  "service_kind": "…",
  "storage_gb": 1,
  "storage_path": "…",
  "monthly_cost": 1,
  "env_vars_masked": {},
  "manifest_analyzed": false,
  "manifest_confirmed": false,
  "auto_deploy": true,
  "update_available": false,
  "pending_commit_sha": "…",
  "pending_update_at": "2026-10-19T12:00:00Z",
  "app_type": "web",
  "bot_mode": "…",
  "bot_username": "…",
  "bot_health": "…",
  "bot_health_hint": "…",
  "bot_restart_count": 0,
  "bot_last_log_at": "2026-10-19T12:00:00Z",
  "healthcheck_path": "…",
  "auto_rollback": false,
  "auto_rollback_minutes": 5,
  "migrate_command": "…",
  "confirm_migrations": true
}

DELETE/projects/{project_id}/services/{service_id}

Удалить сервис и остановить его.

Токен: только с правом записи · Ответ 204 · Ошибки: 401, 403, 404, 422, 429

ПараметрГдеТип
project_id *путьint
service_id *путьint

Ответ 204 — без тела.

PATCH/projects/{project_id}/services/{service_id}

Включить или выключить сервис, сменить порт или команду запуска.

Токен: только с правом записи · Ответ 200 · Ошибки: 401, 403, 404, 409, 422, 429, 503

ПараметрГдеТип
project_id *путьint
service_id *путьint
enabledтелоbool
portтелоint
entrypoint_commandтелоstring
nameтелоstring
branchтелоstring
repo_urlтелоstring
pathтелоstring
dockerfile_pathтелоstring
auto_deployтелоbool
is_publicтелоbool
sizeтелоstring
service_kindтелоstring
storage_gbтелоint
storage_pathтелоstring
confirm_disk_deletionтелоbool
healthcheck_pathтелоstring
auto_rollbackтелоbool
auto_rollback_minutesтелоint
migrate_commandтелоstring
confirm_migrationsтелоbool
Тело запроса, пример
{
  "enabled": true,
  "port": 1,
  "entrypoint_command": "…",
  "name": "api",
  "branch": "main",
  "repo_url": "https://…",
  "path": "…",
  "dockerfile_path": "…",
  "auto_deploy": true,
  "is_public": true,
  "size": "standard",
  "service_kind": "…",
  "storage_gb": 1,
  "storage_path": "…",
  "confirm_disk_deletion": false,
  "healthcheck_path": "…",
  "auto_rollback": true,
  "auto_rollback_minutes": 1,
  "migrate_command": "…",
  "confirm_migrations": true
}
Пример ответа 200
200 · application/json
{
  "id": 1,
  "project_id": 1,
  "name": "api",
  "k8s_name": "…",
  "dns_name": "",
  "subdomain": "",
  "subdomain_taken": false,
  "url": "https://shop-api.prichal.app",
  "is_public": true,
  "internal_host": "",
  "internal_address": "",
  "internal_url": "",
  "source_type": "…",
  "repo_url": "https://…",
  "branch": "main",
  "image_ref": "…",
  "path": "…",
  "dockerfile_path": "…",
  "entrypoint": "…",
  "entrypoint_command": "…",
  "runtime": "python",
  "framework": "fastapi",
  "port": 1,
  "enabled": true,
  "deploy_order": 1,
  "size": "standard",
  "service_kind": "…",
  "storage_gb": 1,
  "storage_path": "…",
  "monthly_cost": 1,
  "env_vars_masked": {},
  "manifest_analyzed": false,
  "manifest_confirmed": false,
  "auto_deploy": true,
  "update_available": false,
  "pending_commit_sha": "…",
  "pending_update_at": "2026-10-19T12:00:00Z",
  "app_type": "web",
  "bot_mode": "…",
  "bot_username": "…",
  "bot_health": "…",
  "bot_health_hint": "…",
  "bot_restart_count": 0,
  "bot_last_log_at": "2026-10-19T12:00:00Z",
  "healthcheck_path": "…",
  "auto_rollback": false,
  "auto_rollback_minutes": 5,
  "migrate_command": "…",
  "confirm_migrations": true
}

GET/projects/{project_id}/services/{service_id}/bot/health

Здоровье Telegram-бота: отвечает ли он, нет ли конфликта вебхука.

Токен: чтение или запись · Ответ 200 · Ошибки: 401, 403, 404, 422, 429

ПараметрГдеТип
project_id *путьint
service_id *путьint
Пример ответа 200
200 · application/json
{
  "state": "…",
  "hint": "…",
  "restart_count": 0,
  "last_log_at": "2026-10-19T12:00:00Z",
  "checked_at": "2026-10-19T12:00:00Z",
  "username": "dev",
  "mode": "…"
}

POST/projects/{project_id}/services/{service_id}/bot/rerun

Повторить подготовку Telegram-бота: анализ → настройка → деплой.

Токен: только с правом записи · Ответ 202 · Ошибки: 400, 401, 403, 404, 422, 429

ПараметрГдеТип
project_id *путьint
service_id *путьint

Схема ответа 202 пока не описана — смотрите ответ на живом запросе.

POST/projects/{project_id}/services/{service_id}/bot/reset-webhook

Снять вебхук в Telegram, если бот в режиме polling молчит.

Токен: только с правом записи · Ответ 200 · Ошибки: 401, 403, 404, 422, 429, 502

ПараметрГдеТип
project_id *путьint
service_id *путьint

Схема ответа 200 пока не описана — смотрите ответ на живом запросе.

PUT/projects/{project_id}/services/{service_id}/bot/settings

Режим Telegram-бота (polling или webhook), команда запуска, диск.

Токен: только с правом записи · Ответ 200 · Ошибки: 401, 403, 404, 422, 429

ПараметрГдеТип
project_id *путьint
service_id *путьint
bot_modeтелоstring
entrypoint_commandтелоstring
storage_gbтелоint
confirm_disk_deletionтелоbool
Тело запроса, пример
{
  "bot_mode": "…",
  "entrypoint_command": "…",
  "storage_gb": 1,
  "confirm_disk_deletion": false
}
Пример ответа 200
200 · application/json
{
  "id": 1,
  "project_id": 1,
  "name": "api",
  "k8s_name": "…",
  "dns_name": "",
  "subdomain": "",
  "subdomain_taken": false,
  "url": "https://shop-api.prichal.app",
  "is_public": true,
  "internal_host": "",
  "internal_address": "",
  "internal_url": "",
  "source_type": "…",
  "repo_url": "https://…",
  "branch": "main",
  "image_ref": "…",
  "path": "…",
  "dockerfile_path": "…",
  "entrypoint": "…",
  "entrypoint_command": "…",
  "runtime": "python",
  "framework": "fastapi",
  "port": 1,
  "enabled": true,
  "deploy_order": 1,
  "size": "standard",
  "service_kind": "…",
  "storage_gb": 1,
  "storage_path": "…",
  "monthly_cost": 1,
  "env_vars_masked": {},
  "manifest_analyzed": false,
  "manifest_confirmed": false,
  "auto_deploy": true,
  "update_available": false,
  "pending_commit_sha": "…",
  "pending_update_at": "2026-10-19T12:00:00Z",
  "app_type": "web",
  "bot_mode": "…",
  "bot_username": "…",
  "bot_health": "…",
  "bot_health_hint": "…",
  "bot_restart_count": 0,
  "bot_last_log_at": "2026-10-19T12:00:00Z",
  "healthcheck_path": "…",
  "auto_rollback": false,
  "auto_rollback_minutes": 5,
  "migrate_command": "…",
  "confirm_migrations": true
}

PUT/projects/{project_id}/services/{service_id}/bot/token

Сохранить токен Telegram-бота (проверяется у Telegram).

Токен: только с правом записи · Ответ 200 · Ошибки: 401, 403, 404, 422, 429, 502

ПараметрГдеТип
project_id *путьint
service_id *путьint
token *телоstring
Тело запроса, пример
{
  "token": "…"
}
Пример ответа 200
200 · application/json
{
  "username": "dev",
  "first_name": "…",
  "env_name": "…"
}

POST/projects/{project_id}/services/{service_id}/deploy

Собрать свежий коммит ветки сервиса и выкатить.

Токен: только с правом записи · Ответ 201 · Ошибки: 400, 401, 403, 404, 422, 429, 503

ПараметрГдеТип
project_id *путьint
service_id *путьint
Пример ответа 201
201 · application/json
{
  "status": "queued",
  "deployment_ids": [
    814
  ],
  "affected_services": [
    "api"
  ]
}

GET/projects/{project_id}/services/{service_id}/env

Переменные окружения сервиса с открытыми значениями.

Токен: чтение или запись · Ответ 200 · Ошибки: 401, 403, 404, 422, 429

ПараметрГдеТип
project_id *путьint
service_id *путьint
Пример ответа 200
200 · application/json
{
  "env_vars": {
    "KEY": "…"
  }
}

PUT/projects/{project_id}/services/{service_id}/env

Заменить переменные сервиса целиком (не слияние: отсутствующие ключи удаляются).

Токен: только с правом записи · Ответ 200 · Ошибки: 401, 403, 404, 422, 429

ПараметрГдеТип
project_id *путьint
service_id *путьint
env_varsтелоobject
dotenvтелоstring
Тело запроса, пример
{
  "env_vars": {
    "KEY": "…"
  },
  "dotenv": "…"
}
Пример ответа 200
200 · application/json
{
  "env_vars_masked": {
    "KEY": "…"
  },
  "count": 1,
  "requires_redeploy": true,
  "affected_services": [],
  "diff": {},
  "unresolved_refs": []
}

GET/projects/{project_id}/services/{service_id}/logs

Логи работающего приложения: последние tail строк.

Токен: чтение или запись · Ответ 200 · Ошибки: 401, 403, 404, 422, 429, 503

ПараметрГдеТип
project_id *путьint
service_id *путьint
tailзапросintпо умолчанию 200
previousзапросboolпо умолчанию false
Пример ответа 200
200 · application/json
{
  "logs": "…",
  "pod": "…",
  "phase": "no_pods",
  "deployed": false,
  "error": "…",
  "restarts": 0,
  "started_at": "2026-10-19T12:00:00Z"
}

GET/projects/{project_id}/services/{service_id}/logs/history

Сохранённые логи приложения за последние часы.

Токен: чтение или запись · Ответ 200 · Ошибки: 401, 403, 404, 422, 429

ПараметрГдеТип
project_id *путьint
service_id *путьint
hoursзапросintпо умолчанию 72

Схема ответа 200 пока не описана — смотрите ответ на живом запросе.

GET/projects/{project_id}/services/{service_id}/metrics

CPU и память сервиса сейчас и занятый диск.

Токен: чтение или запись · Ответ 200 · Ошибки: 401, 403, 404, 422, 429

ПараметрГдеТип
project_id *путьint
service_id *путьint
Пример ответа 200
200 · application/json
{
  "cpu": {
    "used_m": 0.5,
    "limit_m": 1,
    "percent": 0.5
  },
  "memory": {
    "used_mb": 1,
    "limit_mb": 1,
    "percent": 0.5
  },
  "pods": 0,
  "reason": "…",
  "disk": {
    "used_bytes": 1,
    "capacity_bytes": 1,
    "percent": 0.5,
    "collected_at": "2026-10-19T12:00:00Z"
  },
  "disk_reason": "…"
}

GET/projects/{project_id}/services/{service_id}/platform-env

Переменные, которые сервис получает от платформы: доступы к базам (под маской) и адреса соседних сервисов.

Токен: чтение или запись · Ответ 200 · Ошибки: 401, 403, 404, 422, 429

ПараметрГдеТип
project_id *путьint
service_id *путьint
Пример ответа 200
200 · application/json
[
  {
    "key": "…",
    "value": "…",
    "source": "…",
    "secret": true,
    "user_defined": true
  }
]

POST/projects/{project_id}/services/{service_id}/restart

Перезапустить сервис без пересборки — подхватит новые переменные.

Токен: только с правом записи · Ответ 202 · Ошибки: 400, 401, 403, 404, 422, 429

ПараметрГдеТип
project_id *путьint
service_id *путьint
Пример ответа 202
202 · application/json
{
  "status": "restarting",
  "deployment_ids": [
    815
  ]
}

POST/projects/{project_id}/services/{service_id}/update

Выкатить коммит, пришедший при выключенном автодеплое сервиса.

Токен: только с правом записи · Ответ 201 · Ошибки: 400, 401, 403, 404, 422, 429, 503

ПараметрГдеТип
project_id *путьint
service_id *путьint

Схема ответа 201 пока не описана — смотрите ответ на живом запросе.

GET/projects/{project_id}/services/{service_id}/volume-backups

Суточные архивы диска сервиса.

Токен: чтение или запись · Ответ 200 · Ошибки: 401, 403, 404, 422, 429

ПараметрГдеТип
project_id *путьint
service_id *путьint

Схема ответа 200 пока не описана — смотрите ответ на живом запросе.

POST/projects/{project_id}/services/{service_id}/volume-backups/{backup_id}/download

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

Токен: только с правом записи · Ответ 200 · Ошибки: 401, 403, 404, 409, 410, 422, 429, 503

ПараметрГдеТип
project_id *путьint
service_id *путьint
backup_id *путьint

Схема ответа 200 пока не описана — смотрите ответ на живом запросе.

Деплои

GET/deployments/ai/status

Включены ли ИИ-подсказки к упавшим деплоям.

Токен: чтение или запись · Ответ 200 · Ошибки: 401, 403, 429

Пример ответа 200
200 · application/json
{
  "enabled": true
}

GET/deployments/recent

Последние деплои по всем доступным проектам.

Токен: чтение или запись · Ответ 200 · Ошибки: 401, 403, 422, 429

ПараметрГдеТип
limitзапросintпо умолчанию 20
Пример ответа 200
200 · application/json
[
  {
    "id": 1,
    "project_id": 1,
    "service_id": 1,
    "commit_sha": "3f9c2a17",
    "status": "running",
    "logs": "…",
    "pod_name": "…",
    "url": "https://shop-api.prichal.app",
    "pipeline_steps": [],
    "created_at": "2026-10-19T12:00:00Z",
    "updated_at": "2026-10-19T12:00:00Z",
    "project_name": "shop",
    "service_name": "api",
    "kind": "deploy",
    "actor_name": "…",
    "commit_message": "…",
    "queue_position": 1
  }
]

GET/deployments/recent/hints

ИИ-подсказки к последним упавшим деплоям.

Токен: чтение или запись · Ответ 200 · Ошибки: 401, 403, 422, 429

ПараметрГдеТип
limitзапросintпо умолчанию 10
Пример ответа 200
200 · application/json
[
  {
    "id": 1,
    "deployment_id": 1,
    "hint_type": "…",
    "content": {},
    "created_at": "2026-10-19T12:00:00Z"
  }
]

GET/deployments/{deployment_id}

Деплой: статус, шаги, лог сборки. Опрашивайте, чтобы дождаться исхода.

Токен: чтение или запись · Ответ 200 · Ошибки: 401, 403, 404, 422, 429

ПараметрГдеТип
deployment_id *путьint
Пример ответа 200
200 · application/json
{
  "id": 1,
  "project_id": 1,
  "service_id": 1,
  "commit_sha": "3f9c2a17",
  "status": "running",
  "logs": "…",
  "pod_name": "…",
  "url": "https://shop-api.prichal.app",
  "pipeline_steps": [],
  "created_at": "2026-10-19T12:00:00Z",
  "updated_at": "2026-10-19T12:00:00Z",
  "project_name": "shop",
  "service_name": "api",
  "kind": "deploy",
  "actor_name": "…",
  "commit_message": "…",
  "queue_position": 1
}

GET/deployments/{deployment_id}/hints

ИИ-подсказки к этому деплою.

Токен: чтение или запись · Ответ 200 · Ошибки: 401, 403, 404, 422, 429

ПараметрГдеТип
deployment_id *путьint
Пример ответа 200
200 · application/json
[
  {
    "id": 1,
    "deployment_id": 1,
    "hint_type": "…",
    "content": {},
    "created_at": "2026-10-19T12:00:00Z"
  }
]

Релизы, откат и журнал

GET/projects/{project_id}/audit

Журнал действий в проекте: кто, что и когда.

Токен: чтение или запись · Ответ 200 · Ошибки: 401, 403, 404, 422, 429

ПараметрГдеТип
project_id *путьint
limitзапросintпо умолчанию 100
beforeзапросint
service_idзапросint
Пример ответа 200
200 · application/json
[
  {
    "id": 1,
    "created_at": "2026-10-19T12:00:00Z",
    "actor": "…",
    "ip": "…",
    "action": "…",
    "action_label": "…",
    "service_id": 1,
    "service_name": "api",
    "result": "…",
    "summary": "…",
    "details": {}
  }
]

GET/projects/{project_id}/audit.csv

Журнал действий в проекте одним CSV-файлом.

Токен: чтение или запись · Ответ 200 · Ошибки: 401, 403, 404, 422, 429

ПараметрГдеТип
project_id *путьint

Схема ответа 200 пока не описана — смотрите ответ на живом запросе.

POST/projects/{project_id}/deployments/{deployment_id}/cancel

Отменить деплой, который ещё не начал менять прод.

Токен: только с правом записи · Ответ 200 · Ошибки: 401, 403, 404, 422, 429

ПараметрГдеТип
project_id *путьint
deployment_id *путьint

Схема ответа 200 пока не описана — смотрите ответ на живом запросе.

POST/projects/{project_id}/deployments/{deployment_id}/migration/approve

Применить миграции деплоя: снимок базы → миграция → выкатка.

Токен: только с правом записи · Ответ 202 · Ошибки: 401, 403, 404, 409, 422, 429

ПараметрГдеТип
project_id *путьint
deployment_id *путьint

Схема ответа 202 пока не описана — смотрите ответ на живом запросе.

POST/projects/{project_id}/deployments/{deployment_id}/migration/reject

Не применять миграции: деплой отменяется, прод остаётся прежним.

Токен: только с правом записи · Ответ 200 · Ошибки: 401, 403, 404, 409, 422, 429

ПараметрГдеТип
project_id *путьint
deployment_id *путьint

Схема ответа 200 пока не описана — смотрите ответ на живом запросе.

GET/projects/{project_id}/pending-restarts

Сервисы, которые работают со старыми переменными и ждут перезапуска.

Токен: чтение или запись · Ответ 200 · Ошибки: 401, 403, 404, 422, 429

ПараметрГдеТип
project_id *путьint

Схема ответа 200 пока не описана — смотрите ответ на живом запросе.

GET/projects/{project_id}/services/{service_id}/certificate

HTTPS-сертификат сервиса: до какого числа действует и продлевается ли.

Токен: чтение или запись · Ответ 200 · Ошибки: 401, 403, 404, 422, 429

ПараметрГдеТип
project_id *путьint
service_id *путьint

Схема ответа 200 пока не описана — смотрите ответ на живом запросе.

GET/projects/{project_id}/services/{service_id}/releases

Релизы сервиса, новые сверху; before — для следующей страницы.

Токен: чтение или запись · Ответ 200 · Ошибки: 401, 403, 404, 422, 429

ПараметрГдеТип
project_id *путьint
service_id *путьint
limitзапросintпо умолчанию 50
beforeзапросint
Пример ответа 200
200 · application/json
[
  {
    "id": 1,
    "number": 1,
    "service_id": 1,
    "deployment_id": 1,
    "commit_sha": "3f9c2a17",
    "commit_message": "…",
    "author": "…",
    "image": "…",
    "image_digest": "…",
    "env_keys": [
      "…"
    ],
    "env_checksum": "…",
    "sizing": {},
    "manifest": {},
    "migration_boundary": true,
    "db_snapshot_ref": "…",
    "db_snapshot_at": "2026-10-19T12:00:00Z",
    "status": "running",
    "health_reason": "…",
    "rolled_back_from": 1,
    "auto_rollback": true,
    "created_at": "2026-10-19T12:00:00Z",
    "healthy_at": "2026-10-19T12:00:00Z",
    "finished_at": "2026-10-19T12:00:00Z",
    "duration_seconds": 0.5,
    "rollback_allowed": false,
    "is_current": false
  }
]

GET/projects/{project_id}/services/{service_id}/releases/{number}/compare

Что изменилось в релизе: код, ключи переменных, размер, манифест.

Токен: чтение или запись · Ответ 200 · Ошибки: 401, 403, 404, 422, 429

ПараметрГдеТип
project_id *путьint
service_id *путьint
number *путьint
baseзапросint

Схема ответа 200 пока не описана — смотрите ответ на живом запросе.

POST/projects/{project_id}/services/{service_id}/releases/{number}/restore-db

Восстановить базу из снимка, снятого перед миграцией релиза.

Токен: только с правом записи · Ответ 202 · Ошибки: 401, 403, 404, 409, 422, 429

ПараметрГдеТип
project_id *путьint
service_id *путьint
number *путьint
confirm_name *телоstring
Тело запроса, пример
{
  "confirm_name": "…"
}

Схема ответа 202 пока не описана — смотрите ответ на живом запросе.

POST/projects/{project_id}/services/{service_id}/rollback

Откатить сервис на релиз (по умолчанию — предыдущий здоровый).

Токен: только с правом записи · Ответ 202 · Ошибки: 401, 403, 404, 409, 422, 429

ПараметрГдеТип
project_id *путьint
service_id *путьint
release_numberтелоint
confirm_nameтелоstring
Тело запроса, пример
{
  "release_number": 1,
  "confirm_name": "…"
}
Пример ответа 202
202 · application/json
{
  "status": "rolling_back",
  "deployment_id": 816,
  "target": 41
}

GET/projects/{project_id}/services/{service_id}/rollback/preview

Что произойдёт при откате — до самого отката.

Токен: чтение или запись · Ответ 200 · Ошибки: 401, 403, 404, 422, 429

ПараметрГдеТип
project_id *путьint
service_id *путьint
release_numberзапросint
Пример ответа 200
200 · application/json
{
  "target": {
    "id": 1,
    "number": 1,
    "service_id": 1,
    "deployment_id": 1,
    "commit_sha": "3f9c2a17",
    "commit_message": "…",
    "author": "…",
    "image": "…",
    "image_digest": "…",
    "env_keys": [
      "…"
    ],
    "env_checksum": "…",
    "sizing": {},
    "manifest": {},
    "migration_boundary": true,
    "db_snapshot_ref": "…",
    "db_snapshot_at": "2026-10-19T12:00:00Z",
    "status": "running",
    "health_reason": "…",
    "rolled_back_from": 1,
    "auto_rollback": true,
    "created_at": "2026-10-19T12:00:00Z",
    "healthy_at": "2026-10-19T12:00:00Z",
    "finished_at": "2026-10-19T12:00:00Z",
    "duration_seconds": 0.5,
    "rollback_allowed": false,
    "is_current": false
  },
  "current": {
    "id": 1,
    "number": 1,
    "service_id": 1,
    "deployment_id": 1,
    "commit_sha": "3f9c2a17",
    "commit_message": "…",
    "author": "…",
    "image": "…",
    "image_digest": "…",
    "env_keys": [
      "…"
    ],
    "env_checksum": "…",
    "sizing": {},
    "manifest": {},
    "migration_boundary": true,
    "db_snapshot_ref": "…",
    "db_snapshot_at": "2026-10-19T12:00:00Z",
    "status": "running",
    "health_reason": "…",
    "rolled_back_from": 1,
    "auto_rollback": true,
    "created_at": "2026-10-19T12:00:00Z",
    "healthy_at": "2026-10-19T12:00:00Z",
    "finished_at": "2026-10-19T12:00:00Z",
    "duration_seconds": 0.5,
    "rollback_allowed": false,
    "is_current": false
  },
  "migration_boundaries": [
    1
  ],
  "snapshot_ref": "…",
  "snapshot_at": "2026-10-19T12:00:00Z",
  "requires_name_confirmation": true,
  "changes": {}
}

GET/projects/{project_id}/services/{service_id}/status

Что сейчас в проде у сервиса и на что можно откатиться.

Токен: чтение или запись · Ответ 200 · Ошибки: 401, 403, 404, 422, 429

ПараметрГдеТип
project_id *путьint
service_id *путьint
Пример ответа 200
200 · application/json
{
  "service_id": 1,
  "state": "…",
  "current_release": {
    "id": 1,
    "number": 1,
    "service_id": 1,
    "deployment_id": 1,
    "commit_sha": "3f9c2a17",
    "commit_message": "…",
    "author": "…",
    "image": "…",
    "image_digest": "…",
    "env_keys": [
      "…"
    ],
    "env_checksum": "…",
    "sizing": {},
    "manifest": {},
    "migration_boundary": true,
    "db_snapshot_ref": "…",
    "db_snapshot_at": "2026-10-19T12:00:00Z",
    "status": "running",
    "health_reason": "…",
    "rolled_back_from": 1,
    "auto_rollback": true,
    "created_at": "2026-10-19T12:00:00Z",
    "healthy_at": "2026-10-19T12:00:00Z",
    "finished_at": "2026-10-19T12:00:00Z",
    "duration_seconds": 0.5,
    "rollback_allowed": false,
    "is_current": false
  },
  "rollback_target": 1,
  "active_deployment_id": 1,
  "active_deployment_status": "…",
  "queue_length": 1,
  "env_drift": true,
  "drift_reason": "…",
  "backup_verified_at": "2026-10-19T12:00:00Z",
  "backup_verify_ok": true,
  "last_backup_at": "2026-10-19T12:00:00Z"
}

Базы данных и бэкапы

GET/projects/{project_id}/resources/

Базы и другие ресурсы проекта, значения переменных скрыты.

Токен: чтение или запись · Ответ 200 · Ошибки: 401, 403, 404, 422, 429

ПараметрГдеТип
project_id *путьint
Пример ответа 200
200 · application/json
[
  {
    "id": 1,
    "project_id": 1,
    "resource_type": "…",
    "display_name": "",
    "size": "standard",
    "storage_gb": 1,
    "monthly_cost": 1,
    "internal_host": "",
    "internal_address": "",
    "config": {},
    "env_vars_masked": {},
    "status": "running",
    "created_at": "2026-10-19T12:00:00Z",
    "last_backup_at": "2026-10-19T12:00:00Z",
    "last_backup_error": "…",
    "backup_verified_at": "2026-10-19T12:00:00Z",
    "backup_verify_ok": true,
    "backup_verify_error": "…"
  }
]

POST/projects/{project_id}/resources/

Подключить к проекту базу (PostgreSQL, MySQL, Redis, MongoDB).

Токен: только с правом записи · Ответ 201 · Ошибки: 400, 401, 402, 403, 404, 409, 422, 429, 503

ПараметрГдеТип
project_id *путьint
resource_type *телоstring
sizeтелоstring
storage_gbтелоint
configтелоobject
Тело запроса, пример
{
  "resource_type": "…",
  "size": "db-micro",
  "storage_gb": 1,
  "config": {}
}
Пример ответа 201
201 · application/json
{
  "id": 1,
  "project_id": 1,
  "resource_type": "…",
  "display_name": "",
  "size": "standard",
  "storage_gb": 1,
  "monthly_cost": 1,
  "internal_host": "",
  "internal_address": "",
  "config": {},
  "env_vars_masked": {},
  "status": "running",
  "created_at": "2026-10-19T12:00:00Z",
  "last_backup_at": "2026-10-19T12:00:00Z",
  "last_backup_error": "…",
  "backup_verified_at": "2026-10-19T12:00:00Z",
  "backup_verify_ok": true,
  "backup_verify_error": "…"
}

DELETE/projects/{project_id}/resources/{resource_id}

Удалить базу вместе с данными. Необратимо.

Токен: только с правом записи · Ответ 204 · Ошибки: 401, 403, 404, 422, 429

ПараметрГдеТип
project_id *путьint
resource_id *путьint

Ответ 204 — без тела.

PUT/projects/{project_id}/resources/{resource_id}

Изменить размер или настройки базы.

Токен: только с правом записи · Ответ 200 · Ошибки: 401, 403, 404, 422, 429, 503

ПараметрГдеТип
project_id *путьint
resource_id *путьint
configтелоobject
env_varsтелоobject
sizeтелоstring
storage_gbтелоint
Тело запроса, пример
{
  "config": {},
  "env_vars": {},
  "size": "standard",
  "storage_gb": 1
}
Пример ответа 200
200 · application/json
{
  "id": 1,
  "project_id": 1,
  "resource_type": "…",
  "display_name": "",
  "size": "standard",
  "storage_gb": 1,
  "monthly_cost": 1,
  "internal_host": "",
  "internal_address": "",
  "config": {},
  "env_vars_masked": {},
  "status": "running",
  "created_at": "2026-10-19T12:00:00Z",
  "last_backup_at": "2026-10-19T12:00:00Z",
  "last_backup_error": "…",
  "backup_verified_at": "2026-10-19T12:00:00Z",
  "backup_verify_ok": true,
  "backup_verify_error": "…"
}

GET/projects/{project_id}/resources/{resource_id}/backups

Бэкапы базы и состояние восстановления.

Токен: чтение или запись · Ответ 200 · Ошибки: 401, 403, 404, 422, 429

ПараметрГдеТип
project_id *путьint
resource_id *путьint
Пример ответа 200
200 · application/json
{
  "enabled": true,
  "retention_days": 1,
  "interval_hours": 1,
  "hourly_retention_hours": 1,
  "verify_every_hours": 1,
  "restoring": true,
  "restore_started_at": "2026-10-19T12:00:00Z",
  "last_restore_at": "2026-10-19T12:00:00Z",
  "last_restore_ok": true,
  "last_restore_error": "…",
  "items": [
    {
      "id": 1,
      "created_at": "2026-10-19T12:00:00Z",
      "kind": "…",
      "label": "…",
      "created_by": "…"
    }
  ],
  "verifications": [],
  "snapshotting": false,
  "snapshot_started_at": "2026-10-19T12:00:00Z",
  "manual_left": 0
}

POST/projects/{project_id}/resources/{resource_id}/backups

Снять бэкап базы прямо сейчас — например, перед миграцией.

Токен: только с правом записи · Ответ 202 · Ошибки: 401, 403, 404, 409, 422, 429

ПараметрГдеТип
project_id *путьint
resource_id *путьint
labelтелоstring
Тело запроса, пример
{
  "label": "…"
}

Схема ответа 202 пока не описана — смотрите ответ на живом запросе.

POST/projects/{project_id}/resources/{resource_id}/backups/{backup_id}/download

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

Токен: только с правом записи · Ответ 200 · Ошибки: 401, 403, 404, 409, 410, 422, 429, 503

ПараметрГдеТип
project_id *путьint
resource_id *путьint
backup_id *путьint

Схема ответа 200 пока не описана — смотрите ответ на живом запросе.

POST/projects/{project_id}/resources/{resource_id}/backups/{backup_id}/restore

Восстановить базу из бэкапа. Данные после него будут потеряны.

Токен: только с правом записи · Ответ 202 · Ошибки: 401, 403, 404, 409, 410, 422, 429

ПараметрГдеТип
project_id *путьint
resource_id *путьint
backup_id *путьint
confirm_nameтелоstring
Тело запроса, пример
{
  "confirm_name": ""
}

Схема ответа 202 пока не описана — смотрите ответ на живом запросе.

GET/projects/{project_id}/resources/{resource_id}/env

Строки подключения к базе с открытыми значениями.

Токен: чтение или запись · Ответ 200 · Ошибки: 401, 403, 404, 422, 429

ПараметрГдеТип
project_id *путьint
resource_id *путьint

Схема ответа 200 пока не описана — смотрите ответ на живом запросе.

GET/projects/{project_id}/resources/{resource_id}/metrics

CPU и память базы сейчас и занятый диск.

Токен: чтение или запись · Ответ 200 · Ошибки: 401, 403, 404, 422, 429

ПараметрГдеТип
project_id *путьint
resource_id *путьint
Пример ответа 200
200 · application/json
{
  "cpu": {
    "used_m": 0.5,
    "limit_m": 1,
    "percent": 0.5
  },
  "memory": {
    "used_mb": 1,
    "limit_mb": 1,
    "percent": 0.5
  },
  "pods": 0,
  "reason": "…",
  "disk": {
    "used_bytes": 1,
    "capacity_bytes": 1,
    "percent": 0.5,
    "collected_at": "2026-10-19T12:00:00Z"
  },
  "disk_reason": "…"
}

Анализ репозитория

POST/projects/{project_id}/detect

Запустить анализ репозитория: стек, сервисы, порты. Сборку не запускает.

Токен: только с правом записи · Ответ 200 · Ошибки: 401, 403, 404, 422, 429

ПараметрГдеТип
project_id *путьint
Пример ответа 200
200 · application/json
{
  "status": "running",
  "message": "…"
}

GET/projects/{project_id}/manifest

Результат анализа репозитория (манифест сервиса).

Токен: чтение или запись · Ответ 200 · Ошибки: 401, 403, 404, 422, 429

ПараметрГдеТип
project_id *путьint
service_idзапросint
Пример ответа 200
200 · application/json
{
  "id": 1,
  "project_id": 1,
  "service_id": 1,
  "manifest": {},
  "created_at": "2026-10-19T12:00:00Z",
  "updated_at": "2026-10-19T12:00:00Z"
}

PUT/projects/{project_id}/manifest/apply

Поправить манифест до подтверждения: среда, команды, ресурсы.

Токен: только с правом записи · Ответ 200 · Ошибки: 401, 403, 404, 422, 429

ПараметрГдеТип
project_id *путьint
runtimeтелоstring
entrypointтелоstring
resources_to_addтелоstring[]
resources_to_skipтелоstring[]
Тело запроса, пример
{
  "runtime": "python",
  "entrypoint": "…",
  "resources_to_add": [],
  "resources_to_skip": []
}

Схема ответа 200 пока не описана — смотрите ответ на живом запросе.

POST/projects/{project_id}/manifest/confirm

Подтвердить манифест — после этого сервис можно собирать.

Токен: только с правом записи · Ответ 200 · Ошибки: 401, 403, 404, 422, 429, 503

ПараметрГдеТип
project_id *путьint
services *телоobject[]
runtimeтелоstring
resources_to_addтелоstring[]
resources_to_skipтелоstring[]
resource_sizesтелоobject
Тело запроса, пример
{
  "services": [
    {
      "name": "api",
      "path": ".",
      "dockerfile_path": "…",
      "entrypoint": "…",
      "entrypoint_command": "…",
      "runtime": "python",
      "framework": "fastapi",
      "port": 8080,
      "enabled": true,
      "deploy_order": 0,
      "is_public": true,
      "source_type": "…",
      "repo_url": "https://…",
      "branch": "main",
      "image_ref": "…",
      "size": "standard",
      "service_kind": "…",
      "storage_gb": 1,
      "storage_path": "…",
      "env_vars": {
        "KEY": "…"
      }
    }
  ],
  "runtime": "python",
  "resources_to_add": [],
  "resources_to_skip": [],
  "resource_sizes": {}
}

Схема ответа 200 пока не описана — смотрите ответ на живом запросе.

Задачи по расписанию

GET/projects/{project_id}/services/{service_id}/cron

Задачи по расписанию у сервиса.

Токен: чтение или запись · Ответ 200 · Ошибки: 401, 403, 404, 422, 429

ПараметрГдеТип
project_id *путьint
service_id *путьint
Пример ответа 200
200 · application/json
{
  "items": [
    {
      "id": 1,
      "name": "api",
      "schedule": "@daily",
      "timezone": "…",
      "command": "python cleanup.py",
      "enabled": true,
      "created_at": "2026-10-19T12:00:00Z",
      "last_run": {
        "status": "running",
        "started_at": "2026-10-19T12:00:00Z",
        "finished_at": "2026-10-19T12:00:00Z",
        "reason": "…",
        "manual": false
      }
    }
  ],
  "deployed": true,
  "runs_unavailable": false,
  "timeout_minutes": 1,
  "max_per_service": 1
}

POST/projects/{project_id}/services/{service_id}/cron

Добавить задачу по расписанию.

Токен: только с правом записи · Ответ 201 · Ошибки: 401, 403, 404, 409, 422, 429

ПараметрГдеТип
project_id *путьint
service_id *путьint
name *телоstring
schedule *телоstring
command *телоstring
timezoneтелоstring
enabledтелоbool
Тело запроса, пример
{
  "name": "api",
  "schedule": "@daily",
  "command": "python cleanup.py",
  "timezone": "…",
  "enabled": true
}
Пример ответа 201
201 · application/json
{
  "id": 1,
  "name": "api",
  "schedule": "@daily",
  "timezone": "…",
  "command": "python cleanup.py",
  "enabled": true,
  "created_at": "2026-10-19T12:00:00Z",
  "last_run": {
    "status": "running",
    "started_at": "2026-10-19T12:00:00Z",
    "finished_at": "2026-10-19T12:00:00Z",
    "reason": "…",
    "manual": false
  }
}

DELETE/projects/{project_id}/services/{service_id}/cron/{cron_id}

Удалить задачу по расписанию.

Токен: только с правом записи · Ответ 204 · Ошибки: 401, 403, 404, 422, 429

ПараметрГдеТип
project_id *путьint
service_id *путьint
cron_id *путьint

Ответ 204 — без тела.

PUT/projects/{project_id}/services/{service_id}/cron/{cron_id}

Изменить задачу: расписание, команду, включённость.

Токен: только с правом записи · Ответ 200 · Ошибки: 401, 403, 404, 422, 429

ПараметрГдеТип
project_id *путьint
service_id *путьint
cron_id *путьint
nameтелоstring
scheduleтелоstring
commandтелоstring
timezoneтелоstring
enabledтелоbool
Тело запроса, пример
{
  "name": "api",
  "schedule": "@daily",
  "command": "python cleanup.py",
  "timezone": "…",
  "enabled": true
}
Пример ответа 200
200 · application/json
{
  "id": 1,
  "name": "api",
  "schedule": "@daily",
  "timezone": "…",
  "command": "python cleanup.py",
  "enabled": true,
  "created_at": "2026-10-19T12:00:00Z",
  "last_run": {
    "status": "running",
    "started_at": "2026-10-19T12:00:00Z",
    "finished_at": "2026-10-19T12:00:00Z",
    "reason": "…",
    "manual": false
  }
}

GET/projects/{project_id}/services/{service_id}/cron/{cron_id}/logs

Последние запуски задачи и их вывод.

Токен: чтение или запись · Ответ 200 · Ошибки: 401, 403, 404, 422, 429, 503

ПараметрГдеТип
project_id *путьint
service_id *путьint
cron_id *путьint
Пример ответа 200
200 · application/json
{
  "logs": "…"
}

POST/projects/{project_id}/services/{service_id}/cron/{cron_id}/run

Запустить задачу сейчас, вне расписания.

Токен: только с правом записи · Ответ 202 · Ошибки: 401, 403, 404, 409, 422, 429, 503

ПараметрГдеТип
project_id *путьint
service_id *путьint
cron_id *путьint
Пример ответа 202
202 · application/json
{
  "job": "…"
}

Домены

GET/projects/{project_id}/services/{service_id}/domains/

Свои домены сервиса.

Токен: чтение или запись · Ответ 200 · Ошибки: 401, 403, 404, 422, 429

ПараметрГдеТип
project_id *путьint
service_id *путьint
Пример ответа 200
200 · application/json
[
  {
    "id": 1,
    "hostname": "…",
    "status": "running",
    "verified_via": "…",
    "verified_at": "2026-10-19T12:00:00Z",
    "last_checked_at": "2026-10-19T12:00:00Z",
    "problem": "…",
    "created_at": "2026-10-19T12:00:00Z",
    "cname_target": "…",
    "txt_name": "…",
    "txt_value": "…",
    "a_records": []
  }
]

POST/projects/{project_id}/services/{service_id}/domains/

Привязать свой домен к сервису.

Токен: только с правом записи · Ответ 201 · Ошибки: 400, 401, 403, 404, 409, 422, 429

ПараметрГдеТип
project_id *путьint
service_id *путьint
hostname *телоstring
Тело запроса, пример
{
  "hostname": "…"
}
Пример ответа 201
201 · application/json
{
  "id": 1,
  "hostname": "…",
  "status": "running",
  "verified_via": "…",
  "verified_at": "2026-10-19T12:00:00Z",
  "last_checked_at": "2026-10-19T12:00:00Z",
  "problem": "…",
  "created_at": "2026-10-19T12:00:00Z",
  "cname_target": "…",
  "txt_name": "…",
  "txt_value": "…",
  "a_records": []
}

DELETE/projects/{project_id}/services/{service_id}/domains/{domain_id}

Отвязать домен.

Токен: только с правом записи · Ответ 204 · Ошибки: 401, 403, 404, 422, 429

ПараметрГдеТип
project_id *путьint
service_id *путьint
domain_id *путьint

Ответ 204 — без тела.

GET/projects/{project_id}/services/{service_id}/domains/{domain_id}/certificate

HTTPS-сертификат своего домена.

Токен: чтение или запись · Ответ 200 · Ошибки: 401, 403, 404, 422, 429

ПараметрГдеТип
project_id *путьint
service_id *путьint
domain_id *путьint

Схема ответа 200 пока не описана — смотрите ответ на живом запросе.

POST/projects/{project_id}/services/{service_id}/domains/{domain_id}/verify

Проверить DNS-запись домена.

Токен: только с правом записи · Ответ 200 · Ошибки: 401, 403, 404, 422, 429

ПараметрГдеТип
project_id *путьint
service_id *путьint
domain_id *путьint
Пример ответа 200
200 · application/json
{
  "id": 1,
  "hostname": "…",
  "status": "running",
  "verified_via": "…",
  "verified_at": "2026-10-19T12:00:00Z",
  "last_checked_at": "2026-10-19T12:00:00Z",
  "problem": "…",
  "created_at": "2026-10-19T12:00:00Z",
  "cname_target": "…",
  "txt_name": "…",
  "txt_value": "…",
  "a_records": []
}

Команда проекта

POST/projects/{project_id}/invites

Пригласить человека в проект с ролью.

Токен: только с правом записи · Ответ 201 · Ошибки: 401, 403, 404, 422, 429

ПараметрГдеТип
project_id *путьint
role *телоstring
Тело запроса, пример
{
  "role": "developer"
}
Пример ответа 201
201 · application/json
{
  "id": 1,
  "role": "developer",
  "token": "…",
  "expires_at": "2026-10-19T12:00:00Z"
}

DELETE/projects/{project_id}/invites/{invite_id}

Отозвать приглашение.

Токен: только с правом записи · Ответ 204 · Ошибки: 401, 403, 404, 422, 429

ПараметрГдеТип
project_id *путьint
invite_id *путьint

Ответ 204 — без тела.

GET/projects/{project_id}/members

Участники проекта и приглашения.

Токен: чтение или запись · Ответ 200 · Ошибки: 401, 403, 404, 422, 429

ПараметрГдеТип
project_id *путьint
Пример ответа 200
200 · application/json
{
  "members": [
    {
      "user_id": 1,
      "username": "dev",
      "email": "dev@studio.ru",
      "role": "developer",
      "is_you": false,
      "joined_at": "2026-10-19T12:00:00Z"
    }
  ],
  "invites": [
    {
      "id": 1,
      "role": "developer",
      "created_at": "2026-10-19T12:00:00Z",
      "expires_at": "2026-10-19T12:00:00Z",
      "created_by": "…"
    }
  ],
  "my_role": "…"
}

DELETE/projects/{project_id}/members/{user_id}

Убрать участника из проекта.

Токен: только с правом записи · Ответ 204 · Ошибки: 401, 403, 404, 422, 429

ПараметрГдеТип
project_id *путьint
user_id *путьint

Ответ 204 — без тела.

PATCH/projects/{project_id}/members/{user_id}

Сменить роль участника.

Токен: только с правом записи · Ответ 200 · Ошибки: 401, 403, 404, 422, 429

ПараметрГдеТип
project_id *путьint
user_id *путьint
role *телоstring
Тело запроса, пример
{
  "role": "developer"
}
Пример ответа 200
200 · application/json
{
  "user_id": 1,
  "username": "dev",
  "email": "dev@studio.ru",
  "role": "developer",
  "is_you": false,
  "joined_at": "2026-10-19T12:00:00Z"
}

Плательщик проекта

DELETE/projects/{project_id}/payer

Снять плательщика: проект снова оплачивает владелец.

Токен: только с правом записи · Ответ 204 · Ошибки: 401, 403, 404, 422, 429

ПараметрГдеТип
project_id *путьint

Ответ 204 — без тела.

GET/projects/{project_id}/payer

Кто платит за проект и есть ли открытое приглашение плательщику.

Токен: чтение или запись · Ответ 200 · Ошибки: 401, 403, 404, 422, 429

ПараметрГдеТип
project_id *путьint
Пример ответа 200
200 · application/json
{
  "payer": "…",
  "payer_since": "2026-10-19T12:00:00Z",
  "invite_expires_at": "2026-10-19T12:00:00Z"
}

DELETE/projects/{project_id}/payer/invite

Отозвать приглашение плательщику.

Токен: только с правом записи · Ответ 204 · Ошибки: 401, 403, 404, 422, 429

ПараметрГдеТип
project_id *путьint

Ответ 204 — без тела.

POST/projects/{project_id}/payer/invite

Пригласить плательщика: проект будет списывать деньги с его баланса.

Токен: только с правом записи · Ответ 201 · Ошибки: 401, 403, 404, 422, 429

ПараметрГдеТип
project_id *путьint
Пример ответа 201
201 · application/json
{
  "token": "…",
  "expires_at": "2026-10-19T12:00:00Z"
}

Уведомления в Telegram

GET/projects/{project_id}/telegram

Telegram-чаты, куда приходят уведомления проекта.

Токен: чтение или запись · Ответ 200 · Ошибки: 401, 403, 404, 422, 429

ПараметрГдеТип
project_id *путьint

Схема ответа 200 пока не описана — смотрите ответ на живом запросе.

DELETE/projects/{project_id}/telegram/chats/{chat_row_id}

Отвязать Telegram-чат от проекта.

Токен: только с правом записи · Ответ 204 · Ошибки: 401, 403, 404, 422, 429

ПараметрГдеТип
project_id *путьint
chat_row_id *путьint

Ответ 204 — без тела.

POST/projects/{project_id}/telegram/link

Ссылка, по которой бот Prichal добавляется в чат команды.

Токен: только с правом записи · Ответ 200 · Ошибки: 401, 403, 404, 422, 429

ПараметрГдеТип
project_id *путьint

Схема ответа 200 пока не описана — смотрите ответ на живом запросе.

Схема проекта

GET/projects/{project_id}/graph/

Схема проекта: сервисы, базы и связи между ними.

Токен: чтение или запись · Ответ 200 · Ошибки: 401, 403, 404, 422, 429

ПараметрГдеТип
project_id *путьint
Пример ответа 200
200 · application/json
{
  "nodes": [
    {
      "id": "…",
      "type": "postgresql",
      "label": "…",
      "status": "running",
      "metadata": {}
    }
  ],
  "edges": [
    {
      "source": "…",
      "target": "…",
      "label": "…"
    }
  ]
}

ИИ-помощник

POST/projects/{project_id}/ai/ask

Вопрос ИИ-помощнику о проекте.

Токен: только с правом записи · Ответ 200 · Ошибки: 401, 403, 404, 409, 422, 429, 503

ПараметрГдеТип
project_id *путьint
question *телоstring
service_id *телоint
deployment_idтелоint
release_numberтелоint
base_numberтелоint
log_sourceтелоstring
Тело запроса, пример
{
  "question": "…",
  "service_id": 1,
  "deployment_id": 1,
  "release_number": 1,
  "base_number": 1,
  "log_source": "runtime"
}
Пример ответа 200
200 · application/json
{
  "summary": "…",
  "details": [
    "…"
  ],
  "suggestions": [
    "…"
  ],
  "suggested_action": "…",
  "suggested_action_label": "…",
  "confidence": "…",
  "cached": false
}