{"openapi":"3.0.0","paths":{"/api/v1/auth/register":{"post":{"operationId":"AuthController_register","summary":"Register new user with email + password","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RegisterDto"}}}},"responses":{"201":{"description":""}},"tags":["auth"]}},"/api/v1/auth/login":{"post":{"operationId":"AuthController_login","summary":"Login with email + password","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LoginDto"}}}},"responses":{"200":{"description":""}},"tags":["auth"]}},"/api/v1/auth/refresh":{"post":{"operationId":"AuthController_refresh","summary":"Exchange refresh cookie (or body) for new access token","parameters":[],"responses":{"200":{"description":""}},"tags":["auth"]}},"/api/v1/auth/logout":{"post":{"operationId":"AuthController_logout","parameters":[],"responses":{"200":{"description":""}},"tags":["auth"]}},"/api/v1/auth/me":{"get":{"operationId":"AuthController_me","summary":"Return current user profile","parameters":[],"responses":{"200":{"description":""}},"tags":["auth"],"security":[{"bearer":[]}]}},"/api/v1/auth/sessions":{"get":{"operationId":"AuthController_sessions","summary":"List active refresh-token sessions of the current user","parameters":[],"responses":{"200":{"description":""}},"tags":["auth"],"security":[{"bearer":[]}]}},"/api/v1/auth/sessions/{id}/revoke":{"post":{"operationId":"AuthController_revokeSession","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"201":{"description":""}},"tags":["auth"],"security":[{"bearer":[]}]}},"/api/v1/auth/verify":{"post":{"operationId":"AuthController_verifyEmail","summary":"Verify email via token from letter","parameters":[],"responses":{"200":{"description":""}},"tags":["auth"]}},"/api/v1/auth/verify/resend":{"post":{"operationId":"AuthController_resendVerify","parameters":[],"responses":{"201":{"description":""}},"tags":["auth"],"security":[{"bearer":[]}]}},"/api/v1/auth/password-reset/request":{"post":{"operationId":"AuthController_requestReset","parameters":[],"responses":{"200":{"description":""}},"tags":["auth"]}},"/api/v1/auth/password-reset/confirm":{"post":{"operationId":"AuthController_confirmReset","parameters":[],"responses":{"200":{"description":""}},"tags":["auth"]}},"/api/v1/auth/github":{"get":{"operationId":"AuthController_githubStart","summary":"Start GitHub OAuth flow (redirects to github.com)","parameters":[],"responses":{"200":{"description":""}},"tags":["auth"]}},"/api/v1/auth/github/callback":{"get":{"operationId":"AuthController_githubCallback","summary":"GitHub OAuth callback → sets httpOnly cookies and redirects to /new/github","parameters":[],"responses":{"200":{"description":""}},"tags":["auth"]}},"/api/v1/auth/github/repos":{"get":{"operationId":"AuthController_githubRepos","summary":"List authenticated user GitHub repos (via stored OAuth token)","parameters":[],"responses":{"200":{"description":""}},"tags":["auth"],"security":[{"bearer":[]}]}},"/api/v1/auth/gitlab":{"get":{"operationId":"AuthController_gitlabStart","summary":"Start GitLab OAuth flow","parameters":[],"responses":{"200":{"description":""}},"tags":["auth"]}},"/api/v1/auth/gitlab/callback":{"get":{"operationId":"AuthController_gitlabCallback","summary":"GitLab OAuth callback → sets httpOnly cookies and redirects","parameters":[],"responses":{"200":{"description":""}},"tags":["auth"]}},"/api/v1/auth/mfa/status":{"get":{"operationId":"MfaController_status","parameters":[],"responses":{"200":{"description":""}},"tags":["mfa"],"security":[{"bearer":[]}]}},"/api/v1/auth/mfa/setup":{"post":{"operationId":"MfaController_setup","summary":"Start MFA setup — returns QR code and secret","parameters":[],"responses":{"201":{"description":""}},"tags":["mfa"],"security":[{"bearer":[]}]}},"/api/v1/auth/mfa/verify":{"post":{"operationId":"MfaController_verify","summary":"Verify TOTP code and enable MFA — returns backup codes (one-time show)","parameters":[],"responses":{"201":{"description":""}},"tags":["mfa"],"security":[{"bearer":[]}]}},"/api/v1/auth/mfa":{"delete":{"operationId":"MfaController_disable","summary":"Disable MFA (requires current TOTP)","parameters":[],"responses":{"200":{"description":""}},"tags":["mfa"],"security":[{"bearer":[]}]}},"/api/v1/users/me/full":{"get":{"operationId":"UsersController_getFullProfile","parameters":[],"responses":{"200":{"description":""}},"tags":["users"],"security":[{"bearer":[]}]}},"/api/v1/workspaces":{"post":{"operationId":"WorkspacesController_create","summary":"Create new workspace (you become owner)","parameters":[],"responses":{"201":{"description":""}},"tags":["workspaces"],"security":[{"bearer":[]}]},"get":{"operationId":"WorkspacesController_listMy","parameters":[],"responses":{"200":{"description":""}},"tags":["workspaces"],"security":[{"bearer":[]}]}},"/api/v1/workspaces/{id}/members":{"get":{"operationId":"WorkspacesController_members","summary":"List workspace members","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["workspaces"],"security":[{"bearer":[]}]},"post":{"operationId":"WorkspacesController_invite","summary":"Invite user to workspace by email","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"201":{"description":""}},"tags":["workspaces"],"security":[{"bearer":[]}]}},"/api/v1/workspaces/{id}/members/{userId}":{"patch":{"operationId":"WorkspacesController_updateRole","summary":"Change member role","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}},{"name":"userId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["workspaces"],"security":[{"bearer":[]}]},"delete":{"operationId":"WorkspacesController_remove","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}},{"name":"userId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["workspaces"],"security":[{"bearer":[]}]}},"/api/v1/workspaces/{id}":{"patch":{"operationId":"WorkspacesController_updateSettings","summary":"Update workspace settings (wildcardDomain, budget, legal entity, log-drain)","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["workspaces"],"security":[{"bearer":[]}]}},"/api/v1/workspaces/{id}/wildcard/verify":{"post":{"operationId":"WorkspacesController_verifyWildcard","summary":"Verify TXT record for wildcard domain","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"201":{"description":""}},"tags":["workspaces"],"security":[{"bearer":[]}]}},"/api/v1/workspaces/{id}/plan-change":{"post":{"operationId":"WorkspacesController_changePlan","summary":"Change plan (immediate, pro-rata billing at month end)","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"201":{"description":""}},"tags":["workspaces"],"security":[{"bearer":[]}]}},"/api/v1/workspaces/{id}/registry-credentials":{"get":{"operationId":"WorkspacesController_listRegistryCreds","summary":"List container registry credentials (password redacted)","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["workspaces"],"security":[{"bearer":[]}]},"post":{"operationId":"WorkspacesController_createRegistryCred","summary":"Add a container registry credential (HOBBY plan+)","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"201":{"description":""}},"tags":["workspaces"],"security":[{"bearer":[]}]}},"/api/v1/workspaces/{id}/registry-credentials/{credId}":{"delete":{"operationId":"WorkspacesController_removeRegistryCred","summary":"Remove a container registry credential","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}},{"name":"credId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["workspaces"],"security":[{"bearer":[]}]}},"/api/v1/workspaces/{id}/promo/apply":{"post":{"operationId":"WorkspacesController_applyPromo","summary":"Redeem a promo code — adds credits to workspace","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"201":{"description":""}},"tags":["workspaces"],"security":[{"bearer":[]}]}},"/api/v1/workspaces/{id}/dedicated-ips":{"get":{"operationId":"WorkspacesController_listDedicatedIps","summary":"List dedicated IPs reserved for this workspace","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["workspaces"],"security":[{"bearer":[]}]},"post":{"operationId":"WorkspacesController_reserveDedicatedIp","summary":"Reserve a new dedicated IP (PRO plan+)","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"201":{"description":""}},"tags":["workspaces"],"security":[{"bearer":[]}]}},"/api/v1/workspaces/{id}/dedicated-ips/{ipId}":{"delete":{"operationId":"WorkspacesController_releaseDedicatedIp","summary":"Release a dedicated IP back to the pool","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}},{"name":"ipId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["workspaces"],"security":[{"bearer":[]}]}},"/api/v1/workspaces/{id}/private-links":{"get":{"operationId":"WorkspacesController_listPrivateLinks","summary":"List private links configured for the workspace","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["workspaces"],"security":[{"bearer":[]}]},"post":{"operationId":"WorkspacesController_createPrivateLink","summary":"Create a private link to a client resource (PRO plan+)","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"201":{"description":""}},"tags":["workspaces"],"security":[{"bearer":[]}]}},"/api/v1/workspaces/{id}/private-links/{linkId}":{"delete":{"operationId":"WorkspacesController_removePrivateLink","summary":"Remove a private link","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}},{"name":"linkId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["workspaces"],"security":[{"bearer":[]}]}},"/api/v1/workspaces/{id}/hipaa/enable":{"post":{"operationId":"WorkspacesController_enableHipaa","summary":"Enable HIPAA compliance mode (BUSINESS plan+)","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"201":{"description":""}},"tags":["workspaces"],"security":[{"bearer":[]}]}},"/api/v1/workspaces/{id}/hipaa/disable":{"post":{"operationId":"WorkspacesController_disableHipaa","summary":"Disable HIPAA mode","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"201":{"description":""}},"tags":["workspaces"],"security":[{"bearer":[]}]}},"/api/v1/projects":{"get":{"operationId":"ProjectsController_list","summary":"List projects visible to current user","parameters":[{"name":"workspaceId","required":true,"in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["projects"],"security":[{"bearer":[]}]},"post":{"operationId":"ProjectsController_create","summary":"Create new project","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateProjectDto"}}}},"responses":{"201":{"description":""}},"tags":["projects"],"security":[{"bearer":[]}]}},"/api/v1/projects/{id}":{"get":{"operationId":"ProjectsController_findOne","summary":"Get project with all environments/services","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["projects"],"security":[{"bearer":[]}]},"delete":{"operationId":"ProjectsController_remove","summary":"Soft-delete project (archive)","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["projects"],"security":[{"bearer":[]}]},"patch":{"operationId":"ProjectsController_rename","summary":"Rename project","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["projects"],"security":[{"bearer":[]}]}},"/api/v1/projects/{id}/transfer":{"post":{"operationId":"ProjectsController_transfer","summary":"Transfer project to another workspace (must be OWNER/ADMIN)","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"201":{"description":""}},"tags":["projects"],"security":[{"bearer":[]}]}},"/api/v1/projects/{id}/members":{"get":{"operationId":"ProjectsController_members","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["projects"],"security":[{"bearer":[]}]},"post":{"operationId":"ProjectsController_invite","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"201":{"description":""}},"tags":["projects"],"security":[{"bearer":[]}]}},"/api/v1/projects/{id}/members/{userId}":{"delete":{"operationId":"ProjectsController_removeMember","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}},{"name":"userId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["projects"],"security":[{"bearer":[]}]}},"/api/v1/projects/{id}/tokens":{"get":{"operationId":"ProjectsController_tokens","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["projects"],"security":[{"bearer":[]}]},"post":{"operationId":"ProjectsController_createToken","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"201":{"description":""}},"tags":["projects"],"security":[{"bearer":[]}]}},"/api/v1/projects/{id}/tokens/{tokenId}":{"delete":{"operationId":"ProjectsController_removeToken","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}},{"name":"tokenId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["projects"],"security":[{"bearer":[]}]}},"/api/v1/projects/{id}/webhooks":{"get":{"operationId":"ProjectsController_webhooks","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["projects"],"security":[{"bearer":[]}]},"post":{"operationId":"ProjectsController_createWebhook","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"201":{"description":""}},"tags":["projects"],"security":[{"bearer":[]}]}},"/api/v1/projects/{id}/webhooks/{webhookId}":{"delete":{"operationId":"ProjectsController_removeWebhook","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}},{"name":"webhookId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["projects"],"security":[{"bearer":[]}]}},"/api/v1/environments/{id}/env-vars":{"get":{"operationId":"EnvironmentsController_list","summary":"List env vars (secrets masked unless ?reveal=1)","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}},{"name":"reveal","required":true,"in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["environments"],"security":[{"bearer":[]}]},"post":{"operationId":"EnvironmentsController_set","summary":"Upsert (create/update) one or more env vars","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SetEnvVarsDto"}}}},"responses":{"201":{"description":""}},"tags":["environments"],"security":[{"bearer":[]}]}},"/api/v1/environments/{id}/env-vars/{key}":{"delete":{"operationId":"EnvironmentsController_remove","summary":"Delete env var by key","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}},{"name":"key","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["environments"],"security":[{"bearer":[]}]}},"/api/v1/environments":{"get":{"operationId":"EnvironmentsController_listForProject","summary":"List environments for a project (pass ?projectId=)","parameters":[{"name":"projectId","required":true,"in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["environments"],"security":[{"bearer":[]}]},"post":{"operationId":"EnvironmentsController_create","summary":"Create environment (production/staging/preview)","parameters":[],"responses":{"201":{"description":""}},"tags":["environments"],"security":[{"bearer":[]}]}},"/api/v1/environments/{id}":{"delete":{"operationId":"EnvironmentsController_deleteEnv","summary":"Delete environment (production cannot be deleted)","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["environments"],"security":[{"bearer":[]}]}},"/api/v1/environments/{id}/env-vars/import":{"post":{"operationId":"EnvironmentsController_bulkImport","summary":"Bulk import from .env text","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"201":{"description":""}},"tags":["environments"],"security":[{"bearer":[]}]}},"/api/v1/environments/diff/{srcId}/{dstId}":{"get":{"operationId":"EnvironmentsController_diff","summary":"Diff env vars between two environments (src → dst)","parameters":[{"name":"srcId","required":true,"in":"path","schema":{"type":"string"}},{"name":"dstId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["environments"],"security":[{"bearer":[]}]}},"/api/v1/environments/{id}/required-role":{"post":{"operationId":"EnvironmentsController_setRole","summary":"Set required role for write access (member | admin)","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"201":{"description":""}},"tags":["environments"],"security":[{"bearer":[]}]}},"/api/v1/services/{id}":{"get":{"operationId":"ServicesController_findOne","summary":"Get service with deployments and domains","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["services"],"security":[{"bearer":[]}]},"patch":{"operationId":"ServicesController_update","summary":"Update service settings","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateServiceDto"}}}},"responses":{"200":{"description":""}},"tags":["services"],"security":[{"bearer":[]}]},"delete":{"operationId":"ServicesController_remove","summary":"Stop container + delete service record + cleanup Traefik route","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["services"],"security":[{"bearer":[]}]}},"/api/v1/services/{id}/restart":{"post":{"operationId":"ServicesController_restart","summary":"Restart container (docker restart) without rebuild","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"201":{"description":""}},"tags":["services"],"security":[{"bearer":[]}]}},"/api/v1/services/{id}/stop":{"post":{"operationId":"ServicesController_stop","summary":"Stop container (docker stop) but keep record","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"201":{"description":""}},"tags":["services"],"security":[{"bearer":[]}]}},"/api/v1/services/{id}/start":{"post":{"operationId":"ServicesController_start","summary":"Start a previously stopped container (docker start) without rebuild","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"201":{"description":""}},"tags":["services"],"security":[{"bearer":[]}]}},"/api/v1/services/{id}/rollback":{"post":{"operationId":"ServicesController_rollback","summary":"Roll back to a previous SUCCESS deployment (creates a new rollback deployment)","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"201":{"description":""}},"tags":["services"],"security":[{"bearer":[]}]}},"/api/v1/services/{id}/redeploy":{"post":{"operationId":"ServicesController_redeploy","summary":"Trigger new deploy from last known source (optional ?noCache=1)","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"201":{"description":""}},"tags":["services"],"security":[{"bearer":[]}]}},"/api/v1/services/{id}/deployments/{depId}/cancel":{"post":{"operationId":"ServicesController_cancel","summary":"Cancel a pending or in-progress deployment","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}},{"name":"depId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"201":{"description":""}},"tags":["services"],"security":[{"bearer":[]}]}},"/api/v1/services/{id}/metrics":{"get":{"operationId":"ServicesController_metrics","summary":"Service metrics for last 24h (CPU/RAM/network)","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["services"],"security":[{"bearer":[]}]}},"/api/v1/services/{id}/logs":{"get":{"operationId":"ServicesController_logs","summary":"Fetch last N runtime log lines (default 500)","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}},{"name":"tail","required":true,"in":"query","schema":{"type":"string"}},{"name":"since","required":true,"in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["services"],"security":[{"bearer":[]}]}},"/api/v1/services/{serviceId}/volumes":{"get":{"operationId":"VolumesController_list","summary":"List volumes for a service","parameters":[{"name":"serviceId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["volumes"],"security":[{"bearer":[]}]},"post":{"operationId":"VolumesController_create","summary":"Create a new volume for the service","parameters":[{"name":"serviceId","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateVolumeDto"}}}},"responses":{"201":{"description":""}},"tags":["volumes"],"security":[{"bearer":[]}]}},"/api/v1/volumes/{id}":{"patch":{"operationId":"VolumesController_update","summary":"Update volume size (grow only)","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateVolumeDto"}}}},"responses":{"200":{"description":""}},"tags":["volumes"],"security":[{"bearer":[]}]},"delete":{"operationId":"VolumesController_remove","summary":"Delete volume","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["volumes"],"security":[{"bearer":[]}]}},"/api/v1/volumes/{id}/wipe":{"post":{"operationId":"VolumesController_wipe","summary":"Wipe all data from volume (dangerous!)","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"201":{"description":""}},"tags":["volumes"],"security":[{"bearer":[]}]}},"/api/v1/deployments":{"post":{"operationId":"DeploymentsController_create","summary":"Trigger a new deployment (creates service if needed)","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateDeploymentDto"}}}},"responses":{"201":{"description":""}},"tags":["deployments"],"security":[{"bearer":[]}]},"get":{"operationId":"DeploymentsController_list","summary":"List deployments — by service (serviceId=) or workspace-wide (workspaceId=)","parameters":[{"name":"serviceId","required":true,"in":"query","schema":{"type":"string"}},{"name":"workspaceId","required":true,"in":"query","schema":{"type":"string"}},{"name":"status","required":true,"in":"query","schema":{"type":"string"}},{"name":"limit","required":true,"in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["deployments"],"security":[{"bearer":[]}]}},"/api/v1/deployments/{id}":{"get":{"operationId":"DeploymentsController_findOne","summary":"Get deployment with build logs","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["deployments"],"security":[{"bearer":[]}]}},"/api/v1/projects/{projectId}/databases":{"post":{"operationId":"DatabasesController_create","summary":"Provision one-click database (postgres/mysql/redis)","parameters":[{"name":"projectId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"201":{"description":""}},"tags":["databases"],"security":[{"bearer":[]}]}},"/api/v1/volumes/{volumeId}/backups":{"get":{"operationId":"BackupsController_list","summary":"List backups for volume","parameters":[{"name":"volumeId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["backups"],"security":[{"bearer":[]}]},"post":{"operationId":"BackupsController_create","summary":"Trigger immediate backup","parameters":[{"name":"volumeId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"201":{"description":""}},"tags":["backups"],"security":[{"bearer":[]}]}},"/api/v1/volumes/{volumeId}/schedule":{"patch":{"operationId":"BackupsController_setSchedule","summary":"Set/clear backup cron schedule (e.g. \"0 3 * * *\"), null to disable","parameters":[{"name":"volumeId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["backups"],"security":[{"bearer":[]}]}},"/api/v1/backups/{id}":{"delete":{"operationId":"BackupsController_remove","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["backups"],"security":[{"bearer":[]}]}},"/api/v1/backups/{id}/lock":{"patch":{"operationId":"BackupsController_lock","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["backups"],"security":[{"bearer":[]}]}},"/api/v1/backups/{id}/restore":{"post":{"operationId":"BackupsController_restore","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"201":{"description":""}},"tags":["backups"],"security":[{"bearer":[]}]}},"/api/v1/services/{serviceId}/domains":{"get":{"operationId":"DomainsController_list","parameters":[{"name":"serviceId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["domains"],"security":[{"bearer":[]}]},"post":{"operationId":"DomainsController_addCustom","summary":"Add custom domain (issues CNAME verification token)","parameters":[{"name":"serviceId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"201":{"description":""}},"tags":["domains"],"security":[{"bearer":[]}]}},"/api/v1/services/{serviceId}/domains/generate":{"post":{"operationId":"DomainsController_generate","summary":"Generate <slug>-<svc>.<PUBLIC_DOMAIN> hostname","parameters":[{"name":"serviceId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"201":{"description":""}},"tags":["domains"],"security":[{"bearer":[]}]}},"/api/v1/domains/{id}/verify":{"post":{"operationId":"DomainsController_verify","summary":"Check CNAME points to our edge; on success SSL is issued","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"201":{"description":""}},"tags":["domains"],"security":[{"bearer":[]}]}},"/api/v1/domains/{id}":{"delete":{"operationId":"DomainsController_remove","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["domains"],"security":[{"bearer":[]}]}},"/api/v1/workspaces/{id}/activity":{"get":{"operationId":"ActivityController_workspace","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}},{"name":"limit","required":true,"in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["activity"],"security":[{"bearer":[]}]}},"/api/v1/projects/{id}/activity":{"get":{"operationId":"ActivityController_project","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}},{"name":"limit","required":true,"in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["activity"],"security":[{"bearer":[]}]}},"/api/v1/usage":{"get":{"operationId":"UsageController_summary","summary":"Month-to-date usage breakdown per service","parameters":[{"name":"workspaceId","required":true,"in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["usage"],"security":[{"bearer":[]}]}},"/api/v1/invoices":{"get":{"operationId":"InvoicesController_list","summary":"List invoices for a workspace (default = first workspace of user)","parameters":[{"name":"workspaceId","required":true,"in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["invoices"],"security":[{"bearer":[]}]}},"/api/v1/invoices/{id}/pdf":{"get":{"operationId":"InvoicesController_pdf","summary":"Download invoice as PDF","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["invoices"],"security":[{"bearer":[]}]}},"/api/v1/webhooks/github":{"post":{"operationId":"WebhooksController_github","summary":"GitHub push webhook → auto-deploy matching services","parameters":[{"name":"x-hub-signature-256","required":true,"in":"header","schema":{"type":"string"}},{"name":"x-github-event","required":true,"in":"header","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["webhooks"]}},"/api/v1/workspaces/{wsId}/channels":{"get":{"operationId":"AlertsController_listChannels","summary":"List notification channels for workspace","parameters":[{"name":"wsId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["alerts"],"security":[{"bearer":[]}]},"post":{"operationId":"AlertsController_createChannel","summary":"Add channel (kind: telegram | slack | discord | email)","parameters":[{"name":"wsId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"201":{"description":""}},"tags":["alerts"],"security":[{"bearer":[]}]}},"/api/v1/workspaces/{wsId}/channels/{id}":{"delete":{"operationId":"AlertsController_removeChannel","parameters":[{"name":"wsId","required":true,"in":"path","schema":{"type":"string"}},{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["alerts"],"security":[{"bearer":[]}]}},"/api/v1/workspaces/{wsId}/channels/{id}/test":{"post":{"operationId":"AlertsController_test","parameters":[{"name":"wsId","required":true,"in":"path","schema":{"type":"string"}},{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"201":{"description":""}},"tags":["alerts"],"security":[{"bearer":[]}]}},"/api/v1/workspaces/{wsId}/rules":{"get":{"operationId":"AlertsController_listRules","parameters":[{"name":"wsId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["alerts"],"security":[{"bearer":[]}]},"post":{"operationId":"AlertsController_createRule","parameters":[{"name":"wsId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"201":{"description":""}},"tags":["alerts"],"security":[{"bearer":[]}]}},"/api/v1/workspaces/{wsId}/rules/{id}":{"delete":{"operationId":"AlertsController_removeRule","parameters":[{"name":"wsId","required":true,"in":"path","schema":{"type":"string"}},{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["alerts"],"security":[{"bearer":[]}]}},"/api/v1/projects/{projectId}/buckets":{"get":{"operationId":"BucketsController_list","parameters":[{"name":"projectId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}}},"post":{"operationId":"BucketsController_create","parameters":[{"name":"projectId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"201":{"description":""}}}},"/api/v1/buckets/{id}":{"delete":{"operationId":"BucketsController_remove","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}}}},"/api/v1/buckets/{id}/stats":{"get":{"operationId":"BucketsController_stats","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}}}},"/api/v1/buckets/{id}/reveal":{"post":{"operationId":"BucketsController_reveal","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"201":{"description":""}}}},"/api/v1/workspaces/{wsId}/waf/rules":{"get":{"operationId":"WafController_list","parameters":[{"name":"wsId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}}},"post":{"operationId":"WafController_create","parameters":[{"name":"wsId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"201":{"description":""}}}},"/api/v1/waf/rules/{id}":{"patch":{"operationId":"WafController_toggle","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}}},"delete":{"operationId":"WafController_remove","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}}}},"/api/v1/domains/{id}/edge-rules":{"get":{"operationId":"EdgeController_list","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}}},"post":{"operationId":"EdgeController_create","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"201":{"description":""}}}},"/api/v1/edge-rules/{id}":{"patch":{"operationId":"EdgeController_toggle","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}}},"delete":{"operationId":"EdgeController_remove","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}}}},"/api/v1/domains/{id}/cdn":{"patch":{"operationId":"EdgeController_updateCdn","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}}}},"/api/v1/domains/{id}/purge":{"post":{"operationId":"EdgeController_purge","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"201":{"description":""}}}},"/api/v1/github-app/setup":{"get":{"operationId":"GithubAppController_setup","parameters":[],"responses":{"200":{"description":""}}}},"/api/v1/github-app/callback":{"get":{"operationId":"GithubAppController_callback","parameters":[{"name":"installation_id","required":true,"in":"query","schema":{"type":"string"}},{"name":"setup_action","required":true,"in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":""}}}},"/api/v1/github-app/installations/{id}/repos":{"get":{"operationId":"GithubAppController_listRepos","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}}}},"/api/v1/workspaces/{wsId}/saml":{"get":{"operationId":"EnterpriseController_samlGet","parameters":[{"name":"wsId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}}},"post":{"operationId":"EnterpriseController_samlUpsert","parameters":[{"name":"wsId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"201":{"description":""}}},"delete":{"operationId":"EnterpriseController_samlDelete","parameters":[{"name":"wsId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}}}},"/api/v1/workspaces/{wsId}/access-groups":{"get":{"operationId":"EnterpriseController_groupList","parameters":[{"name":"wsId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}}},"post":{"operationId":"EnterpriseController_groupCreate","parameters":[{"name":"wsId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"201":{"description":""}}}},"/api/v1/access-groups/{id}":{"delete":{"operationId":"EnterpriseController_groupRemove","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}}}},"/api/v1/access-groups/{id}/members":{"post":{"operationId":"EnterpriseController_groupAddMember","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"201":{"description":""}}}},"/api/v1/access-groups/{id}/members/{userId}":{"delete":{"operationId":"EnterpriseController_groupRemoveMember","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}},{"name":"userId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}}}},"/api/v1/access-groups/{id}/grants":{"post":{"operationId":"EnterpriseController_groupAddGrant","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"201":{"description":""}}}},"/api/v1/access-grants/{id}":{"delete":{"operationId":"EnterpriseController_groupRemoveGrant","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}}}},"/api/v1/workspaces/{wsId}/guardrails":{"get":{"operationId":"EnterpriseController_guardrailList","parameters":[{"name":"wsId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}}},"post":{"operationId":"EnterpriseController_guardrailCreate","parameters":[{"name":"wsId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"201":{"description":""}}}},"/api/v1/guardrails/{id}":{"patch":{"operationId":"EnterpriseController_guardrailToggle","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}}},"delete":{"operationId":"EnterpriseController_guardrailRemove","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}}}},"/api/v1/workspaces/{wsId}/guardrails/decisions":{"get":{"operationId":"EnterpriseController_guardrailDecisions","parameters":[{"name":"wsId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}}}},"/api/v1/workspaces/{wsId}/compliance/audit-trail":{"get":{"operationId":"EnterpriseController_complianceAudit","parameters":[{"name":"wsId","required":true,"in":"path","schema":{"type":"string"}},{"name":"from","required":true,"in":"query","schema":{"type":"string"}},{"name":"to","required":true,"in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":""}}}},"/api/v1/workspaces/{wsId}/compliance/audit-trail.csv":{"get":{"operationId":"EnterpriseController_complianceAuditCsv","parameters":[{"name":"wsId","required":true,"in":"path","schema":{"type":"string"}},{"name":"from","required":true,"in":"query","schema":{"type":"string"}},{"name":"to","required":true,"in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":""}}}},"/api/v1/workspaces/{wsId}/compliance/retention":{"get":{"operationId":"EnterpriseController_complianceRetention","parameters":[{"name":"wsId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}}}},"/api/v1/marketplace/templates":{"get":{"operationId":"CommunityController_browse","parameters":[{"name":"category","required":true,"in":"query","schema":{"type":"string"}},{"name":"q","required":true,"in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":""}}}},"/api/v1/marketplace/templates/{slug}":{"get":{"operationId":"CommunityController_get","parameters":[{"name":"slug","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}}}},"/api/v1/marketplace/templates/{code}/click":{"post":{"operationId":"CommunityController_trackClick","parameters":[{"name":"code","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"201":{"description":""}}}},"/api/v1/marketplace/submit":{"post":{"operationId":"CommunityController_submit","parameters":[],"responses":{"201":{"description":""}}}},"/api/v1/marketplace/mine":{"get":{"operationId":"CommunityController_mine","parameters":[],"responses":{"200":{"description":""}}}},"/api/v1/marketplace/{id}/install":{"post":{"operationId":"CommunityController_install","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"201":{"description":""}}}},"/api/v1/marketplace/{id}/rate":{"post":{"operationId":"CommunityController_rate","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"201":{"description":""}}}},"/api/v1/admin/marketplace/queue":{"get":{"operationId":"CommunityController_queue","parameters":[],"responses":{"200":{"description":""}}}},"/api/v1/admin/marketplace/{id}/moderate":{"post":{"operationId":"CommunityController_moderate","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"201":{"description":""}}}},"/api/v1/kickbacks/mine":{"get":{"operationId":"CommunityController_myKickbacks","parameters":[],"responses":{"200":{"description":""}}}},"/api/v1/admin/kickbacks/accrue":{"post":{"operationId":"CommunityController_accrue","parameters":[],"responses":{"201":{"description":""}}}},"/api/v1/admin/kickbacks/{id}/paid":{"post":{"operationId":"CommunityController_markKickbackPaid","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"201":{"description":""}}}},"/api/v1/affiliate/me":{"get":{"operationId":"CommunityController_affMe","parameters":[],"responses":{"200":{"description":""}}}},"/api/v1/affiliate/payout-details":{"post":{"operationId":"CommunityController_affPayoutDetails","parameters":[],"responses":{"201":{"description":""}}}},"/api/v1/affiliate/referrals":{"get":{"operationId":"CommunityController_affReferrals","parameters":[],"responses":{"200":{"description":""}}}},"/api/v1/affiliate/payouts":{"get":{"operationId":"CommunityController_affPayouts","parameters":[],"responses":{"200":{"description":""}}}},"/api/v1/affiliate/payout-request":{"post":{"operationId":"CommunityController_affRequestPayout","parameters":[],"responses":{"201":{"description":""}}}},"/api/v1/admin/affiliate/payouts/{id}/paid":{"post":{"operationId":"CommunityController_affMarkPaid","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"201":{"description":""}}}},"/api/v1/workspaces/{wsId}/env-groups":{"get":{"operationId":"EnvGroupsController_list","parameters":[{"name":"wsId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}}},"post":{"operationId":"EnvGroupsController_create","parameters":[{"name":"wsId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"201":{"description":""}}}},"/api/v1/workspaces/{wsId}/env-groups/import-render":{"post":{"operationId":"EnvGroupsController_importFromRender","parameters":[{"name":"wsId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"201":{"description":""}}}},"/api/v1/env-groups/{id}":{"delete":{"operationId":"EnvGroupsController_remove","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}}}},"/api/v1/env-groups/{id}/vars":{"post":{"operationId":"EnvGroupsController_setVars","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"201":{"description":""}}}},"/api/v1/env-groups/{id}/vars/{key}":{"delete":{"operationId":"EnvGroupsController_removeVar","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}},{"name":"key","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}}}},"/api/v1/env-groups/{id}/bind/{envId}":{"post":{"operationId":"EnvGroupsController_bind","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}},{"name":"envId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"201":{"description":""}}},"delete":{"operationId":"EnvGroupsController_unbind","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}},{"name":"envId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}}}},"/api/v1/services/{id}/analytics":{"get":{"operationId":"AnalyticsController_byService","summary":"Web analytics for a service — request counts, unique visitors, mobile %, latency p50/p95, top paths and referrers","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}},{"name":"range","required":true,"in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["analytics"],"security":[{"bearer":[]}]}},"/api/v1/plans/features":{"get":{"operationId":"PlansController_features","summary":"Public feature-to-plan matrix and plan limits (no auth required)","parameters":[],"responses":{"200":{"description":""}},"tags":["plans"]}},"/api/v1/status/health":{"get":{"operationId":"HealthController_health","parameters":[],"responses":{"200":{"description":""}}}},"/api/v1/status":{"get":{"operationId":"HealthController_root","parameters":[],"responses":{"200":{"description":""}}}},"/api/v1/status/metrics":{"get":{"operationId":"HealthController_metrics","parameters":[],"responses":{"200":{"description":""}}}},"/health":{"get":{"operationId":"LivenessController_liveness","parameters":[],"responses":{"200":{"description":""}}}},"/healthz":{"get":{"operationId":"LivenessController_healthz","parameters":[],"responses":{"200":{"description":""}}}},"/readyz":{"get":{"operationId":"LivenessController_ready","parameters":[],"responses":{"200":{"description":""}}}},"/api/v1/health":{"get":{"operationId":"ApiV1HealthController_health","parameters":[],"responses":{"200":{"description":""}}}}},"info":{"title":"deployuz Public API","description":"REST API для deployuz — первой UZ PaaS. Все эндпойнты доступны через Bearer-токен (personal или project token).\n\n**Получить токен:** UI → Settings → Developer → Create token. Или через `deployuz login` в CLI.\n**Rate limit:** 2000 запросов / минуту с одного IP (auth-эндпойнты — 40/минуту).\n**Base URL:** `https://api.deployuz.uz/api/v1` (prod) или `http://localhost:3000/api/v1` (dev).\n\n📘 Полная документация: [docs.deployuz.uz](https://docs.deployuz.uz)","version":"0.5.0","contact":{"name":"deployuz support","url":"https://deployuz.uz","email":"support@deployuz.uz"},"license":{"name":"Proprietary","url":"https://deployuz.uz/legal/terms"}},"tags":[],"servers":[{"url":"http://localhost:3000/api/v1","description":"Local dev"},{"url":"https://api.deployuz.uz/api/v1","description":"Production"}],"components":{"securitySchemes":{"api-token":{"scheme":"bearer","bearerFormat":"JWT","type":"http","description":"Personal или Project token (Settings → Developer)"}},"schemas":{"RegisterDto":{"type":"object","properties":{"email":{"type":"string","example":"you@example.com"},"password":{"type":"string","example":"super-secret-password","minLength":8},"name":{"type":"string","example":"Mirsaid"}},"required":["email","password"]},"LoginDto":{"type":"object","properties":{"email":{"type":"string","example":"you@example.com"},"password":{"type":"string","example":"super-secret-password"}},"required":["email","password"]},"CreateProjectDto":{"type":"object","properties":{"name":{"type":"string","example":"my-shop"},"region":{"type":"string","example":"tashkent-1"}},"required":["name"]},"EnvVarInput":{"type":"object","properties":{"key":{"type":"string","example":"DATABASE_URL"},"value":{"type":"string","example":"postgres://user:pass@host/db"},"isSecret":{"type":"boolean","example":true}},"required":["key","value"]},"SetEnvVarsDto":{"type":"object","properties":{"vars":{"type":"array","items":{"$ref":"#/components/schemas/EnvVarInput"}}},"required":["vars"]},"UpdateServiceDto":{"type":"object","properties":{"name":{"type":"string"},"sourceRepo":{"type":"string"},"sourceBranch":{"type":"string"},"sourceRootDir":{"type":"string"},"buildCommand":{"type":"string"},"startCommand":{"type":"string"},"deployCommand":{"type":"string"},"healthCheckPath":{"type":"string"},"size":{"type":"string","enum":["FREE","MICRO","SMALL","MEDIUM","LARGE","XL","XXL"]},"replicas":{"type":"number","minimum":1,"maximum":42},"restartPolicy":{"type":"string","enum":["always","on-failure","unless-stopped","no"]},"autoDeploy":{"type":"boolean"},"cronExpression":{"type":"string"},"buildTier":{"type":"string","enum":["starter","performance"]}}},"CreateVolumeDto":{"type":"object","properties":{"name":{"type":"string","example":"data"},"mountPath":{"type":"string","example":"/app/data"},"sizeGB":{"type":"number","example":5,"minimum":1,"maximum":1000}},"required":["name","mountPath","sizeGB"]},"UpdateVolumeDto":{"type":"object","properties":{"sizeGB":{"type":"number","minimum":1,"maximum":1000}}},"CreateDeploymentDto":{"type":"object","properties":{"projectId":{"type":"string","example":"clxx1234abcd"},"serviceName":{"type":"string","example":"web"},"serviceType":{"type":"string","enum":["WEB","WORKER","CRON","STATIC_SITE","PRIVATE_SERVICE","POSTGRES","MYSQL","REDIS","MONGO","CUSTOM"],"example":"WEB"},"sourceType":{"type":"string","enum":["GITHUB","GITLAB","BITBUCKET","DOCKER_IMAGE","ZIP_UPLOAD","TEMPLATE"],"example":"GITHUB"},"sourceRepo":{"type":"string","example":"https://github.com/mirsaid/my-shop"},"sourceBranch":{"type":"string","example":"main"},"dockerImage":{"type":"string","example":"ghcr.io/user/img:v1"},"size":{"type":"string","enum":["FREE","MICRO","SMALL","MEDIUM","LARGE","XL","XXL"],"example":"SMALL"},"replicas":{"type":"number","example":1},"buildCommand":{"type":"string","example":"composer install"},"startCommand":{"type":"string","example":"php artisan serve"}},"required":["projectId","serviceName","serviceType","sourceType","size"]}}}}