Проекты
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/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": "…"
}
Домены
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": []
}