{"components":{"schemas":{"Bucket":{"properties":{"createdAt":{"example":"2025-03-30T12:00:00Z","format":"date-time","type":"string"},"createdByUserId":{"description":"The user that created this bucket.","example":"user_abc123","type":"string"},"endpoint":{"description":"S3-compatible endpoint for this bucket.","example":"https://eu-central-2.storage.impossibleapi.net","type":"string"},"id":{"example":"sb_abc123","type":"string"},"name":{"example":"my-app-uploads","type":"string"},"objectLocking":{"example":false,"type":"boolean"},"region":{"description":"| Code | Region | City |\n|------|--------|------|\n| ger | Germany | Frankfurt |\n| us-east | US East | New York |\n","enum":["ger","us-east"],"example":"ger","type":"string"},"status":{"enum":["active","queued_for_deletion","deleting","deleted"],"example":"active","type":"string"},"versioning":{"example":false,"type":"boolean"}},"required":["id","name","region","endpoint","status","versioning","objectLocking","createdByUserId","createdAt"],"type":"object"},"BucketCorsConfig":{"properties":{"rules":{"items":{"$ref":"#/components/schemas/BucketCorsRule"},"maxItems":10,"minItems":1,"type":"array"}},"required":["rules"],"type":"object"},"BucketCorsRule":{"properties":{"allowedHeaders":{"description":"Request headers the browser may send. `*` allows all, and a trailing\nwildcard matches a prefix (`x-amz-*`).\n","example":["Content-Type"],"items":{"type":"string"},"maxItems":25,"type":"array"},"allowedMethods":{"description":"HTTP methods the browser may use. Case-insensitive on input.","example":["PUT","GET","HEAD"],"items":{"enum":["GET","PUT","POST","DELETE","HEAD"],"type":"string"},"minItems":1,"type":"array"},"allowedOrigins":{"description":"Origins allowed to make cross-origin requests. Either `*`, or a\nscheme and host with no path (`https://app.example.com`). A leading\n`*.` wildcards the subdomain (`https://*.example.com`).\n","example":["https://app.example.com"],"items":{"type":"string"},"maxItems":25,"minItems":1,"type":"array"},"exposeHeaders":{"description":"Response headers the browser may read. Wildcards are not allowed\nhere. Upload flows that read the upload's ETag need it listed.\n","example":["ETag"],"items":{"type":"string"},"maxItems":25,"type":"array"},"maxAgeSeconds":{"description":"How long the browser may cache the preflight response.","example":3600,"format":"int32","maximum":86400,"minimum":0,"type":"integer"}},"required":["allowedOrigins","allowedMethods"],"type":"object"},"BucketKey":{"properties":{"accessKeyId":{"example":"78815CE4C72F99885346","type":"string"},"createdAt":{"example":"2025-03-30T12:00:00Z","format":"date-time","type":"string"},"id":{"example":"sk_abc123","type":"string"},"name":{"example":"Production uploads","type":"string"}},"required":["id","name","accessKeyId","createdAt"],"type":"object"},"BucketKeyCreated":{"properties":{"accessKeyId":{"example":"78815CE4C72F99885346","type":"string"},"createdAt":{"example":"2025-03-30T12:00:00Z","format":"date-time","type":"string"},"id":{"example":"sk_abc123","type":"string"},"name":{"example":"Production uploads","type":"string"},"secretAccessKey":{"description":"Only returned at creation time. Store it securely.","example":"44dd5c26860a6306b11ac39c58b7c5ef29c7ae36","type":"string"}},"required":["id","name","accessKeyId","secretAccessKey","createdAt"],"type":"object"},"CurrentIdentity":{"properties":{"authType":{"description":"The authentication mechanism used for this request.","enum":["oauth","apikey","agent"],"example":"oauth","type":"string"},"availableOrganizations":{"description":"OAuth only. Organizations the authenticated subject belongs to.","items":{"$ref":"#/components/schemas/CurrentIdentityOrganization"},"type":"array"},"organizationId":{"description":"The organization resolved from the authenticated token.","example":"org_123456","type":"string"},"tokenType":{"description":"The effective token access level.","enum":["ro","rw"],"example":"rw","type":"string"},"user":{"allOf":[{"$ref":"#/components/schemas/CurrentIdentityUser"}],"description":"For OAuth, this is the OAuth token subject. For API keys, this is the API key creator."}},"required":["authType","tokenType","organizationId","user"],"type":"object"},"CurrentIdentityOrganization":{"properties":{"active":{"description":"True when this is the organization resolved from the current token.","example":true,"type":"boolean"},"default":{"description":"Whether this organization is the user's default organization.","example":false,"type":"boolean"},"id":{"description":"The organization ID.","example":"org_123456","type":"string"},"name":{"description":"The organization display name.","example":"Acme Inc.","type":"string"}},"required":["id","name","active","default"],"type":"object"},"CurrentIdentityUser":{"properties":{"avatarUrl":{"description":"User avatar URL.","example":"https://cdn.example.com/avatar.png","type":"string"},"email":{"description":"User email address.","example":"ada@example.com","type":"string"},"githubAccountId":{"description":"GitHub account ID of the resolved user.","example":12345678,"format":"int64","type":"integer"},"githubLogin":{"description":"GitHub login of the resolved user.","example":"adalovelace","type":"string"},"id":{"description":"The resolved user ID for this request.","example":"user_123456","type":"string"},"name":{"description":"User display name.","example":"Ada Lovelace","type":"string"}},"required":["id","name","email","avatarUrl"],"type":"object"},"CustomDomain":{"properties":{"domain":{"description":"The custom domain name","example":"example.com","type":"string"},"id":{"description":"The unique identifier of the custom domain","example":"custom_domain_123456","type":"string"},"status":{"description":"The current status of the custom domain","enum":["pending","active","failed"],"example":"active","type":"string"}},"required":["id","domain","status"],"type":"object"},"EnvironmentVariable":{"properties":{"key":{"description":"The environment variable key","example":"DATABASE_URL","minLength":1,"type":"string"},"secret":{"description":"Whether this environment variable should be treated as a secret","example":true,"type":"boolean"},"value":{"description":"The environment variable value. If secret is true, this will be masked in responses.","example":"","type":"string"}},"required":["key","value","secret"],"type":"object"},"Error":{"properties":{"code":{"description":"A unique identifier for the type of error","enum":["invalid_request","invalid_token","missing_token","read_only_token","api_access_disabled","project_not_found","server_not_found","service_not_found","credential_not_found","ssh_key_already_exists","ssh_key_in_use","ssh_access_unavailable","oauth_client_not_found","insufficient_capacity","product_not_found","invalid_disk_size","invalid_deployment","invalid_network","invalid_volume","invalid_environment","invalid_credentials","service_invalid_state","server_invalid_state","project_not_empty","internal_server_error","domain_already_exists","rate_limit_exceeded","token_revoked"],"example":"invalid_request","type":"string"},"message":{"description":"A human-readable message describing the error","example":"The request body is invalid","type":"string"}},"required":["code","message"],"type":"object"},"ImageDeployment":{"properties":{"registryAuthenticationId":{"description":"The ID of the registry credentials to use for authentication","example":"credential_123456","type":"string"},"url":{"description":"The URL of the container image","example":"docker.io/library/nginx:latest","type":"string"}},"required":["url"],"type":"object"},"InstanceType":{"description":"The size of the server instance. For pricing, see [sliplane.io/pricing](https://sliplane.io/pricing).\n\n| Instance Type | Type | vCPU | RAM | Disk |\n|--------------|------|------|-----|------|\n| Starter | Shared | 1 | 1 GB | 20 GB |\n| Base | Shared | 2 | 2 GB | 20 GB |\n| Medium | Shared | 3 | 4 GB | 20 GB |\n| Large | Shared | 4 | 8 GB | 20 GB |\n| X-Large | Shared | 8 | 16 GB | 20 GB |\n| XX-Large | Shared | 16 | 32 GB | 20 GB |\n| Dedicated Base | Dedicated | 2 | 8 GB | 20 GB |\n| Dedicated Medium | Dedicated | 4 | 16 GB | 20 GB |\n| Dedicated Large | Dedicated | 8 | 32 GB | 20 GB |\n| Dedicated X-Large | Dedicated | 16 | 64 GB | 20 GB |\n| Dedicated XX-Large | Dedicated | 32 | 128 GB | 20 GB |\n| Dedicated XXX-Large | Dedicated | 48 | 192 GB | 20 GB |\n","enum":["starter","base","medium","large","x-large","xx-large","dedicated-base","dedicated-medium","dedicated-large","dedicated-x-large","dedicated-xx-large","dedicated-xxx-large"],"type":"string"},"Location":{"description":"The geographical region of the server.\n\n| Region ID | Region Name |\n|-----------|-------------|\n| ger       | Germany |\n| fin       | Finland |\n| us-east   | US East (Ashburn, USA) |\n| us-west   | US West (Hillsboro, USA) |\n| sin       | Singapore |\n| conf      | Confidential Germany |\n\nLegacy datacenter IDs (deprecated, still accepted for backwards compatibility):\n\n| Legacy ID | Maps to |\n|-----------|---------|\n| fsn       | ger |\n| nbg       | ger |\n| hel       | fin |\n| ash       | us-east |\n| hil       | us-west |\n","enum":["ger","fin","us-east","us-west","sin","conf","fsn","nbg","ash","hel","hil"],"type":"string"},"OAuthClient":{"properties":{"createdAt":{"description":"Timestamp when the OAuth client was created.","example":"2024-03-20T12:00:00Z","format":"date-time","type":"string"},"id":{"description":"The unique identifier of the OAuth client.","example":"oclient_123456","type":"string"},"imageUrl":{"description":"Optional image URL shown in consent screens.","example":"https://cdn.example.com/logo.png","type":"string"},"name":{"description":"The OAuth client display name.","example":"My Integrator App","minLength":1,"type":"string"},"organizationId":{"description":"The organization this OAuth client belongs to.","example":"org_123456","type":"string"},"redirectUris":{"description":"List of allowed redirect callback URLs.","example":["https://app.example.com/callback","http://localhost:3000/callback"],"items":{"format":"uri","type":"string"},"minItems":1,"type":"array"},"updatedAt":{"description":"Timestamp when the OAuth client was last updated.","example":"2024-03-20T12:00:00Z","format":"date-time","type":"string"}},"required":["id","organizationId","name","redirectUris","createdAt","updatedAt"],"type":"object"},"OAuthClientUser":{"properties":{"avatarUrl":{"description":"Avatar URL of the authorized user.","example":"https://cdn.example.com/avatar.png","type":"string"},"email":{"description":"Email address of the authorized user.","example":"ada@example.com","format":"email","type":"string"},"firstAuthorizedAt":{"description":"Timestamp of the first recorded authorization grant.","example":"2024-03-20T12:00:00Z","format":"date-time","type":"string"},"grantCount":{"description":"Total number of recorded authorization grants by this user.","example":3,"format":"int32","minimum":1,"type":"integer"},"lastAuthorizedAt":{"description":"Timestamp of the latest recorded authorization grant.","example":"2024-03-21T12:00:00Z","format":"date-time","type":"string"},"name":{"description":"Display name of the authorized user.","example":"Ada Lovelace","type":"string"},"userId":{"description":"The user ID that authorized this OAuth client.","example":"user_123456","type":"string"}},"required":["userId","name","email","avatarUrl","firstAuthorizedAt","lastAuthorizedAt","grantCount"],"type":"object"},"Postgres":{"properties":{"connection":{"allOf":[{"$ref":"#/components/schemas/PostgresConnection"}],"description":"Connection details. Only included once the database is running."},"createdAt":{"description":"The timestamp when the database was created.","example":"2024-03-20T12:00:00Z","format":"date-time","type":"string"},"createdByUserId":{"description":"The user that created this Postgres database.","example":"user_abc123","type":"string"},"databaseName":{"description":"The name of the PostgreSQL database.","example":"app","type":"string"},"databaseUser":{"description":"The name of the PostgreSQL role.","example":"app","type":"string"},"diskSizeGb":{"description":"The size of the database disk in GB.","example":10,"type":"integer"},"id":{"description":"The unique identifier of the Postgres database.","example":"pg_123456","type":"string"},"ipAllowList":{"description":"Source IP ranges allowed to connect to the database.","items":{"$ref":"#/components/schemas/PostgresIpAllowListEntry"},"type":"array"},"name":{"description":"The display name shown in the dashboard.","example":"My Database","minLength":1,"type":"string"},"region":{"$ref":"#/components/schemas/PostgresRegion"},"status":{"$ref":"#/components/schemas/PostgresStatus"},"version":{"$ref":"#/components/schemas/PostgresVersion"}},"required":["id","name","databaseName","databaseUser","region","version","diskSizeGb","status","ipAllowList","createdByUserId","createdAt"],"type":"object"},"PostgresActiveConnection":{"properties":{"applicationName":{"description":"Client-provided application name, if any.","example":"psql","type":"string"},"backendStart":{"description":"Time when the backend process started.","format":"date-time","type":"string"},"backendType":{"description":"PostgreSQL backend type.","example":"client backend","type":"string"},"clientAddr":{"description":"Client IP address as reported by Postgres, if available.","example":"203.0.113.10","type":"string"},"clientHostname":{"description":"Client hostname as reported by Postgres, if reverse DNS is enabled.","example":"client.example.com","type":"string"},"clientPort":{"description":"Client TCP port.","example":53422,"type":"integer"},"dbname":{"description":"Database the connection is attached to.","example":"app","type":"string"},"pid":{"description":"PostgreSQL backend process ID.","example":1234,"type":"integer"},"query":{"description":"Current or last query text, depending on connection state and Postgres visibility rules.","type":"string"},"queryStart":{"description":"Time when the current query started, if any.","format":"date-time","type":"string"},"reportedAt":{"description":"Timestamp when this snapshot was collected.","example":"2026-05-23T12:00:00Z","format":"date-time","type":"string"},"state":{"description":"Current connection state, for example active or idle.","example":"active","type":"string"},"stateChange":{"description":"Time when the connection state last changed.","format":"date-time","type":"string"},"user":{"description":"PostgreSQL role attached to the connection.","example":"app","type":"string"},"waitEvent":{"description":"Wait event name, if the backend is waiting.","example":"ClientRead","type":"string"},"waitEventType":{"description":"Wait event type, if the backend is waiting.","example":"Client","type":"string"},"xactStart":{"description":"Time when the current transaction started, if any.","format":"date-time","type":"string"}},"required":["pid","reportedAt","backendType"],"type":"object"},"PostgresConnection":{"properties":{"database":{"description":"The name of the PostgreSQL database.","example":"app","type":"string"},"host":{"description":"The hostname to connect to.","example":"pg-123456.db.sliplane.app","type":"string"},"password":{"description":"The password for the PostgreSQL role.","example":"s3cr3t-p4ssw0rd","type":"string"},"port":{"description":"The port to connect to.","example":5432,"type":"integer"},"uri":{"description":"A ready-to-use PostgreSQL connection string.","example":"postgres://app:s3cr3t-p4ssw0rd@pg-123456.db.sliplane.app:5432/app","type":"string"},"user":{"description":"The PostgreSQL role to authenticate as.","example":"app","type":"string"}},"required":["host","port","database","user","password","uri"],"type":"object"},"PostgresCreateResponse":{"properties":{"createdAt":{"description":"The timestamp when the database was created.","example":"2024-03-20T12:00:00Z","format":"date-time","type":"string"},"createdByUserId":{"description":"The user that created this Postgres database.","example":"user_abc123","type":"string"},"databaseName":{"description":"The name of the PostgreSQL database.","example":"app","type":"string"},"databaseUser":{"description":"The name of the PostgreSQL role.","example":"app","type":"string"},"diskSizeGb":{"description":"The size of the database disk in GB.","example":10,"type":"integer"},"id":{"description":"The unique identifier of the Postgres database.","example":"pg_123456","type":"string"},"ipAllowList":{"description":"Source IP ranges allowed to connect to the database.","items":{"$ref":"#/components/schemas/PostgresIpAllowListEntry"},"type":"array"},"name":{"description":"The display name shown in the dashboard.","example":"My Database","minLength":1,"type":"string"},"region":{"$ref":"#/components/schemas/PostgresRegion"},"status":{"$ref":"#/components/schemas/PostgresStatus"},"version":{"$ref":"#/components/schemas/PostgresVersion"}},"required":["id","name","databaseName","databaseUser","region","version","diskSizeGb","status","ipAllowList","createdByUserId","createdAt"],"type":"object"},"PostgresInstanceType":{"description":"The size of the Postgres compute instance. For pricing, see [sliplane.io/pricing](https://sliplane.io/pricing).\n\n| Instance Type | Type | vCPU | RAM | Included Disk |\n|--------------|------|------|-----|---------------|\n| Starter | Shared | 1 | 1 GB | 10 GB |\n| Base | Shared | 2 | 2 GB | 10 GB |\n| Medium | Shared | 2 | 4 GB | 10 GB |\n| Large | Shared | 4 | 8 GB | 10 GB |\n| X-Large | Shared | 8 | 16 GB | 10 GB |\n| XX-Large | Shared | 16 | 32 GB | 10 GB |\n| Dedicated Base | Dedicated | 2 | 8 GB | 10 GB |\n| Dedicated Medium | Dedicated | 4 | 16 GB | 10 GB |\n| Dedicated Large | Dedicated | 8 | 32 GB | 10 GB |\n| Dedicated X-Large | Dedicated | 16 | 64 GB | 10 GB |\n| Dedicated XX-Large | Dedicated | 32 | 128 GB | 10 GB |\n| Dedicated XXX-Large | Dedicated | 48 | 192 GB | 10 GB |\n","enum":["starter","base","medium","large","x-large","xx-large","dedicated-base","dedicated-medium","dedicated-large","dedicated-x-large","dedicated-xx-large","dedicated-xxx-large"],"type":"string"},"PostgresIpAllowListEntry":{"properties":{"createdAt":{"description":"The timestamp when this allow list entry was created.","example":"2026-05-24T12:00:00Z","format":"date-time","type":"string"},"description":{"description":"Optional label for this IP address range.","example":"office","type":"string"},"id":{"description":"Unique identifier for this allow list entry.","example":"pgfw_abc123","type":"string"},"source":{"description":"Source IP address range in CIDR notation. IPv4 and IPv6 CIDRs are supported.","example":"203.0.113.0/24","type":"string"}},"required":["id","source","createdAt"],"type":"object"},"PostgresIpAllowListEntryInput":{"properties":{"description":{"description":"Optional label for this IP address range.","example":"office","type":"string"},"source":{"description":"Source IP address range in CIDR notation. IPv4 and IPv6 CIDRs are supported.","example":"203.0.113.0/24","type":"string"}},"required":["source"],"type":"object"},"PostgresLog":{"properties":{"backendType":{"description":"The backend type emitting the log (e.g. client backend, autovacuum worker).","example":"client backend","type":"string"},"createdAt":{"description":"Timestamp the log line was emitted by Postgres.","example":"2026-05-23T12:00:00Z","format":"date-time","type":"string"},"dbname":{"description":"The database the connection was attached to, if any.","example":"app","type":"string"},"detail":{"description":"Additional detail text accompanying the message.","type":"string"},"hint":{"description":"Postgres-provided hint for resolving the issue.","type":"string"},"id":{"description":"Unique identifier for this log line.","example":"pglog_abc123","type":"string"},"message":{"description":"The primary log message.","example":"database system is ready to accept connections","type":"string"},"pid":{"description":"The PID of the Postgres backend that emitted the line.","example":1234,"type":"integer"},"query":{"description":"Query text associated with the log line, if logged.","type":"string"},"severity":{"description":"Postgres severity level (LOG, NOTICE, WARNING, ERROR, FATAL, PANIC).","example":"LOG","type":"string"},"statement":{"description":"SQL statement associated with the log line, if logged.","type":"string"},"user":{"description":"The PostgreSQL role attached to the connection, if any.","example":"app","type":"string"}},"required":["id","createdAt","message","severity"],"type":"object"},"PostgresRegion":{"description":"The region where the database runs.\n\n| Region ID | Region Name |\n|-----------|-------------|\n| ger       | Germany |\n| fin       | Finland |\n| us-east   | US East (Ashburn, USA) |\n| us-west   | US West (Hillsboro, USA) |\n| sin       | Singapore |\n| conf      | Confidential Germany |\n","enum":["ger","fin","us-east","us-west","sin","conf"],"type":"string"},"PostgresRelationSize":{"properties":{"indexBytes":{"description":"Bytes used by indexes attached to the table.","example":52428800,"format":"int64","type":"integer"},"reportedAt":{"description":"Timestamp when this snapshot was collected.","example":"2026-05-23T12:00:00Z","format":"date-time","type":"string"},"schemaName":{"description":"PostgreSQL schema containing the table.","example":"public","type":"string"},"tableBytes":{"description":"Bytes used by the table, including TOAST and free space.","example":104857600,"format":"int64","type":"integer"},"tableName":{"description":"PostgreSQL table name.","example":"events","type":"string"},"totalBytes":{"description":"Total bytes used by the table and its indexes.","example":157286400,"format":"int64","type":"integer"}},"required":["reportedAt","schemaName","tableName","tableBytes","indexBytes","totalBytes"],"type":"object"},"PostgresRestoreWindow":{"properties":{"max":{"description":"Latest timestamp accepted for point-in-time restore.","example":"2026-05-25T10:28:30Z","format":"date-time","type":"string"},"min":{"description":"Earliest timestamp accepted for point-in-time restore.","example":"2026-05-25T09:00:00Z","format":"date-time","type":"string"}},"required":["min","max"],"type":"object"},"PostgresSlowQuery":{"properties":{"calls":{"description":"Number of times this normalized statement has run.","example":42,"format":"int64","type":"integer"},"databaseId":{"description":"PostgreSQL database OID for this pg_stat_statements row.","example":16384,"format":"int64","type":"integer"},"maxExecMs":{"description":"Maximum execution time in milliseconds.","example":1200.4,"format":"double","type":"number"},"meanExecMs":{"description":"Mean execution time in milliseconds.","example":365.3,"format":"double","type":"number"},"query":{"description":"Normalized query text from pg_stat_statements.","example":"SELECT * FROM events WHERE user_id = $1","type":"string"},"queryId":{"description":"PostgreSQL pg_stat_statements query ID, if available.","example":123456789,"format":"int64","type":"integer"},"rank":{"description":"Position in the current slow query snapshot.","example":1,"type":"integer"},"reportedAt":{"description":"Timestamp when this snapshot was collected.","example":"2026-05-23T12:00:00Z","format":"date-time","type":"string"},"rowsTouched":{"description":"Total rows returned or affected by this normalized statement.","example":10000,"format":"int64","type":"integer"},"stddevExecMs":{"description":"Standard deviation of execution time in milliseconds.","example":81.2,"format":"double","type":"number"},"topLevel":{"description":"Whether this row is for a top-level statement.","example":true,"type":"boolean"},"totalExecMs":{"description":"Total execution time in milliseconds.","example":15342.7,"format":"double","type":"number"},"userId":{"description":"PostgreSQL role OID for this pg_stat_statements row.","example":24576,"format":"int64","type":"integer"},"userName":{"description":"PostgreSQL role name for this pg_stat_statements row, if available.","example":"app","type":"string"}},"required":["rank","reportedAt","databaseId","userId","calls","totalExecMs","meanExecMs","maxExecMs","stddevExecMs","rowsTouched","topLevel","query"],"type":"object"},"PostgresStatus":{"description":"The current status of the Postgres database.","enum":["provisioning","restoring","running","restarting","maintenance","paused","updating","error","deleting"],"type":"string"},"PostgresTopQuery":{"properties":{"calls":{"description":"Number of times this normalized statement has run.","example":4200,"format":"int64","type":"integer"},"databaseId":{"description":"PostgreSQL database OID for this pg_stat_statements row.","example":16384,"format":"int64","type":"integer"},"maxExecMs":{"description":"Maximum execution time in milliseconds.","example":120.4,"format":"double","type":"number"},"meanExecMs":{"description":"Mean execution time in milliseconds.","example":3.65,"format":"double","type":"number"},"query":{"description":"Normalized query text from pg_stat_statements.","example":"SELECT * FROM events WHERE user_id = $1","type":"string"},"queryId":{"description":"PostgreSQL pg_stat_statements query ID, if available.","example":123456789,"format":"int64","type":"integer"},"rank":{"description":"Position in the current top query snapshot.","example":1,"type":"integer"},"reportedAt":{"description":"Timestamp when this snapshot was collected.","example":"2026-05-23T12:00:00Z","format":"date-time","type":"string"},"rowsTouched":{"description":"Total rows returned or affected by this normalized statement.","example":10000,"format":"int64","type":"integer"},"stddevExecMs":{"description":"Standard deviation of execution time in milliseconds.","example":8.12,"format":"double","type":"number"},"topLevel":{"description":"Whether this row is for a top-level statement.","example":true,"type":"boolean"},"totalExecMs":{"description":"Total execution time in milliseconds.","example":15342.7,"format":"double","type":"number"},"userId":{"description":"PostgreSQL role OID for this pg_stat_statements row.","example":24576,"format":"int64","type":"integer"},"userName":{"description":"PostgreSQL role name for this pg_stat_statements row, if available.","example":"app","type":"string"}},"required":["rank","reportedAt","databaseId","userId","calls","totalExecMs","meanExecMs","maxExecMs","stddevExecMs","rowsTouched","topLevel","query"],"type":"object"},"PostgresVersion":{"description":"The PostgreSQL major version.","enum":[18],"example":18,"type":"integer"},"Project":{"properties":{"id":{"description":"The unique identifier of the project","example":"project_123456","type":"string"},"name":{"description":"The name of the project","example":"My Project","minLength":1,"type":"string"}},"required":["id","name"],"type":"object"},"RegistryCredentials":{"properties":{"createdAt":{"description":"The timestamp when the credentials were created","example":"2024-03-20T12:00:00Z","format":"date-time","type":"string"},"id":{"description":"The unique identifier of the registry credentials","example":"credential_123456","type":"string"},"name":{"description":"A name to identify these credentials","example":"Docker Hub Credentials","minLength":1,"type":"string"},"type":{"description":"The type of registry these credentials are for","enum":["ghcr","dockerhub","dhi","generic"],"example":"dockerhub","type":"string"},"username":{"description":"The username for the registry","example":"myusername","type":"string"}},"required":["id","name","type","username","createdAt"],"type":"object"},"RepositoryDeployment":{"properties":{"autoDeploy":{"default":true,"description":"Whether to automatically deploy when changes are pushed to the branch","example":true,"type":"boolean"},"branch":{"default":"main","description":"The branch to deploy from","example":"main","type":"string"},"dockerContext":{"default":".","description":"The build context for Docker","example":".","type":"string"},"dockerfilePath":{"default":"Dockerfile","description":"The path to the Dockerfile in the repository","example":"Dockerfile","type":"string"},"ignorePaths":{"description":"List of file path glob patterns to exclude from triggering a rebuild. Changes to files matching only these patterns will not trigger auto-deploy.","example":["docs/**","*.md"],"items":{"type":"string"},"type":"array"},"includePaths":{"description":"List of file path glob patterns that trigger a rebuild. If specified, only changes to files matching these patterns will trigger auto-deploy.","example":["src/**","Dockerfile"],"items":{"type":"string"},"type":"array"},"url":{"description":"The URL of the repository","example":"https://github.com/username/repo","format":"uri","type":"string"}},"required":["url"],"type":"object"},"SSHConnection":{"description":"SSH connection details for the service.","properties":{"host":{"example":"203.0.113.1","type":"string"},"port":{"example":22222,"type":"integer"},"username":{"example":"service_123456","type":"string"}},"required":["host","port","username"],"type":"object"},"SSHKey":{"properties":{"createdAt":{"format":"date-time","type":"string"},"fingerprint":{"description":"SHA256 fingerprint of the public key.","type":"string"},"id":{"example":"pk_123456","type":"string"},"name":{"example":"Laptop","type":"string"},"publicKey":{"description":"SSH public key in authorized_keys format.","type":"string"}},"required":["id","name","publicKey","fingerprint","createdAt"],"type":"object"},"Server":{"properties":{"createdAt":{"description":"The timestamp when the server was created","example":"2024-03-20T12:00:00Z","format":"date-time","type":"string"},"diskSizeGb":{"description":"Provisioned data disk size in GB. Reflects any prior rescales beyond the size bundled with `instanceType`.","example":160,"type":"integer"},"id":{"description":"The unique identifier of the server","example":"server_123456","type":"string"},"instanceType":{"$ref":"#/components/schemas/InstanceType"},"ipv4":{"description":"The IPv4 address of the server","example":"192.168.1.1","format":"ipv4","type":"string"},"ipv6":{"description":"The IPv6 address of the server","example":"2001:0db8:85a3:0000:0000:8a2e:0370:7334","format":"ipv6","type":"string"},"location":{"description":"The location identifier assigned to the server.","type":"string","x-go-type":"Location"},"memoryMb":{"description":"RAM allocated to the server, in MB","example":8192,"type":"integer"},"name":{"description":"The name of the server","example":"Production Server","minLength":1,"type":"string"},"status":{"$ref":"#/components/schemas/ServerStatus"},"vcpu":{"description":"Number of vCPUs allocated to the server","example":4,"type":"integer"}},"required":["id","name","instanceType","location","status","createdAt","vcpu","memoryMb","diskSizeGb"],"type":"object"},"ServerMetric":{"properties":{"cpuUsage":{"description":"CPU usage percentage","example":35.7,"format":"float","type":"number"},"createdAt":{"description":"The timestamp when the metric was recorded","example":"2024-03-20T12:00:00Z","format":"date-time","type":"string"},"freeMemory":{"description":"Free memory in MB","example":4096,"format":"float","type":"number"},"totalMemory":{"description":"Total memory in MB","example":8192,"format":"float","type":"number"},"usedMemory":{"description":"Used memory in MB","example":4096,"format":"float","type":"number"}},"required":["createdAt","usedMemory","freeMemory","totalMemory","cpuUsage"],"type":"object"},"ServerStatus":{"description":"The current status of the server","enum":["booting","running","error","rescaling","deleting"],"type":"string"},"ServerVolumeResponse":{"properties":{"id":{"description":"The unique identifier of the volume","example":"volume_123456","type":"string"},"name":{"description":"The name of the volume","example":"data","type":"string"}},"required":["id","name"],"type":"object"},"Service":{"properties":{"cmd":{"description":"Override the Docker CMD instruction","example":"npm start","type":"string"},"createdAt":{"description":"The timestamp when the service was created","example":"2024-03-20T12:00:00Z","format":"date-time","type":"string"},"deployment":{"description":"The deployment configuration for the service","oneOf":[{"$ref":"#/components/schemas/RepositoryDeployment","Repository Deployment":null},{"$ref":"#/components/schemas/ImageDeployment","Image Deployment":null}],"type":"object"},"env":{"description":"Environment variables for the service","items":{"$ref":"#/components/schemas/EnvironmentVariable"},"type":"array"},"healthcheck":{"default":"/","description":"The path to use for health checks","example":"/health","type":"string"},"id":{"description":"The unique identifier of the service","example":"service_123456","type":"string"},"name":{"description":"The name of the service","example":"My Service","minLength":1,"type":"string"},"network":{"$ref":"#/components/schemas/ServiceNetworkResponse"},"projectId":{"description":"The ID of the project containing the service","example":"project_123456","type":"string"},"serverId":{"description":"The ID of the server running the service","example":"server_123456","type":"string"},"status":{"$ref":"#/components/schemas/ServiceStatus"},"volumes":{"description":"Volumes mounted to the service","items":{"$ref":"#/components/schemas/VolumeResponse"},"type":"array"}},"required":["id","name","serverId","projectId","status","createdAt","deployment","network"],"type":"object"},"ServiceEvent":{"properties":{"createdAt":{"description":"The timestamp when the event occurred","example":"2024-03-20T12:00:00Z","format":"date-time","type":"string"},"id":{"description":"The unique identifier of the event","example":"service_event_123456","type":"string"},"message":{"description":"Human-readable description of the event","example":"Deploy started","type":"string"},"payload":{"description":"Additional event metadata as a JSON object","example":{"branchName":"main","commitHash":"abc123","deployEventId":"service_event_abc123"},"type":"object"},"trigger":{"description":"What caused the event. An event reporting the outcome of an\noperation carries the same trigger as the event that started it, so\na whole deploy chain shares one value. Triggers include:\n- deploys: manual, api, webhook, github_push, commit_check, create, settings_change, image_tag_change, volume_attach, volume_detach, volume_change\n- suspends and resumes: manual, api, restart, billing, escalation, server_restart\n- platform reactions: container_status_changed, oom\n","example":"github_push","type":"string"},"type":{"description":"The type of event. Types include:\n- service_deploy, service_deploy_success, service_deploy_failed, service_deploy_cancelled\n- service_build, service_build_failed\n- service_suspend, service_suspend_success, service_suspend_failed\n- service_resume, service_resume_success, service_resume_failed\n- service_delete, service_delete_success, service_delete_failed\n- service_oom\n- service_container_status_changed\n","example":"service_deploy_success","type":"string"}},"required":["id","type","createdAt","message","trigger"],"type":"object"},"ServiceLog":{"properties":{"createdAt":{"description":"The timestamp when the log was created","example":"2024-03-20T12:00:00Z","format":"date-time","type":"string"},"message":{"description":"The log message","example":"Application started successfully","type":"string"}},"required":["message","createdAt"],"type":"object"},"ServiceMetric":{"properties":{"cpuUsage":{"description":"CPU usage percentage","example":45.2,"format":"float","type":"number"},"createdAt":{"description":"The timestamp when the metric was recorded","example":"2024-03-20T12:00:00Z","format":"date-time","type":"string"},"freeMemory":{"description":"Free memory in MB","example":1536,"format":"float","type":"number"},"totalMemory":{"description":"Total memory in MB","example":2048,"format":"float","type":"number"},"usedMemory":{"description":"Used memory in MB","example":512.5,"format":"float","type":"number"}},"required":["createdAt","usedMemory","freeMemory","totalMemory","cpuUsage"],"type":"object"},"ServiceNetworkRequest":{"description":"Network configuration. When omitted while creating a service, the service is private.","properties":{"protocol":{"description":"The protocol to use for the service. Only required when public is true.","enum":["http","tcp","udp"],"example":"http","type":"string"},"public":{"default":false,"description":"Whether the service is publicly accessible","example":true,"type":"boolean"}},"required":["public"],"type":"object"},"ServiceNetworkResponse":{"properties":{"customDomains":{"description":"Custom domains assigned to this service","items":{"$ref":"#/components/schemas/CustomDomain"},"type":"array"},"internalDomain":{"description":"The internal domain name for accessing the service within the server.","example":"my-service.internal","type":"string"},"managedDomain":{"description":"The managed domain assigned to this service. Only included in responses if the service is public.","example":"example.sliplane.app","type":"string"},"protocol":{"description":"The protocol to use for the service. Only required when public is true.","enum":["http","tcp","udp"],"example":"http","type":"string"},"public":{"default":false,"description":"Whether the service is publicly accessible","example":true,"type":"boolean"}},"required":["public"],"type":"object"},"ServiceSSHKey":{"properties":{"attachedAt":{"format":"date-time","type":"string"},"fingerprint":{"type":"string"},"keyId":{"example":"pk_123456","type":"string"},"name":{"type":"string"}},"required":["keyId","name","fingerprint","attachedAt"],"type":"object"},"ServiceStatus":{"description":"The current status of the service","enum":["pending","live","failed","suspended","deleting"],"type":"string"},"UpdateOAuthClient":{"properties":{"imageUrl":{"description":"Updated image URL. Send an empty string to clear it.","example":"https://cdn.example.com/new-logo.png","type":"string"},"name":{"description":"Updated OAuth client display name.","example":"Updated Integrator App","minLength":1,"type":"string"},"redirectUris":{"description":"Full replacement list of allowed redirect callback URLs.","example":["https://app.example.com/callback"],"items":{"format":"uri","type":"string"},"minItems":1,"type":"array"}},"type":"object"},"Volume":{"oneOf":[{"name":"Existing Volume","properties":{"id":{"description":"The ID of an existing volume to mount","example":"volume_123456","type":"string"},"mountPath":{"description":"The path where the volume should be mounted in the container","example":"/data","type":"string"}},"required":["id","mountPath"]},{"name":"New Volume","properties":{"mountPath":{"description":"The path where the volume should be mounted in the container","example":"/data","type":"string"},"name":{"description":"The name of the volume","example":"data","type":"string"}},"required":["name","mountPath"]}]},"VolumeResponse":{"properties":{"id":{"description":"The unique identifier of the volume","example":"volume_123456","type":"string"},"mountPath":{"description":"The path where the volume is mounted in the container","example":"/data","type":"string"},"name":{"description":"The name of the volume","example":"data","type":"string"}},"required":["id","name","mountPath"],"type":"object"}},"securitySchemes":{"bearerAuth":{"description":"Bearer token obtained from the Sliplane dashboard. Tokens embed the organization ID (api_rw_org_xxx_secret).","scheme":"bearer","type":"http"}}},"info":{"contact":{"email":"support@sliplane.io","name":"Sliplane Support"},"description":"The Sliplane API allows you to manage your services programmatically.\n\n## Authentication\nAll requests require authentication using a Bearer token, which can be obtained from the Sliplane Dashboard in your team settings.\n\nTokens embed the organization ID directly (e.g., `api_rw_org_xxx_secret`), so only the `Authorization` header is needed:\n```\nAuthorization: Bearer api_rw_org_xxx_secret\n```\n\nYou can create a `read-only` or `read-write` token. `read-only` tokens can only make `GET` requests, all other requests fail with a `403 Forbidden` error. A token is specific to an organization and has access to all resources within that organization.\n\n## API Versioning\nThe API is versioned using a version prefix in the URL path (e.g., `/v0/`). The current version is `v0`. Within a version, non-breaking changes (such as adding optional fields) may be introduced, but breaking changes will not be made.\n\n## Rate Limiting\nThe API is subject to rate limits to ensure fair usage and system stability. The following limits apply:\n\n| Endpoint Type | Rate Limit | Response Code |\n|--------------|------------|---------------|\n| Server Creation | 50 requests per hour | 429 Too Many Requests |\n| Server Rescaling | 10 requests per hour | 429 Too Many Requests |\n| Service Creation | 10 requests per minute | 429 Too Many Requests |\n| Service Deploy | 10 requests per minute | 429 Too Many Requests |\n| All other endpoints | 400 requests per minute | 429 Too Many Requests |\n\nIf you require higher rate limits, please contact [support@sliplane.io](mailto:support@sliplane.io).\n\n## Regions\n\nContact support to enable Confidential Germany (`conf`). This region supports only dedicated instance types.\n\n## LLMs\n\nIf you want to vibecode your Sliplane integration, you can use our [llms.txt file](https://ctrl.sliplane.io/llms.txt).\n\n## Legal\n\n- [Legal Disclosure](https://sliplane.io/legal)\n- [Privacy Policy](https://www.iubenda.com/privacy-policy/57501407)\n","title":"Sliplane API","version":"0.6.0"},"openapi":"3.0.4","paths":{"/buckets":{"get":{"description":"Returns all buckets for the organization.","operationId":"listBuckets","responses":{"200":{"content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/Bucket"},"type":"array"}}},"description":"List of buckets"},"401":{"content":{"application/json":{"schema":{"properties":{"code":{"enum":["invalid_token","missing_token"],"example":"missing_token","type":"string"},"message":{"example":"No authentication token provided","type":"string"}},"type":"object"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"properties":{"code":{"enum":["read_only_token","api_access_disabled"],"example":"api_access_disabled","type":"string"},"message":{"example":"API access is not enabled for your organization","type":"string"}},"type":"object"}}},"description":"Forbidden"}},"summary":"List buckets","tags":["Buckets"]},"post":{"description":"Creates a new S3-compatible bucket in the specified region.","operationId":"createBucket","requestBody":{"content":{"application/json":{"schema":{"properties":{"name":{"description":"Bucket name. Must be globally unique and follow S3 naming rules.","example":"my-app-uploads","maxLength":63,"minLength":3,"pattern":"^[a-z0-9][a-z0-9.-]{1,61}[a-z0-9]$","type":"string"},"objectLocking":{"default":false,"description":"Enable S3 Object Lock. Prevents deletion or overwrite for a retention period. Implicitly enables versioning.","example":false,"type":"boolean"},"region":{"description":"Region where the bucket will be created.\n\n| Code | Region | City |\n|------|--------|------|\n| ger | Germany | Frankfurt |\n| us-east | US East | New York |\n","enum":["ger","us-east"],"example":"ger","type":"string"},"versioning":{"default":false,"description":"Enable S3 versioning. Keeps every version of every object.","example":false,"type":"boolean"}},"required":["name","region"],"type":"object"}}},"required":true},"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Bucket"}}},"description":"Bucket created"},"400":{"content":{"application/json":{"schema":{"properties":{"code":{"enum":["invalid_request"],"example":"invalid_request","type":"string"},"message":{"example":"The request body is invalid","type":"string"}},"type":"object"}}},"description":"Bad Request"},"401":{"content":{"application/json":{"schema":{"properties":{"code":{"enum":["invalid_token","missing_token"],"example":"missing_token","type":"string"},"message":{"example":"No authentication token provided","type":"string"}},"type":"object"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"properties":{"code":{"enum":["read_only_token","api_access_disabled"],"example":"api_access_disabled","type":"string"},"message":{"example":"API access is not enabled for your organization","type":"string"}},"type":"object"}}},"description":"Forbidden"},"409":{"content":{"application/json":{"schema":{"properties":{"code":{"enum":["bucket_exists"],"example":"bucket_exists","type":"string"},"message":{"example":"A bucket with this name already exists","type":"string"}},"type":"object"}}},"description":"Bucket name already taken"}},"summary":"Create a bucket","tags":["Buckets"]}},"/buckets/{bucketId}":{"delete":{"description":"Schedules a bucket for deletion in 24 hours.\nThe bucket and all its access keys will be removed after the grace period.\n","operationId":"deleteBucket","parameters":[{"description":"The ID of the bucket to delete","in":"path","name":"bucketId","required":true,"schema":{"type":"string"}}],"responses":{"202":{"content":{"application/json":{"schema":{"properties":{"deletesAt":{"example":"2025-03-31T12:00:00Z","format":"date-time","type":"string"},"message":{"example":"Bucket scheduled for deletion","type":"string"}},"required":["message","deletesAt"],"type":"object"}}},"description":"Bucket scheduled for deletion"},"401":{"content":{"application/json":{"schema":{"properties":{"code":{"enum":["invalid_token","missing_token"],"example":"missing_token","type":"string"},"message":{"example":"No authentication token provided","type":"string"}},"type":"object"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"properties":{"code":{"enum":["read_only_token","api_access_disabled"],"example":"api_access_disabled","type":"string"},"message":{"example":"API access is not enabled for your organization","type":"string"}},"type":"object"}}},"description":"Forbidden"},"404":{"description":"Bucket not found"}},"summary":"Delete a bucket","tags":["Buckets"]},"patch":{"description":"Updates bucket versioning. Versioning can be enabled or disabled after bucket creation.\nVersioning cannot be disabled for buckets with object locking enabled.\nThis operation is idempotent; buckets already in the requested state return the current bucket.\n","operationId":"updateBucket","parameters":[{"description":"The ID of the bucket","in":"path","name":"bucketId","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"properties":{"versioning":{"description":"Set to true to enable S3 versioning, or false to disable it.","example":true,"type":"boolean"}},"required":["versioning"],"type":"object"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Bucket"}}},"description":"Bucket updated"},"400":{"content":{"application/json":{"schema":{"properties":{"code":{"enum":["invalid_request"],"example":"invalid_request","type":"string"},"message":{"example":"Versioning is required","type":"string"}},"type":"object"}}},"description":"Bad Request"},"401":{"content":{"application/json":{"schema":{"properties":{"code":{"enum":["invalid_token","missing_token"],"example":"missing_token","type":"string"},"message":{"example":"No authentication token provided","type":"string"}},"type":"object"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"properties":{"code":{"enum":["read_only_token","api_access_disabled","feature_not_enabled"],"example":"feature_not_enabled","type":"string"},"message":{"example":"This feature is not enabled for your organization","type":"string"}},"type":"object"}}},"description":"Forbidden"},"404":{"description":"Bucket not found"},"409":{"content":{"application/json":{"schema":{"properties":{"code":{"enum":["bucket_not_active","bucket_object_lock_enabled"],"example":"bucket_not_active","type":"string"},"message":{"example":"Bucket is not active","type":"string"}},"type":"object"}}},"description":"Bucket is not active or object locking prevents disabling versioning"}},"summary":"Update a bucket","tags":["Buckets"]}},"/buckets/{bucketId}/cors":{"delete":{"description":"Removes all CORS rules from the bucket. Succeeds when none are set.","operationId":"deleteBucketCors","parameters":[{"description":"The ID of the bucket","in":"path","name":"bucketId","required":true,"schema":{"type":"string"}}],"responses":{"204":{"description":"CORS configuration deleted"},"401":{"content":{"application/json":{"schema":{"properties":{"code":{"enum":["invalid_token","missing_token"],"example":"missing_token","type":"string"},"message":{"example":"No authentication token provided","type":"string"}},"type":"object"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"properties":{"code":{"enum":["read_only_token","api_access_disabled"],"example":"api_access_disabled","type":"string"},"message":{"example":"API access is not enabled for your organization","type":"string"}},"type":"object"}}},"description":"Forbidden"},"404":{"description":"Bucket not found"},"409":{"content":{"application/json":{"schema":{"properties":{"code":{"enum":["bucket_not_active"],"example":"bucket_not_active","type":"string"},"message":{"example":"Bucket is not active","type":"string"}},"type":"object"}}},"description":"Bucket is not active"}},"summary":"Delete the CORS configuration","tags":["Bucket CORS"]},"get":{"description":"Returns the CORS rules currently set on the bucket, read live from the\nstorage provider. Returns an empty list when no CORS configuration exists.\n","operationId":"getBucketCors","parameters":[{"description":"The ID of the bucket","in":"path","name":"bucketId","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BucketCorsConfig"}}},"description":"Current CORS configuration"},"401":{"content":{"application/json":{"schema":{"properties":{"code":{"enum":["invalid_token","missing_token"],"example":"missing_token","type":"string"},"message":{"example":"No authentication token provided","type":"string"}},"type":"object"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"properties":{"code":{"enum":["read_only_token","api_access_disabled"],"example":"api_access_disabled","type":"string"},"message":{"example":"API access is not enabled for your organization","type":"string"}},"type":"object"}}},"description":"Forbidden"},"404":{"description":"Bucket not found"},"409":{"content":{"application/json":{"schema":{"properties":{"code":{"enum":["bucket_not_active"],"example":"bucket_not_active","type":"string"},"message":{"example":"Bucket is not active","type":"string"}},"type":"object"}}},"description":"Bucket is not active"}},"summary":"Get the CORS configuration","tags":["Bucket CORS"]},"put":{"description":"Replaces the bucket's CORS configuration with the rules provided. This is\nnot a merge: rules you leave out are removed.\n\nThe response echoes the configuration read back from the storage provider\nafter the write, so it reflects any normalization the provider applied.\n","operationId":"putBucketCors","parameters":[{"description":"The ID of the bucket","in":"path","name":"bucketId","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BucketCorsConfig"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BucketCorsConfig"}}},"description":"CORS configuration applied"},"400":{"content":{"application/json":{"schema":{"properties":{"code":{"enum":["invalid_request"],"example":"invalid_request","type":"string"},"message":{"example":"rules[0]: allowedMethods contains an unsupported method \"PATCH\"","type":"string"}},"type":"object"}}},"description":"Bad Request"},"401":{"content":{"application/json":{"schema":{"properties":{"code":{"enum":["invalid_token","missing_token"],"example":"missing_token","type":"string"},"message":{"example":"No authentication token provided","type":"string"}},"type":"object"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"properties":{"code":{"enum":["read_only_token","api_access_disabled"],"example":"api_access_disabled","type":"string"},"message":{"example":"API access is not enabled for your organization","type":"string"}},"type":"object"}}},"description":"Forbidden"},"404":{"description":"Bucket not found"},"409":{"content":{"application/json":{"schema":{"properties":{"code":{"enum":["bucket_not_active"],"example":"bucket_not_active","type":"string"},"message":{"example":"Bucket is not active","type":"string"}},"type":"object"}}},"description":"Bucket is not active"}},"summary":"Replace the CORS configuration","tags":["Bucket CORS"]}},"/buckets/{bucketId}/keys":{"get":{"description":"Returns all access keys for a bucket. Secret keys are not included.","operationId":"listBucketKeys","parameters":[{"description":"The ID of the bucket","in":"path","name":"bucketId","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/BucketKey"},"type":"array"}}},"description":"List of access keys"},"401":{"content":{"application/json":{"schema":{"properties":{"code":{"enum":["invalid_token","missing_token"],"example":"missing_token","type":"string"},"message":{"example":"No authentication token provided","type":"string"}},"type":"object"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"properties":{"code":{"enum":["read_only_token","api_access_disabled"],"example":"api_access_disabled","type":"string"},"message":{"example":"API access is not enabled for your organization","type":"string"}},"type":"object"}}},"description":"Forbidden"},"404":{"description":"Bucket not found"}},"summary":"List access keys","tags":["Bucket Keys"]},"post":{"description":"Creates a new access key scoped to this bucket.\nThe secret key is only returned in this response.\n","operationId":"createBucketKey","parameters":[{"description":"The ID of the bucket","in":"path","name":"bucketId","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"properties":{"name":{"description":"Human-readable name for this access key.","example":"Production uploads","minLength":1,"type":"string"}},"required":["name"],"type":"object"}}},"required":true},"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BucketKeyCreated"}}},"description":"Access key created"},"401":{"content":{"application/json":{"schema":{"properties":{"code":{"enum":["invalid_token","missing_token"],"example":"missing_token","type":"string"},"message":{"example":"No authentication token provided","type":"string"}},"type":"object"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"properties":{"code":{"enum":["read_only_token","api_access_disabled"],"example":"api_access_disabled","type":"string"},"message":{"example":"API access is not enabled for your organization","type":"string"}},"type":"object"}}},"description":"Forbidden"},"404":{"description":"Bucket not found"}},"summary":"Create an access key","tags":["Bucket Keys"]}},"/buckets/{bucketId}/keys/{keyId}":{"delete":{"description":"Deletes an access key and its associated IAM resources.","operationId":"deleteBucketKey","parameters":[{"description":"The ID of the bucket","in":"path","name":"bucketId","required":true,"schema":{"type":"string"}},{"description":"The ID of the access key to delete","in":"path","name":"keyId","required":true,"schema":{"type":"string"}}],"responses":{"204":{"description":"Access key deleted"},"401":{"content":{"application/json":{"schema":{"properties":{"code":{"enum":["invalid_token","missing_token"],"example":"missing_token","type":"string"},"message":{"example":"No authentication token provided","type":"string"}},"type":"object"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"properties":{"code":{"enum":["read_only_token","api_access_disabled"],"example":"api_access_disabled","type":"string"},"message":{"example":"API access is not enabled for your organization","type":"string"}},"type":"object"}}},"description":"Forbidden"},"404":{"description":"Access key not found"}},"summary":"Delete an access key","tags":["Bucket Keys"]}},"/me":{"get":{"description":"Returns the authenticated caller identity and token context.\n\nUser semantics:\n- For OAuth tokens, `user` is the OAuth token subject.\n- For API key tokens, `user` is the user who created the API key.\n- For OAuth tokens, `availableOrganizations` lists the subject's organizations, and `active` marks the token organization.\n- For API key tokens, `availableOrganizations` is omitted.\n","operationId":"getMe","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CurrentIdentity"}}},"description":"Current caller identity"},"401":{"content":{"application/json":{"schema":{"properties":{"code":{"enum":["invalid_token","missing_token"],"example":"missing_token","type":"string"},"message":{"example":"No authentication token provided","type":"string"}},"type":"object"}}},"description":"Unauthorized - Invalid or missing authentication token"}},"summary":"Get current identity","tags":["Identity"]}},"/oauth-clients":{"get":{"description":"Returns all OAuth clients bound to the authenticated organization.","operationId":"listOAuthClients","responses":{"200":{"content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/OAuthClient"},"type":"array"}}},"description":"List of OAuth clients"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Unauthorized - Invalid or missing authentication token"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Forbidden - API access not enabled for organization or read-only key"}},"summary":"List OAuth clients","tags":["OAuth Clients"]}},"/oauth-clients/{clientId}":{"get":{"description":"Returns details for a single OAuth client in the authenticated organization.","operationId":"getOAuthClient","parameters":[{"description":"The OAuth client ID to retrieve.","in":"path","name":"clientId","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/OAuthClient"}}},"description":"OAuth client details"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Unauthorized - Invalid or missing authentication token"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Forbidden - API access not enabled for organization or read-only key"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"OAuth client not found"}},"summary":"Get OAuth client","tags":["OAuth Clients"]},"patch":{"description":"Updates OAuth client metadata. Provide at least one field to update.","operationId":"updateOAuthClient","parameters":[{"description":"The OAuth client ID to update.","in":"path","name":"clientId","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateOAuthClient"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/OAuthClient"}}},"description":"OAuth client updated successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Bad Request - Invalid request body"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Unauthorized - Invalid or missing authentication token"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Forbidden - API access not enabled for organization or read-only key"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"OAuth client not found"}},"summary":"Update OAuth client","tags":["OAuth Clients"]}},"/oauth-clients/{clientId}/users":{"get":{"description":"Lists users who authorized the OAuth client in the authenticated organization.","operationId":"listOAuthClientUsers","parameters":[{"description":"The OAuth client ID to inspect.","in":"path","name":"clientId","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/OAuthClientUser"},"type":"array"}}},"description":"OAuth client authorized users"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Unauthorized - Invalid or missing authentication token"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Forbidden - API access not enabled for organization or read-only key"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"OAuth client not found"}},"summary":"List OAuth client users","tags":["OAuth Clients"]}},"/postgres":{"get":{"description":"Returns a list of all Postgres databases in the organization.","operationId":"listPostgres","responses":{"200":{"content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/Postgres"},"type":"array"}}},"description":"List of Postgres databases"},"401":{"content":{"application/json":{"schema":{"properties":{"code":{"enum":["invalid_token","missing_token"],"example":"missing_token","type":"string"},"message":{"example":"No authentication token provided","type":"string"}},"type":"object"}}},"description":"Unauthorized - Invalid or missing authentication token"},"403":{"content":{"application/json":{"schema":{"properties":{"code":{"enum":["read_only_token","api_access_disabled","feature_not_enabled"],"example":"feature_not_enabled","type":"string"},"message":{"example":"This feature is not enabled for your organization","type":"string"}},"type":"object"}}},"description":"Forbidden - API access not enabled for organization or read-only key"}},"summary":"List Postgres databases","tags":["Postgres"]},"post":{"description":"Creates a new managed PostgreSQL database. Credentials are generated automatically when not provided.","operationId":"createPostgres","requestBody":{"content":{"application/json":{"schema":{"properties":{"billingCycle":{"description":"Optional billing cycle for the Postgres compute product. Defaults to `hourly`.\n","enum":["hourly","monthly","yearly"],"example":"monthly","type":"string"},"databaseName":{"description":"The name of the PostgreSQL database to create.\nOptional. Defaults to a randomly generated name.\n","example":"app","type":"string"},"databaseUser":{"description":"The name of the PostgreSQL role to create.\nOptional. Defaults to a randomly generated name.\n","example":"app","type":"string"},"diskSizeGb":{"description":"Optional. The size of the database disk in GB. Must be one of the Postgres disk catalog sizes (10, 50, 100, 250, 500, 1000 GB). When omitted, the database gets the 10 GB disk bundled with `instanceType`.\n","enum":[10,50,100,250,500,1000],"example":10,"type":"integer"},"instanceType":{"$ref":"#/components/schemas/PostgresInstanceType"},"ipAllowList":{"description":"Source IP ranges allowed to connect to the database, in CIDR notation.\nOptional. Defaults to allowing all IPv4 and IPv6 addresses (`0.0.0.0/0` and `::/0`).\nUse an empty array to block all public database connections.\n","items":{"$ref":"#/components/schemas/PostgresIpAllowListEntryInput"},"type":"array"},"name":{"description":"The display name shown in the dashboard.","example":"My Database","minLength":1,"type":"string"},"region":{"$ref":"#/components/schemas/PostgresRegion"},"version":{"allOf":[{"$ref":"#/components/schemas/PostgresVersion"}],"default":18,"description":"PostgreSQL major version. Optional, defaults to the latest supported version."}},"required":["name","instanceType","region"],"type":"object"}}},"required":true},"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PostgresCreateResponse"}}},"description":"Postgres database created successfully"},"400":{"content":{"application/json":{"schema":{"properties":{"code":{"enum":["invalid_request","product_not_found"],"example":"invalid_request","type":"string"},"message":{"example":"The request body is invalid","type":"string"}},"type":"object"}}},"description":"Bad Request. Possible reasons:\n- `invalid_request`: the request body could not be parsed, or `diskSizeGb` is smaller than the disk bundled with the instance type\n- `product_not_found`: no product/price exists for this instance type and region, or `diskSizeGb` is not in the Postgres disk catalog for this region\n"},"401":{"content":{"application/json":{"schema":{"properties":{"code":{"enum":["invalid_token","missing_token"],"example":"missing_token","type":"string"},"message":{"example":"No authentication token provided","type":"string"}},"type":"object"}}},"description":"Unauthorized - Invalid or missing authentication token"},"403":{"content":{"application/json":{"schema":{"properties":{"code":{"enum":["read_only_token","api_access_disabled","region_not_enabled"],"example":"region_not_enabled","type":"string"},"message":{"example":"Access to the requested region is not enabled for this organization","type":"string"}},"type":"object"}}},"description":"Forbidden - API access not enabled, key is read-only, or the requested region is not enabled for the organization"}},"summary":"Create a Postgres database","tags":["Postgres"]}},"/postgres/{postgresId}":{"delete":{"description":"Deletes an existing Postgres database. This permanently destroys all data.","operationId":"deletePostgres","parameters":[{"description":"The ID of the Postgres database to delete","in":"path","name":"postgresId","required":true,"schema":{"type":"string"}}],"responses":{"204":{"description":"Postgres database deleted successfully"},"401":{"content":{"application/json":{"schema":{"properties":{"code":{"enum":["invalid_token","missing_token"],"example":"missing_token","type":"string"},"message":{"example":"No authentication token provided","type":"string"}},"type":"object"}}},"description":"Unauthorized - Invalid or missing authentication token"},"403":{"content":{"application/json":{"schema":{"properties":{"code":{"enum":["read_only_token","api_access_disabled","feature_not_enabled"],"example":"feature_not_enabled","type":"string"},"message":{"example":"This feature is not enabled for your organization","type":"string"}},"type":"object"}}},"description":"Forbidden - API access not enabled for organization or read-only key"},"404":{"content":{"application/json":{"schema":{"properties":{"code":{"enum":["postgres_not_found"],"example":"postgres_not_found","type":"string"},"message":{"example":"Postgres database not found","type":"string"}},"type":"object"}}},"description":"Postgres database not found"}},"summary":"Delete a Postgres database","tags":["Postgres"]},"get":{"description":"Returns the details of a specific Postgres database.","operationId":"getPostgres","parameters":[{"description":"The ID of the Postgres database to retrieve","in":"path","name":"postgresId","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Postgres"}}},"description":"Postgres database details"},"401":{"content":{"application/json":{"schema":{"properties":{"code":{"enum":["invalid_token","missing_token"],"example":"missing_token","type":"string"},"message":{"example":"No authentication token provided","type":"string"}},"type":"object"}}},"description":"Unauthorized - Invalid or missing authentication token"},"403":{"content":{"application/json":{"schema":{"properties":{"code":{"enum":["read_only_token","api_access_disabled","feature_not_enabled"],"example":"feature_not_enabled","type":"string"},"message":{"example":"This feature is not enabled for your organization","type":"string"}},"type":"object"}}},"description":"Forbidden - API access not enabled for organization or read-only key"},"404":{"content":{"application/json":{"schema":{"properties":{"code":{"enum":["postgres_not_found"],"example":"postgres_not_found","type":"string"},"message":{"example":"Postgres database not found","type":"string"}},"type":"object"}}},"description":"Postgres database not found"}},"summary":"Get Postgres database details","tags":["Postgres"]},"patch":{"description":"Updates an existing Postgres database. The database name, user, region, and version cannot be changed.\nCompute and disk can be rescaled, together or independently. Both cannot be\nscaled down.\n","operationId":"updatePostgres","parameters":[{"description":"The ID of the Postgres database to update","in":"path","name":"postgresId","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"properties":{"diskSizeGb":{"description":"The new disk size in GB. Must be one of the Postgres disk catalog sizes (10, 50, 100, 250, 500, 1000 GB) and larger than the current size.","enum":[10,50,100,250,500,1000],"example":50,"type":"integer"},"instanceType":{"$ref":"#/components/schemas/PostgresInstanceType","description":"The compute tier to rescale to, billed on the database's current billing cycle.\nMemory cannot be scaled down; requesting a smaller tier is rejected with `invalid_request`.\n"},"ipAllowList":{"description":"Source IP ranges allowed to connect to the database, in CIDR notation.\nWhen provided, this fully replaces the existing IP allow list.\nUse an empty array to block all public database connections.\nOmit this field to leave the existing IP allow list unchanged.\n","items":{"$ref":"#/components/schemas/PostgresIpAllowListEntryInput"},"type":"array"},"name":{"description":"The new display name shown in the dashboard.","minLength":1,"type":"string"}},"type":"object"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Postgres"}}},"description":"Postgres database updated successfully"},"400":{"content":{"application/json":{"schema":{"properties":{"code":{"enum":["invalid_request"],"example":"invalid_request","type":"string"},"message":{"example":"The request body is invalid","type":"string"}},"type":"object"}}},"description":"Bad Request - Invalid request body"},"401":{"content":{"application/json":{"schema":{"properties":{"code":{"enum":["invalid_token","missing_token"],"example":"missing_token","type":"string"},"message":{"example":"No authentication token provided","type":"string"}},"type":"object"}}},"description":"Unauthorized - Invalid or missing authentication token"},"403":{"content":{"application/json":{"schema":{"properties":{"code":{"enum":["read_only_token","api_access_disabled","feature_not_enabled"],"example":"feature_not_enabled","type":"string"},"message":{"example":"This feature is not enabled for your organization","type":"string"}},"type":"object"}}},"description":"Forbidden - API access not enabled for organization or read-only key"},"404":{"content":{"application/json":{"schema":{"properties":{"code":{"enum":["postgres_not_found"],"example":"postgres_not_found","type":"string"},"message":{"example":"Postgres database not found","type":"string"}},"type":"object"}}},"description":"Postgres database not found"},"409":{"content":{"application/json":{"schema":{"properties":{"code":{"enum":["server_invalid_state"],"example":"server_invalid_state","type":"string"},"message":{"example":"Postgres is not in a state that allows disk rescaling","type":"string"}},"type":"object"}}},"description":"Conflict. Possible reasons:\n- `server_invalid_state`: the database is not in a state that allows disk rescaling (e.g. it is not running, or is being deleted)\n"}},"summary":"Update a Postgres database","tags":["Postgres"]}},"/postgres/{postgresId}/active-connections":{"get":{"description":"Returns the latest active client connections reported by the Postgres instance.\n","operationId":"listPostgresActiveConnections","parameters":[{"description":"The ID of the Postgres database to fetch active connections for.","in":"path","name":"postgresId","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/PostgresActiveConnection"},"type":"array"}}},"description":"Current active Postgres client connections."},"401":{"content":{"application/json":{"schema":{"properties":{"code":{"enum":["invalid_token","missing_token"],"example":"missing_token","type":"string"},"message":{"example":"No authentication token provided","type":"string"}},"type":"object"}}},"description":"Unauthorized - Invalid or missing authentication token"},"403":{"content":{"application/json":{"schema":{"properties":{"code":{"enum":["read_only_token","api_access_disabled","feature_not_enabled"],"example":"feature_not_enabled","type":"string"},"message":{"example":"This feature is not enabled for your organization","type":"string"}},"type":"object"}}},"description":"Forbidden - API access not enabled for organization or read-only key"},"404":{"content":{"application/json":{"schema":{"properties":{"code":{"enum":["postgres_not_found"],"example":"postgres_not_found","type":"string"},"message":{"example":"Postgres database not found","type":"string"}},"type":"object"}}},"description":"Postgres database not found"}},"summary":"List current Postgres active connections","tags":["Postgres"]}},"/postgres/{postgresId}/credentials/rotate":{"post":{"description":"Generates a new password for the managed Postgres owner role and updates the database role before returning the refreshed connection details.\n","operationId":"rotatePostgresCredentials","parameters":[{"description":"The ID of the Postgres database whose generated credentials should be rotated","in":"path","name":"postgresId","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Postgres"}}},"description":"Credentials rotated successfully. The response contains the updated connection details."},"401":{"content":{"application/json":{"schema":{"properties":{"code":{"enum":["invalid_token","missing_token"],"example":"missing_token","type":"string"},"message":{"example":"No authentication token provided","type":"string"}},"type":"object"}}},"description":"Unauthorized - Invalid or missing authentication token"},"403":{"content":{"application/json":{"schema":{"properties":{"code":{"enum":["read_only_token","api_access_disabled","feature_not_enabled"],"example":"feature_not_enabled","type":"string"},"message":{"example":"This feature is not enabled for your organization","type":"string"}},"type":"object"}}},"description":"Forbidden - API access not enabled for organization or read-only key"},"404":{"content":{"application/json":{"schema":{"properties":{"code":{"enum":["postgres_not_found"],"example":"postgres_not_found","type":"string"},"message":{"example":"Postgres database not found","type":"string"}},"type":"object"}}},"description":"Postgres database not found"},"409":{"content":{"application/json":{"schema":{"properties":{"code":{"enum":["server_invalid_state"],"example":"server_invalid_state","type":"string"},"message":{"example":"Postgres is not in a state that allows credential rotation","type":"string"}},"type":"object"}}},"description":"Conflict. The database is not in a state that allows rotating generated credentials.\n"}},"summary":"Rotate generated Postgres credentials","tags":["Postgres"]}},"/postgres/{postgresId}/logs":{"get":{"description":"Returns the most recent server log lines emitted by the Postgres instance. Logs are retained for up to 24 hours.\n","operationId":"listPostgresLogs","parameters":[{"description":"The ID of the Postgres database to fetch logs for.","in":"path","name":"postgresId","required":true,"schema":{"type":"string"}},{"description":"Earliest log timestamp to return (RFC 3339). Clamped to the\n24-hour retention window if older.\n","in":"query","name":"since","required":false,"schema":{"format":"date-time","type":"string"}},{"description":"Latest log timestamp to return (RFC 3339). Defaults to now.","in":"query","name":"until","required":false,"schema":{"format":"date-time","type":"string"}},{"description":"Maximum number of log lines to return, newest first.","in":"query","name":"limit","required":false,"schema":{"default":1000,"maximum":1000,"minimum":1,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/PostgresLog"},"type":"array"}}},"description":"Recent Postgres log lines, ordered newest-first."},"400":{"content":{"application/json":{"schema":{"properties":{"code":{"enum":["invalid_request"],"example":"invalid_request","type":"string"},"message":{"example":"Invalid request body","type":"string"}},"type":"object"}}},"description":"Invalid query parameters"},"401":{"content":{"application/json":{"schema":{"properties":{"code":{"enum":["invalid_token","missing_token"],"example":"missing_token","type":"string"},"message":{"example":"No authentication token provided","type":"string"}},"type":"object"}}},"description":"Unauthorized - Invalid or missing authentication token"},"403":{"content":{"application/json":{"schema":{"properties":{"code":{"enum":["read_only_token","api_access_disabled","feature_not_enabled"],"example":"feature_not_enabled","type":"string"},"message":{"example":"This feature is not enabled for your organization","type":"string"}},"type":"object"}}},"description":"Forbidden - API access not enabled for organization or read-only key"},"404":{"content":{"application/json":{"schema":{"properties":{"code":{"enum":["postgres_not_found"],"example":"postgres_not_found","type":"string"},"message":{"example":"Postgres database not found","type":"string"}},"type":"object"}}},"description":"Postgres database not found"}},"summary":"List recent Postgres server logs","tags":["Postgres"]}},"/postgres/{postgresId}/pause":{"post":{"description":"Stops the Postgres instance. The database transitions to\nthe `paused` status. Use the unpause endpoint to start it again. Note that stopped databases are still being charged for.\n","operationId":"pausePostgres","parameters":[{"description":"The ID of the Postgres database to pause","in":"path","name":"postgresId","required":true,"schema":{"type":"string"}}],"responses":{"202":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Postgres"}}},"description":"Pause accepted. The database is now in the `paused` state."},"401":{"content":{"application/json":{"schema":{"properties":{"code":{"enum":["invalid_token","missing_token"],"example":"missing_token","type":"string"},"message":{"example":"No authentication token provided","type":"string"}},"type":"object"}}},"description":"Unauthorized - Invalid or missing authentication token"},"403":{"content":{"application/json":{"schema":{"properties":{"code":{"enum":["read_only_token","api_access_disabled","feature_not_enabled"],"example":"feature_not_enabled","type":"string"},"message":{"example":"This feature is not enabled for your organization","type":"string"}},"type":"object"}}},"description":"Forbidden - API access not enabled for organization or read-only key"},"404":{"content":{"application/json":{"schema":{"properties":{"code":{"enum":["postgres_not_found"],"example":"postgres_not_found","type":"string"},"message":{"example":"Postgres database not found","type":"string"}},"type":"object"}}},"description":"Postgres database not found"},"409":{"content":{"application/json":{"schema":{"properties":{"code":{"enum":["server_invalid_state"],"example":"server_invalid_state","type":"string"},"message":{"example":"Postgres is not in a state that allows pausing","type":"string"}},"type":"object"}}},"description":"Conflict. The database is not in a state that allows pausing\n(e.g. it is not running, or already paused).\n"}},"summary":"Pause a Postgres database","tags":["Postgres"]}},"/postgres/{postgresId}/relation-sizes":{"get":{"description":"Returns the latest table and index size snapshot reported by the Postgres instance.\n","operationId":"listPostgresRelationSizes","parameters":[{"description":"The ID of the Postgres database to fetch relation sizes for.","in":"path","name":"postgresId","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/PostgresRelationSize"},"type":"array"}}},"description":"Current Postgres table and index size snapshot."},"401":{"content":{"application/json":{"schema":{"properties":{"code":{"enum":["invalid_token","missing_token"],"example":"missing_token","type":"string"},"message":{"example":"No authentication token provided","type":"string"}},"type":"object"}}},"description":"Unauthorized - Invalid or missing authentication token"},"403":{"content":{"application/json":{"schema":{"properties":{"code":{"enum":["read_only_token","api_access_disabled","feature_not_enabled"],"example":"feature_not_enabled","type":"string"},"message":{"example":"This feature is not enabled for your organization","type":"string"}},"type":"object"}}},"description":"Forbidden - API access not enabled for organization or read-only key"},"404":{"content":{"application/json":{"schema":{"properties":{"code":{"enum":["postgres_not_found"],"example":"postgres_not_found","type":"string"},"message":{"example":"Postgres database not found","type":"string"}},"type":"object"}}},"description":"Postgres database not found"}},"summary":"List current Postgres table and index sizes","tags":["Postgres"]}},"/postgres/{postgresId}/restart":{"post":{"description":"Restarts the Postgres instance. The database transitions to the\n`restarting` status until the database is ready to start accepting connections again, at which point it flips back to `running`.\n","operationId":"restartPostgres","parameters":[{"description":"The ID of the Postgres database to restart","in":"path","name":"postgresId","required":true,"schema":{"type":"string"}}],"responses":{"202":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Postgres"}}},"description":"Restart accepted. The database is now in the `restarting` state."},"401":{"content":{"application/json":{"schema":{"properties":{"code":{"enum":["invalid_token","missing_token"],"example":"missing_token","type":"string"},"message":{"example":"No authentication token provided","type":"string"}},"type":"object"}}},"description":"Unauthorized - Invalid or missing authentication token"},"403":{"content":{"application/json":{"schema":{"properties":{"code":{"enum":["read_only_token","api_access_disabled","feature_not_enabled"],"example":"feature_not_enabled","type":"string"},"message":{"example":"This feature is not enabled for your organization","type":"string"}},"type":"object"}}},"description":"Forbidden - API access not enabled for organization or read-only key"},"404":{"content":{"application/json":{"schema":{"properties":{"code":{"enum":["postgres_not_found"],"example":"postgres_not_found","type":"string"},"message":{"example":"Postgres database not found","type":"string"}},"type":"object"}}},"description":"Postgres database not found"},"409":{"content":{"application/json":{"schema":{"properties":{"code":{"enum":["server_invalid_state"],"example":"server_invalid_state","type":"string"},"message":{"example":"Postgres is not in a state that allows a restart","type":"string"}},"type":"object"}}},"description":"Conflict. The database is not in a state that allows a restart\n(e.g. it is provisioning, deleting, or already restarting).\n"}},"summary":"Restart a Postgres database","tags":["Postgres"]}},"/postgres/{postgresId}/restore":{"get":{"description":"Returns the timestamp range that can be used for point-in-time restore.\n","operationId":"getPostgresRestoreWindow","parameters":[{"description":"The ID of the source Postgres database.","in":"path","name":"postgresId","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PostgresRestoreWindow"}}},"description":"Restore window for this Postgres database."},"401":{"content":{"application/json":{"schema":{"properties":{"code":{"enum":["invalid_token","missing_token"],"example":"missing_token","type":"string"},"message":{"example":"No authentication token provided","type":"string"}},"type":"object"}}},"description":"Unauthorized - Invalid or missing authentication token"},"403":{"content":{"application/json":{"schema":{"properties":{"code":{"enum":["read_only_token","api_access_disabled","feature_not_enabled"],"example":"feature_not_enabled","type":"string"},"message":{"example":"This feature is not enabled for your organization","type":"string"}},"type":"object"}}},"description":"Forbidden - API access not enabled for organization or read-only key"},"404":{"content":{"application/json":{"schema":{"properties":{"code":{"enum":["postgres_not_found"],"example":"postgres_not_found","type":"string"},"message":{"example":"Postgres database not found","type":"string"}},"type":"object"}}},"description":"Postgres database not found"},"409":{"content":{"application/json":{"schema":{"properties":{"code":{"enum":["server_invalid_state"],"example":"server_invalid_state","type":"string"},"message":{"example":"postgres backup unavailable","type":"string"}},"type":"object"}}},"description":"Conflict - Restore window is not available yet"}},"summary":"Get Postgres restore window","tags":["Postgres"]},"post":{"description":"Creates a new Postgres database with the same configuration as the source database and restores it to the requested timestamp.\n","operationId":"restorePostgres","parameters":[{"description":"The ID of the source Postgres database to restore.","in":"path","name":"postgresId","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"properties":{"timestamp":{"description":"The point in time to restore to.","example":"2026-05-25T10:30:00Z","format":"date-time","type":"string"}},"required":["timestamp"],"type":"object"}}},"required":true},"responses":{"202":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Postgres"}}},"description":"Restore accepted. A new Postgres database is being provisioned from backup."},"400":{"content":{"application/json":{"schema":{"properties":{"code":{"enum":["invalid_request"],"example":"invalid_request","type":"string"},"message":{"example":"The request body is invalid","type":"string"}},"type":"object"}}},"description":"Bad Request - Invalid timestamp or request body"},"401":{"content":{"application/json":{"schema":{"properties":{"code":{"enum":["invalid_token","missing_token"],"example":"missing_token","type":"string"},"message":{"example":"No authentication token provided","type":"string"}},"type":"object"}}},"description":"Unauthorized - Invalid or missing authentication token"},"403":{"content":{"application/json":{"schema":{"properties":{"code":{"enum":["read_only_token","api_access_disabled","feature_not_enabled"],"example":"feature_not_enabled","type":"string"},"message":{"example":"This feature is not enabled for your organization","type":"string"}},"type":"object"}}},"description":"Forbidden - API access not enabled for organization or read-only key"},"404":{"content":{"application/json":{"schema":{"properties":{"code":{"enum":["postgres_not_found"],"example":"postgres_not_found","type":"string"},"message":{"example":"Postgres database not found","type":"string"}},"type":"object"}}},"description":"Postgres database not found"}},"summary":"Restore a Postgres database to a point in time","tags":["Postgres"]}},"/postgres/{postgresId}/slow-queries":{"get":{"description":"Returns the latest slow query snapshot reported by the Postgres instance.\n","operationId":"listPostgresSlowQueries","parameters":[{"description":"The ID of the Postgres database to fetch slow queries for.","in":"path","name":"postgresId","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/PostgresSlowQuery"},"type":"array"}}},"description":"Current Postgres slow query snapshot."},"401":{"content":{"application/json":{"schema":{"properties":{"code":{"enum":["invalid_token","missing_token"],"example":"missing_token","type":"string"},"message":{"example":"No authentication token provided","type":"string"}},"type":"object"}}},"description":"Unauthorized - Invalid or missing authentication token"},"403":{"content":{"application/json":{"schema":{"properties":{"code":{"enum":["read_only_token","api_access_disabled","feature_not_enabled"],"example":"feature_not_enabled","type":"string"},"message":{"example":"This feature is not enabled for your organization","type":"string"}},"type":"object"}}},"description":"Forbidden - API access not enabled for organization or read-only key"},"404":{"content":{"application/json":{"schema":{"properties":{"code":{"enum":["postgres_not_found"],"example":"postgres_not_found","type":"string"},"message":{"example":"Postgres database not found","type":"string"}},"type":"object"}}},"description":"Postgres database not found"}},"summary":"List current Postgres slow queries","tags":["Postgres"]}},"/postgres/{postgresId}/top-queries":{"get":{"description":"Returns the latest top query snapshot reported by the Postgres instance, ranked by call count.\n","operationId":"listPostgresTopQueries","parameters":[{"description":"The ID of the Postgres database to fetch top queries for.","in":"path","name":"postgresId","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/PostgresTopQuery"},"type":"array"}}},"description":"Current Postgres top query snapshot."},"401":{"content":{"application/json":{"schema":{"properties":{"code":{"enum":["invalid_token","missing_token"],"example":"missing_token","type":"string"},"message":{"example":"No authentication token provided","type":"string"}},"type":"object"}}},"description":"Unauthorized - Invalid or missing authentication token"},"403":{"content":{"application/json":{"schema":{"properties":{"code":{"enum":["read_only_token","api_access_disabled","feature_not_enabled"],"example":"feature_not_enabled","type":"string"},"message":{"example":"This feature is not enabled for your organization","type":"string"}},"type":"object"}}},"description":"Forbidden - API access not enabled for organization or read-only key"},"404":{"content":{"application/json":{"schema":{"properties":{"code":{"enum":["postgres_not_found"],"example":"postgres_not_found","type":"string"},"message":{"example":"Postgres database not found","type":"string"}},"type":"object"}}},"description":"Postgres database not found"}},"summary":"List current Postgres top queries","tags":["Postgres"]}},"/postgres/{postgresId}/unpause":{"post":{"description":"Starts the Postgres instance after it was paused. The\ndatabase transitions back to the `running` status.\n","operationId":"unpausePostgres","parameters":[{"description":"The ID of the Postgres database to unpause","in":"path","name":"postgresId","required":true,"schema":{"type":"string"}}],"responses":{"202":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Postgres"}}},"description":"Unpause accepted. The database is now in the `running` state."},"401":{"content":{"application/json":{"schema":{"properties":{"code":{"enum":["invalid_token","missing_token"],"example":"missing_token","type":"string"},"message":{"example":"No authentication token provided","type":"string"}},"type":"object"}}},"description":"Unauthorized - Invalid or missing authentication token"},"403":{"content":{"application/json":{"schema":{"properties":{"code":{"enum":["read_only_token","api_access_disabled","feature_not_enabled"],"example":"feature_not_enabled","type":"string"},"message":{"example":"This feature is not enabled for your organization","type":"string"}},"type":"object"}}},"description":"Forbidden - API access not enabled for organization or read-only key"},"404":{"content":{"application/json":{"schema":{"properties":{"code":{"enum":["postgres_not_found"],"example":"postgres_not_found","type":"string"},"message":{"example":"Postgres database not found","type":"string"}},"type":"object"}}},"description":"Postgres database not found"},"409":{"content":{"application/json":{"schema":{"properties":{"code":{"enum":["server_invalid_state"],"example":"server_invalid_state","type":"string"},"message":{"example":"Postgres is not in a state that allows unpausing","type":"string"}},"type":"object"}}},"description":"Conflict. The database is not in a state that allows unpausing\n(e.g. it is not currently paused).\n"}},"summary":"Unpause a paused Postgres database","tags":["Postgres"]}},"/projects":{"get":{"description":"Returns a list of all projects in the organization","operationId":"listProjects","responses":{"200":{"content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/Project"},"type":"array"}}},"description":"List of projects"},"401":{"content":{"application/json":{"schema":{"properties":{"code":{"enum":["invalid_token","missing_token"],"example":"missing_token","type":"string"},"message":{"example":"No authentication token provided","type":"string"}},"type":"object"}}},"description":"Unauthorized - Invalid or missing authentication token"},"403":{"content":{"application/json":{"schema":{"properties":{"code":{"enum":["read_only_token","api_access_disabled"],"example":"read_only_token","type":"string"},"message":{"example":"This token does not have write permissions","type":"string"}},"type":"object"}}},"description":"Forbidden - API access not enabled for organization or read-only key"}},"summary":"List projects","tags":["Projects"]},"post":{"description":"Creates a new project with the specified name","operationId":"createProject","requestBody":{"content":{"application/json":{"schema":{"properties":{"name":{"description":"The name of the project","example":"My Project","minLength":1,"type":"string"}},"required":["name"],"type":"object"}}},"required":true},"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Project"}}},"description":"Project created successfully"},"400":{"content":{"application/json":{"schema":{"properties":{"code":{"enum":["invalid_request"],"example":"invalid_request","type":"string"},"message":{"example":"The request body is invalid","type":"string"}},"type":"object"}}},"description":"Bad Request - Invalid request body"},"401":{"content":{"application/json":{"schema":{"properties":{"code":{"enum":["invalid_token","missing_token"],"example":"missing_token","type":"string"},"message":{"example":"No authentication token provided","type":"string"}},"type":"object"}}},"description":"Unauthorized - Invalid or missing authentication token"},"403":{"content":{"application/json":{"schema":{"properties":{"code":{"enum":["read_only_token","api_access_disabled"],"example":"read_only_token","type":"string"},"message":{"example":"This token does not have write permissions","type":"string"}},"type":"object"}}},"description":"Forbidden - API access not enabled for organization or read-only key"}},"summary":"Create a new project","tags":["Projects"]}},"/projects/{projectId}":{"delete":{"description":"Deletes an existing project. The project must not contain any services.","operationId":"deleteProject","parameters":[{"description":"The ID of the project to delete","in":"path","name":"projectId","required":true,"schema":{"type":"string"}}],"responses":{"204":{"description":"Project deleted successfully"},"401":{"content":{"application/json":{"schema":{"properties":{"code":{"enum":["invalid_token","missing_token"],"example":"missing_token","type":"string"},"message":{"example":"No authentication token provided","type":"string"}},"type":"object"}}},"description":"Unauthorized - Invalid or missing authentication token"},"403":{"content":{"application/json":{"schema":{"properties":{"code":{"enum":["read_only_token","api_access_disabled"],"example":"read_only_token","type":"string"},"message":{"example":"This token does not have write permissions","type":"string"}},"type":"object"}}},"description":"Forbidden - API access not enabled for organization or read-only key"},"404":{"content":{"application/json":{"schema":{"properties":{"code":{"enum":["project_not_found"],"example":"project_not_found","type":"string"},"message":{"example":"Project not found","type":"string"}},"type":"object"}}},"description":"Project not found"},"409":{"content":{"application/json":{"schema":{"properties":{"code":{"enum":["project_not_empty"],"example":"project_not_empty","type":"string"},"message":{"example":"Cannot delete project that contains services","type":"string"}},"type":"object"}}},"description":"Project contains services"}},"summary":"Delete a project","tags":["Projects"]},"patch":{"description":"Updates the name of an existing project","operationId":"updateProject","parameters":[{"description":"The ID of the project to update","in":"path","name":"projectId","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"properties":{"name":{"description":"The new name of the project","minLength":1,"type":"string"}},"required":["name"],"type":"object"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Project"}}},"description":"Project updated successfully"},"400":{"content":{"application/json":{"schema":{"properties":{"code":{"enum":["invalid_request","product_not_found"],"example":"invalid_request","type":"string"},"message":{"example":"The request body is invalid","type":"string"}},"type":"object"}}},"description":"Bad Request. Possible reasons:\n- `invalid_request`: the request body could not be parsed, or `diskSizeGb` is smaller than the disk bundled with the instance type\n- `product_not_found`: no product/price exists for this instance type and region, or `diskSizeGb` is not in the Postgres disk catalog for this region\n"},"401":{"content":{"application/json":{"schema":{"properties":{"code":{"enum":["invalid_token","missing_token"],"example":"missing_token","type":"string"},"message":{"example":"No authentication token provided","type":"string"}},"type":"object"}}},"description":"Unauthorized - Invalid or missing authentication token"},"403":{"content":{"application/json":{"schema":{"properties":{"code":{"enum":["read_only_token","api_access_disabled"],"example":"read_only_token","type":"string"},"message":{"example":"This token does not have write permissions","type":"string"}},"type":"object"}}},"description":"Forbidden - API access not enabled for organization or read-only key"},"404":{"description":"Project not found"}},"summary":"Update a project","tags":["Projects"]}},"/projects/{projectId}/services":{"get":{"description":"Returns a list of all services in the project","operationId":"listServices","parameters":[{"description":"The ID of the project to list services from","in":"path","name":"projectId","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/Service"},"type":"array"}}},"description":"List of services"},"401":{"content":{"application/json":{"schema":{"properties":{"code":{"enum":["invalid_token","missing_token"],"example":"missing_token","type":"string"},"message":{"example":"No authentication token provided","type":"string"}},"type":"object"}}},"description":"Unauthorized - Invalid or missing authentication token"},"403":{"content":{"application/json":{"schema":{"properties":{"code":{"enum":["read_only_token","api_access_disabled"],"example":"read_only_token","type":"string"},"message":{"example":"This token does not have write permissions","type":"string"}},"type":"object"}}},"description":"Forbidden - API access not enabled for organization or read-only key"},"404":{"content":{"application/json":{"schema":{"properties":{"code":{"enum":["project_not_found"],"example":"project_not_found","type":"string"},"message":{"example":"Project not found","type":"string"}},"type":"object"}}},"description":"Project not found"}},"summary":"List services","tags":["Services"]},"post":{"description":"Creates a new service within a project","operationId":"createService","parameters":[{"description":"The ID of the project to create the service in","in":"path","name":"projectId","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"properties":{"cmd":{"description":"Override the Docker CMD instruction","example":"npm start","type":"string"},"deployment":{"description":"The deployment configuration for the service","oneOf":[{"$ref":"#/components/schemas/RepositoryDeployment","Repository Deployment":null},{"$ref":"#/components/schemas/ImageDeployment","Image Deployment":null}],"type":"object"},"env":{"description":"Environment variables for the service","items":{"$ref":"#/components/schemas/EnvironmentVariable"},"type":"array"},"healthcheck":{"default":"/","description":"The path to use for health checks","example":"/health","type":"string"},"name":{"description":"The name of the service","example":"My Service","minLength":1,"type":"string"},"network":{"$ref":"#/components/schemas/ServiceNetworkRequest"},"serverId":{"description":"The ID of the server to run the service on","example":"server_123456","type":"string"},"volumes":{"description":"Volumes to mount to the service","items":{"$ref":"#/components/schemas/Volume"},"type":"array"}},"required":["name","serverId","deployment"],"type":"object"}}},"required":true},"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Service"}}},"description":"Service created successfully"},"400":{"content":{"application/json":{"schema":{"properties":{"code":{"enum":["invalid_request"],"example":"invalid_request","type":"string"},"message":{"example":"The request body is invalid","type":"string"}},"type":"object"}}},"description":"Bad Request - Invalid request body"},"401":{"content":{"application/json":{"schema":{"properties":{"code":{"enum":["invalid_token","missing_token"],"example":"missing_token","type":"string"},"message":{"example":"No authentication token provided","type":"string"}},"type":"object"}}},"description":"Unauthorized - Invalid or missing authentication token"},"403":{"content":{"application/json":{"schema":{"properties":{"code":{"enum":["read_only_token","api_access_disabled"],"example":"read_only_token","type":"string"},"message":{"example":"This token does not have write permissions","type":"string"}},"type":"object"}}},"description":"Forbidden - API access not enabled for organization or read-only key"},"404":{"content":{"application/json":{"schema":{"properties":{"code":{"enum":["project_not_found","server_not_found"],"example":"project_not_found","type":"string"},"message":{"example":"Project or server not found","type":"string"}},"type":"object"}}},"description":"Project or server not found"}},"summary":"Create a new service","tags":["Services"]}},"/projects/{projectId}/services/{serviceId}":{"delete":{"description":"Deletes an existing service","operationId":"deleteService","parameters":[{"description":"The ID of the project containing the service","in":"path","name":"projectId","required":true,"schema":{"type":"string"}},{"description":"The ID of the service to delete","in":"path","name":"serviceId","required":true,"schema":{"type":"string"}}],"responses":{"204":{"description":"Service deleted successfully"},"401":{"content":{"application/json":{"schema":{"properties":{"code":{"enum":["invalid_token","missing_token"],"example":"missing_token","type":"string"},"message":{"example":"No authentication token provided","type":"string"}},"type":"object"}}},"description":"Unauthorized - Invalid or missing authentication token"},"403":{"content":{"application/json":{"schema":{"properties":{"code":{"enum":["read_only_token","api_access_disabled"],"example":"read_only_token","type":"string"},"message":{"example":"This token does not have write permissions","type":"string"}},"type":"object"}}},"description":"Forbidden - API access not enabled for organization or read-only key"},"404":{"content":{"application/json":{"schema":{"properties":{"code":{"enum":["project_not_found","service_not_found"],"example":"project_not_found","type":"string"},"message":{"example":"Project or service not found","type":"string"}},"type":"object"}}},"description":"Project or service not found"}},"summary":"Delete a service","tags":["Services"]},"get":{"description":"Returns the details of a specific service","operationId":"getService","parameters":[{"description":"The ID of the project containing the service","in":"path","name":"projectId","required":true,"schema":{"type":"string"}},{"description":"The ID of the service to retrieve","in":"path","name":"serviceId","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Service"}}},"description":"Service details"},"401":{"content":{"application/json":{"schema":{"properties":{"code":{"enum":["invalid_token","missing_token"],"example":"missing_token","type":"string"},"message":{"example":"No authentication token provided","type":"string"}},"type":"object"}}},"description":"Unauthorized - Invalid or missing authentication token"},"403":{"content":{"application/json":{"schema":{"properties":{"code":{"enum":["read_only_token","api_access_disabled"],"example":"read_only_token","type":"string"},"message":{"example":"This token does not have write permissions","type":"string"}},"type":"object"}}},"description":"Forbidden - API access not enabled for organization or read-only key"},"404":{"content":{"application/json":{"schema":{"properties":{"code":{"enum":["project_not_found","service_not_found"],"example":"project_not_found","type":"string"},"message":{"example":"Project or service not found","type":"string"}},"type":"object"}}},"description":"Project or service not found"}},"summary":"Get service details","tags":["Services"]},"patch":{"description":"Updates an existing service. The deployment type (image or repository) cannot be changed. Network settings cannot be changed. Volumes cannot be modified through this endpoint.\n\nWhen updating environment variables, providing the `env` key means full replacement. If you want to add a new environment variable, you must include all previous environment variables in the array. If a variable is secret, you can keep the value empty. Otherwise it will be overwritten.\n","operationId":"updateService","parameters":[{"description":"The ID of the project containing the service","in":"path","name":"projectId","required":true,"schema":{"type":"string"}},{"description":"The ID of the service to update","in":"path","name":"serviceId","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"properties":{"cmd":{"description":"Override the Docker CMD instruction","example":"npm start","type":"string"},"deployment":{"description":"The deployment configuration for the service. Must match the current deployment type (image or repository)","oneOf":[{"$ref":"#/components/schemas/RepositoryDeployment","Repository Deployment":null},{"$ref":"#/components/schemas/ImageDeployment","Image Deployment":null}],"type":"object"},"env":{"description":"Environment variables for the service. Providing this key will replace all existing environment variables","items":{"$ref":"#/components/schemas/EnvironmentVariable"},"type":"array"},"healthcheck":{"description":"The path to use for health checks","example":"/health","type":"string"},"name":{"description":"The new name of the service","minLength":1,"type":"string"}},"type":"object"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Service"}}},"description":"Service updated successfully"},"400":{"content":{"application/json":{"schema":{"properties":{"code":{"enum":["invalid_request"],"example":"invalid_request","type":"string"},"message":{"example":"The request body is invalid","type":"string"}},"type":"object"}}},"description":"Bad Request - Invalid request body"},"401":{"content":{"application/json":{"schema":{"properties":{"code":{"enum":["invalid_token","missing_token"],"example":"missing_token","type":"string"},"message":{"example":"No authentication token provided","type":"string"}},"type":"object"}}},"description":"Unauthorized - Invalid or missing authentication token"},"403":{"content":{"application/json":{"schema":{"properties":{"code":{"enum":["read_only_token","api_access_disabled"],"example":"read_only_token","type":"string"},"message":{"example":"This token does not have write permissions","type":"string"}},"type":"object"}}},"description":"Forbidden - API access not enabled for organization or read-only key"},"404":{"content":{"application/json":{"schema":{"properties":{"code":{"enum":["project_not_found","service_not_found"],"example":"project_not_found","type":"string"},"message":{"example":"Project or service not found","type":"string"}},"type":"object"}}},"description":"Project or service not found"},"409":{"content":{"application/json":{"schema":{"properties":{"code":{"enum":["invalid_deployment","service_invalid_state"],"example":"invalid_deployment","type":"string"},"message":{"example":"Cannot change deployment type","type":"string"}},"type":"object"}}},"description":"Invalid deployment type change, or the service is suspended"}},"summary":"Update a service","tags":["Services"]}},"/projects/{projectId}/services/{serviceId}/deploy":{"post":{"description":"Manually triggers a deployment of a service. For image-based services, you can specify a new tag to deploy.\n","operationId":"deployService","parameters":[{"description":"The ID of the project containing the service","in":"path","name":"projectId","required":true,"schema":{"type":"string"}},{"description":"The ID of the service to deploy","in":"path","name":"serviceId","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"properties":{"tag":{"description":"The new tag to deploy for image-based services","example":"latest","type":"string"}},"type":"object"}}},"required":false},"responses":{"202":{"description":"Deployment request accepted"},"400":{"content":{"application/json":{"schema":{"properties":{"code":{"enum":["invalid_request"],"example":"invalid_request","type":"string"},"message":{"example":"The request is invalid","type":"string"}},"type":"object"}}},"description":"Bad Request - Invalid request"},"401":{"content":{"application/json":{"schema":{"properties":{"code":{"enum":["invalid_token","missing_token"],"example":"missing_token","type":"string"},"message":{"example":"No authentication token provided","type":"string"}},"type":"object"}}},"description":"Unauthorized - Invalid or missing authentication token"},"403":{"content":{"application/json":{"schema":{"properties":{"code":{"enum":["read_only_token","api_access_disabled"],"example":"read_only_token","type":"string"},"message":{"example":"This token does not have write permissions","type":"string"}},"type":"object"}}},"description":"Forbidden - API access not enabled for organization or read-only key"},"404":{"content":{"application/json":{"schema":{"properties":{"code":{"enum":["project_not_found","service_not_found"],"example":"project_not_found","type":"string"},"message":{"example":"Project or service not found","type":"string"}},"type":"object"}}},"description":"Project or service not found"},"409":{"content":{"application/json":{"schema":{"properties":{"code":{"enum":["service_invalid_state"],"example":"service_invalid_state","type":"string"},"message":{"example":"Service is not in a state that allows deployment","type":"string"}},"type":"object"}}},"description":"Service is not in a state that allows deployment"}},"summary":"Create a deployment","tags":["Services"]}},"/projects/{projectId}/services/{serviceId}/domains":{"post":{"description":"Adds a custom domain to a service. The domain will be verified by checking for either a CNAME record pointing to the service's managed domain or an A record pointing to the server's IP address. Once verified, the domain will be added to the service. The verification process can take up to 24 hours, after which the domain will be marked as failed if not verified.","operationId":"addCustomDomain","parameters":[{"description":"The ID of the project containing the service","in":"path","name":"projectId","required":true,"schema":{"type":"string"}},{"description":"The ID of the service to add the domain to","in":"path","name":"serviceId","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"properties":{"domain":{"description":"The custom domain to add","example":"example.com","type":"string"}},"required":["domain"],"type":"object"}}},"required":true},"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CustomDomain"}}},"description":"Custom domain added successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Bad Request - Invalid request body"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Unauthorized - Invalid or missing authentication token"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Forbidden - API access not enabled for organization or read-only key"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Project or service not found"},"409":{"content":{"application/json":{"schema":{"properties":{"code":{"enum":["domain_already_exists"],"example":"domain_already_exists","type":"string"},"message":{"example":"Domain is already attached to a service","type":"string"}},"type":"object"}}},"description":"Custom domain already exists"}},"summary":"Add a custom domain","tags":["Services"]}},"/projects/{projectId}/services/{serviceId}/domains/{domainId}":{"delete":{"description":"Removes a custom domain from a service","operationId":"removeCustomDomain","parameters":[{"description":"The ID of the project containing the service","in":"path","name":"projectId","required":true,"schema":{"type":"string"}},{"description":"The ID of the service to remove the domain from","in":"path","name":"serviceId","required":true,"schema":{"type":"string"}},{"description":"The ID of the custom domain to remove","in":"path","name":"domainId","required":true,"schema":{"type":"string"}}],"responses":{"204":{"description":"Custom domain removed successfully"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Unauthorized - Invalid or missing authentication token"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Forbidden - API access not enabled for organization or read-only key"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Project, service, or domain not found"}},"summary":"Remove a custom domain","tags":["Services"]}},"/projects/{projectId}/services/{serviceId}/env":{"get":{"description":"Returns all environment variables for a service. Secret values are masked.","operationId":"listServiceEnvironmentVariables","parameters":[{"description":"The ID of the project containing the service","in":"path","name":"projectId","required":true,"schema":{"type":"string"}},{"description":"The ID of the service","in":"path","name":"serviceId","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/EnvironmentVariable"},"type":"array"}}},"description":"Service environment variables"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"API access is not enabled for the organization"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Project or service not found"}},"summary":"List service environment variables","tags":["Services"]}},"/projects/{projectId}/services/{serviceId}/env/{key}":{"delete":{"description":"Deletes an environment variable.","operationId":"deleteServiceEnvironmentVariable","parameters":[{"description":"The ID of the project containing the service","in":"path","name":"projectId","required":true,"schema":{"type":"string"}},{"description":"The ID of the service","in":"path","name":"serviceId","required":true,"schema":{"type":"string"}},{"description":"The environment variable key","in":"path","name":"key","required":true,"schema":{"minLength":1,"type":"string"}}],"responses":{"204":{"description":"Environment variable deleted"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"API access is not enabled for the organization or the token is read-only"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Project, service, or environment variable not found"},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"The service is suspended"}},"summary":"Delete a service environment variable","tags":["Services"]},"put":{"description":"Creates or replaces an environment variable.","operationId":"setServiceEnvironmentVariable","parameters":[{"description":"The ID of the project containing the service","in":"path","name":"projectId","required":true,"schema":{"type":"string"}},{"description":"The ID of the service","in":"path","name":"serviceId","required":true,"schema":{"type":"string"}},{"description":"The environment variable key","in":"path","name":"key","required":true,"schema":{"minLength":1,"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"properties":{"secret":{"description":"Whether the value must be masked in API responses","type":"boolean"},"value":{"description":"The environment variable value","type":"string"}},"required":["value","secret"],"type":"object"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EnvironmentVariable"}}},"description":"Environment variable replaced"},"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EnvironmentVariable"}}},"description":"Environment variable created"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Invalid environment variable"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"API access is not enabled for the organization or the token is read-only"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Project or service not found"},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"The service is suspended"}},"summary":"Set a service environment variable","tags":["Services"]}},"/projects/{projectId}/services/{serviceId}/events":{"get":{"description":"Returns events for a service showing deployment history, build status, and system events.\nEvents are returned in reverse chronological order (newest first).\n","operationId":"getServiceEvents","parameters":[{"description":"The ID of the project containing the service","in":"path","name":"projectId","required":true,"schema":{"type":"string"}},{"description":"The ID of the service to get events for","in":"path","name":"serviceId","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/ServiceEvent"},"type":"array"}}},"description":"Service events retrieved successfully"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Unauthorized - Invalid or missing authentication token"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Forbidden - API access not enabled for organization or read-only key"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Service or project not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Internal server error"}},"security":[{"bearerAuth":[]}],"summary":"Get service events","tags":["Services"]}},"/projects/{projectId}/services/{serviceId}/logs":{"get":{"description":"Returns logs for a service with optional time range filtering. Only returns message and creation timestamp. A maximum of 500 log lines are returned per request. When `to` is set, the 500 most recent lines up to that timestamp are returned; page backwards through older logs by repeating the request with `to` set to the earliest timestamp you received.","operationId":"getServiceLogs","parameters":[{"description":"The ID of the project containing the service","in":"path","name":"projectId","required":true,"schema":{"type":"string"}},{"description":"The ID of the service to get logs for","in":"path","name":"serviceId","required":true,"schema":{"type":"string"}},{"description":"From timestamp (Unix seconds)","in":"query","name":"from","required":false,"schema":{"format":"int64","type":"integer"}},{"description":"To timestamp (Unix seconds). At most 500 lines are returned, counting back from this timestamp.","in":"query","name":"to","required":false,"schema":{"format":"int64","type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/ServiceLog"},"type":"array"}}},"description":"List of service logs"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Bad Request - Invalid query parameters"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Unauthorized - Invalid or missing authentication token"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Forbidden - API access not enabled for organization or read-only key"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Project or service not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Internal server error"}},"summary":"Get service logs","tags":["Services"]}},"/projects/{projectId}/services/{serviceId}/metrics":{"get":{"description":"Returns metrics for a service with optional time range filtering. Provides CPU and memory usage data for monitoring service performance. Use either 'range' parameter OR 'from'+'to' parameters, but not both.","operationId":"getServiceMetrics","parameters":[{"description":"The ID of the project containing the service","in":"path","name":"projectId","required":true,"schema":{"type":"string"}},{"description":"The ID of the service to get metrics for","in":"path","name":"serviceId","required":true,"schema":{"type":"string"}},{"description":"Predefined time range for metrics. Do not use with from/to parameters.","in":"query","name":"range","required":false,"schema":{"enum":["10min","1h","24h","7d"],"type":"string"}},{"description":"From timestamp (Unix seconds). Use only with 'to' parameter, not with 'range'.","in":"query","name":"from","required":false,"schema":{"format":"int64","type":"integer"}},{"description":"To timestamp (Unix seconds). Use only with 'from' parameter, not with 'range'.","in":"query","name":"to","required":false,"schema":{"format":"int64","type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/ServiceMetric"},"type":"array"}}},"description":"Service metrics data"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Bad Request - Invalid query parameters"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Unauthorized - Invalid or missing authentication token"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Forbidden - API access not enabled for organization or read-only key"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Project or service not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Internal server error"}},"summary":"Get service metrics","tags":["Services"],"x-codeSamples":[{"label":"Using predefined range","lang":"curl","source":"curl 'https://ctrl.sliplane.io/v0/projects/{projectId}/services/{serviceId}/metrics?range=1h'\n"}]}},"/projects/{projectId}/services/{serviceId}/pause":{"post":{"description":"Pause a service","operationId":"pauseService","parameters":[{"description":"The ID of the project containing the service","in":"path","name":"projectId","required":true,"schema":{"type":"string"}},{"description":"The ID of the service to pause","in":"path","name":"serviceId","required":true,"schema":{"type":"string"}}],"responses":{"202":{"description":"Service pause request accepted"},"403":{"content":{"application/json":{"schema":{"properties":{"code":{"enum":["read_only_token","api_access_disabled"],"example":"read_only_token","type":"string"},"message":{"example":"This token does not have write permissions","type":"string"}},"type":"object"}}},"description":"Forbidden - API access not enabled for organization or read-only key"},"404":{"content":{"application/json":{"schema":{"properties":{"code":{"enum":["project_not_found","service_not_found"],"example":"project_not_found","type":"string"},"message":{"example":"Project or service not found","type":"string"}},"type":"object"}}},"description":"Project or service not found"},"409":{"content":{"application/json":{"schema":{"properties":{"code":{"enum":["service_invalid_state"],"example":"service_invalid_state","type":"string"},"message":{"example":"Service is not in a state that allows this operation","type":"string"}},"type":"object"}}},"description":"Conflict - Invalid state transition"}},"summary":"Pause a service","tags":["Services"]}},"/projects/{projectId}/services/{serviceId}/ssh-keys":{"get":{"description":"Lists the authenticated user's SSH keys attached to the service.\n","operationId":"listServiceSSHKeys","responses":{"200":{"content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/ServiceSSHKey"},"type":"array"}}},"description":"Attached SSH keys"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Invalid or missing authentication token"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Access denied or read-only token"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Resource not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Internal server error"}},"summary":"List service SSH keys","tags":["SSH Keys"]},"parameters":[{"in":"path","name":"projectId","required":true,"schema":{"type":"string"}},{"in":"path","name":"serviceId","required":true,"schema":{"type":"string"}}]},"/projects/{projectId}/services/{serviceId}/ssh-keys/{keyId}":{"delete":{"description":"Detaches an SSH key from the service.\n","operationId":"detachSSHKey","responses":{"204":{"description":"SSH key detached"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Invalid or missing authentication token"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Access denied or read-only token"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Resource not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Internal server error"}},"summary":"Detach an SSH key","tags":["SSH Keys"]},"parameters":[{"in":"path","name":"projectId","required":true,"schema":{"type":"string"}},{"in":"path","name":"serviceId","required":true,"schema":{"type":"string"}},{"in":"path","name":"keyId","required":true,"schema":{"type":"string"}}],"put":{"description":"Attaches an SSH key to the service and returns its SSH connection details.\n","operationId":"attachSSHKey","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SSHConnection"}}},"description":"SSH connection details"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Invalid or missing authentication token"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Access denied or read-only token"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Resource not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Internal server error"}},"summary":"Attach an SSH key","tags":["SSH Keys"]}},"/projects/{projectId}/services/{serviceId}/unpause":{"post":{"description":"Unpause a service","operationId":"unpauseService","parameters":[{"description":"The ID of the project containing the service","in":"path","name":"projectId","required":true,"schema":{"type":"string"}},{"description":"The ID of the service to unpause","in":"path","name":"serviceId","required":true,"schema":{"type":"string"}}],"responses":{"202":{"description":"Service unpause request accepted"},"403":{"content":{"application/json":{"schema":{"properties":{"code":{"enum":["read_only_token","api_access_disabled"],"example":"read_only_token","type":"string"},"message":{"example":"This token does not have write permissions","type":"string"}},"type":"object"}}},"description":"Forbidden - API access not enabled for organization or read-only key"},"404":{"content":{"application/json":{"schema":{"properties":{"code":{"enum":["project_not_found","service_not_found"],"example":"project_not_found","type":"string"},"message":{"example":"Project or service not found","type":"string"}},"type":"object"}}},"description":"Project or service not found"},"409":{"content":{"application/json":{"schema":{"properties":{"code":{"enum":["service_invalid_state"],"example":"service_invalid_state","type":"string"},"message":{"example":"Service is not in a state that allows this operation","type":"string"}},"type":"object"}}},"description":"Conflict - Invalid state transition"}},"summary":"Unpause a service","tags":["Services"]}},"/registry-credentials":{"get":{"description":"Returns a list of all registry credentials in the organization","operationId":"listRegistryCredentials","responses":{"200":{"content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/RegistryCredentials"},"type":"array"}}},"description":"List of registry credentials"},"401":{"content":{"application/json":{"schema":{"properties":{"code":{"enum":["invalid_token","missing_token"],"example":"missing_token","type":"string"},"message":{"example":"No authentication token provided","type":"string"}},"type":"object"}}},"description":"Unauthorized - Invalid or missing authentication token"},"403":{"content":{"application/json":{"schema":{"properties":{"code":{"enum":["read_only_token","api_access_disabled"],"example":"read_only_token","type":"string"},"message":{"example":"This token does not have write permissions","type":"string"}},"type":"object"}}},"description":"Forbidden - API access not enabled for organization or read-only key"}},"summary":"List registry credentials","tags":["Registry Credentials"]},"post":{"description":"Creates new credentials for a container registry","operationId":"createRegistryCredentials","requestBody":{"content":{"application/json":{"schema":{"properties":{"name":{"description":"A name to identify these credentials","example":"Docker Hub Credentials","minLength":1,"type":"string"},"token":{"description":"The authentication token for the registry","example":"mytoken","type":"string"},"type":{"description":"The type of registry these credentials are for","enum":["ghcr","dockerhub","dhi","generic"],"example":"dockerhub","type":"string"},"username":{"description":"The username for the registry","example":"myusername","type":"string"}},"required":["name","type","username","token"],"type":"object"}}},"required":true},"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RegistryCredentials"}}},"description":"Registry credentials created successfully"},"400":{"content":{"application/json":{"schema":{"properties":{"code":{"enum":["invalid_request"],"example":"invalid_request","type":"string"},"message":{"example":"The request body is invalid","type":"string"}},"type":"object"}}},"description":"Bad Request - Invalid request body"},"401":{"content":{"application/json":{"schema":{"properties":{"code":{"enum":["invalid_token","missing_token"],"example":"missing_token","type":"string"},"message":{"example":"No authentication token provided","type":"string"}},"type":"object"}}},"description":"Unauthorized - Invalid or missing authentication token"},"403":{"content":{"application/json":{"schema":{"properties":{"code":{"enum":["read_only_token","api_access_disabled"],"example":"read_only_token","type":"string"},"message":{"example":"This token does not have write permissions","type":"string"}},"type":"object"}}},"description":"Forbidden - API access not enabled for organization or read-only key"}},"summary":"Create registry credentials","tags":["Registry Credentials"]}},"/registry-credentials/{credentialId}":{"delete":{"description":"Deletes existing registry credentials","operationId":"deleteRegistryCredentials","parameters":[{"description":"The ID of the registry credentials to delete","in":"path","name":"credentialId","required":true,"schema":{"type":"string"}}],"responses":{"204":{"description":"Registry credentials deleted successfully"},"401":{"content":{"application/json":{"schema":{"properties":{"code":{"enum":["invalid_token","missing_token"],"example":"missing_token","type":"string"},"message":{"example":"No authentication token provided","type":"string"}},"type":"object"}}},"description":"Unauthorized - Invalid or missing authentication token"},"403":{"content":{"application/json":{"schema":{"properties":{"code":{"enum":["read_only_token","api_access_disabled"],"example":"read_only_token","type":"string"},"message":{"example":"This token does not have write permissions","type":"string"}},"type":"object"}}},"description":"Forbidden - API access not enabled for organization or read-only key"},"404":{"content":{"application/json":{"schema":{"properties":{"code":{"enum":["credential_not_found"],"example":"credential_not_found","type":"string"},"message":{"example":"Registry credentials not found","type":"string"}},"type":"object"}}},"description":"Registry credentials not found"}},"summary":"Delete registry credentials","tags":["Registry Credentials"]},"get":{"description":"Returns the details of specific registry credentials","operationId":"getRegistryCredentials","parameters":[{"description":"The ID of the registry credentials to retrieve","in":"path","name":"credentialId","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RegistryCredentials"}}},"description":"Registry credentials details"},"401":{"content":{"application/json":{"schema":{"properties":{"code":{"enum":["invalid_token","missing_token"],"example":"missing_token","type":"string"},"message":{"example":"No authentication token provided","type":"string"}},"type":"object"}}},"description":"Unauthorized - Invalid or missing authentication token"},"403":{"content":{"application/json":{"schema":{"properties":{"code":{"enum":["read_only_token","api_access_disabled"],"example":"read_only_token","type":"string"},"message":{"example":"This token does not have write permissions","type":"string"}},"type":"object"}}},"description":"Forbidden - API access not enabled for organization or read-only key"},"404":{"content":{"application/json":{"schema":{"properties":{"code":{"enum":["credential_not_found"],"example":"credential_not_found","type":"string"},"message":{"example":"Registry credentials not found","type":"string"}},"type":"object"}}},"description":"Registry credentials not found"}},"summary":"Get registry credentials","tags":["Registry Credentials"]},"patch":{"description":"Updates the name of existing registry credentials. Only the name can be updated after creation.","operationId":"updateRegistryCredentials","parameters":[{"description":"The ID of the registry credentials to update","in":"path","name":"credentialId","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"properties":{"name":{"description":"A name to identify these credentials","example":"Docker Hub Credentials","minLength":1,"type":"string"}},"required":["name"],"type":"object"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RegistryCredentials"}}},"description":"Registry credentials updated successfully"},"400":{"content":{"application/json":{"schema":{"properties":{"code":{"enum":["invalid_request"],"example":"invalid_request","type":"string"},"message":{"example":"The request body is invalid","type":"string"}},"type":"object"}}},"description":"Bad Request - Invalid request body"},"401":{"content":{"application/json":{"schema":{"properties":{"code":{"enum":["invalid_token","missing_token"],"example":"missing_token","type":"string"},"message":{"example":"No authentication token provided","type":"string"}},"type":"object"}}},"description":"Unauthorized - Invalid or missing authentication token"},"403":{"content":{"application/json":{"schema":{"properties":{"code":{"enum":["read_only_token","api_access_disabled"],"example":"read_only_token","type":"string"},"message":{"example":"This token does not have write permissions","type":"string"}},"type":"object"}}},"description":"Forbidden - API access not enabled for organization or read-only key"},"404":{"content":{"application/json":{"schema":{"properties":{"code":{"enum":["credential_not_found"],"example":"credential_not_found","type":"string"},"message":{"example":"Registry credentials not found","type":"string"}},"type":"object"}}},"description":"Registry credentials not found"}},"summary":"Update registry credentials","tags":["Registry Credentials"]}},"/servers":{"get":{"description":"Returns a list of all servers in the organization","operationId":"listServers","responses":{"200":{"content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/Server"},"type":"array"}}},"description":"List of servers"},"401":{"content":{"application/json":{"schema":{"properties":{"code":{"enum":["invalid_token","missing_token"],"example":"missing_token","type":"string"},"message":{"example":"No authentication token provided","type":"string"}},"type":"object"}}},"description":"Unauthorized - Invalid or missing authentication token"},"403":{"content":{"application/json":{"schema":{"properties":{"code":{"enum":["read_only_token","api_access_disabled"],"example":"read_only_token","type":"string"},"message":{"example":"This token does not have write permissions","type":"string"}},"type":"object"}}},"description":"Forbidden - API access not enabled for organization or read-only key"}},"summary":"List servers","tags":["Servers"]},"post":{"description":"Creates a new server with the specified configuration","operationId":"createServer","requestBody":{"content":{"application/json":{"schema":{"properties":{"billingCycle":{"description":"Optional billing cycle for the new server. Defaults to `hourly`. Choosing `monthly` or `yearly` bills the period upfront, prorated to the next billing anchor.\n","enum":["hourly","monthly","yearly"],"example":"monthly","type":"string"},"diskSizeGb":{"description":"Optional. Provision the server with a larger data disk than what's bundled with the instance type. Must be one of the catalog sizes (50, 100, 250, 500, 1000 GB) and must be larger than the bundled disk; otherwise rejected with `invalid_disk_size` / `invalid_request`. When omitted, the server gets the disk bundled with `instanceType`.\n","enum":[50,100,250,500,1000],"example":100,"type":"integer"},"instanceType":{"$ref":"#/components/schemas/InstanceType"},"location":{"$ref":"#/components/schemas/Location"},"name":{"description":"The name of the server","example":"Production Server","minLength":1,"type":"string"}},"required":["name","instanceType","location"],"type":"object"}}},"required":true},"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Server"}}},"description":"Server created successfully"},"400":{"content":{"application/json":{"schema":{"properties":{"code":{"enum":["invalid_request","invalid_server_name","invalid_server_type","invalid_location","invalid_disk_size","product_not_found"],"example":"invalid_request","type":"string"},"message":{"example":"The request body is invalid","type":"string"}},"type":"object"}}},"description":"Bad Request. Possible reasons:\n- `invalid_request`: the request body could not be parsed, or `diskSizeGb` is smaller than the disk bundled with the instance type\n- `invalid_server_name`: the server name is empty\n- `invalid_server_type`: the instance type is not in the catalog\n- `invalid_location`: the location is not in the supported region list\n- `invalid_disk_size`: `diskSizeGb` is not in the disk catalog for this region\n- `product_not_found`: no product/price exists for this instance type and location\n"},"401":{"content":{"application/json":{"schema":{"properties":{"code":{"enum":["invalid_token","missing_token"],"example":"missing_token","type":"string"},"message":{"example":"No authentication token provided","type":"string"}},"type":"object"}}},"description":"Unauthorized - Invalid or missing authentication token"},"403":{"content":{"application/json":{"schema":{"properties":{"code":{"enum":["read_only_token","api_access_disabled","quota_exceeded","quota_request_required","region_not_enabled"],"example":"read_only_token","type":"string"},"message":{"example":"This token does not have write permissions","type":"string"}},"type":"object"}}},"description":"Forbidden. Possible reasons:\n- `read_only_token` / `api_access_disabled`: the token cannot write\n- `quota_exceeded`: org has hit its quota for this server type\n- `quota_request_required`: this server type requires a manual quota request\n- `region_not_enabled`: the region is not enabled for this organization\n"},"409":{"content":{"application/json":{"schema":{"properties":{"code":{"enum":["quota_request_already_exists"],"example":"quota_request_already_exists","type":"string"},"message":{"example":"A quota request for this server type is already pending","type":"string"}},"type":"object"}}},"description":"Conflict - A quota request for this server type is already pending"},"503":{"content":{"application/json":{"schema":{"properties":{"code":{"enum":["insufficient_capacity"],"example":"insufficient_capacity","type":"string"},"message":{"example":"Insufficient capacity in the requested location","type":"string"}},"type":"object"}}},"description":"Service Unavailable - Insufficient capacity in the requested location"}},"summary":"Create a new server","tags":["Servers"]}},"/servers/{serverId}":{"delete":{"description":"Deletes an existing server","operationId":"deleteServer","parameters":[{"description":"The ID of the server to delete","in":"path","name":"serverId","required":true,"schema":{"type":"string"}}],"responses":{"204":{"description":"Server deleted successfully"},"401":{"content":{"application/json":{"schema":{"properties":{"code":{"enum":["invalid_token","missing_token"],"example":"missing_token","type":"string"},"message":{"example":"No authentication token provided","type":"string"}},"type":"object"}}},"description":"Unauthorized - Invalid or missing authentication token"},"403":{"content":{"application/json":{"schema":{"properties":{"code":{"enum":["read_only_token","api_access_disabled"],"example":"read_only_token","type":"string"},"message":{"example":"This token does not have write permissions","type":"string"}},"type":"object"}}},"description":"Forbidden - API access not enabled for organization or read-only key"},"404":{"content":{"application/json":{"schema":{"properties":{"code":{"enum":["server_not_found"],"example":"server_not_found","type":"string"},"message":{"example":"Server not found","type":"string"}},"type":"object"}}},"description":"Server not found"}},"summary":"Delete a server","tags":["Servers"]},"get":{"description":"Returns the details of a specific server","operationId":"getServer","parameters":[{"description":"The ID of the server to retrieve","in":"path","name":"serverId","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Server"}}},"description":"Server details"},"401":{"content":{"application/json":{"schema":{"properties":{"code":{"enum":["invalid_token","missing_token"],"example":"missing_token","type":"string"},"message":{"example":"No authentication token provided","type":"string"}},"type":"object"}}},"description":"Unauthorized - Invalid or missing authentication token"},"403":{"content":{"application/json":{"schema":{"properties":{"code":{"enum":["read_only_token","api_access_disabled"],"example":"read_only_token","type":"string"},"message":{"example":"This token does not have write permissions","type":"string"}},"type":"object"}}},"description":"Forbidden - API access not enabled for organization or read-only key"},"404":{"content":{"application/json":{"schema":{"properties":{"code":{"enum":["server_not_found"],"example":"server_not_found","type":"string"},"message":{"example":"Server not found","type":"string"}},"type":"object"}}},"description":"Server not found"}},"summary":"Get server details","tags":["Servers"]},"post":{"description":"Changes the instance type of an existing server. You can only scale up, not down. Scaling will make your services unavailable for a few minutes.","operationId":"rescaleServer","parameters":[{"description":"The ID of the server to rescale","in":"path","name":"serverId","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"properties":{"billingCycle":{"description":"Optional billing cycle for the rescaled server. Defaults to `hourly`. Switching from `hourly` to `monthly`/`yearly` bills the new period prorated to the next billing anchor; switching from `monthly`/`yearly` to `hourly` issues a credit for the unused remainder of the prepaid period.\n","enum":["hourly","monthly","yearly"],"example":"monthly","type":"string"},"instanceType":{"$ref":"#/components/schemas/InstanceType"}},"required":["instanceType"],"type":"object"}}},"required":true},"responses":{"202":{"description":"Rescale request accepted"},"400":{"content":{"application/json":{"schema":{"properties":{"code":{"enum":["invalid_request","invalid_server_type"],"example":"invalid_request","type":"string"},"message":{"example":"The request body is invalid","type":"string"}},"type":"object"}}},"description":"Bad Request. Possible reasons:\n- `invalid_request`: the request body could not be parsed, or the rescale would be a downscale (which is not allowed)\n- `invalid_server_type`: the requested instance type is not in the catalog\n"},"401":{"content":{"application/json":{"schema":{"properties":{"code":{"enum":["invalid_token","missing_token"],"example":"missing_token","type":"string"},"message":{"example":"No authentication token provided","type":"string"}},"type":"object"}}},"description":"Unauthorized - Invalid or missing authentication token"},"403":{"content":{"application/json":{"schema":{"properties":{"code":{"enum":["read_only_token","api_access_disabled","quota_exceeded","quota_request_required"],"example":"read_only_token","type":"string"},"message":{"example":"This token does not have write permissions","type":"string"}},"type":"object"}}},"description":"Forbidden. Possible reasons:\n- `read_only_token` / `api_access_disabled`: the token cannot write\n- `quota_exceeded`: org has hit its quota for this server type\n- `quota_request_required`: this server type requires a manual quota request\n"},"404":{"content":{"application/json":{"schema":{"properties":{"code":{"enum":["server_not_found"],"example":"server_not_found","type":"string"},"message":{"example":"Server not found","type":"string"}},"type":"object"}}},"description":"Server not found"},"409":{"content":{"application/json":{"schema":{"properties":{"code":{"enum":["server_invalid_state","quota_request_already_exists"],"example":"server_invalid_state","type":"string"},"message":{"example":"Server is not in a state that allows rescaling","type":"string"}},"type":"object"}}},"description":"Conflict. Possible reasons:\n- `server_invalid_state`: the server is not in a state that allows rescaling\n- `quota_request_already_exists`: a quota request for this server type is already pending\n"},"503":{"content":{"application/json":{"schema":{"properties":{"code":{"enum":["insufficient_capacity"],"example":"insufficient_capacity","type":"string"},"message":{"example":"Insufficient capacity for the requested instance type","type":"string"}},"type":"object"}}},"description":"Service Unavailable - Insufficient capacity for the requested instance type"}},"summary":"Rescale a server","tags":["Servers"]}},"/servers/{serverId}/disk":{"post":{"description":"Grows the server's data disk to one of the catalog sizes. Disks can only grow, not shrink. Allowed sizes are 50, 100, 250, 500, and 1000 GB; passing any other `diskSizeGb` is rejected with `invalid_disk_size`.","operationId":"rescaleServerDisk","parameters":[{"description":"The ID of the server whose disk should be rescaled","in":"path","name":"serverId","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"properties":{"diskSizeGb":{"description":"New data disk size in GB. Must be one of the catalog sizes (50, 100, 250, 500, 1000 GB) and must be larger than the current disk size.","enum":[50,100,250,500,1000],"example":500,"type":"integer"}},"required":["diskSizeGb"],"type":"object"}}},"required":true},"responses":{"202":{"description":"Disk rescale request accepted"},"400":{"content":{"application/json":{"schema":{"properties":{"code":{"enum":["invalid_request","invalid_disk_size"],"example":"invalid_request","type":"string"},"message":{"example":"The request body is invalid","type":"string"}},"type":"object"}}},"description":"Bad Request. Possible reasons:\n- `invalid_request`: the request body could not be parsed, `diskSizeGb` is missing/invalid, or the new size is not larger than the current disk size\n- `invalid_disk_size`: `diskSizeGb` is not in the disk catalog for this region\n"},"401":{"content":{"application/json":{"schema":{"properties":{"code":{"enum":["invalid_token","missing_token"],"example":"missing_token","type":"string"},"message":{"example":"No authentication token provided","type":"string"}},"type":"object"}}},"description":"Unauthorized - Invalid or missing authentication token"},"403":{"content":{"application/json":{"schema":{"properties":{"code":{"enum":["read_only_token","api_access_disabled","quota_exceeded"],"example":"read_only_token","type":"string"},"message":{"example":"This token does not have write permissions","type":"string"}},"type":"object"}}},"description":"Forbidden. Possible reasons:\n- `read_only_token` / `api_access_disabled`: the token cannot write\n- `quota_exceeded`: org has hit its disk-storage quota for this region\n"},"404":{"content":{"application/json":{"schema":{"properties":{"code":{"enum":["server_not_found"],"example":"server_not_found","type":"string"},"message":{"example":"Server not found","type":"string"}},"type":"object"}}},"description":"Server not found"},"409":{"content":{"application/json":{"schema":{"properties":{"code":{"enum":["server_invalid_state","quota_request_already_exists"],"example":"server_invalid_state","type":"string"},"message":{"example":"Server is not in a state that allows disk rescaling","type":"string"}},"type":"object"}}},"description":"Conflict. Possible reasons:\n- `server_invalid_state`: the server is not in a state that allows disk rescaling (e.g. it is not an SLVM server, or a rescale is already in progress)\n- `quota_request_already_exists`: a disk-storage quota request for this region is already pending\n"}},"summary":"Rescale a server's data disk","tags":["Servers"]}},"/servers/{serverId}/metrics":{"get":{"description":"Returns metrics for a server with optional time range filtering. Provides CPU and memory usage data for monitoring server performance. Use either 'range' parameter OR 'from'+'to' parameters, but not both.","operationId":"getServerMetrics","parameters":[{"description":"The ID of the server to get metrics for","in":"path","name":"serverId","required":true,"schema":{"type":"string"}},{"description":"Predefined time range for metrics. Do not use with from/to parameters.","in":"query","name":"range","required":false,"schema":{"enum":["10min","1h","24h","7d"],"type":"string"}},{"description":"From timestamp (Unix seconds). Use only with 'to' parameter, not with 'range'.","in":"query","name":"from","required":false,"schema":{"format":"int64","type":"integer"}},{"description":"To timestamp (Unix seconds). Use only with 'from' parameter, not with 'range'.","in":"query","name":"to","required":false,"schema":{"format":"int64","type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/ServerMetric"},"type":"array"}}},"description":"Server metrics data"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Bad Request - Invalid query parameters"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Unauthorized - Invalid or missing authentication token"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Forbidden - API access not enabled for organization or read-only key"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Server not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Internal server error"}},"summary":"Get server metrics","tags":["Servers"],"x-codeSamples":[{"label":"Using predefined range","lang":"curl","source":"curl 'https://ctrl.sliplane.io/v0/servers/{serverId}/metrics?range=1h'\n"}]}},"/servers/{serverId}/volumes":{"get":{"description":"Returns a list of all volumes available on the server","operationId":"listServerVolumes","parameters":[{"description":"The ID of the server to list volumes for","in":"path","name":"serverId","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/ServerVolumeResponse"},"type":"array"}}},"description":"List of server volumes"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Unauthorized - Invalid or missing authentication token"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Forbidden - API access not enabled for organization or read-only key"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Server not found"}},"summary":"List server volumes","tags":["Servers"]},"post":{"description":"Creates a new volume on a server. The volume can later be attached to a service.","operationId":"createServerVolume","parameters":[{"description":"The ID of the server to create the volume on","in":"path","name":"serverId","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"properties":{"name":{"description":"The name of the volume","example":"data","minLength":1,"type":"string"}},"required":["name"],"type":"object"}}},"required":true},"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerVolumeResponse"}}},"description":"Volume created successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Bad Request - Invalid request body"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Unauthorized - Invalid or missing authentication token"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Forbidden - API access not enabled for organization or read-only key"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Server not found"}},"summary":"Create a volume","tags":["Servers"]}},"/ssh-keys":{"get":{"description":"Lists the authenticated user's SSH public keys.\n","operationId":"listSSHKeys","responses":{"200":{"content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/SSHKey"},"type":"array"}}},"description":"SSH keys"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Invalid or missing authentication token"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Access denied or read-only token"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Internal server error"}},"summary":"List SSH keys","tags":["SSH Keys"]},"post":{"description":"Registers an SSH public key for the authenticated user. Attach the key to a service to enable SSH access.\n","operationId":"createSSHKey","requestBody":{"content":{"application/json":{"schema":{"properties":{"expiresAt":{"description":"Time after which the key is deleted and its service access is removed. Must be at least 5 minutes and no more than 30 days from now. Omit for a permanent key.","format":"date-time","type":"string"},"name":{"example":"Laptop","minLength":1,"type":"string"},"publicKey":{"description":"SSH public key in authorized_keys format.","minLength":1,"type":"string"}},"required":["name","publicKey"],"type":"object"}}},"required":true},"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SSHKey"}}},"description":"SSH key created"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Invalid request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Invalid or missing authentication token"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Access denied or read-only token"},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"SSH key already exists"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Internal server error"}},"summary":"Create an SSH key","tags":["SSH Keys"]}},"/ssh-keys/{keyId}":{"delete":{"description":"Deletes an SSH key. Detach it from all services first; attached keys return 409.\n","operationId":"deleteSSHKey","responses":{"204":{"description":"SSH key deleted"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Invalid or missing authentication token"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Access denied or read-only token"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Resource not found"},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"SSH key is still attached to a service"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Internal server error"}},"summary":"Delete an SSH key","tags":["SSH Keys"]},"parameters":[{"in":"path","name":"keyId","required":true,"schema":{"type":"string"}}]}},"security":[{"bearerAuth":[]}],"servers":[{"description":"Production API server","url":"https://ctrl.sliplane.io/v0"}],"tags":[{"description":"Operations related to caller identity and authentication context.","name":"Identity"},{"description":"Operations related to project management. Projects are used to logically group services. There is no limit to the number of projects you can create.","name":"Projects"},{"description":"Operations related to server management. Servers are the compute resources that run your services.","name":"Servers"},{"description":"Operations related to service management. Services are applications running on servers within a project.","name":"Services"},{"description":"Manage the authenticated user's SSH public keys and service access.","name":"SSH Keys"},{"description":"Operations related to container registry credentials management. These credentials are used to authenticate with container registries when deploying services.","name":"Registry Credentials"},{"description":"Operations related to OAuth client metadata and authorization visibility.","name":"OAuth Clients"},{"description":"S3-compatible buckets. Each bucket gets its own scoped credentials.\n","name":"Buckets"},{"description":"Access keys for buckets. Each key is scoped to a single bucket via IAM policy.\nThe secret key is only returned once at creation time.\n","name":"Bucket Keys"},{"description":"Cross-origin rules for a bucket, so a browser on your own domain can read\nfrom it or upload to it directly.\n","name":"Bucket CORS"},{"description":"Managed PostgreSQL databases. Each database is provisioned with generated credentials and a connection endpoint.\nRequires the Postgres feature to be enabled for the organization.\n","name":"Postgres"}]}