{
  "x-generator": "NSwag v14.7.1.0 (NJsonSchema v11.6.1.0 (Newtonsoft.Json v13.0.0.0))",
  "openapi": "3.0.0",
  "info": {
    "title": "Cloudovňa API",
    "description": "Manage Cloudovňa services with a personal API token, made under Integrations in the dashboard. Send it as `Authorization: Bearer cdv_...`. Guides: https://cloudovna.eu/docs",
    "version": "v1"
  },
  "servers": [
    {
      "url": "https://admin.cloudovna.eu"
    }
  ],
  "paths": {
    "/api/health": {
      "get": {
        "tags": [
          "Health"
        ],
        "summary": "Liveness probe.",
        "operationId": "CloudovnaAPIEndpointsHealthEndpoint",
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HealthResponse"
                }
              }
            }
          }
        }
      }
    },
    "/api/services/{id}/domains/cloudflare": {
      "get": {
        "tags": [
          "Services"
        ],
        "summary": "The records Cloudovna would set in the owner's Cloudflare zone, and those in the way.",
        "operationId": "CloudovnaAPIEndpointsServicesCloudflarePlanEndpoint",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "guid"
            }
          },
          {
            "name": "zone",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/CloudflarePlanDto"
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized"
          }
        },
        "security": [
          {
            "Bearer": []
          }
        ]
      },
      "post": {
        "tags": [
          "Services"
        ],
        "summary": "Set the records in the owner's Cloudflare zone, replacing those the plan showed in the way.",
        "operationId": "CloudovnaAPIEndpointsServicesApplyCloudflareEndpoint",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "guid"
            }
          }
        ],
        "requestBody": {
          "x-name": "ApplyCloudflareRequest",
          "description": "",
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ApplyCloudflareRequest"
              }
            }
          },
          "required": true,
          "x-position": 1
        },
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/DomainsResponse"
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized"
          }
        },
        "security": [
          {
            "Bearer": []
          }
        ]
      }
    },
    "/api/services/{id}/backups": {
      "get": {
        "tags": [
          "Services"
        ],
        "summary": "A database's backups, or a container's snapshots of its volumes.",
        "operationId": "CloudovnaAPIEndpointsServicesListBackupsEndpoint",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "guid"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/BackupDto"
                  }
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized"
          }
        },
        "security": [
          {
            "Bearer": []
          }
        ]
      },
      "post": {
        "tags": [
          "Services"
        ],
        "summary": "Back a database up, or snapshot a container's volumes.",
        "operationId": "CloudovnaAPIEndpointsServicesCreateBackupEndpoint",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "guid"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BackupDto"
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized"
          }
        },
        "security": [
          {
            "Bearer": []
          }
        ]
      }
    },
    "/api/services/{id}/database/allowlist": {
      "put": {
        "tags": [
          "Services"
        ],
        "summary": "Limit which IP addresses a database's logins may connect from; an empty list lets in any. The account's own containers are always let in.",
        "operationId": "CloudovnaAPIEndpointsServicesSetAllowlistEndpoint",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "guid"
            }
          }
        ],
        "requestBody": {
          "x-name": "AllowlistRequest",
          "description": "",
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/AllowlistRequest"
              }
            }
          },
          "required": true,
          "x-position": 1
        },
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServiceResponse"
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized"
          }
        },
        "security": [
          {
            "Bearer": []
          }
        ]
      }
    },
    "/api/services/{id}/backups/schedule": {
      "put": {
        "tags": [
          "Services"
        ],
        "summary": "Set a database's automatic backups, or a container's automatic snapshots.",
        "operationId": "CloudovnaAPIEndpointsServicesSetBackupScheduleEndpoint",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "guid"
            }
          }
        ],
        "requestBody": {
          "x-name": "BackupScheduleRequest",
          "description": "",
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/BackupScheduleRequest"
              }
            }
          },
          "required": true,
          "x-position": 1
        },
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServiceResponse"
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized"
          }
        },
        "security": [
          {
            "Bearer": []
          }
        ]
      }
    },
    "/api/services/{id}/backups/{backupId}/file": {
      "get": {
        "tags": [
          "Services"
        ],
        "summary": "Download a backup.",
        "operationId": "CloudovnaAPIEndpointsServicesDownloadBackupEndpoint",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "guid"
            }
          },
          {
            "name": "backupId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "guid"
            }
          }
        ],
        "responses": {
          "204": {
            "description": "No Content"
          },
          "401": {
            "description": "Unauthorized"
          }
        },
        "security": [
          {
            "Bearer": []
          }
        ]
      }
    },
    "/api/services/{id}/backups/upload": {
      "put": {
        "tags": [
          "Services"
        ],
        "summary": "Upload a file to restore a database, or a container's volumes, from.",
        "operationId": "CloudovnaAPIEndpointsServicesUploadBackupEndpoint",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "guid"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BackupDto"
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized"
          }
        },
        "security": [
          {
            "Bearer": []
          }
        ]
      }
    },
    "/api/services/{id}/backups/{backupId}/restore": {
      "post": {
        "tags": [
          "Services"
        ],
        "summary": "Restore a database from a backup, or a container's volumes from a snapshot.",
        "operationId": "CloudovnaAPIEndpointsServicesRestoreBackupEndpoint",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "guid"
            }
          },
          {
            "name": "backupId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "guid"
            }
          }
        ],
        "responses": {
          "204": {
            "description": "No Content"
          },
          "401": {
            "description": "Unauthorized"
          }
        },
        "security": [
          {
            "Bearer": []
          }
        ]
      }
    },
    "/api/services/{id}/backups/{backupId}": {
      "delete": {
        "tags": [
          "Services"
        ],
        "summary": "Delete a backup.",
        "operationId": "CloudovnaAPIEndpointsServicesDeleteBackupEndpoint",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "guid"
            }
          },
          {
            "name": "backupId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "guid"
            }
          }
        ],
        "responses": {
          "204": {
            "description": "No Content"
          },
          "401": {
            "description": "Unauthorized"
          }
        },
        "security": [
          {
            "Bearer": []
          }
        ]
      }
    },
    "/api/services/{id}/domains": {
      "get": {
        "tags": [
          "Services"
        ],
        "summary": "A container's own domains, and the DNS records each needs.",
        "operationId": "CloudovnaAPIEndpointsServicesListDomainsEndpoint",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "guid"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/DomainsResponse"
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized"
          }
        },
        "security": [
          {
            "Bearer": []
          }
        ]
      },
      "post": {
        "tags": [
          "Services"
        ],
        "summary": "Add a domain to a container.",
        "operationId": "CloudovnaAPIEndpointsServicesAddDomainEndpoint",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "guid"
            }
          }
        ],
        "requestBody": {
          "x-name": "AddDomainRequest",
          "description": "",
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/AddDomainRequest"
              }
            }
          },
          "required": true,
          "x-position": 1
        },
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/DomainsResponse"
                }
              }
            }
          },
          "400": {
            "description": "Bad Request",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized"
          }
        },
        "security": [
          {
            "Bearer": []
          }
        ]
      }
    },
    "/api/services/{id}/domains/zone": {
      "get": {
        "tags": [
          "Services"
        ],
        "summary": "Download the DNS records a zone still needs as a BIND zone file.",
        "operationId": "CloudovnaAPIEndpointsServicesDomainZoneFileEndpoint",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "guid"
            }
          }
        ],
        "responses": {
          "204": {
            "description": "No Content"
          },
          "401": {
            "description": "Unauthorized"
          }
        },
        "security": [
          {
            "Bearer": []
          }
        ]
      }
    },
    "/api/services/{id}/domains/{domainId}/check": {
      "post": {
        "tags": [
          "Services"
        ],
        "summary": "Check a domain's DNS records now.",
        "operationId": "CloudovnaAPIEndpointsServicesCheckDomainEndpoint",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "guid"
            }
          },
          {
            "name": "domainId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "guid"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/DomainsResponse"
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized"
          }
        },
        "security": [
          {
            "Bearer": []
          }
        ]
      }
    },
    "/api/services/{id}/domains/{domainId}": {
      "delete": {
        "tags": [
          "Services"
        ],
        "summary": "Take a domain off a container, with the domains that redirect to it.",
        "operationId": "CloudovnaAPIEndpointsServicesRemoveDomainEndpoint",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "guid"
            }
          },
          {
            "name": "domainId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "guid"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/DomainsResponse"
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized"
          }
        },
        "security": [
          {
            "Bearer": []
          }
        ]
      }
    },
    "/api/services/{id}/domains/app-address": {
      "post": {
        "tags": [
          "Services"
        ],
        "summary": "Give a container a new app address, or one when it has none; an old one stops working.",
        "operationId": "CloudovnaAPIEndpointsServicesRenewAppAddressEndpoint",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "guid"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/DomainsResponse"
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized"
          }
        },
        "security": [
          {
            "Bearer": []
          }
        ]
      }
    },
    "/api/services/health": {
      "get": {
        "tags": [
          "Services"
        ],
        "summary": "How the health checks of the caller's containers stand.",
        "operationId": "CloudovnaAPIEndpointsServicesAccountHealthEndpoint",
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "additionalProperties": {
                    "$ref": "#/components/schemas/ServiceHealthDto"
                  }
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized"
          }
        },
        "security": [
          {
            "Bearer": []
          }
        ]
      }
    },
    "/api/services/{id}/health": {
      "get": {
        "tags": [
          "Services"
        ],
        "summary": "A container's health checks and their recent results.",
        "operationId": "CloudovnaAPIEndpointsServicesListHealthChecksEndpoint",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "guid"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HealthChecksResponse"
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized"
          }
        },
        "security": [
          {
            "Bearer": []
          }
        ]
      },
      "post": {
        "tags": [
          "Services"
        ],
        "summary": "Add a health check: a URL on one of the container's domains.",
        "operationId": "CloudovnaAPIEndpointsServicesCreateHealthCheckEndpoint",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "guid"
            }
          }
        ],
        "requestBody": {
          "x-name": "HealthCheckRequest",
          "description": "",
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/HealthCheckRequest"
              }
            }
          },
          "required": true,
          "x-position": 1
        },
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HealthChecksResponse"
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized"
          }
        },
        "security": [
          {
            "Bearer": []
          }
        ]
      }
    },
    "/api/services/{id}/health/{checkId}": {
      "put": {
        "tags": [
          "Services"
        ],
        "summary": "Change a health check.",
        "operationId": "CloudovnaAPIEndpointsServicesUpdateHealthCheckEndpoint",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "guid"
            }
          },
          {
            "name": "checkId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "guid"
            }
          }
        ],
        "requestBody": {
          "x-name": "HealthCheckRequest",
          "description": "",
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/HealthCheckRequest"
              }
            }
          },
          "required": true,
          "x-position": 1
        },
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HealthChecksResponse"
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized"
          }
        },
        "security": [
          {
            "Bearer": []
          }
        ]
      },
      "delete": {
        "tags": [
          "Services"
        ],
        "summary": "Remove a health check.",
        "operationId": "CloudovnaAPIEndpointsServicesDeleteHealthCheckEndpoint",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "guid"
            }
          },
          {
            "name": "checkId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "guid"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HealthChecksResponse"
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized"
          }
        },
        "security": [
          {
            "Bearer": []
          }
        ]
      }
    },
    "/api/services/{id}/health/{checkId}/run": {
      "post": {
        "tags": [
          "Services"
        ],
        "summary": "Run a health check now.",
        "operationId": "CloudovnaAPIEndpointsServicesRunHealthCheckEndpoint",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "guid"
            }
          },
          {
            "name": "checkId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "guid"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HealthChecksResponse"
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized"
          }
        },
        "security": [
          {
            "Bearer": []
          }
        ]
      }
    },
    "/api/images/lookup": {
      "get": {
        "tags": [
          "Images"
        ],
        "summary": "Look an image up on Docker Hub or GitHub Container Registry (ghcr.io/...).",
        "operationId": "CloudovnaAPIEndpointsServicesImageLookupEndpoint",
        "parameters": [
          {
            "name": "image",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "registry",
            "in": "query",
            "schema": {
              "type": "string",
              "format": "guid",
              "nullable": true
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ImageLookup"
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized"
          }
        },
        "security": [
          {
            "Bearer": []
          }
        ]
      }
    },
    "/api/images/search": {
      "get": {
        "tags": [
          "Images"
        ],
        "summary": "Search Docker Hub's public repositories.",
        "operationId": "CloudovnaAPIEndpointsServicesImageSearchEndpoint",
        "parameters": [
          {
            "name": "query",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/HubSearchResult"
                  }
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized"
          }
        },
        "security": [
          {
            "Bearer": []
          }
        ]
      }
    },
    "/api/images/tags": {
      "get": {
        "tags": [
          "Images"
        ],
        "summary": "A public repository's tags, newest push first.",
        "operationId": "CloudovnaAPIEndpointsServicesImageTagsEndpoint",
        "parameters": [
          {
            "name": "repository",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/HubTag"
                  }
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized"
          }
        },
        "security": [
          {
            "Bearer": []
          }
        ]
      }
    },
    "/api/services/{id}/links": {
      "get": {
        "tags": [
          "Services"
        ],
        "summary": "A container's linked databases.",
        "operationId": "CloudovnaAPIEndpointsServicesListLinksEndpoint",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "guid"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/LinkDto"
                  }
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized"
          }
        },
        "security": [
          {
            "Bearer": []
          }
        ]
      },
      "post": {
        "tags": [
          "Services"
        ],
        "summary": "Link a container to one of your databases.",
        "operationId": "CloudovnaAPIEndpointsServicesCreateLinkEndpoint",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "guid"
            }
          }
        ],
        "requestBody": {
          "x-name": "CreateLinkRequest",
          "description": "",
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/CreateLinkRequest"
              }
            }
          },
          "required": true,
          "x-position": 1
        },
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServiceResponse"
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized"
          }
        },
        "security": [
          {
            "Bearer": []
          }
        ]
      }
    },
    "/api/services/{id}/links/{linkId}": {
      "delete": {
        "tags": [
          "Services"
        ],
        "summary": "Unlink a database from a container.",
        "operationId": "CloudovnaAPIEndpointsServicesDeleteLinkEndpoint",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "guid"
            }
          },
          {
            "name": "linkId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "guid"
            }
          },
          {
            "name": "removeVars",
            "in": "query",
            "required": true,
            "schema": {
              "type": "boolean"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServiceResponse"
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized"
          }
        },
        "security": [
          {
            "Bearer": []
          }
        ]
      }
    },
    "/api/services/{id}/links/{linkId}/rotate": {
      "post": {
        "tags": [
          "Services"
        ],
        "summary": "Give a link's database login a new password.",
        "operationId": "CloudovnaAPIEndpointsServicesRotateLinkEndpoint",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "guid"
            }
          },
          {
            "name": "linkId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "guid"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServiceResponse"
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized"
          }
        },
        "security": [
          {
            "Bearer": []
          }
        ]
      }
    },
    "/api/pool": {
      "get": {
        "tags": [
          "Pool"
        ],
        "summary": "The signed-in account's resource pool: size, what its containers and databases take, what is free, its price and dates. 404 when it has none.",
        "operationId": "CloudovnaAPIEndpointsServicesGetPoolEndpoint",
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PoolResponse"
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized"
          }
        },
        "security": [
          {
            "Bearer": []
          }
        ]
      },
      "put": {
        "tags": [
          "Pool"
        ],
        "summary": "Resize the account's resource pool (or order one): bigger is paid for the rest of the period, smaller applies at renewal. Answers with the pool and any payment asked for.",
        "operationId": "CloudovnaAPIEndpointsServicesResizePoolEndpoint",
        "requestBody": {
          "x-name": "ResizePoolRequest",
          "description": "",
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ResizePoolRequest"
              }
            }
          },
          "required": true,
          "x-position": 1
        },
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PoolChangedResponse"
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized"
          }
        },
        "security": [
          {
            "Bearer": []
          }
        ]
      }
    },
    "/api/pool/check": {
      "post": {
        "tags": [
          "Pool"
        ],
        "summary": "Whether an addition (or a member's new share, with serviceId) fits the resource pool, and if not, how much it must grow and what that costs now.",
        "operationId": "CloudovnaAPIEndpointsServicesCheckPoolEndpoint",
        "requestBody": {
          "x-name": "CheckPoolRequest",
          "description": "",
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/CheckPoolRequest"
              }
            }
          },
          "required": true,
          "x-position": 1
        },
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/CheckPoolResponse"
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized"
          }
        },
        "security": [
          {
            "Bearer": []
          }
        ]
      }
    },
    "/api/services/{id}/allocation": {
      "put": {
        "tags": [
          "Services"
        ],
        "summary": "Set a container's share of the resource pool (cpu, ramMb, diskMb; redeploys it) or a database's (quotaGb). Free, within the pool's room.",
        "operationId": "CloudovnaAPIEndpointsServicesSetAllocationEndpoint",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "guid"
            }
          }
        ],
        "requestBody": {
          "x-name": "SetAllocationRequest",
          "description": "",
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/SetAllocationRequest"
              }
            }
          },
          "required": true,
          "x-position": 1
        },
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServiceResponse"
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized"
          }
        },
        "security": [
          {
            "Bearer": []
          }
        ]
      }
    },
    "/api/services/changes": {
      "get": {
        "tags": [
          "Services"
        ],
        "summary": "Server-sent events: \"changed\" whenever the account's services, stacks, resource pool or payments change.",
        "operationId": "CloudovnaAPIEndpointsServicesServiceChangesEndpoint",
        "responses": {
          "204": {
            "description": "No Content"
          },
          "401": {
            "description": "Unauthorized"
          }
        },
        "security": [
          {
            "Bearer": []
          }
        ]
      }
    },
    "/api/services": {
      "get": {
        "tags": [
          "Services"
        ],
        "summary": "The signed-in account's containers, databases and contracts. Its resource pool is at GET /pool.",
        "operationId": "CloudovnaAPIEndpointsServicesListServicesEndpoint",
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/ServiceResponse"
                  }
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized"
          }
        },
        "security": [
          {
            "Bearer": []
          }
        ]
      }
    },
    "/api/services/{id}": {
      "get": {
        "tags": [
          "Services"
        ],
        "summary": "One service.",
        "operationId": "CloudovnaAPIEndpointsServicesGetServiceEndpoint",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "guid"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServiceResponse"
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized"
          }
        },
        "security": [
          {
            "Bearer": []
          }
        ]
      }
    },
    "/api/services/containers": {
      "post": {
        "tags": [
          "Services"
        ],
        "summary": "Order a container from a Docker Hub image, as a share of the account's resource pool; the pool grows for it unless growPool is false (409).",
        "operationId": "CloudovnaAPIEndpointsServicesCreateContainerEndpoint",
        "requestBody": {
          "x-name": "CreateContainerRequest",
          "description": "",
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/CreateContainerRequest"
              }
            }
          },
          "required": true,
          "x-position": 1
        },
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServiceResponse"
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized"
          }
        },
        "security": [
          {
            "Bearer": []
          }
        ]
      }
    },
    "/api/services/databases": {
      "post": {
        "tags": [
          "Services"
        ],
        "summary": "Order a PostgreSQL or SQL Server database, as a share of the account's resource pool; the pool grows for it unless growPool is false (409).",
        "operationId": "CloudovnaAPIEndpointsServicesCreateDatabaseEndpoint",
        "requestBody": {
          "x-name": "CreateDatabaseRequest",
          "description": "",
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/CreateDatabaseRequest"
              }
            }
          },
          "required": true,
          "x-position": 1
        },
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/DatabaseCreatedResponse"
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized"
          }
        },
        "security": [
          {
            "Bearer": []
          }
        ]
      }
    },
    "/api/services/{id}/{action}": {
      "post": {
        "tags": [
          "Services"
        ],
        "summary": "Restart, redeploy, stop, start, cancel or resume a service. Cancelling a database containers are linked to needs ?linked=true.",
        "operationId": "CloudovnaAPIEndpointsServicesServiceActionEndpoint",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "guid"
            }
          },
          {
            "name": "action",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServiceResponse"
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized"
          }
        },
        "security": [
          {
            "Bearer": []
          }
        ]
      }
    },
    "/api/catalog": {
      "get": {
        "tags": [
          "Catalog"
        ],
        "summary": "Prices and sizes, net (vatRate is added on top, 0 while Cloudovňa is not a VAT payer): the resource pool's (pool), the database engines and the regions. No token needed.",
        "operationId": "CloudovnaAPIEndpointsServicesCatalogEndpoint",
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/CatalogResponse"
                }
              }
            }
          }
        }
      }
    },
    "/api/services/{id}/name": {
      "put": {
        "tags": [
          "Services"
        ],
        "summary": "Rename a service.",
        "operationId": "CloudovnaAPIEndpointsServicesRenameServiceEndpoint",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "guid"
            }
          }
        ],
        "requestBody": {
          "x-name": "RenameServiceRequest",
          "description": "",
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/RenameServiceRequest"
              }
            }
          },
          "required": true,
          "x-position": 1
        },
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServiceResponse"
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized"
          }
        },
        "security": [
          {
            "Bearer": []
          }
        ]
      }
    },
    "/api/services/{id}/config": {
      "put": {
        "tags": [
          "Services"
        ],
        "summary": "Change a container's port, environment and volumes, and redeploy it.",
        "operationId": "CloudovnaAPIEndpointsServicesUpdateConfigEndpoint",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "guid"
            }
          }
        ],
        "requestBody": {
          "x-name": "UpdateConfigRequest",
          "description": "",
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/UpdateConfigRequest"
              }
            }
          },
          "required": true,
          "x-position": 1
        },
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServiceResponse"
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized"
          }
        },
        "security": [
          {
            "Bearer": []
          }
        ]
      }
    },
    "/api/services/{id}/auto-update": {
      "put": {
        "tags": [
          "Services"
        ],
        "summary": "Turn a container's auto-update on or off.",
        "operationId": "CloudovnaAPIEndpointsServicesAutoUpdateEndpoint",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "guid"
            }
          }
        ],
        "requestBody": {
          "x-name": "AutoUpdateRequest",
          "description": "",
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/AutoUpdateRequest"
              }
            }
          },
          "required": true,
          "x-position": 1
        },
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServiceResponse"
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized"
          }
        },
        "security": [
          {
            "Bearer": []
          }
        ]
      }
    },
    "/api/services/{id}/events": {
      "get": {
        "tags": [
          "Services"
        ],
        "summary": "A service's history of changes and deployments.",
        "operationId": "CloudovnaAPIEndpointsServicesServiceEventsEndpoint",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "guid"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/ServiceEventResponse"
                  }
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized"
          }
        },
        "security": [
          {
            "Bearer": []
          }
        ]
      }
    },
    "/api/services/{id}/logs": {
      "get": {
        "tags": [
          "Services"
        ],
        "summary": "The last lines a container printed.",
        "operationId": "CloudovnaAPIEndpointsServicesServiceLogsEndpoint",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "guid"
            }
          },
          {
            "name": "tail",
            "in": "query",
            "required": true,
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          },
          {
            "name": "since",
            "in": "query",
            "schema": {
              "type": "string",
              "nullable": true
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ContainerLogs"
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized"
          }
        },
        "security": [
          {
            "Bearer": []
          }
        ]
      }
    },
    "/api/services/{id}/metrics": {
      "get": {
        "tags": [
          "Services"
        ],
        "summary": "Recent CPU, memory and disk readings for one service.",
        "operationId": "CloudovnaAPIEndpointsServicesServiceMetricsEndpoint",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "guid"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/MetricSample"
                  }
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized"
          }
        },
        "security": [
          {
            "Bearer": []
          }
        ]
      }
    },
    "/api/services/metrics": {
      "get": {
        "tags": [
          "Services"
        ],
        "summary": "Recent CPU, memory and disk readings for all of the caller's containers and databases.",
        "operationId": "CloudovnaAPIEndpointsServicesAccountMetricsEndpoint",
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "additionalProperties": {
                    "type": "array",
                    "items": {
                      "$ref": "#/components/schemas/MetricSample"
                    }
                  }
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized"
          }
        },
        "security": [
          {
            "Bearer": []
          }
        ]
      }
    },
    "/api/services/{id}/database/password": {
      "post": {
        "tags": [
          "Services"
        ],
        "summary": "Reset a database login's password.",
        "operationId": "CloudovnaAPIEndpointsServicesResetDatabasePasswordEndpoint",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "guid"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/DatabasePasswordResponse"
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized"
          }
        },
        "security": [
          {
            "Bearer": []
          }
        ]
      }
    },
    "/api/services/{id}/database/logins": {
      "post": {
        "tags": [
          "Services"
        ],
        "summary": "Make a named connection string: a new database login.",
        "operationId": "CloudovnaAPIEndpointsServicesCreateConnectionLoginEndpoint",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "guid"
            }
          }
        ],
        "requestBody": {
          "x-name": "CreateConnectionLoginRequest",
          "description": "",
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/CreateConnectionLoginRequest"
              }
            }
          },
          "required": true,
          "x-position": 1
        },
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ConnectionLoginResponse"
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized"
          }
        },
        "security": [
          {
            "Bearer": []
          }
        ]
      }
    },
    "/api/services/{id}/database/logins/{loginId}": {
      "delete": {
        "tags": [
          "Services"
        ],
        "summary": "Revoke a named connection string.",
        "operationId": "CloudovnaAPIEndpointsServicesRevokeConnectionLoginEndpoint",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "guid"
            }
          },
          {
            "name": "loginId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "guid"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServiceResponse"
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized"
          }
        },
        "security": [
          {
            "Bearer": []
          }
        ]
      }
    },
    "/api/stacks/order": {
      "post": {
        "tags": [
          "Stacks"
        ],
        "summary": "Order a container and a database linked to it, as shares of the account's resource pool; the pool grows for them unless growPool is false (409).",
        "operationId": "CloudovnaAPIEndpointsServicesOrderStackEndpoint",
        "requestBody": {
          "x-name": "OrderStackRequest",
          "description": "",
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/OrderStackRequest"
              }
            }
          },
          "required": true,
          "x-position": 1
        },
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/StackOrderedResponse"
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized"
          }
        },
        "security": [
          {
            "Bearer": []
          }
        ]
      }
    },
    "/api/stacks": {
      "get": {
        "tags": [
          "Stacks"
        ],
        "summary": "The signed-in account's stacks.",
        "operationId": "CloudovnaAPIEndpointsServicesListStacksEndpoint",
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/StackDto"
                  }
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized"
          }
        },
        "security": [
          {
            "Bearer": []
          }
        ]
      },
      "post": {
        "tags": [
          "Stacks"
        ],
        "summary": "Create a stack, optionally moving services into it.",
        "operationId": "CloudovnaAPIEndpointsServicesCreateStackEndpoint",
        "requestBody": {
          "x-name": "CreateStackRequest",
          "description": "",
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/CreateStackRequest"
              }
            }
          },
          "required": true,
          "x-position": 1
        },
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/StackDto"
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized"
          }
        },
        "security": [
          {
            "Bearer": []
          }
        ]
      }
    },
    "/api/stacks/{id}": {
      "get": {
        "tags": [
          "Stacks"
        ],
        "summary": "One stack, with its services.",
        "operationId": "CloudovnaAPIEndpointsServicesGetStackEndpoint",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "guid"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/StackDto"
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized"
          }
        },
        "security": [
          {
            "Bearer": []
          }
        ]
      },
      "patch": {
        "tags": [
          "Stacks"
        ],
        "summary": "Rename a stack.",
        "operationId": "CloudovnaAPIEndpointsServicesRenameStackEndpoint",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "guid"
            }
          }
        ],
        "requestBody": {
          "x-name": "RenameStackRequest",
          "description": "",
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/RenameStackRequest"
              }
            }
          },
          "required": true,
          "x-position": 1
        },
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/StackDto"
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized"
          }
        },
        "security": [
          {
            "Bearer": []
          }
        ]
      },
      "delete": {
        "tags": [
          "Stacks"
        ],
        "summary": "Delete a stack, saying for each service whether to delete or keep it.",
        "operationId": "CloudovnaAPIEndpointsServicesDeleteStackEndpoint",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "guid"
            }
          }
        ],
        "requestBody": {
          "x-name": "DeleteStackRequest",
          "description": "",
          "content": {
            "*/*": {
              "schema": {
                "$ref": "#/components/schemas/DeleteStackRequest"
              }
            },
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/DeleteStackRequest"
              }
            }
          },
          "required": true,
          "x-position": 1
        },
        "responses": {
          "204": {
            "description": "No Content"
          },
          "401": {
            "description": "Unauthorized"
          }
        },
        "security": [
          {
            "Bearer": []
          }
        ]
      }
    },
    "/api/stacks/{id}/services": {
      "post": {
        "tags": [
          "Stacks"
        ],
        "summary": "Move a service into a stack; the services it is linked to come along.",
        "operationId": "CloudovnaAPIEndpointsServicesMoveIntoStackEndpoint",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "guid"
            }
          }
        ],
        "requestBody": {
          "x-name": "MoveServiceRequest",
          "description": "",
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/MoveServiceRequest"
              }
            }
          },
          "required": true,
          "x-position": 1
        },
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/StackDto"
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized"
          }
        },
        "security": [
          {
            "Bearer": []
          }
        ]
      }
    },
    "/api/stacks/{id}/services/{serviceId}": {
      "delete": {
        "tags": [
          "Stacks"
        ],
        "summary": "Take a service out of a stack.",
        "operationId": "CloudovnaAPIEndpointsServicesMoveOutOfStackEndpoint",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "guid"
            }
          },
          {
            "name": "serviceId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "guid"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/StackDto"
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized"
          }
        },
        "security": [
          {
            "Bearer": []
          }
        ]
      }
    },
    "/api/stacks/{id}/actions": {
      "post": {
        "tags": [
          "Stacks"
        ],
        "summary": "Start, stop or redeploy a stack's containers.",
        "operationId": "CloudovnaAPIEndpointsServicesStackActionEndpoint",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "guid"
            }
          }
        ],
        "requestBody": {
          "x-name": "StackActionRequest",
          "description": "",
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/StackActionRequest"
              }
            }
          },
          "required": true,
          "x-position": 1
        },
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/StackDto"
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized"
          }
        },
        "security": [
          {
            "Bearer": []
          }
        ]
      }
    },
    "/api/services/{id}/webhook": {
      "post": {
        "tags": [
          "Services"
        ],
        "summary": "Make or replace a container's deploy webhook.",
        "operationId": "CloudovnaAPIEndpointsServicesCreateWebhookEndpoint",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "guid"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServiceResponse"
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized"
          }
        },
        "security": [
          {
            "Bearer": []
          }
        ]
      },
      "delete": {
        "tags": [
          "Services"
        ],
        "summary": "Remove a container's deploy webhook.",
        "operationId": "CloudovnaAPIEndpointsServicesRemoveWebhookEndpoint",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "guid"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServiceResponse"
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized"
          }
        },
        "security": [
          {
            "Bearer": []
          }
        ]
      }
    },
    "/api/hooks/containers/{token}": {
      "post": {
        "tags": [
          "Hooks"
        ],
        "summary": "Deploy webhook: redeploys the container if its tag has a new build.",
        "operationId": "CloudovnaAPIEndpointsServicesTriggerWebhookEndpoint",
        "parameters": [
          {
            "name": "token",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "204": {
            "description": "No Content"
          }
        }
      }
    },
    "/api/organizations/current/invitations": {
      "post": {
        "tags": [
          "Organizations"
        ],
        "summary": "Invite someone into the current organization by email. Owners only.",
        "operationId": "CloudovnaAPIEndpointsOrganizationsInviteEndpoint",
        "requestBody": {
          "x-name": "InviteRequest",
          "description": "",
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/InviteRequest"
              }
            }
          },
          "required": true,
          "x-position": 1
        },
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/OrganizationResponse"
                }
              }
            }
          },
          "400": {
            "description": "Bad Request",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized"
          },
          "403": {
            "description": "Forbidden"
          }
        }
      }
    },
    "/api/organizations/current/invitations/{id}": {
      "delete": {
        "tags": [
          "Organizations"
        ],
        "summary": "Withdraw an invitation. Owners only.",
        "operationId": "CloudovnaAPIEndpointsOrganizationsCancelInvitationEndpoint",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "guid"
            }
          }
        ],
        "responses": {
          "204": {
            "description": "No Content"
          },
          "401": {
            "description": "Unauthorized"
          },
          "403": {
            "description": "Forbidden"
          }
        }
      }
    },
    "/api/invitations/{token}": {
      "get": {
        "tags": [
          "Invitations"
        ],
        "summary": "What an invitation is for.",
        "operationId": "CloudovnaAPIEndpointsOrganizationsGetInvitationEndpoint",
        "parameters": [
          {
            "name": "token",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/InvitationInfoResponse"
                }
              }
            }
          }
        }
      }
    },
    "/api/invitations/{token}/accept": {
      "post": {
        "tags": [
          "Invitations"
        ],
        "summary": "Accept an invitation, as the person it was sent to.",
        "operationId": "CloudovnaAPIEndpointsOrganizationsAcceptInvitationEndpoint",
        "parameters": [
          {
            "name": "token",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/OrganizationSummaryDto"
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized"
          },
          "403": {
            "description": "Forbidden"
          }
        }
      }
    },
    "/api/organizations": {
      "get": {
        "tags": [
          "Organizations"
        ],
        "summary": "Your organizations; staff can search all of them.",
        "operationId": "CloudovnaAPIEndpointsOrganizationsListOrganizationsEndpoint",
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/OrganizationSummaryDto"
                  }
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized"
          },
          "403": {
            "description": "Forbidden"
          }
        }
      },
      "post": {
        "tags": [
          "Organizations"
        ],
        "summary": "Make an organization, with you as its owner.",
        "operationId": "CloudovnaAPIEndpointsOrganizationsCreateOrganizationEndpoint",
        "requestBody": {
          "x-name": "CreateOrganizationRequest",
          "description": "",
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/CreateOrganizationRequest"
              }
            }
          },
          "required": true,
          "x-position": 1
        },
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/OrganizationSummaryDto"
                }
              }
            }
          },
          "400": {
            "description": "Bad Request",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized"
          },
          "403": {
            "description": "Forbidden"
          }
        }
      }
    },
    "/api/organizations/switch": {
      "post": {
        "tags": [
          "Organizations"
        ],
        "summary": "Make an organization the one the dashboard opens in.",
        "operationId": "CloudovnaAPIEndpointsOrganizationsSwitchOrganizationEndpoint",
        "requestBody": {
          "x-name": "SwitchOrganizationRequest",
          "description": "",
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/SwitchOrganizationRequest"
              }
            }
          },
          "required": true,
          "x-position": 1
        },
        "responses": {
          "204": {
            "description": "No Content"
          },
          "401": {
            "description": "Unauthorized"
          },
          "403": {
            "description": "Forbidden"
          }
        }
      }
    },
    "/api/organizations/current": {
      "get": {
        "tags": [
          "Organizations"
        ],
        "summary": "The current organization, its members and (for owners) its open invitations.",
        "operationId": "CloudovnaAPIEndpointsOrganizationsGetOrganizationEndpoint",
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/OrganizationResponse"
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized"
          },
          "403": {
            "description": "Forbidden"
          }
        }
      },
      "put": {
        "tags": [
          "Organizations"
        ],
        "summary": "Rename the current organization or change its billing email. Owners only.",
        "operationId": "CloudovnaAPIEndpointsOrganizationsUpdateOrganizationEndpoint",
        "requestBody": {
          "x-name": "UpdateOrganizationRequest",
          "description": "",
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/UpdateOrganizationRequest"
              }
            }
          },
          "required": true,
          "x-position": 1
        },
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/OrganizationResponse"
                }
              }
            }
          },
          "400": {
            "description": "Bad Request",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized"
          },
          "403": {
            "description": "Forbidden"
          }
        }
      },
      "delete": {
        "tags": [
          "Organizations"
        ],
        "summary": "Delete the current organization. Only an empty one, and only by an owner.",
        "operationId": "CloudovnaAPIEndpointsOrganizationsDeleteOrganizationEndpoint",
        "responses": {
          "204": {
            "description": "No Content"
          },
          "401": {
            "description": "Unauthorized"
          },
          "403": {
            "description": "Forbidden"
          }
        }
      }
    },
    "/api/organizations/current/join": {
      "post": {
        "tags": [
          "Organizations"
        ],
        "summary": "Staff: become an owner of the current organization.",
        "operationId": "CloudovnaAPIEndpointsOrganizationsJoinOrganizationEndpoint",
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/OrganizationResponse"
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized"
          },
          "403": {
            "description": "Forbidden"
          }
        }
      }
    },
    "/api/organizations/current/members/{userId}": {
      "put": {
        "tags": [
          "Organizations"
        ],
        "summary": "Change a member's role. Owners only.",
        "operationId": "CloudovnaAPIEndpointsOrganizationsChangeMemberEndpoint",
        "parameters": [
          {
            "name": "userId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "guid"
            }
          }
        ],
        "requestBody": {
          "x-name": "ChangeMemberRequest",
          "description": "",
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ChangeMemberRequest"
              }
            }
          },
          "required": true,
          "x-position": 1
        },
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/OrganizationResponse"
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized"
          },
          "403": {
            "description": "Forbidden"
          }
        }
      },
      "delete": {
        "tags": [
          "Organizations"
        ],
        "summary": "Remove a member (owners), or leave (anyone).",
        "operationId": "CloudovnaAPIEndpointsOrganizationsRemoveMemberEndpoint",
        "parameters": [
          {
            "name": "userId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "guid"
            }
          }
        ],
        "responses": {
          "204": {
            "description": "No Content"
          },
          "401": {
            "description": "Unauthorized"
          },
          "403": {
            "description": "Forbidden"
          }
        }
      }
    },
    "/api/integrations/cloudflare": {
      "get": {
        "tags": [
          "Integrations"
        ],
        "summary": "The Cloudflare tokens linked to this account.",
        "operationId": "CloudovnaAPIEndpointsIntegrationsListCloudflareAccountsEndpoint",
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/CloudflareAccountsResponse"
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized"
          }
        },
        "security": [
          {
            "Bearer": []
          }
        ]
      },
      "post": {
        "tags": [
          "Integrations"
        ],
        "summary": "Link a Cloudflare API token with Zone Read and DNS Edit.",
        "operationId": "CloudovnaAPIEndpointsIntegrationsLinkCloudflareAccountEndpoint",
        "requestBody": {
          "x-name": "CloudflareTokenRequest",
          "description": "",
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/CloudflareTokenRequest"
              }
            }
          },
          "required": true,
          "x-position": 1
        },
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/CloudflareAccountsResponse"
                }
              }
            }
          },
          "400": {
            "description": "Bad Request",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized"
          }
        },
        "security": [
          {
            "Bearer": []
          }
        ]
      }
    },
    "/api/integrations/cloudflare/zone": {
      "get": {
        "tags": [
          "Integrations"
        ],
        "summary": "Which of the caller's Cloudflare zones a name is in, and whether it is active there.",
        "operationId": "CloudovnaAPIEndpointsIntegrationsCloudflareZoneEndpoint",
        "parameters": [
          {
            "name": "hostname",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/CloudflareZoneDto"
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized"
          }
        },
        "security": [
          {
            "Bearer": []
          }
        ]
      }
    },
    "/api/integrations/cloudflare/{id}/token": {
      "put": {
        "tags": [
          "Integrations"
        ],
        "summary": "Give a linked Cloudflare link a new token.",
        "operationId": "CloudovnaAPIEndpointsIntegrationsReplaceCloudflareTokenEndpoint",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "guid"
            }
          }
        ],
        "requestBody": {
          "x-name": "CloudflareTokenRequest",
          "description": "",
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/CloudflareTokenRequest"
              }
            }
          },
          "required": true,
          "x-position": 1
        },
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/CloudflareAccountsResponse"
                }
              }
            }
          },
          "400": {
            "description": "Bad Request",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized"
          }
        },
        "security": [
          {
            "Bearer": []
          }
        ]
      }
    },
    "/api/integrations/cloudflare/{id}/check": {
      "post": {
        "tags": [
          "Integrations"
        ],
        "summary": "Ask Cloudflare again which zones a linked token sees.",
        "operationId": "CloudovnaAPIEndpointsIntegrationsCheckCloudflareAccountEndpoint",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "guid"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/CloudflareAccountsResponse"
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized"
          }
        },
        "security": [
          {
            "Bearer": []
          }
        ]
      }
    },
    "/api/integrations/cloudflare/{id}": {
      "delete": {
        "tags": [
          "Integrations"
        ],
        "summary": "Unlink a Cloudflare token. Records it set stay in the zone.",
        "operationId": "CloudovnaAPIEndpointsIntegrationsUnlinkCloudflareAccountEndpoint",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "guid"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/CloudflareAccountsResponse"
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized"
          }
        },
        "security": [
          {
            "Bearer": []
          }
        ]
      }
    },
    "/api/integrations/docker-hub": {
      "get": {
        "tags": [
          "Integrations"
        ],
        "summary": "The registry accounts (Docker Hub, GitHub) linked to this account.",
        "operationId": "CloudovnaAPIEndpointsIntegrationsListRegistryAccountsEndpoint",
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/RegistryAccountsResponse"
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized"
          }
        },
        "security": [
          {
            "Bearer": []
          }
        ]
      },
      "post": {
        "tags": [
          "Integrations"
        ],
        "summary": "Link a Docker Hub account, or a GitHub one (registry ghcr.io, a classic token with read:packages), with a username and a personal access token.",
        "operationId": "CloudovnaAPIEndpointsIntegrationsLinkRegistryAccountEndpoint",
        "requestBody": {
          "x-name": "LinkRegistryAccountRequest",
          "description": "",
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/LinkRegistryAccountRequest"
              }
            }
          },
          "required": true,
          "x-position": 1
        },
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/RegistryAccountsResponse"
                }
              }
            }
          },
          "400": {
            "description": "Bad Request",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized"
          }
        },
        "security": [
          {
            "Bearer": []
          }
        ]
      }
    },
    "/api/integrations/docker-hub/{id}/token": {
      "put": {
        "tags": [
          "Integrations"
        ],
        "summary": "Give a linked Docker Hub account a new token.",
        "operationId": "CloudovnaAPIEndpointsIntegrationsReplaceRegistryTokenEndpoint",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "guid"
            }
          }
        ],
        "requestBody": {
          "x-name": "ReplaceRegistryTokenRequest",
          "description": "",
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ReplaceRegistryTokenRequest"
              }
            }
          },
          "required": true,
          "x-position": 1
        },
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/RegistryAccountsResponse"
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized"
          }
        },
        "security": [
          {
            "Bearer": []
          }
        ]
      }
    },
    "/api/integrations/docker-hub/{id}/check": {
      "post": {
        "tags": [
          "Integrations"
        ],
        "summary": "Ask Docker Hub again whether a linked account's token works.",
        "operationId": "CloudovnaAPIEndpointsIntegrationsCheckRegistryAccountEndpoint",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "guid"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/RegistryAccountsResponse"
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized"
          }
        },
        "security": [
          {
            "Bearer": []
          }
        ]
      }
    },
    "/api/integrations/docker-hub/{id}": {
      "delete": {
        "tags": [
          "Integrations"
        ],
        "summary": "Unlink a Docker Hub account. Refused while a container pulls with it.",
        "operationId": "CloudovnaAPIEndpointsIntegrationsUnlinkRegistryAccountEndpoint",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "guid"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/RegistryAccountsResponse"
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized"
          }
        },
        "security": [
          {
            "Bearer": []
          }
        ]
      }
    },
    "/api/integrations/docker-hub/{id}/repositories": {
      "get": {
        "tags": [
          "Integrations"
        ],
        "summary": "A linked account's repositories, private ones included.",
        "operationId": "CloudovnaAPIEndpointsIntegrationsRegistryRepositoriesEndpoint",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "guid"
            }
          },
          {
            "name": "namespace",
            "in": "query",
            "schema": {
              "type": "string",
              "nullable": true
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/HubRepository"
                  }
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized"
          }
        },
        "security": [
          {
            "Bearer": []
          }
        ]
      }
    },
    "/api/integrations/docker-hub/{id}/repositories/{namespace}/{repository}/tags": {
      "get": {
        "tags": [
          "Integrations"
        ],
        "summary": "A repository's tags, newest push first.",
        "operationId": "CloudovnaAPIEndpointsIntegrationsRegistryTagsEndpoint",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "guid"
            }
          },
          {
            "name": "namespace",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "repository",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/HubTag"
                  }
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized"
          }
        },
        "security": [
          {
            "Bearer": []
          }
        ]
      }
    },
    "/api/invoices": {
      "get": {
        "tags": [
          "Invoices"
        ],
        "summary": "The signed-in account's invoices, newest first, a page at a time; ?serviceId= for one service's.",
        "operationId": "CloudovnaAPIEndpointsBillingListInvoicesEndpoint",
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/InvoiceResponse"
                  }
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized"
          }
        },
        "security": [
          {
            "Bearer": []
          }
        ]
      }
    },
    "/api/invoices/{id}/pdf": {
      "get": {
        "tags": [
          "Invoices"
        ],
        "summary": "Download an invoice as a PDF.",
        "operationId": "CloudovnaAPIEndpointsBillingInvoicePdfEndpoint",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "guid"
            }
          }
        ],
        "responses": {
          "204": {
            "description": "No Content"
          },
          "401": {
            "description": "Unauthorized"
          }
        },
        "security": [
          {
            "Bearer": []
          }
        ]
      }
    },
    "/api/payments": {
      "get": {
        "tags": [
          "Payments"
        ],
        "summary": "What the signed-in account has to pay, oldest due first; ?serviceId= for one service's.",
        "operationId": "CloudovnaAPIEndpointsBillingListPaymentsEndpoint",
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/PaymentResponse"
                  }
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized"
          }
        },
        "security": [
          {
            "Bearer": []
          }
        ]
      }
    },
    "/api/payments/{id}/checkout": {
      "post": {
        "tags": [
          "Payments"
        ],
        "summary": "Begin paying a payment online. Answers with the payment page to go to.",
        "operationId": "CloudovnaAPIEndpointsBillingCheckoutEndpoint",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "guid"
            }
          }
        ],
        "requestBody": {
          "x-name": "CheckoutRequest",
          "description": "",
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/CheckoutRequest"
              }
            }
          },
          "required": true,
          "x-position": 1
        },
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/CheckoutResponse"
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized"
          }
        },
        "security": [
          {
            "Bearer": []
          }
        ]
      }
    },
    "/api/payments/{id}/check": {
      "post": {
        "tags": [
          "Payments"
        ],
        "summary": "Check a payment with the payment provider and settle it if it is paid.",
        "operationId": "CloudovnaAPIEndpointsBillingCheckPaymentEndpoint",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "guid"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PaymentResponse"
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized"
          }
        },
        "security": [
          {
            "Bearer": []
          }
        ]
      }
    },
    "/api/public/payments/{token}": {
      "get": {
        "tags": [
          "Public"
        ],
        "summary": "A payment, from the link in its email.",
        "operationId": "CloudovnaAPIEndpointsBillingGetPublicPaymentEndpoint",
        "parameters": [
          {
            "name": "token",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PublicPaymentResponse"
                }
              }
            }
          }
        }
      }
    },
    "/api/public/payments/{token}/checkout": {
      "post": {
        "tags": [
          "Public"
        ],
        "summary": "Begin paying a payment from its link. Answers with the payment page to go to.",
        "operationId": "CloudovnaAPIEndpointsBillingPublicCheckoutEndpoint",
        "parameters": [
          {
            "name": "token",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "x-name": "PublicCheckoutRequest",
          "description": "",
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/PublicCheckoutRequest"
              }
            }
          },
          "required": true,
          "x-position": 1
        },
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/CheckoutResponse"
                }
              }
            }
          }
        }
      }
    },
    "/api/public/payments/{token}/check": {
      "post": {
        "tags": [
          "Public"
        ],
        "summary": "Check a payment from its link with the payment provider.",
        "operationId": "CloudovnaAPIEndpointsBillingPublicCheckPaymentEndpoint",
        "parameters": [
          {
            "name": "token",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PublicPaymentResponse"
                }
              }
            }
          }
        }
      }
    },
    "/api/public/payments/{token}/invoice": {
      "get": {
        "tags": [
          "Public"
        ],
        "summary": "Download the invoice of a payment, from its link.",
        "operationId": "CloudovnaAPIEndpointsBillingPublicInvoicePdfEndpoint",
        "parameters": [
          {
            "name": "token",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "204": {
            "description": "No Content"
          }
        }
      }
    },
    "/api/oauth/authorization": {
      "get": {
        "tags": [
          "Oauth"
        ],
        "summary": "What an app asking to connect wants, for the consent page.",
        "operationId": "CloudovnaAPIEndpointsAuthGetAuthorizationEndpoint",
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AuthorizationPromptResponse"
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized"
          },
          "403": {
            "description": "Forbidden"
          }
        }
      },
      "post": {
        "tags": [
          "Oauth"
        ],
        "summary": "Allow or deny an app asking to connect.",
        "operationId": "CloudovnaAPIEndpointsAuthDecideAuthorizationEndpoint",
        "requestBody": {
          "x-name": "DecideAuthorizationRequest",
          "description": "",
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/DecideAuthorizationRequest"
              }
            }
          },
          "required": true,
          "x-position": 1
        },
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/DecideAuthorizationResponse"
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized"
          },
          "403": {
            "description": "Forbidden"
          }
        }
      }
    },
    "/api/oauth/grants": {
      "get": {
        "tags": [
          "Oauth"
        ],
        "summary": "Apps connected to the account over OAuth.",
        "operationId": "CloudovnaAPIEndpointsAuthListConnectedAppsEndpoint",
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/ConnectedAppDto"
                  }
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized"
          },
          "403": {
            "description": "Forbidden"
          }
        }
      }
    },
    "/api/oauth/grants/{id}": {
      "delete": {
        "tags": [
          "Oauth"
        ],
        "summary": "Disconnect an app. Its access ends at once; it has to be approved again to come back.",
        "operationId": "CloudovnaAPIEndpointsAuthDisconnectAppEndpoint",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "guid"
            }
          }
        ],
        "responses": {
          "204": {
            "description": "No Content"
          },
          "401": {
            "description": "Unauthorized"
          },
          "403": {
            "description": "Forbidden"
          }
        }
      }
    },
    "/mcp": {
      "get": {
        "operationId": "GetMcp",
        "responses": {
          "200": {
            "description": ""
          }
        }
      }
    },
    "/.well-known/mcp/server-card.json": {
      "get": {
        "operationId": "Get.wellKnownMcpServerCard.json",
        "responses": {
          "200": {
            "description": ""
          }
        }
      }
    },
    "/oauth/authorize": {
      "get": {
        "operationId": "GetOauthAuthorize",
        "responses": {
          "200": {
            "description": ""
          }
        }
      }
    },
    "/.well-known": {
      "options": {
        "operationId": "Options.wellKnown",
        "responses": {
          "200": {
            "description": ""
          }
        }
      },
      "get": {
        "operationId": "Get.wellKnown",
        "responses": {
          "200": {
            "description": ""
          }
        }
      }
    },
    "/oauth": {
      "options": {
        "operationId": "OptionsOauth",
        "responses": {
          "200": {
            "description": ""
          }
        }
      }
    },
    "/.well-known/oauth-protected-resource": {
      "get": {
        "operationId": "Get.wellKnownOauthProtectedResource",
        "responses": {
          "200": {
            "description": ""
          }
        }
      }
    },
    "/.well-known/oauth-protected-resource/mcp": {
      "get": {
        "operationId": "Get.wellKnownOauthProtectedResourceMcp",
        "responses": {
          "200": {
            "description": ""
          }
        }
      }
    },
    "/.well-known/oauth-authorization-server": {
      "get": {
        "operationId": "Get.wellKnownOauthAuthorizationServer",
        "responses": {
          "200": {
            "description": ""
          }
        }
      }
    },
    "/oauth/register": {
      "post": {
        "operationId": "PostOauthRegister",
        "responses": {
          "200": {
            "description": ""
          }
        }
      }
    },
    "/oauth/token": {
      "post": {
        "operationId": "PostOauthToken",
        "responses": {
          "200": {
            "description": ""
          }
        }
      }
    },
    "/oauth/revoke": {
      "post": {
        "operationId": "PostOauthRevoke",
        "responses": {
          "200": {
            "description": ""
          }
        }
      }
    }
  },
  "components": {
    "schemas": {
      "HealthResponse": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "status": {
            "type": "string"
          }
        }
      },
      "CloudflarePlanDto": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "zone": {
            "type": "string"
          },
          "problem": {
            "nullable": true,
            "oneOf": [
              {
                "$ref": "#/components/schemas/CloudflarePlanProblem"
              }
            ]
          },
          "domains": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "records": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/PlannedRecordDto"
            }
          },
          "removed": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/RemovedRecordDto"
            }
          },
          "sslMode": {
            "type": "string",
            "nullable": true
          },
          "proxied": {
            "type": "boolean"
          }
        }
      },
      "CloudflarePlanProblem": {
        "type": "string",
        "description": "",
        "x-enumNames": [
          "NoAccount",
          "ZoneNotFound",
          "ZoneNotActive",
          "NothingToDo"
        ],
        "enum": [
          "NoAccount",
          "ZoneNotFound",
          "ZoneNotActive",
          "NothingToDo"
        ]
      },
      "PlannedRecordDto": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "action": {
            "$ref": "#/components/schemas/PlannedAction"
          },
          "type": {
            "type": "string"
          },
          "name": {
            "type": "string"
          },
          "content": {
            "type": "string"
          }
        }
      },
      "PlannedAction": {
        "type": "string",
        "description": "",
        "x-enumNames": [
          "Create",
          "Update",
          "Keep"
        ],
        "enum": [
          "Create",
          "Update",
          "Keep"
        ]
      },
      "RemovedRecordDto": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "id": {
            "type": "string"
          },
          "type": {
            "type": "string"
          },
          "name": {
            "type": "string"
          },
          "content": {
            "type": "string"
          },
          "proxied": {
            "type": "boolean"
          }
        }
      },
      "CloudflarePlanRequest": {
        "type": "object",
        "additionalProperties": false
      },
      "DomainsResponse": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "edgeHostname": {
            "type": "string"
          },
          "edgeAddresses": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "domains": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/DomainDto"
            }
          }
        }
      },
      "DomainDto": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "id": {
            "type": "string",
            "format": "guid"
          },
          "hostname": {
            "type": "string"
          },
          "display": {
            "type": "string"
          },
          "redirectTo": {
            "type": "string",
            "nullable": true
          },
          "status": {
            "$ref": "#/components/schemas/DomainStatus"
          },
          "isApex": {
            "type": "boolean"
          },
          "zone": {
            "type": "string",
            "nullable": true
          },
          "provider": {
            "type": "string",
            "nullable": true
          },
          "proofFound": {
            "type": "boolean"
          },
          "routing": {
            "nullable": true,
            "oneOf": [
              {
                "$ref": "#/components/schemas/DomainRouting"
              }
            ]
          },
          "problem": {
            "nullable": true,
            "oneOf": [
              {
                "$ref": "#/components/schemas/DomainProblem"
              }
            ]
          },
          "addresses": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "createdAt": {
            "type": "string",
            "format": "date-time"
          },
          "verifiedAt": {
            "type": "string",
            "format": "date-time",
            "nullable": true
          },
          "checkedAt": {
            "type": "string",
            "format": "date-time",
            "nullable": true
          },
          "records": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/DnsRecordDto"
            }
          },
          "https": {
            "nullable": true,
            "oneOf": [
              {
                "$ref": "#/components/schemas/HttpsState"
              }
            ]
          },
          "routedAt": {
            "type": "string",
            "format": "date-time",
            "nullable": true
          },
          "certificateReadyAt": {
            "type": "string",
            "format": "date-time",
            "nullable": true
          },
          "certificateCheckedAt": {
            "type": "string",
            "format": "date-time",
            "nullable": true
          },
          "certificateError": {
            "type": "string",
            "nullable": true
          },
          "isAppAddress": {
            "type": "boolean"
          }
        }
      },
      "DomainStatus": {
        "type": "string",
        "description": "",
        "x-enumNames": [
          "Pending",
          "Active"
        ],
        "enum": [
          "Pending",
          "Active"
        ]
      },
      "DomainRouting": {
        "type": "string",
        "description": "",
        "x-enumNames": [
          "Cname",
          "Address",
          "Cloudflare"
        ],
        "enum": [
          "Cname",
          "Address",
          "Cloudflare"
        ]
      },
      "DomainProblem": {
        "type": "string",
        "description": "",
        "x-enumNames": [
          "NoZone",
          "NotPointed",
          "PointsElsewhere",
          "LookupFailed"
        ],
        "enum": [
          "NoZone",
          "NotPointed",
          "PointsElsewhere",
          "LookupFailed"
        ]
      },
      "DnsRecordDto": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "type": {
            "type": "string"
          },
          "name": {
            "type": "string"
          },
          "fqdn": {
            "type": "string"
          },
          "value": {
            "type": "string"
          }
        }
      },
      "HttpsState": {
        "type": "string",
        "description": "",
        "x-enumNames": [
          "SettingUp",
          "Ready",
          "Failing"
        ],
        "enum": [
          "SettingUp",
          "Ready",
          "Failing"
        ]
      },
      "ApplyCloudflareRequest": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "zone": {
            "type": "string"
          },
          "proxied": {
            "type": "boolean"
          },
          "remove": {
            "type": "array",
            "nullable": true,
            "items": {
              "type": "string"
            }
          }
        }
      },
      "BackupDto": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "id": {
            "type": "string",
            "format": "guid"
          },
          "kind": {
            "$ref": "#/components/schemas/BackupKind"
          },
          "status": {
            "$ref": "#/components/schemas/BackupStatus"
          },
          "fileName": {
            "type": "string"
          },
          "sizeBytes": {
            "type": "integer",
            "format": "int64",
            "nullable": true
          },
          "createdAt": {
            "type": "string",
            "format": "date-time"
          },
          "completedAt": {
            "type": "string",
            "format": "date-time",
            "nullable": true
          },
          "restoredAt": {
            "type": "string",
            "format": "date-time",
            "nullable": true
          },
          "error": {
            "type": "string",
            "nullable": true
          },
          "restoring": {
            "type": "boolean"
          }
        }
      },
      "BackupKind": {
        "type": "string",
        "description": "",
        "x-enumNames": [
          "Backup",
          "Upload",
          "Automatic"
        ],
        "enum": [
          "Backup",
          "Upload",
          "Automatic"
        ]
      },
      "BackupStatus": {
        "type": "string",
        "description": "",
        "x-enumNames": [
          "Pending",
          "Ready",
          "Failed"
        ],
        "enum": [
          "Pending",
          "Ready",
          "Failed"
        ]
      },
      "ServiceResponse": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "id": {
            "type": "string",
            "format": "guid"
          },
          "name": {
            "type": "string"
          },
          "type": {
            "$ref": "#/components/schemas/ServiceType"
          },
          "status": {
            "$ref": "#/components/schemas/ServiceStatus"
          },
          "statusMessage": {
            "type": "string",
            "nullable": true
          },
          "interval": {
            "$ref": "#/components/schemas/BillingInterval"
          },
          "price": {
            "type": "number",
            "format": "decimal"
          },
          "paidUntil": {
            "type": "string",
            "format": "date",
            "nullable": true
          },
          "cancelAt": {
            "type": "string",
            "format": "date",
            "nullable": true
          },
          "suspendedOn": {
            "type": "string",
            "format": "date",
            "nullable": true
          },
          "removedOn": {
            "type": "string",
            "format": "date",
            "nullable": true
          },
          "neverSuspend": {
            "type": "boolean"
          },
          "unbilled": {
            "type": "boolean"
          },
          "changeAtRenewal": {
            "nullable": true,
            "oneOf": [
              {
                "$ref": "#/components/schemas/PlannedChange"
              }
            ]
          },
          "changeOn": {
            "type": "string",
            "format": "date",
            "nullable": true
          },
          "createdAt": {
            "type": "string",
            "format": "date-time"
          },
          "container": {
            "nullable": true,
            "oneOf": [
              {
                "$ref": "#/components/schemas/ContainerDto"
              }
            ]
          },
          "database": {
            "nullable": true,
            "oneOf": [
              {
                "$ref": "#/components/schemas/DatabaseDto"
              }
            ]
          },
          "managed": {
            "nullable": true,
            "oneOf": [
              {
                "$ref": "#/components/schemas/ManagedDto"
              }
            ]
          },
          "owner": {
            "nullable": true,
            "oneOf": [
              {
                "$ref": "#/components/schemas/OwnerDto"
              }
            ]
          },
          "node": {
            "nullable": true,
            "oneOf": [
              {
                "$ref": "#/components/schemas/NodeRefDto"
              }
            ]
          },
          "stack": {
            "nullable": true,
            "oneOf": [
              {
                "$ref": "#/components/schemas/StackRefDto"
              }
            ]
          },
          "links": {
            "type": "array",
            "nullable": true,
            "items": {
              "$ref": "#/components/schemas/LinkDto"
            }
          },
          "usedBy": {
            "type": "array",
            "nullable": true,
            "items": {
              "$ref": "#/components/schemas/LinkUserDto"
            }
          },
          "brokenReferences": {
            "type": "array",
            "nullable": true,
            "items": {
              "type": "string"
            }
          },
          "trialEndsAt": {
            "type": "string",
            "format": "date",
            "nullable": true
          },
          "poolId": {
            "type": "string",
            "format": "guid",
            "nullable": true
          },
          "poolSize": {
            "nullable": true,
            "oneOf": [
              {
                "$ref": "#/components/schemas/PoolSizeDto"
              }
            ]
          },
          "unlimited": {
            "type": "boolean"
          }
        }
      },
      "ServiceType": {
        "type": "string",
        "description": "",
        "x-enumNames": [
          "ContainerHosting",
          "DatabaseStorage",
          "Managed",
          "Pool"
        ],
        "enum": [
          "ContainerHosting",
          "DatabaseStorage",
          "Managed",
          "Pool"
        ]
      },
      "ServiceStatus": {
        "type": "string",
        "description": "",
        "x-enumNames": [
          "Pending",
          "Provisioning",
          "Running",
          "Failed",
          "Decommissioning",
          "Decommissioned",
          "Active",
          "AwaitingPayment",
          "Suspended",
          "Stopped"
        ],
        "enum": [
          "Pending",
          "Provisioning",
          "Running",
          "Failed",
          "Decommissioning",
          "Decommissioned",
          "Active",
          "AwaitingPayment",
          "Suspended",
          "Stopped"
        ]
      },
      "BillingInterval": {
        "type": "string",
        "description": "",
        "x-enumNames": [
          "Monthly",
          "Annual"
        ],
        "enum": [
          "Monthly",
          "Annual"
        ]
      },
      "PlannedChange": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "vcpu": {
            "type": "number",
            "format": "decimal",
            "nullable": true
          },
          "ramMb": {
            "type": "integer",
            "format": "int32",
            "nullable": true
          },
          "diskMb": {
            "type": "integer",
            "format": "int32",
            "nullable": true
          },
          "postgresGb": {
            "type": "integer",
            "format": "int32",
            "nullable": true
          },
          "sqlServerGb": {
            "type": "integer",
            "format": "int32",
            "nullable": true
          }
        }
      },
      "ContainerDto": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "image": {
            "type": "string"
          },
          "containerPort": {
            "type": "integer",
            "format": "int32"
          },
          "domain": {
            "nullable": true,
            "oneOf": [
              {
                "$ref": "#/components/schemas/ContainerDomainDto"
              }
            ]
          },
          "ramMb": {
            "type": "integer",
            "format": "int32"
          },
          "cpu": {
            "type": "number",
            "format": "decimal"
          },
          "diskGb": {
            "type": "integer",
            "format": "int32"
          },
          "environment": {
            "type": "object",
            "additionalProperties": {
              "type": "string"
            }
          },
          "volumes": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "imageDigest": {
            "type": "string",
            "nullable": true
          },
          "registry": {
            "nullable": true,
            "oneOf": [
              {
                "$ref": "#/components/schemas/ContainerRegistryDto"
              }
            ]
          },
          "autoUpdate": {
            "type": "boolean"
          },
          "webhookToken": {
            "type": "string",
            "nullable": true
          },
          "region": {
            "type": "string"
          },
          "backupSchedule": {
            "$ref": "#/components/schemas/BackupScheduleDto"
          },
          "diskMb": {
            "type": "integer",
            "format": "int32"
          },
          "unsandboxed": {
            "type": "boolean"
          }
        }
      },
      "ContainerDomainDto": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "hostname": {
            "type": "string"
          },
          "display": {
            "type": "string"
          },
          "active": {
            "type": "boolean"
          }
        }
      },
      "ContainerRegistryDto": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "id": {
            "type": "string",
            "format": "guid"
          },
          "username": {
            "type": "string"
          }
        }
      },
      "BackupScheduleDto": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "frequency": {
            "$ref": "#/components/schemas/BackupFrequency"
          },
          "hour": {
            "type": "integer",
            "format": "int32"
          },
          "weekday": {
            "$ref": "#/components/schemas/DayOfWeek"
          },
          "keep": {
            "type": "integer",
            "format": "int32"
          },
          "nextAt": {
            "type": "string",
            "format": "date-time",
            "nullable": true
          },
          "minute": {
            "type": "integer",
            "format": "int32"
          },
          "maxKeep": {
            "type": "integer",
            "format": "int32"
          }
        }
      },
      "BackupFrequency": {
        "type": "string",
        "description": "",
        "x-enumNames": [
          "Off",
          "Daily",
          "Weekly"
        ],
        "enum": [
          "Off",
          "Daily",
          "Weekly"
        ]
      },
      "DayOfWeek": {
        "type": "string",
        "description": "",
        "x-enumNames": [
          "Sunday",
          "Monday",
          "Tuesday",
          "Wednesday",
          "Thursday",
          "Friday",
          "Saturday"
        ],
        "enum": [
          "Sunday",
          "Monday",
          "Tuesday",
          "Wednesday",
          "Thursday",
          "Friday",
          "Saturday"
        ]
      },
      "DatabaseDto": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "engine": {
            "$ref": "#/components/schemas/DatabaseEngine"
          },
          "quotaGb": {
            "type": "integer",
            "format": "int32"
          },
          "host": {
            "type": "string",
            "nullable": true
          },
          "port": {
            "type": "integer",
            "format": "int32",
            "nullable": true
          },
          "database": {
            "type": "string",
            "nullable": true
          },
          "username": {
            "type": "string",
            "nullable": true
          },
          "logins": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/ConnectionLoginDto"
            }
          },
          "backupSchedule": {
            "$ref": "#/components/schemas/BackupScheduleDto"
          },
          "tlsVerified": {
            "type": "boolean"
          },
          "allowedSources": {
            "type": "array",
            "items": {
              "type": "string"
            }
          }
        }
      },
      "DatabaseEngine": {
        "type": "string",
        "description": "",
        "x-enumNames": [
          "Postgres",
          "SqlServer"
        ],
        "enum": [
          "Postgres",
          "SqlServer"
        ]
      },
      "ConnectionLoginDto": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "id": {
            "type": "string",
            "format": "guid"
          },
          "name": {
            "type": "string"
          },
          "username": {
            "type": "string"
          },
          "createdAt": {
            "type": "string",
            "format": "date-time"
          },
          "linkedContainerId": {
            "type": "string",
            "format": "guid",
            "nullable": true
          }
        }
      },
      "ManagedDto": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "description": {
            "type": "string"
          }
        }
      },
      "OwnerDto": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "id": {
            "type": "string",
            "format": "guid"
          },
          "name": {
            "type": "string"
          },
          "email": {
            "type": "string",
            "nullable": true
          },
          "staff": {
            "type": "boolean"
          }
        }
      },
      "NodeRefDto": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "id": {
            "type": "string",
            "format": "guid"
          },
          "name": {
            "type": "string"
          }
        }
      },
      "StackRefDto": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "id": {
            "type": "string",
            "format": "guid"
          },
          "name": {
            "type": "string"
          }
        }
      },
      "LinkDto": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "id": {
            "type": "string",
            "format": "guid"
          },
          "alias": {
            "type": "string"
          },
          "databaseId": {
            "type": "string",
            "format": "guid"
          },
          "databaseName": {
            "type": "string"
          },
          "databaseStatus": {
            "$ref": "#/components/schemas/ServiceStatus"
          },
          "engine": {
            "$ref": "#/components/schemas/DatabaseEngine"
          },
          "host": {
            "type": "string",
            "nullable": true
          },
          "port": {
            "type": "integer",
            "format": "int32",
            "nullable": true
          },
          "name": {
            "type": "string",
            "nullable": true
          },
          "user": {
            "type": "string"
          },
          "ready": {
            "type": "boolean"
          },
          "rotating": {
            "type": "boolean"
          },
          "createdAt": {
            "type": "string",
            "format": "date-time"
          },
          "rotatedAt": {
            "type": "string",
            "format": "date-time",
            "nullable": true
          },
          "tlsVerified": {
            "type": "boolean"
          }
        }
      },
      "LinkUserDto": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "linkId": {
            "type": "string",
            "format": "guid"
          },
          "containerId": {
            "type": "string",
            "format": "guid"
          },
          "containerName": {
            "type": "string"
          },
          "alias": {
            "type": "string"
          }
        }
      },
      "PoolSizeDto": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "cpu": {
            "type": "number",
            "format": "decimal"
          },
          "ramMb": {
            "type": "integer",
            "format": "int32"
          },
          "diskMb": {
            "type": "integer",
            "format": "int32"
          },
          "postgresGb": {
            "type": "integer",
            "format": "int32"
          },
          "sqlServerGb": {
            "type": "integer",
            "format": "int32"
          }
        }
      },
      "AllowlistRequest": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "sources": {
            "type": "array",
            "items": {
              "type": "string"
            }
          }
        }
      },
      "BackupScheduleRequest": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "frequency": {
            "$ref": "#/components/schemas/BackupFrequency"
          },
          "hour": {
            "type": "integer",
            "format": "int32"
          },
          "weekday": {
            "$ref": "#/components/schemas/DayOfWeek"
          },
          "keep": {
            "type": "integer",
            "format": "int32"
          }
        }
      },
      "AddDomainRequest": {
        "type": "object",
        "additionalProperties": false,
        "required": [
          "hostname"
        ],
        "properties": {
          "hostname": {
            "type": "string",
            "maxLength": 300,
            "minLength": 0,
            "nullable": false
          },
          "companion": {
            "type": "boolean"
          }
        }
      },
      "ErrorResponse": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "statusCode": {
            "type": "integer",
            "format": "int32",
            "default": 400
          },
          "message": {
            "type": "string",
            "default": "One or more errors occurred!"
          },
          "errors": {
            "type": "object",
            "additionalProperties": {
              "type": "array",
              "items": {
                "type": "string"
              }
            }
          }
        }
      },
      "ServiceHealthDto": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "state": {
            "$ref": "#/components/schemas/HealthState"
          },
          "checks": {
            "type": "integer",
            "format": "int32"
          },
          "down": {
            "type": "integer",
            "format": "int32"
          },
          "lastCheckedAt": {
            "type": "string",
            "format": "date-time"
          },
          "lastOk": {
            "type": "boolean"
          },
          "lastStatusCode": {
            "type": "integer",
            "format": "int32",
            "nullable": true
          },
          "display": {
            "type": "string"
          }
        }
      },
      "HealthState": {
        "type": "string",
        "description": "",
        "x-enumNames": [
          "Unknown",
          "Up",
          "Down"
        ],
        "enum": [
          "Unknown",
          "Up",
          "Down"
        ]
      },
      "HealthChecksResponse": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "max": {
            "type": "integer",
            "format": "int32"
          },
          "intervals": {
            "type": "array",
            "items": {
              "type": "integer",
              "format": "int32"
            }
          },
          "checks": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/HealthCheckDto"
            }
          }
        }
      },
      "HealthCheckDto": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "id": {
            "type": "string",
            "format": "guid"
          },
          "domainId": {
            "type": "string",
            "format": "guid"
          },
          "display": {
            "type": "string"
          },
          "path": {
            "type": "string"
          },
          "url": {
            "type": "string"
          },
          "intervalSeconds": {
            "type": "integer",
            "format": "int32"
          },
          "notify": {
            "type": "boolean"
          },
          "state": {
            "$ref": "#/components/schemas/HealthState"
          },
          "active": {
            "type": "boolean"
          },
          "lastCheckedAt": {
            "type": "string",
            "format": "date-time",
            "nullable": true
          },
          "lastStatusCode": {
            "type": "integer",
            "format": "int32",
            "nullable": true
          },
          "lastLatencyMs": {
            "type": "integer",
            "format": "int32",
            "nullable": true
          },
          "lastError": {
            "type": "string",
            "nullable": true
          },
          "downSince": {
            "type": "string",
            "format": "date-time",
            "nullable": true
          },
          "uptime": {
            "type": "number",
            "format": "double",
            "nullable": true
          },
          "recent": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/HealthResultDto"
            }
          }
        }
      },
      "HealthResultDto": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "at": {
            "type": "string",
            "format": "date-time"
          },
          "ok": {
            "type": "boolean"
          },
          "statusCode": {
            "type": "integer",
            "format": "int32",
            "nullable": true
          },
          "latencyMs": {
            "type": "integer",
            "format": "int32",
            "nullable": true
          }
        }
      },
      "HealthCheckRequest": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "domainId": {
            "type": "string",
            "format": "guid"
          },
          "path": {
            "type": "string",
            "nullable": true
          },
          "intervalSeconds": {
            "type": "integer",
            "format": "int32"
          },
          "notify": {
            "type": "boolean"
          }
        }
      },
      "ImageLookup": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "status": {
            "$ref": "#/components/schemas/ImageLookupStatus"
          },
          "image": {
            "type": "string"
          },
          "description": {
            "type": "string",
            "nullable": true
          },
          "pulls": {
            "type": "integer",
            "format": "int64",
            "nullable": true
          },
          "stars": {
            "type": "integer",
            "format": "int32",
            "nullable": true
          },
          "official": {
            "type": "boolean"
          },
          "pushedAt": {
            "type": "string",
            "format": "date-time",
            "nullable": true
          },
          "sizeBytes": {
            "type": "integer",
            "format": "int64",
            "nullable": true
          },
          "amd64": {
            "type": "boolean"
          },
          "ports": {
            "type": "array",
            "nullable": true,
            "items": {
              "type": "integer",
              "format": "int32"
            }
          },
          "volumes": {
            "type": "array",
            "nullable": true,
            "items": {
              "type": "string"
            }
          },
          "private": {
            "type": "boolean"
          },
          "digest": {
            "type": "string",
            "nullable": true
          }
        }
      },
      "ImageLookupStatus": {
        "type": "string",
        "description": "",
        "x-enumNames": [
          "Found",
          "NotFound",
          "Unavailable"
        ],
        "enum": [
          "Found",
          "NotFound",
          "Unavailable"
        ]
      },
      "ImageLookupRequest": {
        "type": "object",
        "additionalProperties": false
      },
      "HubSearchResult": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "namespace": {
            "type": "string"
          },
          "name": {
            "type": "string"
          },
          "description": {
            "type": "string",
            "nullable": true
          },
          "pulls": {
            "type": "integer",
            "format": "int64",
            "nullable": true
          },
          "stars": {
            "type": "integer",
            "format": "int32",
            "nullable": true
          },
          "official": {
            "type": "boolean"
          }
        }
      },
      "ImageSearchRequest": {
        "type": "object",
        "additionalProperties": false
      },
      "HubTag": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "name": {
            "type": "string"
          },
          "digest": {
            "type": "string",
            "nullable": true
          },
          "pushedAt": {
            "type": "string",
            "format": "date-time",
            "nullable": true
          },
          "amd64": {
            "type": "boolean"
          }
        }
      },
      "ImageTagsRequest": {
        "type": "object",
        "additionalProperties": false
      },
      "CreateLinkRequest": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "databaseId": {
            "type": "string",
            "format": "guid"
          },
          "alias": {
            "type": "string",
            "nullable": true
          }
        }
      },
      "DeleteLinkRequest": {
        "type": "object",
        "additionalProperties": false
      },
      "PoolResponse": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "id": {
            "type": "string",
            "format": "guid"
          },
          "name": {
            "type": "string"
          },
          "status": {
            "$ref": "#/components/schemas/ServiceStatus"
          },
          "interval": {
            "$ref": "#/components/schemas/BillingInterval"
          },
          "size": {
            "$ref": "#/components/schemas/PoolSizeDto"
          },
          "allocated": {
            "$ref": "#/components/schemas/PoolSizeDto"
          },
          "free": {
            "$ref": "#/components/schemas/PoolSizeDto"
          },
          "price": {
            "type": "number",
            "format": "decimal"
          },
          "paidUntil": {
            "type": "string",
            "format": "date",
            "nullable": true
          },
          "trialEndsAt": {
            "type": "string",
            "format": "date",
            "nullable": true
          },
          "cancelAt": {
            "type": "string",
            "format": "date",
            "nullable": true
          },
          "suspendedOn": {
            "type": "string",
            "format": "date",
            "nullable": true
          },
          "changeAtRenewal": {
            "nullable": true,
            "oneOf": [
              {
                "$ref": "#/components/schemas/PoolSizeDto"
              }
            ]
          },
          "changeOn": {
            "type": "string",
            "format": "date",
            "nullable": true
          },
          "growing": {
            "nullable": true,
            "oneOf": [
              {
                "$ref": "#/components/schemas/PoolSizeDto"
              }
            ]
          },
          "flatPrice": {
            "type": "boolean"
          },
          "createdAt": {
            "type": "string",
            "format": "date-time"
          },
          "members": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/PoolMemberDto"
            }
          },
          "unlimited": {
            "type": "boolean"
          }
        }
      },
      "PoolMemberDto": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "id": {
            "type": "string",
            "format": "guid"
          },
          "name": {
            "type": "string"
          },
          "type": {
            "$ref": "#/components/schemas/ServiceType"
          },
          "status": {
            "$ref": "#/components/schemas/ServiceStatus"
          },
          "allocation": {
            "$ref": "#/components/schemas/PoolSizeDto"
          },
          "container": {
            "nullable": true,
            "oneOf": [
              {
                "$ref": "#/components/schemas/ContainerAllocationDto"
              }
            ]
          },
          "engine": {
            "nullable": true,
            "oneOf": [
              {
                "$ref": "#/components/schemas/DatabaseEngine"
              }
            ]
          },
          "quotaGb": {
            "type": "integer",
            "format": "int32",
            "nullable": true
          }
        }
      },
      "ContainerAllocationDto": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "cpu": {
            "type": "number",
            "format": "decimal"
          },
          "ramMb": {
            "type": "integer",
            "format": "int32"
          },
          "diskMb": {
            "type": "integer",
            "format": "int32"
          }
        }
      },
      "PoolChangedResponse": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "pool": {
            "$ref": "#/components/schemas/PoolResponse"
          },
          "payment": {
            "nullable": true,
            "oneOf": [
              {
                "$ref": "#/components/schemas/PaymentResponse"
              }
            ]
          }
        }
      },
      "PaymentResponse": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "id": {
            "type": "string",
            "format": "guid"
          },
          "purpose": {
            "$ref": "#/components/schemas/BillingPurpose"
          },
          "serviceId": {
            "type": "string",
            "format": "guid",
            "nullable": true
          },
          "serviceName": {
            "type": "string",
            "nullable": true
          },
          "services": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/PaymentServiceResponse"
            }
          },
          "scheduleId": {
            "type": "string",
            "format": "guid",
            "nullable": true
          },
          "status": {
            "$ref": "#/components/schemas/PaymentStatus"
          },
          "createdAt": {
            "type": "string",
            "format": "date-time"
          },
          "dueOn": {
            "type": "string",
            "format": "date"
          },
          "periodFrom": {
            "type": "string",
            "format": "date"
          },
          "periodTo": {
            "type": "string",
            "format": "date"
          },
          "subtotal": {
            "type": "number",
            "format": "decimal"
          },
          "vatTotal": {
            "type": "number",
            "format": "decimal"
          },
          "total": {
            "type": "number",
            "format": "decimal"
          },
          "currency": {
            "type": "string"
          },
          "lines": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/PaymentLineResponse"
            }
          },
          "onItsWay": {
            "type": "boolean"
          },
          "online": {
            "type": "boolean"
          },
          "paidAt": {
            "type": "string",
            "format": "date-time",
            "nullable": true
          },
          "invoiceId": {
            "type": "string",
            "format": "guid",
            "nullable": true
          },
          "customerName": {
            "type": "string",
            "nullable": true
          }
        }
      },
      "BillingPurpose": {
        "type": "string",
        "description": "",
        "x-enumNames": [
          "Order",
          "Renewal",
          "Change"
        ],
        "enum": [
          "Order",
          "Renewal",
          "Change"
        ]
      },
      "PaymentServiceResponse": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "id": {
            "type": "string",
            "format": "guid"
          },
          "name": {
            "type": "string"
          }
        }
      },
      "PaymentStatus": {
        "type": "string",
        "description": "",
        "x-enumNames": [
          "Open",
          "Paid",
          "Cancelled",
          "Scheduled"
        ],
        "enum": [
          "Open",
          "Paid",
          "Cancelled",
          "Scheduled"
        ]
      },
      "PaymentLineResponse": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "description": {
            "type": "string"
          },
          "quantity": {
            "type": "number",
            "format": "decimal"
          },
          "unitPrice": {
            "type": "number",
            "format": "decimal"
          },
          "serviceId": {
            "type": "string",
            "format": "guid",
            "nullable": true
          }
        }
      },
      "ResizePoolRequest": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "cpu": {
            "type": "number",
            "format": "decimal"
          },
          "ramMb": {
            "type": "integer",
            "format": "int32"
          },
          "diskMb": {
            "type": "integer",
            "format": "int32"
          },
          "postgresGb": {
            "type": "integer",
            "format": "int32"
          },
          "sqlServerGb": {
            "type": "integer",
            "format": "int32"
          },
          "interval": {
            "$ref": "#/components/schemas/BillingInterval"
          }
        }
      },
      "CheckPoolResponse": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "hasPool": {
            "type": "boolean"
          },
          "fits": {
            "type": "boolean"
          },
          "growth": {
            "$ref": "#/components/schemas/PoolSizeDto"
          },
          "newSize": {
            "$ref": "#/components/schemas/PoolSizeDto"
          },
          "price": {
            "type": "number",
            "format": "decimal"
          },
          "trial": {
            "type": "boolean"
          }
        }
      },
      "CheckPoolRequest": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "cpu": {
            "type": "number",
            "format": "decimal"
          },
          "ramMb": {
            "type": "integer",
            "format": "int32"
          },
          "diskMb": {
            "type": "integer",
            "format": "int32"
          },
          "postgresGb": {
            "type": "integer",
            "format": "int32"
          },
          "sqlServerGb": {
            "type": "integer",
            "format": "int32"
          },
          "interval": {
            "$ref": "#/components/schemas/BillingInterval"
          },
          "serviceId": {
            "type": "string",
            "format": "guid",
            "nullable": true
          }
        }
      },
      "SetAllocationRequest": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "cpu": {
            "type": "number",
            "format": "decimal",
            "nullable": true
          },
          "ramMb": {
            "type": "integer",
            "format": "int32",
            "nullable": true
          },
          "diskMb": {
            "type": "integer",
            "format": "int32",
            "nullable": true
          },
          "quotaGb": {
            "type": "integer",
            "format": "int32",
            "nullable": true
          }
        }
      },
      "CreateContainerRequest": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "name": {
            "type": "string"
          },
          "image": {
            "type": "string"
          },
          "containerPort": {
            "type": "integer",
            "format": "int32"
          },
          "interval": {
            "$ref": "#/components/schemas/BillingInterval"
          },
          "environment": {
            "type": "object",
            "nullable": true,
            "additionalProperties": {
              "type": "string"
            }
          },
          "extras": {
            "nullable": true,
            "oneOf": [
              {
                "$ref": "#/components/schemas/ExtrasDto"
              }
            ]
          },
          "volumes": {
            "type": "array",
            "nullable": true,
            "items": {
              "type": "string"
            }
          },
          "domain": {
            "type": "string",
            "nullable": true
          },
          "companion": {
            "type": "boolean"
          },
          "registryCredentialId": {
            "type": "string",
            "format": "guid",
            "nullable": true
          },
          "region": {
            "type": "string",
            "nullable": true
          },
          "allocation": {
            "nullable": true,
            "oneOf": [
              {
                "$ref": "#/components/schemas/ContainerAllocationDto"
              }
            ]
          },
          "growPool": {
            "type": "boolean"
          },
          "poolSize": {
            "nullable": true,
            "oneOf": [
              {
                "$ref": "#/components/schemas/PoolSizeDto"
              }
            ]
          },
          "appAddress": {
            "type": "boolean"
          }
        }
      },
      "ExtrasDto": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "ram": {
            "type": "integer",
            "format": "int32"
          },
          "cpu": {
            "type": "integer",
            "format": "int32"
          },
          "disk": {
            "type": "integer",
            "format": "int32"
          }
        }
      },
      "DatabaseCreatedResponse": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "service": {
            "$ref": "#/components/schemas/ServiceResponse"
          },
          "password": {
            "type": "string"
          }
        }
      },
      "CreateDatabaseRequest": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "name": {
            "type": "string"
          },
          "engine": {
            "$ref": "#/components/schemas/DatabaseEngine"
          },
          "quotaGb": {
            "type": "integer",
            "format": "int32"
          },
          "interval": {
            "$ref": "#/components/schemas/BillingInterval"
          },
          "growPool": {
            "type": "boolean"
          },
          "poolSize": {
            "nullable": true,
            "oneOf": [
              {
                "$ref": "#/components/schemas/PoolSizeDto"
              }
            ]
          }
        }
      },
      "CatalogResponse": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "vatRate": {
            "type": "number",
            "format": "decimal"
          },
          "vatPayer": {
            "type": "boolean"
          },
          "databaseEngines": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/DatabaseEngineOffer"
            }
          },
          "regions": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "pool": {
            "$ref": "#/components/schemas/PoolCatalog"
          }
        }
      },
      "DatabaseEngineOffer": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "engine": {
            "$ref": "#/components/schemas/DatabaseEngine"
          },
          "name": {
            "type": "string"
          },
          "maxQuotaGb": {
            "type": "integer",
            "format": "int32"
          },
          "available": {
            "type": "boolean"
          }
        }
      },
      "PoolCatalog": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "cpuMonthly": {
            "type": "number",
            "format": "decimal"
          },
          "ramPerGbMonthly": {
            "type": "number",
            "format": "decimal"
          },
          "diskPerGbMonthly": {
            "type": "number",
            "format": "decimal"
          },
          "postgresPerGbMonthly": {
            "type": "number",
            "format": "decimal"
          },
          "sqlServerPerGbMonthly": {
            "type": "number",
            "format": "decimal"
          },
          "postgresBaseMonthly": {
            "type": "number",
            "format": "decimal"
          },
          "sqlServerBaseMonthly": {
            "type": "number",
            "format": "decimal"
          },
          "annualMonths": {
            "type": "integer",
            "format": "int32"
          },
          "cpuStep": {
            "type": "number",
            "format": "decimal"
          },
          "minContainerCpu": {
            "type": "number",
            "format": "decimal"
          },
          "minContainerRamMb": {
            "type": "integer",
            "format": "int32"
          },
          "minContainerDiskMb": {
            "type": "integer",
            "format": "int32"
          },
          "minDatabaseGb": {
            "type": "integer",
            "format": "int32"
          },
          "defaultContainer": {
            "$ref": "#/components/schemas/ContainerAllocationDto"
          },
          "max": {
            "$ref": "#/components/schemas/PoolSizeDto"
          },
          "trial": {
            "$ref": "#/components/schemas/TrialCatalog"
          },
          "trialDatabaseGb": {
            "type": "integer",
            "format": "int32"
          },
          "minPoolCpu": {
            "type": "number",
            "format": "decimal"
          },
          "trialDays": {
            "type": "integer",
            "format": "int32"
          },
          "ramStepMb": {
            "type": "integer",
            "format": "int32"
          }
        }
      },
      "TrialCatalog": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "cpu": {
            "type": "number",
            "format": "decimal"
          },
          "ramMb": {
            "type": "integer",
            "format": "int32"
          },
          "diskMb": {
            "type": "integer",
            "format": "int32"
          },
          "databaseGb": {
            "type": "integer",
            "format": "int32"
          }
        }
      },
      "RenameServiceRequest": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "name": {
            "type": "string"
          }
        }
      },
      "UpdateConfigRequest": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "containerPort": {
            "type": "integer",
            "format": "int32"
          },
          "environment": {
            "type": "object",
            "nullable": true,
            "additionalProperties": {
              "type": "string"
            }
          },
          "volumes": {
            "type": "array",
            "nullable": true,
            "items": {
              "type": "string"
            }
          }
        }
      },
      "AutoUpdateRequest": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "enabled": {
            "type": "boolean"
          }
        }
      },
      "ServiceEventResponse": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "id": {
            "type": "string",
            "format": "guid"
          },
          "at": {
            "type": "string",
            "format": "date-time"
          },
          "kind": {
            "$ref": "#/components/schemas/ServiceEventKind"
          },
          "data": {
            "type": "object",
            "additionalProperties": {
              "type": "string"
            }
          },
          "actor": {
            "type": "string"
          },
          "actorName": {
            "type": "string",
            "nullable": true
          }
        }
      },
      "ServiceEventKind": {
        "type": "string",
        "description": "",
        "x-enumNames": [
          "Created",
          "Renamed",
          "ExtrasChanged",
          "PortChanged",
          "EnvironmentChanged",
          "VolumesChanged",
          "RestartRequested",
          "RedeployRequested",
          "Deployed",
          "Restarted",
          "Failed",
          "CancelScheduled",
          "CancelWithdrawn",
          "DecommissionRequested",
          "Decommissioned",
          "PasswordReset",
          "Moved",
          "BackupRequested",
          "BackupMade",
          "RestoreRequested",
          "Restored",
          "QuotaChanged",
          "DomainAdded",
          "DomainVerified",
          "DomainRemoved",
          "PaymentReceived",
          "Suspended",
          "OrderExpired",
          "ChangeScheduled",
          "AutoUpdateChanged",
          "AutoUpdated",
          "WebhookChanged",
          "LoginCreated",
          "LoginRevoked",
          "StopRequested",
          "StartRequested",
          "HealthDown",
          "HealthUp",
          "DnsConfigured",
          "BillingRemoved",
          "BillingAdded",
          "DatabaseLinked",
          "DatabaseUnlinked",
          "LinkRotated",
          "AllocationChanged",
          "PoolResized",
          "AllowlistChanged",
          "SandboxChanged"
        ],
        "enum": [
          "Created",
          "Renamed",
          "ExtrasChanged",
          "PortChanged",
          "EnvironmentChanged",
          "VolumesChanged",
          "RestartRequested",
          "RedeployRequested",
          "Deployed",
          "Restarted",
          "Failed",
          "CancelScheduled",
          "CancelWithdrawn",
          "DecommissionRequested",
          "Decommissioned",
          "PasswordReset",
          "Moved",
          "BackupRequested",
          "BackupMade",
          "RestoreRequested",
          "Restored",
          "QuotaChanged",
          "DomainAdded",
          "DomainVerified",
          "DomainRemoved",
          "PaymentReceived",
          "Suspended",
          "OrderExpired",
          "ChangeScheduled",
          "AutoUpdateChanged",
          "AutoUpdated",
          "WebhookChanged",
          "LoginCreated",
          "LoginRevoked",
          "StopRequested",
          "StartRequested",
          "HealthDown",
          "HealthUp",
          "DnsConfigured",
          "BillingRemoved",
          "BillingAdded",
          "DatabaseLinked",
          "DatabaseUnlinked",
          "LinkRotated",
          "AllocationChanged",
          "PoolResized",
          "AllowlistChanged",
          "SandboxChanged"
        ]
      },
      "ContainerLogs": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "found": {
            "type": "boolean"
          },
          "output": {
            "type": "string"
          },
          "truncated": {
            "type": "boolean"
          },
          "incremental": {
            "type": "boolean"
          }
        }
      },
      "ServiceLogsRequest": {
        "type": "object",
        "additionalProperties": false
      },
      "MetricSample": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "at": {
            "type": "string",
            "format": "date-time"
          },
          "cpu": {
            "type": "number",
            "format": "decimal"
          },
          "memory": {
            "type": "integer",
            "format": "int64"
          },
          "memoryLimit": {
            "type": "integer",
            "format": "int64"
          },
          "disk": {
            "type": "integer",
            "format": "int64",
            "nullable": true
          }
        }
      },
      "DatabasePasswordResponse": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "password": {
            "type": "string"
          }
        }
      },
      "ConnectionLoginResponse": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "login": {
            "$ref": "#/components/schemas/ConnectionLoginDto"
          },
          "password": {
            "type": "string"
          }
        }
      },
      "CreateConnectionLoginRequest": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "name": {
            "type": "string",
            "nullable": true
          }
        }
      },
      "StackOrderedResponse": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "stack": {
            "$ref": "#/components/schemas/StackRefDto"
          },
          "container": {
            "$ref": "#/components/schemas/ServiceResponse"
          },
          "database": {
            "$ref": "#/components/schemas/ServiceResponse"
          },
          "password": {
            "type": "string"
          }
        }
      },
      "OrderStackRequest": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "name": {
            "type": "string"
          },
          "interval": {
            "$ref": "#/components/schemas/BillingInterval"
          },
          "container": {
            "$ref": "#/components/schemas/CreateContainerRequest"
          },
          "database": {
            "$ref": "#/components/schemas/StackDatabaseRequest"
          },
          "alias": {
            "type": "string",
            "nullable": true
          },
          "growPool": {
            "type": "boolean"
          },
          "poolSize": {
            "nullable": true,
            "oneOf": [
              {
                "$ref": "#/components/schemas/PoolSizeDto"
              }
            ]
          }
        }
      },
      "StackDatabaseRequest": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "engine": {
            "$ref": "#/components/schemas/DatabaseEngine"
          },
          "quotaGb": {
            "type": "integer",
            "format": "int32"
          },
          "name": {
            "type": "string",
            "nullable": true
          }
        }
      },
      "StackDto": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "id": {
            "type": "string",
            "format": "guid"
          },
          "name": {
            "type": "string"
          },
          "createdAt": {
            "type": "string",
            "format": "date-time"
          },
          "status": {
            "$ref": "#/components/schemas/StackStatus"
          },
          "primaryDomain": {
            "type": "string",
            "nullable": true
          },
          "monthlyPrice": {
            "type": "number",
            "format": "decimal"
          },
          "services": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/ServiceResponse"
            }
          }
        }
      },
      "StackStatus": {
        "type": "string",
        "description": "",
        "x-enumNames": [
          "Running",
          "Stopped",
          "Deploying",
          "Suspended",
          "AwaitingPayment",
          "Failed",
          "Empty"
        ],
        "enum": [
          "Running",
          "Stopped",
          "Deploying",
          "Suspended",
          "AwaitingPayment",
          "Failed",
          "Empty"
        ]
      },
      "CreateStackRequest": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "name": {
            "type": "string"
          },
          "serviceIds": {
            "type": "array",
            "nullable": true,
            "items": {
              "type": "string",
              "format": "guid"
            }
          }
        }
      },
      "RenameStackRequest": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "name": {
            "type": "string"
          }
        }
      },
      "DeleteStackRequest": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "services": {
            "type": "object",
            "nullable": true,
            "additionalProperties": {
              "type": "string"
            }
          }
        }
      },
      "MoveServiceRequest": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "serviceId": {
            "type": "string",
            "format": "guid"
          }
        }
      },
      "StackActionRequest": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "action": {
            "type": "string"
          }
        }
      },
      "OrganizationResponse": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "id": {
            "type": "string",
            "format": "guid"
          },
          "name": {
            "type": "string"
          },
          "billingEmail": {
            "type": "string",
            "nullable": true
          },
          "invoiceLanguage": {
            "type": "string"
          },
          "unbilled": {
            "type": "boolean"
          },
          "role": {
            "$ref": "#/components/schemas/OrganizationRole"
          },
          "member": {
            "type": "boolean"
          },
          "createdAt": {
            "type": "string",
            "format": "date-time"
          },
          "members": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/OrganizationMemberDto"
            }
          },
          "invitations": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/InvitationDto"
            }
          }
        }
      },
      "OrganizationRole": {
        "type": "string",
        "description": "",
        "x-enumNames": [
          "Viewer",
          "Member",
          "Owner"
        ],
        "enum": [
          "Viewer",
          "Member",
          "Owner"
        ]
      },
      "OrganizationMemberDto": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "id": {
            "type": "string",
            "format": "guid"
          },
          "name": {
            "type": "string"
          },
          "email": {
            "type": "string"
          },
          "role": {
            "$ref": "#/components/schemas/OrganizationRole"
          },
          "since": {
            "type": "string",
            "format": "date-time"
          }
        }
      },
      "InvitationDto": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "id": {
            "type": "string",
            "format": "guid"
          },
          "email": {
            "type": "string"
          },
          "role": {
            "$ref": "#/components/schemas/OrganizationRole"
          },
          "createdAt": {
            "type": "string",
            "format": "date-time"
          },
          "expiresAt": {
            "type": "string",
            "format": "date-time"
          }
        }
      },
      "InviteRequest": {
        "type": "object",
        "additionalProperties": false,
        "required": [
          "email"
        ],
        "properties": {
          "email": {
            "type": "string",
            "minLength": 1,
            "nullable": false
          },
          "role": {
            "$ref": "#/components/schemas/OrganizationRole"
          }
        }
      },
      "InvitationInfoResponse": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "organization": {
            "type": "string"
          },
          "email": {
            "type": "string"
          },
          "role": {
            "$ref": "#/components/schemas/OrganizationRole"
          },
          "invitedBy": {
            "type": "string",
            "nullable": true
          },
          "expired": {
            "type": "boolean"
          }
        }
      },
      "OrganizationSummaryDto": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "id": {
            "type": "string",
            "format": "guid"
          },
          "name": {
            "type": "string"
          },
          "role": {
            "$ref": "#/components/schemas/OrganizationRole"
          },
          "unbilled": {
            "type": "boolean"
          },
          "member": {
            "type": "boolean"
          }
        }
      },
      "CreateOrganizationRequest": {
        "type": "object",
        "additionalProperties": false,
        "required": [
          "name"
        ],
        "properties": {
          "name": {
            "type": "string",
            "maxLength": 200,
            "minLength": 0,
            "nullable": false
          },
          "billingEmail": {
            "type": "string",
            "nullable": true
          },
          "invoiceLanguage": {
            "type": "string",
            "nullable": true
          },
          "unbilled": {
            "type": "boolean"
          }
        }
      },
      "SwitchOrganizationRequest": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "organizationId": {
            "type": "string",
            "format": "guid"
          }
        }
      },
      "UpdateOrganizationRequest": {
        "type": "object",
        "additionalProperties": false,
        "required": [
          "name"
        ],
        "properties": {
          "name": {
            "type": "string",
            "maxLength": 200,
            "minLength": 0,
            "nullable": false
          },
          "billingEmail": {
            "type": "string",
            "nullable": true
          },
          "unbilled": {
            "type": "boolean",
            "nullable": true
          }
        }
      },
      "ChangeMemberRequest": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "role": {
            "$ref": "#/components/schemas/OrganizationRole"
          }
        }
      },
      "CloudflareAccountsResponse": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "available": {
            "type": "boolean"
          },
          "accounts": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/CloudflareAccountDto"
            }
          }
        }
      },
      "CloudflareAccountDto": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "id": {
            "type": "string",
            "format": "guid"
          },
          "zones": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "createdAt": {
            "type": "string",
            "format": "date-time"
          },
          "verifiedAt": {
            "type": "string",
            "format": "date-time",
            "nullable": true
          },
          "refused": {
            "type": "boolean"
          }
        }
      },
      "CloudflareZoneDto": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "state": {
            "$ref": "#/components/schemas/CloudflareZoneState"
          },
          "zone": {
            "type": "string",
            "nullable": true
          }
        }
      },
      "CloudflareZoneState": {
        "type": "string",
        "description": "",
        "x-enumNames": [
          "NoAccount",
          "NotFound",
          "NotActive",
          "Refused",
          "Connected"
        ],
        "enum": [
          "NoAccount",
          "NotFound",
          "NotActive",
          "Refused",
          "Connected"
        ]
      },
      "CloudflareZoneRequest": {
        "type": "object",
        "additionalProperties": false
      },
      "CloudflareTokenRequest": {
        "type": "object",
        "additionalProperties": false,
        "required": [
          "token"
        ],
        "properties": {
          "token": {
            "type": "string",
            "maxLength": 500,
            "minLength": 0,
            "nullable": false
          }
        }
      },
      "RegistryAccountsResponse": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "available": {
            "type": "boolean"
          },
          "accounts": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/RegistryAccountDto"
            }
          }
        }
      },
      "RegistryAccountDto": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "id": {
            "type": "string",
            "format": "guid"
          },
          "registry": {
            "type": "string"
          },
          "username": {
            "type": "string"
          },
          "createdAt": {
            "type": "string",
            "format": "date-time"
          },
          "verifiedAt": {
            "type": "string",
            "format": "date-time",
            "nullable": true
          },
          "refused": {
            "type": "boolean"
          },
          "services": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/RegistryServiceDto"
            }
          }
        }
      },
      "RegistryServiceDto": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "id": {
            "type": "string",
            "format": "guid"
          },
          "name": {
            "type": "string"
          }
        }
      },
      "LinkRegistryAccountRequest": {
        "type": "object",
        "additionalProperties": false,
        "required": [
          "username",
          "token"
        ],
        "properties": {
          "username": {
            "type": "string",
            "maxLength": 100,
            "minLength": 0,
            "nullable": false
          },
          "token": {
            "type": "string",
            "maxLength": 4096,
            "minLength": 0,
            "nullable": false
          },
          "registry": {
            "type": "string",
            "nullable": true
          }
        }
      },
      "ReplaceRegistryTokenRequest": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "token": {
            "type": "string"
          }
        }
      },
      "HubRepository": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "namespace": {
            "type": "string"
          },
          "name": {
            "type": "string"
          },
          "private": {
            "type": "boolean"
          },
          "description": {
            "type": "string",
            "nullable": true
          },
          "lastUpdated": {
            "type": "string",
            "format": "date-time",
            "nullable": true
          }
        }
      },
      "RegistryRepositoriesRequest": {
        "type": "object",
        "additionalProperties": false
      },
      "InvoiceResponse": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "id": {
            "type": "string",
            "format": "guid"
          },
          "purpose": {
            "nullable": true,
            "oneOf": [
              {
                "$ref": "#/components/schemas/BillingPurpose"
              }
            ]
          },
          "serviceId": {
            "type": "string",
            "format": "guid",
            "nullable": true
          },
          "serviceName": {
            "type": "string",
            "nullable": true
          },
          "number": {
            "type": "string"
          },
          "issuedOn": {
            "type": "string",
            "format": "date"
          },
          "dueOn": {
            "type": "string",
            "format": "date"
          },
          "periodFrom": {
            "type": "string",
            "format": "date",
            "nullable": true
          },
          "periodTo": {
            "type": "string",
            "format": "date",
            "nullable": true
          },
          "status": {
            "$ref": "#/components/schemas/InvoiceStatus"
          },
          "subtotal": {
            "type": "number",
            "format": "decimal"
          },
          "vatTotal": {
            "type": "number",
            "format": "decimal"
          },
          "total": {
            "type": "number",
            "format": "decimal"
          },
          "currency": {
            "type": "string"
          },
          "lines": {
            "type": "integer",
            "format": "int32"
          },
          "customerName": {
            "type": "string"
          },
          "customerEmail": {
            "type": "string",
            "nullable": true
          },
          "pdfGeneratedAt": {
            "type": "string",
            "format": "date-time",
            "nullable": true
          }
        }
      },
      "InvoiceStatus": {
        "type": "string",
        "description": "",
        "x-enumNames": [
          "Issued",
          "Paid",
          "Cancelled"
        ],
        "enum": [
          "Issued",
          "Paid",
          "Cancelled"
        ]
      },
      "CheckoutResponse": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "url": {
            "type": "string"
          }
        }
      },
      "CheckoutRequest": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "saveMethod": {
            "type": "boolean"
          },
          "returnPath": {
            "type": "string",
            "nullable": true
          }
        }
      },
      "PublicPaymentResponse": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "payment": {
            "$ref": "#/components/schemas/PaymentResponse"
          },
          "organization": {
            "type": "string"
          },
          "language": {
            "type": "string"
          },
          "iban": {
            "type": "string",
            "nullable": true
          },
          "invoiceNumber": {
            "type": "string",
            "nullable": true
          }
        }
      },
      "PublicCheckoutRequest": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "saveMethod": {
            "type": "boolean"
          }
        }
      },
      "AuthorizationPromptResponse": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "clientName": {
            "type": "string"
          },
          "clientUri": {
            "type": "string",
            "nullable": true
          },
          "redirectTarget": {
            "type": "string"
          },
          "scope": {
            "nullable": true,
            "oneOf": [
              {
                "$ref": "#/components/schemas/ApiTokenScope"
              }
            ]
          },
          "organizations": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/OrganizationSummaryDto"
            }
          }
        }
      },
      "ApiTokenScope": {
        "type": "string",
        "description": "",
        "x-enumNames": [
          "Read",
          "Manage"
        ],
        "enum": [
          "Read",
          "Manage"
        ]
      },
      "DecideAuthorizationResponse": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "redirect": {
            "type": "string"
          }
        }
      },
      "DecideAuthorizationRequest": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "request": {
            "type": "string"
          },
          "approve": {
            "type": "boolean"
          },
          "scope": {
            "$ref": "#/components/schemas/ApiTokenScope"
          },
          "organizationId": {
            "type": "string",
            "format": "guid",
            "nullable": true
          }
        }
      },
      "ConnectedAppDto": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "id": {
            "type": "string",
            "format": "guid"
          },
          "name": {
            "type": "string"
          },
          "clientUri": {
            "type": "string",
            "nullable": true
          },
          "scope": {
            "$ref": "#/components/schemas/ApiTokenScope"
          },
          "createdAt": {
            "type": "string",
            "format": "date-time"
          },
          "lastUsedAt": {
            "type": "string",
            "format": "date-time",
            "nullable": true
          },
          "organization": {
            "type": "string"
          }
        }
      }
    },
    "securitySchemes": {
      "Bearer": {
        "type": "http",
        "description": "A personal API token, cdv_...",
        "scheme": "bearer"
      }
    }
  }
}