{
    "openapi": "3.0.3",
    "info": {
        "title": "HostHatch Cloud API",
        "version": "1.0.0",
        "description": "Manage your HostHatch projects, servers and their resources programmatically.\n\nAuthenticate with an API key created on your profile page, sent as `Authorization: Bearer <your-key>`. Resources belong to a project, addressed by its slug. Errors are RFC 9457 problem details with a stable `code`."
    },
    "paths": {
        "/me/": {
            "get": {
                "operationId": "me_retrieve",
                "description": "Who the current key belongs to, and which projects it can reach.",
                "tags": [
                    "account"
                ],
                "security": [
                    {
                        "bearerAuth": []
                    }
                ],
                "responses": {
                    "200": {
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/CurrentUser"
                                }
                            }
                        },
                        "description": ""
                    }
                }
            }
        },
        "/projects/": {
            "get": {
                "operationId": "projects_list",
                "parameters": [
                    {
                        "name": "page",
                        "required": false,
                        "in": "query",
                        "description": "A page number within the paginated result set. A page past the end, or one that is not a number, answers 404 not_found.",
                        "schema": {
                            "type": "integer"
                        }
                    },
                    {
                        "name": "page_size",
                        "required": false,
                        "in": "query",
                        "description": "Number of results per page: 50 by default, at most 100.",
                        "schema": {
                            "type": "integer"
                        }
                    }
                ],
                "tags": [
                    "projects"
                ],
                "security": [
                    {
                        "bearerAuth": []
                    }
                ],
                "responses": {
                    "200": {
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/PaginatedProjectList"
                                }
                            }
                        },
                        "description": ""
                    }
                }
            },
            "post": {
                "operationId": "projects_create",
                "tags": [
                    "projects"
                ],
                "requestBody": {
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/ProjectRequest"
                            }
                        }
                    },
                    "required": true
                },
                "security": [
                    {
                        "bearerAuth": []
                    }
                ],
                "responses": {
                    "201": {
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Project"
                                }
                            }
                        },
                        "description": ""
                    }
                }
            }
        },
        "/projects/{project_slug}/": {
            "get": {
                "operationId": "projects_retrieve",
                "parameters": [
                    {
                        "in": "path",
                        "name": "project_slug",
                        "schema": {
                            "type": "string",
                            "pattern": "^[-\\w]+$"
                        },
                        "required": true
                    }
                ],
                "tags": [
                    "projects"
                ],
                "security": [
                    {
                        "bearerAuth": []
                    }
                ],
                "responses": {
                    "200": {
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Project"
                                }
                            }
                        },
                        "description": ""
                    }
                }
            },
            "put": {
                "operationId": "projects_update",
                "parameters": [
                    {
                        "in": "path",
                        "name": "project_slug",
                        "schema": {
                            "type": "string",
                            "pattern": "^[-\\w]+$"
                        },
                        "required": true
                    }
                ],
                "tags": [
                    "projects"
                ],
                "requestBody": {
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/ProjectRequest"
                            }
                        }
                    },
                    "required": true
                },
                "security": [
                    {
                        "bearerAuth": []
                    }
                ],
                "responses": {
                    "200": {
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Project"
                                }
                            }
                        },
                        "description": ""
                    }
                }
            },
            "patch": {
                "operationId": "projects_partial_update",
                "parameters": [
                    {
                        "in": "path",
                        "name": "project_slug",
                        "schema": {
                            "type": "string",
                            "pattern": "^[-\\w]+$"
                        },
                        "required": true
                    }
                ],
                "tags": [
                    "projects"
                ],
                "requestBody": {
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/PatchedProjectRequest"
                            }
                        }
                    }
                },
                "security": [
                    {
                        "bearerAuth": []
                    }
                ],
                "responses": {
                    "200": {
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Project"
                                }
                            }
                        },
                        "description": ""
                    }
                }
            },
            "delete": {
                "operationId": "projects_destroy",
                "description": "Delete project: if it exists in Raven, first validate it has no servers/ssh keys,\nthen delete in Raven, then delete locally.",
                "parameters": [
                    {
                        "in": "path",
                        "name": "project_slug",
                        "schema": {
                            "type": "string",
                            "pattern": "^[-\\w]+$"
                        },
                        "required": true
                    }
                ],
                "tags": [
                    "projects"
                ],
                "security": [
                    {
                        "bearerAuth": []
                    }
                ],
                "responses": {
                    "204": {
                        "description": "No response body"
                    }
                }
            }
        },
        "/projects/{project_slug}/actions/": {
            "get": {
                "operationId": "actions_list",
                "description": "Asynchronous operations in a project, newest first. Poll an action until its status is\n`success` or `error`; `unknown` means Raven may have carried it out but never confirmed it.",
                "parameters": [
                    {
                        "name": "page",
                        "required": false,
                        "in": "query",
                        "description": "A page number within the paginated result set. A page past the end, or one that is not a number, answers 404 not_found.",
                        "schema": {
                            "type": "integer"
                        }
                    },
                    {
                        "name": "page_size",
                        "required": false,
                        "in": "query",
                        "description": "Number of results per page: 50 by default, at most 100.",
                        "schema": {
                            "type": "integer"
                        }
                    },
                    {
                        "in": "path",
                        "name": "project_slug",
                        "schema": {
                            "type": "string"
                        },
                        "required": true
                    },
                    {
                        "in": "query",
                        "name": "resource_id",
                        "schema": {
                            "type": "string",
                            "minLength": 1,
                            "pattern": "^[0-9a-f]{1,32}$"
                        }
                    },
                    {
                        "in": "query",
                        "name": "resource_type",
                        "schema": {
                            "enum": [
                                "server"
                            ],
                            "type": "string",
                            "minLength": 1
                        },
                        "description": "* `server` - server"
                    },
                    {
                        "in": "query",
                        "name": "status",
                        "schema": {
                            "enum": [
                                "running",
                                "unknown",
                                "success",
                                "error"
                            ],
                            "type": "string",
                            "minLength": 1
                        },
                        "description": "* `running` - Running\n* `unknown` - Unknown\n* `success` - Success\n* `error` - Error"
                    },
                    {
                        "in": "query",
                        "name": "type",
                        "schema": {
                            "enum": [
                                "server.power_on",
                                "server.power_off",
                                "server.shutdown",
                                "server.reboot",
                                "server.reinstall",
                                "server.reset_password",
                                "server.restore_snapshot",
                                "server.create_snapshot",
                                "server.mount_iso",
                                "server.unmount_iso",
                                "server.enable_ipv6",
                                "server.enable_private_network"
                            ],
                            "type": "string",
                            "minLength": 1
                        },
                        "description": "* `server.power_on` - Power On\n* `server.power_off` - Power Off\n* `server.shutdown` - Shutdown\n* `server.reboot` - Reboot\n* `server.reinstall` - Reinstall\n* `server.reset_password` - Reset Password\n* `server.restore_snapshot` - Restore Snapshot\n* `server.create_snapshot` - Create Snapshot\n* `server.mount_iso` - Mount Iso\n* `server.unmount_iso` - Unmount Iso\n* `server.enable_ipv6` - Enable Ipv6\n* `server.enable_private_network` - Enable Private Network"
                    }
                ],
                "tags": [
                    "actions"
                ],
                "security": [
                    {
                        "bearerAuth": []
                    }
                ],
                "responses": {
                    "200": {
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/PaginatedActionList"
                                }
                            }
                        },
                        "description": ""
                    },
                    "400": {
                        "content": {
                            "application/problem+json": {
                                "schema": {
                                    "$ref": "#/components/schemas/ProblemDetails"
                                }
                            }
                        },
                        "description": "`validation_error`"
                    },
                    "404": {
                        "content": {
                            "application/problem+json": {
                                "schema": {
                                    "$ref": "#/components/schemas/ProblemDetails"
                                }
                            }
                        },
                        "description": "`not_found`"
                    }
                }
            }
        },
        "/projects/{project_slug}/actions/{id}/": {
            "get": {
                "operationId": "actions_retrieve",
                "description": "Asynchronous operations in a project, newest first. Poll an action until its status is\n`success` or `error`; `unknown` means Raven may have carried it out but never confirmed it.",
                "parameters": [
                    {
                        "in": "path",
                        "name": "id",
                        "schema": {
                            "type": "string",
                            "pattern": "^\\d+$"
                        },
                        "required": true
                    },
                    {
                        "in": "path",
                        "name": "project_slug",
                        "schema": {
                            "type": "string"
                        },
                        "required": true
                    }
                ],
                "tags": [
                    "actions"
                ],
                "security": [
                    {
                        "bearerAuth": []
                    }
                ],
                "responses": {
                    "200": {
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Action"
                                }
                            }
                        },
                        "description": ""
                    },
                    "404": {
                        "content": {
                            "application/problem+json": {
                                "schema": {
                                    "$ref": "#/components/schemas/ProblemDetails"
                                }
                            }
                        },
                        "description": "`not_found`"
                    }
                }
            }
        },
        "/projects/{project_slug}/firewall-groups/": {
            "get": {
                "operationId": "firewall_groups_list",
                "description": "The project's firewall groups, each with its rules and the ids of the servers it is attached to.",
                "summary": "List firewall groups",
                "parameters": [
                    {
                        "name": "page",
                        "required": false,
                        "in": "query",
                        "description": "A page number within the paginated result set. A page past the end, or one that is not a number, answers 404 not_found.",
                        "schema": {
                            "type": "integer"
                        }
                    },
                    {
                        "name": "page_size",
                        "required": false,
                        "in": "query",
                        "description": "Number of results per page: 50 by default, at most 100.",
                        "schema": {
                            "type": "integer"
                        }
                    },
                    {
                        "in": "path",
                        "name": "project_slug",
                        "schema": {
                            "type": "string"
                        },
                        "required": true
                    }
                ],
                "tags": [
                    "firewall-groups"
                ],
                "security": [
                    {
                        "bearerAuth": []
                    }
                ],
                "responses": {
                    "200": {
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/PaginatedFirewallGroupList"
                                }
                            }
                        },
                        "description": ""
                    },
                    "403": {
                        "content": {
                            "application/problem+json": {
                                "schema": {
                                    "$ref": "#/components/schemas/ProblemDetails"
                                }
                            }
                        },
                        "description": "`billing_account_required`, `project_not_ready`"
                    },
                    "404": {
                        "content": {
                            "application/problem+json": {
                                "schema": {
                                    "$ref": "#/components/schemas/ProblemDetails"
                                }
                            }
                        },
                        "description": "`not_found`"
                    },
                    "502": {
                        "content": {
                            "application/problem+json": {
                                "schema": {
                                    "$ref": "#/components/schemas/ProblemDetails"
                                }
                            }
                        },
                        "description": "`upstream_error`"
                    },
                    "503": {
                        "content": {
                            "application/problem+json": {
                                "schema": {
                                    "$ref": "#/components/schemas/ProblemDetails"
                                }
                            }
                        },
                        "description": "`upstream_unavailable`"
                    }
                }
            },
            "post": {
                "operationId": "firewall_groups_create",
                "description": "Create an empty group, then add its rules. A group applies only to the servers it is attached to. Names are unique in a project, so a create whose response was lost can be sent again: if the group was created, the answer is `409 name_taken` with its id in `group_id` (left out only when Raven refused the name and the group could not be read back).",
                "summary": "Create a firewall group",
                "parameters": [
                    {
                        "in": "path",
                        "name": "project_slug",
                        "schema": {
                            "type": "string"
                        },
                        "required": true
                    }
                ],
                "tags": [
                    "firewall-groups"
                ],
                "requestBody": {
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/FirewallGroupRequest"
                            },
                            "examples": {
                                "InboundWebTraffic": {
                                    "value": {
                                        "name": "web",
                                        "direction": "ingress"
                                    },
                                    "summary": "Inbound web traffic"
                                }
                            }
                        }
                    },
                    "required": true
                },
                "security": [
                    {
                        "bearerAuth": []
                    }
                ],
                "responses": {
                    "201": {
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/FirewallGroup"
                                },
                                "examples": {
                                    "Created": {
                                        "value": {
                                            "id": 412,
                                            "name": "web",
                                            "direction": "ingress",
                                            "servers": [],
                                            "rules": [],
                                            "created_at": "2026-10-19T10:00:00.000000Z"
                                        }
                                    }
                                }
                            }
                        },
                        "description": ""
                    },
                    "400": {
                        "content": {
                            "application/problem+json": {
                                "schema": {
                                    "$ref": "#/components/schemas/ProblemDetails"
                                }
                            }
                        },
                        "description": "`validation_error`"
                    },
                    "403": {
                        "content": {
                            "application/problem+json": {
                                "schema": {
                                    "$ref": "#/components/schemas/ProblemDetails"
                                }
                            }
                        },
                        "description": "`read_only_key`, `billing_account_required`, `project_not_ready`"
                    },
                    "404": {
                        "content": {
                            "application/problem+json": {
                                "schema": {
                                    "$ref": "#/components/schemas/ProblemDetails"
                                }
                            }
                        },
                        "description": "`not_found`"
                    },
                    "409": {
                        "content": {
                            "application/problem+json": {
                                "schema": {
                                    "$ref": "#/components/schemas/ProblemDetails"
                                }
                            }
                        },
                        "description": "`name_taken`"
                    },
                    "502": {
                        "content": {
                            "application/problem+json": {
                                "schema": {
                                    "$ref": "#/components/schemas/ProblemDetails"
                                }
                            }
                        },
                        "description": "`upstream_error`"
                    },
                    "503": {
                        "content": {
                            "application/problem+json": {
                                "schema": {
                                    "$ref": "#/components/schemas/ProblemDetails"
                                }
                            }
                        },
                        "description": "`upstream_unavailable`"
                    }
                }
            }
        },
        "/projects/{project_slug}/firewall-groups/{group_id}/": {
            "get": {
                "operationId": "firewall_groups_retrieve",
                "description": "One of the project's firewall groups, with its rules and the servers it is attached to.",
                "summary": "Get a firewall group",
                "parameters": [
                    {
                        "in": "path",
                        "name": "group_id",
                        "schema": {
                            "type": "integer"
                        },
                        "description": "The group's id.",
                        "required": true
                    },
                    {
                        "in": "path",
                        "name": "project_slug",
                        "schema": {
                            "type": "string"
                        },
                        "required": true
                    }
                ],
                "tags": [
                    "firewall-groups"
                ],
                "security": [
                    {
                        "bearerAuth": []
                    }
                ],
                "responses": {
                    "200": {
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/FirewallGroup"
                                },
                                "examples": {
                                    "AGroupWithOneRule": {
                                        "value": {
                                            "id": 412,
                                            "name": "web",
                                            "direction": "ingress",
                                            "servers": [
                                                "774736"
                                            ],
                                            "rules": [
                                                {
                                                    "id": 9002,
                                                    "protocol": "tcp",
                                                    "port_min": 443,
                                                    "port_max": 443,
                                                    "source_cidr": "0.0.0.0/0",
                                                    "destination_cidr": null,
                                                    "priority": 1000,
                                                    "comment": "HTTPS"
                                                }
                                            ],
                                            "created_at": "2026-10-19T10:00:00.000000Z"
                                        },
                                        "summary": "A group with one rule"
                                    }
                                }
                            }
                        },
                        "description": ""
                    },
                    "403": {
                        "content": {
                            "application/problem+json": {
                                "schema": {
                                    "$ref": "#/components/schemas/ProblemDetails"
                                }
                            }
                        },
                        "description": "`billing_account_required`, `project_not_ready`"
                    },
                    "404": {
                        "content": {
                            "application/problem+json": {
                                "schema": {
                                    "$ref": "#/components/schemas/ProblemDetails"
                                }
                            }
                        },
                        "description": "`not_found`"
                    },
                    "502": {
                        "content": {
                            "application/problem+json": {
                                "schema": {
                                    "$ref": "#/components/schemas/ProblemDetails"
                                }
                            }
                        },
                        "description": "`upstream_error`"
                    },
                    "503": {
                        "content": {
                            "application/problem+json": {
                                "schema": {
                                    "$ref": "#/components/schemas/ProblemDetails"
                                }
                            }
                        },
                        "description": "`upstream_unavailable`"
                    }
                }
            },
            "patch": {
                "operationId": "firewall_groups_rename",
                "description": "Change a group's name, the only property of a group that can change. A `direction` other than the group's is a validation error: create a group with the other direction instead. Fields that cannot change are ignored, so a group read and sent back whole with a new name is a rename. A name another group of the project has is `409 name_taken`, with that group's id in `group_id` when it can be read back.",
                "summary": "Rename a firewall group",
                "parameters": [
                    {
                        "in": "path",
                        "name": "group_id",
                        "schema": {
                            "type": "integer"
                        },
                        "description": "The group's id.",
                        "required": true
                    },
                    {
                        "in": "path",
                        "name": "project_slug",
                        "schema": {
                            "type": "string"
                        },
                        "required": true
                    }
                ],
                "tags": [
                    "firewall-groups"
                ],
                "requestBody": {
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/PatchedFirewallGroupRenameRequest"
                            },
                            "examples": {
                                "NewName": {
                                    "value": {
                                        "name": "web-public"
                                    },
                                    "summary": "New name"
                                }
                            }
                        }
                    }
                },
                "security": [
                    {
                        "bearerAuth": []
                    }
                ],
                "responses": {
                    "200": {
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/FirewallGroup"
                                }
                            }
                        },
                        "description": ""
                    },
                    "400": {
                        "content": {
                            "application/problem+json": {
                                "schema": {
                                    "$ref": "#/components/schemas/ProblemDetails"
                                }
                            }
                        },
                        "description": "`validation_error`"
                    },
                    "403": {
                        "content": {
                            "application/problem+json": {
                                "schema": {
                                    "$ref": "#/components/schemas/ProblemDetails"
                                }
                            }
                        },
                        "description": "`read_only_key`, `billing_account_required`, `project_not_ready`"
                    },
                    "404": {
                        "content": {
                            "application/problem+json": {
                                "schema": {
                                    "$ref": "#/components/schemas/ProblemDetails"
                                }
                            }
                        },
                        "description": "`not_found`"
                    },
                    "409": {
                        "content": {
                            "application/problem+json": {
                                "schema": {
                                    "$ref": "#/components/schemas/ProblemDetails"
                                }
                            }
                        },
                        "description": "`name_taken`"
                    },
                    "502": {
                        "content": {
                            "application/problem+json": {
                                "schema": {
                                    "$ref": "#/components/schemas/ProblemDetails"
                                }
                            }
                        },
                        "description": "`upstream_error`"
                    },
                    "503": {
                        "content": {
                            "application/problem+json": {
                                "schema": {
                                    "$ref": "#/components/schemas/ProblemDetails"
                                }
                            }
                        },
                        "description": "`upstream_unavailable`"
                    }
                }
            },
            "delete": {
                "operationId": "firewall_groups_delete",
                "description": "Delete a group and its rules. A group still attached to servers answers `409 group_in_use` with their ids in `servers`: detach it from them first, since removing a group changes what those servers allow.",
                "summary": "Delete a firewall group",
                "parameters": [
                    {
                        "in": "path",
                        "name": "group_id",
                        "schema": {
                            "type": "integer"
                        },
                        "description": "The group's id.",
                        "required": true
                    },
                    {
                        "in": "path",
                        "name": "project_slug",
                        "schema": {
                            "type": "string"
                        },
                        "required": true
                    }
                ],
                "tags": [
                    "firewall-groups"
                ],
                "security": [
                    {
                        "bearerAuth": []
                    }
                ],
                "responses": {
                    "204": {
                        "description": "No response body"
                    },
                    "403": {
                        "content": {
                            "application/problem+json": {
                                "schema": {
                                    "$ref": "#/components/schemas/ProblemDetails"
                                }
                            }
                        },
                        "description": "`read_only_key`, `billing_account_required`, `project_not_ready`"
                    },
                    "404": {
                        "content": {
                            "application/problem+json": {
                                "schema": {
                                    "$ref": "#/components/schemas/ProblemDetails"
                                }
                            }
                        },
                        "description": "`not_found`"
                    },
                    "409": {
                        "content": {
                            "application/problem+json": {
                                "schema": {
                                    "$ref": "#/components/schemas/ProblemDetails"
                                }
                            }
                        },
                        "description": "`group_in_use`"
                    },
                    "502": {
                        "content": {
                            "application/problem+json": {
                                "schema": {
                                    "$ref": "#/components/schemas/ProblemDetails"
                                }
                            }
                        },
                        "description": "`upstream_error`"
                    },
                    "503": {
                        "content": {
                            "application/problem+json": {
                                "schema": {
                                    "$ref": "#/components/schemas/ProblemDetails"
                                }
                            }
                        },
                        "description": "`upstream_unavailable`"
                    }
                }
            }
        },
        "/projects/{project_slug}/firewall-groups/{group_id}/rules/": {
            "get": {
                "operationId": "firewall_rules_list",
                "description": "The rules of one of the project's firewall groups, lowest `priority` first.",
                "summary": "List a group's rules",
                "parameters": [
                    {
                        "in": "path",
                        "name": "group_id",
                        "schema": {
                            "type": "integer"
                        },
                        "description": "The group's id.",
                        "required": true
                    },
                    {
                        "name": "page",
                        "required": false,
                        "in": "query",
                        "description": "A page number within the paginated result set. A page past the end, or one that is not a number, answers 404 not_found.",
                        "schema": {
                            "type": "integer"
                        }
                    },
                    {
                        "name": "page_size",
                        "required": false,
                        "in": "query",
                        "description": "Number of results per page: 50 by default, at most 100.",
                        "schema": {
                            "type": "integer"
                        }
                    },
                    {
                        "in": "path",
                        "name": "project_slug",
                        "schema": {
                            "type": "string"
                        },
                        "required": true
                    }
                ],
                "tags": [
                    "firewall-groups"
                ],
                "security": [
                    {
                        "bearerAuth": []
                    }
                ],
                "responses": {
                    "200": {
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/PaginatedFirewallRuleList"
                                }
                            }
                        },
                        "description": ""
                    },
                    "403": {
                        "content": {
                            "application/problem+json": {
                                "schema": {
                                    "$ref": "#/components/schemas/ProblemDetails"
                                }
                            }
                        },
                        "description": "`billing_account_required`, `project_not_ready`"
                    },
                    "404": {
                        "content": {
                            "application/problem+json": {
                                "schema": {
                                    "$ref": "#/components/schemas/ProblemDetails"
                                }
                            }
                        },
                        "description": "`not_found`"
                    },
                    "502": {
                        "content": {
                            "application/problem+json": {
                                "schema": {
                                    "$ref": "#/components/schemas/ProblemDetails"
                                }
                            }
                        },
                        "description": "`upstream_error`"
                    },
                    "503": {
                        "content": {
                            "application/problem+json": {
                                "schema": {
                                    "$ref": "#/components/schemas/ProblemDetails"
                                }
                            }
                        },
                        "description": "`upstream_unavailable`"
                    }
                }
            },
            "post": {
                "operationId": "firewall_rules_create",
                "description": "Add a rule that allows the traffic it matches. Rules of an `ingress` group match on `source_cidr` and those of an `egress` group on `destination_cidr`; the other must be empty. A CIDR is answered in canonical form, and one with host bits set, such as `192.0.2.1/24`, is refused rather than read as `192.0.2.0/24`. A rule the group already has is `409 rule_exists` with that rule's id in `rule_id` (left out only when Raven refused the rule and the group could not be read back), so a create whose response was lost can be sent again. Rules are the same when they have the same protocol, the same ports (no ports and 1 to 65535 both mean every port, and a `port_min` alone is that one port) and the same CIDR for the group's direction, however it is spelled.",
                "summary": "Add a rule to a group",
                "parameters": [
                    {
                        "in": "path",
                        "name": "group_id",
                        "schema": {
                            "type": "integer"
                        },
                        "description": "The group's id.",
                        "required": true
                    },
                    {
                        "in": "path",
                        "name": "project_slug",
                        "schema": {
                            "type": "string"
                        },
                        "required": true
                    }
                ],
                "tags": [
                    "firewall-groups"
                ],
                "requestBody": {
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/FirewallRuleRequest"
                            },
                            "examples": {
                                "HTTPSFromAnywhere": {
                                    "value": {
                                        "protocol": "tcp",
                                        "port_min": 443,
                                        "port_max": 443,
                                        "source_cidr": "0.0.0.0/0",
                                        "destination_cidr": null,
                                        "priority": 1000,
                                        "comment": "HTTPS"
                                    },
                                    "summary": "HTTPS from anywhere"
                                },
                                "SSHFromOneNetwork": {
                                    "value": {
                                        "protocol": "tcp",
                                        "port_min": 22,
                                        "source_cidr": "198.51.100.0/24",
                                        "comment": "Office"
                                    },
                                    "summary": "SSH from one network"
                                }
                            }
                        }
                    },
                    "required": true
                },
                "security": [
                    {
                        "bearerAuth": []
                    }
                ],
                "responses": {
                    "201": {
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/FirewallRule"
                                },
                                "examples": {
                                    "Created": {
                                        "value": {
                                            "id": 9002,
                                            "protocol": "tcp",
                                            "port_min": 443,
                                            "port_max": 443,
                                            "source_cidr": "0.0.0.0/0",
                                            "destination_cidr": null,
                                            "priority": 1000,
                                            "comment": "HTTPS"
                                        }
                                    }
                                }
                            }
                        },
                        "description": ""
                    },
                    "400": {
                        "content": {
                            "application/problem+json": {
                                "schema": {
                                    "$ref": "#/components/schemas/ProblemDetails"
                                }
                            }
                        },
                        "description": "`validation_error`"
                    },
                    "403": {
                        "content": {
                            "application/problem+json": {
                                "schema": {
                                    "$ref": "#/components/schemas/ProblemDetails"
                                }
                            }
                        },
                        "description": "`read_only_key`, `billing_account_required`, `project_not_ready`"
                    },
                    "404": {
                        "content": {
                            "application/problem+json": {
                                "schema": {
                                    "$ref": "#/components/schemas/ProblemDetails"
                                }
                            }
                        },
                        "description": "`not_found`"
                    },
                    "409": {
                        "content": {
                            "application/problem+json": {
                                "schema": {
                                    "$ref": "#/components/schemas/ProblemDetails"
                                }
                            }
                        },
                        "description": "`rule_exists`"
                    },
                    "502": {
                        "content": {
                            "application/problem+json": {
                                "schema": {
                                    "$ref": "#/components/schemas/ProblemDetails"
                                }
                            }
                        },
                        "description": "`upstream_error`"
                    },
                    "503": {
                        "content": {
                            "application/problem+json": {
                                "schema": {
                                    "$ref": "#/components/schemas/ProblemDetails"
                                }
                            }
                        },
                        "description": "`upstream_unavailable`"
                    }
                }
            }
        },
        "/projects/{project_slug}/firewall-groups/{group_id}/rules/{rule_id}/": {
            "get": {
                "operationId": "firewall_rules_retrieve",
                "description": "One rule of one of the project's firewall groups.",
                "summary": "Get a rule",
                "parameters": [
                    {
                        "in": "path",
                        "name": "group_id",
                        "schema": {
                            "type": "integer"
                        },
                        "description": "The group's id.",
                        "required": true
                    },
                    {
                        "in": "path",
                        "name": "project_slug",
                        "schema": {
                            "type": "string"
                        },
                        "required": true
                    },
                    {
                        "in": "path",
                        "name": "rule_id",
                        "schema": {
                            "type": "integer"
                        },
                        "description": "The rule's id.",
                        "required": true
                    }
                ],
                "tags": [
                    "firewall-groups"
                ],
                "security": [
                    {
                        "bearerAuth": []
                    }
                ],
                "responses": {
                    "200": {
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/FirewallRule"
                                },
                                "examples": {
                                    "ARule": {
                                        "value": {
                                            "id": 9002,
                                            "protocol": "tcp",
                                            "port_min": 443,
                                            "port_max": 443,
                                            "source_cidr": "0.0.0.0/0",
                                            "destination_cidr": null,
                                            "priority": 1000,
                                            "comment": "HTTPS"
                                        },
                                        "summary": "A rule"
                                    }
                                }
                            }
                        },
                        "description": ""
                    },
                    "403": {
                        "content": {
                            "application/problem+json": {
                                "schema": {
                                    "$ref": "#/components/schemas/ProblemDetails"
                                }
                            }
                        },
                        "description": "`billing_account_required`, `project_not_ready`"
                    },
                    "404": {
                        "content": {
                            "application/problem+json": {
                                "schema": {
                                    "$ref": "#/components/schemas/ProblemDetails"
                                }
                            }
                        },
                        "description": "`not_found`"
                    },
                    "502": {
                        "content": {
                            "application/problem+json": {
                                "schema": {
                                    "$ref": "#/components/schemas/ProblemDetails"
                                }
                            }
                        },
                        "description": "`upstream_error`"
                    },
                    "503": {
                        "content": {
                            "application/problem+json": {
                                "schema": {
                                    "$ref": "#/components/schemas/ProblemDetails"
                                }
                            }
                        },
                        "description": "`upstream_unavailable`"
                    }
                }
            },
            "patch": {
                "operationId": "firewall_rules_update",
                "description": "Change some of a rule's fields; the others keep their values. The rule that results is checked as a whole, so changing `protocol` to `icmp` or `any` also needs `port_min` and `port_max` set to null. Making it the same as another rule of the group is `409 rule_exists`, with that rule's id in `rule_id` when it can be read back.",
                "summary": "Change a rule",
                "parameters": [
                    {
                        "in": "path",
                        "name": "group_id",
                        "schema": {
                            "type": "integer"
                        },
                        "description": "The group's id.",
                        "required": true
                    },
                    {
                        "in": "path",
                        "name": "project_slug",
                        "schema": {
                            "type": "string"
                        },
                        "required": true
                    },
                    {
                        "in": "path",
                        "name": "rule_id",
                        "schema": {
                            "type": "integer"
                        },
                        "description": "The rule's id.",
                        "required": true
                    }
                ],
                "tags": [
                    "firewall-groups"
                ],
                "requestBody": {
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/PatchedFirewallRuleRequest"
                            },
                            "examples": {
                                "ANarrowerSource": {
                                    "value": {
                                        "source_cidr": "203.0.113.0/24"
                                    },
                                    "summary": "A narrower source"
                                }
                            }
                        }
                    }
                },
                "security": [
                    {
                        "bearerAuth": []
                    }
                ],
                "responses": {
                    "200": {
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/FirewallRule"
                                }
                            }
                        },
                        "description": ""
                    },
                    "400": {
                        "content": {
                            "application/problem+json": {
                                "schema": {
                                    "$ref": "#/components/schemas/ProblemDetails"
                                }
                            }
                        },
                        "description": "`validation_error`"
                    },
                    "403": {
                        "content": {
                            "application/problem+json": {
                                "schema": {
                                    "$ref": "#/components/schemas/ProblemDetails"
                                }
                            }
                        },
                        "description": "`read_only_key`, `billing_account_required`, `project_not_ready`"
                    },
                    "404": {
                        "content": {
                            "application/problem+json": {
                                "schema": {
                                    "$ref": "#/components/schemas/ProblemDetails"
                                }
                            }
                        },
                        "description": "`not_found`"
                    },
                    "409": {
                        "content": {
                            "application/problem+json": {
                                "schema": {
                                    "$ref": "#/components/schemas/ProblemDetails"
                                }
                            }
                        },
                        "description": "`rule_exists`"
                    },
                    "502": {
                        "content": {
                            "application/problem+json": {
                                "schema": {
                                    "$ref": "#/components/schemas/ProblemDetails"
                                }
                            }
                        },
                        "description": "`upstream_error`"
                    },
                    "503": {
                        "content": {
                            "application/problem+json": {
                                "schema": {
                                    "$ref": "#/components/schemas/ProblemDetails"
                                }
                            }
                        },
                        "description": "`upstream_unavailable`"
                    }
                }
            },
            "delete": {
                "operationId": "firewall_rules_delete",
                "description": "Remove a rule from its group. The traffic it allowed is refused unless another rule allows it.",
                "summary": "Delete a rule",
                "parameters": [
                    {
                        "in": "path",
                        "name": "group_id",
                        "schema": {
                            "type": "integer"
                        },
                        "description": "The group's id.",
                        "required": true
                    },
                    {
                        "in": "path",
                        "name": "project_slug",
                        "schema": {
                            "type": "string"
                        },
                        "required": true
                    },
                    {
                        "in": "path",
                        "name": "rule_id",
                        "schema": {
                            "type": "integer"
                        },
                        "description": "The rule's id.",
                        "required": true
                    }
                ],
                "tags": [
                    "firewall-groups"
                ],
                "security": [
                    {
                        "bearerAuth": []
                    }
                ],
                "responses": {
                    "204": {
                        "description": "No response body"
                    },
                    "403": {
                        "content": {
                            "application/problem+json": {
                                "schema": {
                                    "$ref": "#/components/schemas/ProblemDetails"
                                }
                            }
                        },
                        "description": "`read_only_key`, `billing_account_required`, `project_not_ready`"
                    },
                    "404": {
                        "content": {
                            "application/problem+json": {
                                "schema": {
                                    "$ref": "#/components/schemas/ProblemDetails"
                                }
                            }
                        },
                        "description": "`not_found`"
                    },
                    "502": {
                        "content": {
                            "application/problem+json": {
                                "schema": {
                                    "$ref": "#/components/schemas/ProblemDetails"
                                }
                            }
                        },
                        "description": "`upstream_error`"
                    },
                    "503": {
                        "content": {
                            "application/problem+json": {
                                "schema": {
                                    "$ref": "#/components/schemas/ProblemDetails"
                                }
                            }
                        },
                        "description": "`upstream_unavailable`"
                    }
                }
            }
        },
        "/projects/{project_slug}/invitations/": {
            "get": {
                "operationId": "invitations_list",
                "parameters": [
                    {
                        "name": "page",
                        "required": false,
                        "in": "query",
                        "description": "A page number within the paginated result set. A page past the end, or one that is not a number, answers 404 not_found.",
                        "schema": {
                            "type": "integer"
                        }
                    },
                    {
                        "name": "page_size",
                        "required": false,
                        "in": "query",
                        "description": "Number of results per page: 50 by default, at most 100.",
                        "schema": {
                            "type": "integer"
                        }
                    },
                    {
                        "in": "path",
                        "name": "project_slug",
                        "schema": {
                            "type": "string"
                        },
                        "required": true
                    }
                ],
                "tags": [
                    "projects"
                ],
                "security": [
                    {
                        "bearerAuth": []
                    }
                ],
                "responses": {
                    "200": {
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/PaginatedInvitationList"
                                }
                            }
                        },
                        "description": ""
                    }
                }
            },
            "post": {
                "operationId": "invitations_create",
                "parameters": [
                    {
                        "in": "path",
                        "name": "project_slug",
                        "schema": {
                            "type": "string"
                        },
                        "required": true
                    }
                ],
                "tags": [
                    "projects"
                ],
                "requestBody": {
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/InvitationRequest"
                            }
                        }
                    },
                    "required": true
                },
                "security": [
                    {
                        "bearerAuth": []
                    }
                ],
                "responses": {
                    "201": {
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Invitation"
                                }
                            }
                        },
                        "description": ""
                    }
                }
            }
        },
        "/projects/{project_slug}/invitations/{id}/": {
            "get": {
                "operationId": "invitations_retrieve",
                "parameters": [
                    {
                        "in": "path",
                        "name": "id",
                        "schema": {
                            "type": "string",
                            "format": "uuid"
                        },
                        "description": "A UUID string identifying this invitation.",
                        "required": true
                    },
                    {
                        "in": "path",
                        "name": "project_slug",
                        "schema": {
                            "type": "string"
                        },
                        "required": true
                    }
                ],
                "tags": [
                    "projects"
                ],
                "security": [
                    {
                        "bearerAuth": []
                    }
                ],
                "responses": {
                    "200": {
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Invitation"
                                }
                            }
                        },
                        "description": ""
                    }
                }
            },
            "put": {
                "operationId": "invitations_update",
                "parameters": [
                    {
                        "in": "path",
                        "name": "id",
                        "schema": {
                            "type": "string",
                            "format": "uuid"
                        },
                        "description": "A UUID string identifying this invitation.",
                        "required": true
                    },
                    {
                        "in": "path",
                        "name": "project_slug",
                        "schema": {
                            "type": "string"
                        },
                        "required": true
                    }
                ],
                "tags": [
                    "projects"
                ],
                "requestBody": {
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/InvitationRequest"
                            }
                        }
                    },
                    "required": true
                },
                "security": [
                    {
                        "bearerAuth": []
                    }
                ],
                "responses": {
                    "200": {
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Invitation"
                                }
                            }
                        },
                        "description": ""
                    }
                }
            },
            "patch": {
                "operationId": "invitations_partial_update",
                "parameters": [
                    {
                        "in": "path",
                        "name": "id",
                        "schema": {
                            "type": "string",
                            "format": "uuid"
                        },
                        "description": "A UUID string identifying this invitation.",
                        "required": true
                    },
                    {
                        "in": "path",
                        "name": "project_slug",
                        "schema": {
                            "type": "string"
                        },
                        "required": true
                    }
                ],
                "tags": [
                    "projects"
                ],
                "requestBody": {
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/PatchedInvitationRequest"
                            }
                        }
                    }
                },
                "security": [
                    {
                        "bearerAuth": []
                    }
                ],
                "responses": {
                    "200": {
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Invitation"
                                }
                            }
                        },
                        "description": ""
                    }
                }
            },
            "delete": {
                "operationId": "invitations_destroy",
                "parameters": [
                    {
                        "in": "path",
                        "name": "id",
                        "schema": {
                            "type": "string",
                            "format": "uuid"
                        },
                        "description": "A UUID string identifying this invitation.",
                        "required": true
                    },
                    {
                        "in": "path",
                        "name": "project_slug",
                        "schema": {
                            "type": "string"
                        },
                        "required": true
                    }
                ],
                "tags": [
                    "projects"
                ],
                "security": [
                    {
                        "bearerAuth": []
                    }
                ],
                "responses": {
                    "204": {
                        "description": "No response body"
                    }
                }
            }
        },
        "/projects/{project_slug}/products/": {
            "get": {
                "operationId": "products_list",
                "description": "The orderable product catalogue, with the config option ids needed to place an order.",
                "parameters": [
                    {
                        "in": "path",
                        "name": "project_slug",
                        "schema": {
                            "type": "string"
                        },
                        "required": true
                    }
                ],
                "tags": [
                    "catalogue"
                ],
                "security": [
                    {
                        "bearerAuth": []
                    }
                ],
                "responses": {
                    "200": {
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Products"
                                }
                            }
                        },
                        "description": ""
                    }
                }
            }
        },
        "/projects/{project_slug}/servers/": {
            "get": {
                "operationId": "servers_list",
                "description": "The project's servers, as summaries. Fetch a server for its network, plan and billing.",
                "parameters": [
                    {
                        "name": "page",
                        "required": false,
                        "in": "query",
                        "description": "A page number within the paginated result set. A page past the end, or one that is not a number, answers 404 not_found.",
                        "schema": {
                            "type": "integer"
                        }
                    },
                    {
                        "name": "page_size",
                        "required": false,
                        "in": "query",
                        "description": "Number of results per page: 50 by default, at most 100.",
                        "schema": {
                            "type": "integer"
                        }
                    },
                    {
                        "in": "path",
                        "name": "project_slug",
                        "schema": {
                            "type": "string"
                        },
                        "required": true
                    }
                ],
                "tags": [
                    "servers"
                ],
                "security": [
                    {
                        "bearerAuth": []
                    }
                ],
                "responses": {
                    "200": {
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/PaginatedServerSummaryList"
                                }
                            }
                        },
                        "description": ""
                    },
                    "403": {
                        "content": {
                            "application/problem+json": {
                                "schema": {
                                    "$ref": "#/components/schemas/ProblemDetails"
                                }
                            }
                        },
                        "description": "`billing_account_required`, `project_not_ready`"
                    },
                    "404": {
                        "content": {
                            "application/problem+json": {
                                "schema": {
                                    "$ref": "#/components/schemas/ProblemDetails"
                                }
                            }
                        },
                        "description": "`not_found`"
                    },
                    "502": {
                        "content": {
                            "application/problem+json": {
                                "schema": {
                                    "$ref": "#/components/schemas/ProblemDetails"
                                }
                            }
                        },
                        "description": "`upstream_error`"
                    },
                    "503": {
                        "content": {
                            "application/problem+json": {
                                "schema": {
                                    "$ref": "#/components/schemas/ProblemDetails"
                                }
                            }
                        },
                        "description": "`upstream_unavailable`"
                    }
                }
            }
        },
        "/projects/{project_slug}/servers/{server_id}/": {
            "get": {
                "operationId": "servers_retrieve",
                "description": "One server. `billing` and `firewall_groups` are null when they could not be read just now; the rest of the server is still returned.",
                "parameters": [
                    {
                        "in": "path",
                        "name": "project_slug",
                        "schema": {
                            "type": "string"
                        },
                        "required": true
                    },
                    {
                        "in": "path",
                        "name": "server_id",
                        "schema": {
                            "type": "string",
                            "pattern": "^[0-9a-f]{1,32}$"
                        },
                        "required": true
                    }
                ],
                "tags": [
                    "servers"
                ],
                "security": [
                    {
                        "bearerAuth": []
                    }
                ],
                "responses": {
                    "200": {
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Server"
                                }
                            }
                        },
                        "description": ""
                    },
                    "403": {
                        "content": {
                            "application/problem+json": {
                                "schema": {
                                    "$ref": "#/components/schemas/ProblemDetails"
                                }
                            }
                        },
                        "description": "`billing_account_required`, `project_not_ready`"
                    },
                    "404": {
                        "content": {
                            "application/problem+json": {
                                "schema": {
                                    "$ref": "#/components/schemas/ProblemDetails"
                                }
                            }
                        },
                        "description": "`not_found`"
                    },
                    "502": {
                        "content": {
                            "application/problem+json": {
                                "schema": {
                                    "$ref": "#/components/schemas/ProblemDetails"
                                }
                            }
                        },
                        "description": "`upstream_error`"
                    },
                    "503": {
                        "content": {
                            "application/problem+json": {
                                "schema": {
                                    "$ref": "#/components/schemas/ProblemDetails"
                                }
                            }
                        },
                        "description": "`upstream_unavailable`"
                    }
                }
            },
            "patch": {
                "operationId": "servers_update",
                "description": "Rename the server. Its hostname is the only property that can change.",
                "parameters": [
                    {
                        "in": "path",
                        "name": "project_slug",
                        "schema": {
                            "type": "string"
                        },
                        "required": true
                    },
                    {
                        "in": "path",
                        "name": "server_id",
                        "schema": {
                            "type": "string",
                            "pattern": "^[0-9a-f]{1,32}$"
                        },
                        "required": true
                    }
                ],
                "tags": [
                    "servers"
                ],
                "requestBody": {
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/PatchedServerUpdateRequest"
                            }
                        }
                    }
                },
                "security": [
                    {
                        "bearerAuth": []
                    }
                ],
                "responses": {
                    "200": {
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Server"
                                }
                            }
                        },
                        "description": ""
                    },
                    "400": {
                        "content": {
                            "application/problem+json": {
                                "schema": {
                                    "$ref": "#/components/schemas/ProblemDetails"
                                }
                            }
                        },
                        "description": "`validation_error`"
                    },
                    "403": {
                        "content": {
                            "application/problem+json": {
                                "schema": {
                                    "$ref": "#/components/schemas/ProblemDetails"
                                }
                            }
                        },
                        "description": "`read_only_key`, `billing_account_required`, `project_not_ready`"
                    },
                    "404": {
                        "content": {
                            "application/problem+json": {
                                "schema": {
                                    "$ref": "#/components/schemas/ProblemDetails"
                                }
                            }
                        },
                        "description": "`not_found`"
                    },
                    "502": {
                        "content": {
                            "application/problem+json": {
                                "schema": {
                                    "$ref": "#/components/schemas/ProblemDetails"
                                }
                            }
                        },
                        "description": "`upstream_error`"
                    },
                    "503": {
                        "content": {
                            "application/problem+json": {
                                "schema": {
                                    "$ref": "#/components/schemas/ProblemDetails"
                                }
                            }
                        },
                        "description": "`upstream_unavailable`"
                    }
                }
            }
        },
        "/projects/{project_slug}/servers/{server_id}/actions/": {
            "get": {
                "operationId": "servers_actions_list",
                "description": "The actions run on one server, newest first, and the endpoints that start them. Each start\nanswers 202 with the Action to poll; one exclusive action (power, reinstall, snapshots, ISOs)\nruns per server at a time, and a second one answers 409 action_in_progress with its id.",
                "parameters": [
                    {
                        "name": "page",
                        "required": false,
                        "in": "query",
                        "description": "A page number within the paginated result set. A page past the end, or one that is not a number, answers 404 not_found.",
                        "schema": {
                            "type": "integer"
                        }
                    },
                    {
                        "name": "page_size",
                        "required": false,
                        "in": "query",
                        "description": "Number of results per page: 50 by default, at most 100.",
                        "schema": {
                            "type": "integer"
                        }
                    },
                    {
                        "in": "path",
                        "name": "project_slug",
                        "schema": {
                            "type": "string"
                        },
                        "required": true
                    },
                    {
                        "in": "path",
                        "name": "server_id",
                        "schema": {
                            "type": "string",
                            "pattern": "^[0-9a-f]{1,32}$"
                        },
                        "required": true
                    }
                ],
                "tags": [
                    "actions"
                ],
                "security": [
                    {
                        "bearerAuth": []
                    }
                ],
                "responses": {
                    "200": {
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/PaginatedActionList"
                                }
                            }
                        },
                        "description": ""
                    },
                    "403": {
                        "content": {
                            "application/problem+json": {
                                "schema": {
                                    "$ref": "#/components/schemas/ProblemDetails"
                                }
                            }
                        },
                        "description": "`billing_account_required`, `project_not_ready`"
                    },
                    "404": {
                        "content": {
                            "application/problem+json": {
                                "schema": {
                                    "$ref": "#/components/schemas/ProblemDetails"
                                }
                            }
                        },
                        "description": "`not_found`"
                    },
                    "502": {
                        "content": {
                            "application/problem+json": {
                                "schema": {
                                    "$ref": "#/components/schemas/ProblemDetails"
                                }
                            }
                        },
                        "description": "`upstream_error`"
                    }
                }
            }
        },
        "/projects/{project_slug}/servers/{server_id}/actions/enable-ipv6/": {
            "post": {
                "operationId": "servers_enable_ipv6",
                "description": "Route an IPv6 /64 subnet to the server. The subnet is in the action's `result.subnet` as soon as it is assigned; the action succeeds once the network is set up for it.",
                "parameters": [
                    {
                        "in": "header",
                        "name": "Idempotency-Key",
                        "schema": {
                            "type": "string"
                        },
                        "description": "1 to 64 characters. Repeating a request with the same key and body answers with the action it started, whatever state that reached, with status 200 and `Idempotent-Replayed: true`."
                    },
                    {
                        "in": "path",
                        "name": "project_slug",
                        "schema": {
                            "type": "string"
                        },
                        "required": true
                    },
                    {
                        "in": "path",
                        "name": "server_id",
                        "schema": {
                            "type": "string",
                            "pattern": "^[0-9a-f]{1,32}$"
                        },
                        "required": true
                    }
                ],
                "tags": [
                    "actions"
                ],
                "security": [
                    {
                        "bearerAuth": []
                    }
                ],
                "responses": {
                    "202": {
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Action"
                                }
                            }
                        },
                        "description": ""
                    },
                    "200": {
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Action"
                                }
                            }
                        },
                        "description": "A replay of an earlier request with the same key."
                    },
                    "400": {
                        "content": {
                            "application/problem+json": {
                                "schema": {
                                    "$ref": "#/components/schemas/ProblemDetails"
                                }
                            }
                        },
                        "description": "`validation_error`"
                    },
                    "403": {
                        "content": {
                            "application/problem+json": {
                                "schema": {
                                    "$ref": "#/components/schemas/ProblemDetails"
                                }
                            }
                        },
                        "description": "`read_only_key`, `billing_account_required`, `project_not_ready`"
                    },
                    "404": {
                        "content": {
                            "application/problem+json": {
                                "schema": {
                                    "$ref": "#/components/schemas/ProblemDetails"
                                }
                            }
                        },
                        "description": "`not_found`"
                    },
                    "409": {
                        "content": {
                            "application/problem+json": {
                                "schema": {
                                    "$ref": "#/components/schemas/ProblemDetails"
                                }
                            }
                        },
                        "description": "`idempotency_key_reused`, `already_enabled`, `insufficient_capacity`"
                    },
                    "502": {
                        "content": {
                            "application/problem+json": {
                                "schema": {
                                    "$ref": "#/components/schemas/ProblemDetails"
                                }
                            }
                        },
                        "description": "`upstream_error`"
                    },
                    "503": {
                        "content": {
                            "application/problem+json": {
                                "schema": {
                                    "$ref": "#/components/schemas/ProblemDetails"
                                }
                            }
                        },
                        "description": "`node_maintenance`"
                    }
                }
            }
        },
        "/projects/{project_slug}/servers/{server_id}/actions/enable-private-network/": {
            "post": {
                "operationId": "servers_enable_private_network",
                "description": "Attach the server to the private network shared by your servers in its location. The action succeeds at once, but the interface appears on the server's next start or reboot through this API; configure its address inside the server.",
                "parameters": [
                    {
                        "in": "header",
                        "name": "Idempotency-Key",
                        "schema": {
                            "type": "string"
                        },
                        "description": "1 to 64 characters. Repeating a request with the same key and body answers with the action it started, whatever state that reached, with status 200 and `Idempotent-Replayed: true`."
                    },
                    {
                        "in": "path",
                        "name": "project_slug",
                        "schema": {
                            "type": "string"
                        },
                        "required": true
                    },
                    {
                        "in": "path",
                        "name": "server_id",
                        "schema": {
                            "type": "string",
                            "pattern": "^[0-9a-f]{1,32}$"
                        },
                        "required": true
                    }
                ],
                "tags": [
                    "actions"
                ],
                "security": [
                    {
                        "bearerAuth": []
                    }
                ],
                "responses": {
                    "202": {
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Action"
                                }
                            }
                        },
                        "description": ""
                    },
                    "200": {
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Action"
                                }
                            }
                        },
                        "description": "A replay of an earlier request with the same key."
                    },
                    "400": {
                        "content": {
                            "application/problem+json": {
                                "schema": {
                                    "$ref": "#/components/schemas/ProblemDetails"
                                }
                            }
                        },
                        "description": "`validation_error`"
                    },
                    "403": {
                        "content": {
                            "application/problem+json": {
                                "schema": {
                                    "$ref": "#/components/schemas/ProblemDetails"
                                }
                            }
                        },
                        "description": "`read_only_key`, `billing_account_required`, `project_not_ready`"
                    },
                    "404": {
                        "content": {
                            "application/problem+json": {
                                "schema": {
                                    "$ref": "#/components/schemas/ProblemDetails"
                                }
                            }
                        },
                        "description": "`not_found`"
                    },
                    "409": {
                        "content": {
                            "application/problem+json": {
                                "schema": {
                                    "$ref": "#/components/schemas/ProblemDetails"
                                }
                            }
                        },
                        "description": "`idempotency_key_reused`, `not_eligible`, `already_enabled`"
                    },
                    "502": {
                        "content": {
                            "application/problem+json": {
                                "schema": {
                                    "$ref": "#/components/schemas/ProblemDetails"
                                }
                            }
                        },
                        "description": "`upstream_error`"
                    },
                    "503": {
                        "content": {
                            "application/problem+json": {
                                "schema": {
                                    "$ref": "#/components/schemas/ProblemDetails"
                                }
                            }
                        },
                        "description": "`node_maintenance`"
                    }
                }
            }
        },
        "/projects/{project_slug}/servers/{server_id}/actions/power-off/": {
            "post": {
                "operationId": "servers_power_off",
                "description": "Cut the power at once, as pulling the plug would. Unsaved data in the server is lost.",
                "parameters": [
                    {
                        "in": "header",
                        "name": "Idempotency-Key",
                        "schema": {
                            "type": "string"
                        },
                        "description": "1 to 64 characters. Repeating a request with the same key and body answers with the action it started, whatever state that reached, with status 200 and `Idempotent-Replayed: true`."
                    },
                    {
                        "in": "path",
                        "name": "project_slug",
                        "schema": {
                            "type": "string"
                        },
                        "required": true
                    },
                    {
                        "in": "path",
                        "name": "server_id",
                        "schema": {
                            "type": "string",
                            "pattern": "^[0-9a-f]{1,32}$"
                        },
                        "required": true
                    }
                ],
                "tags": [
                    "actions"
                ],
                "security": [
                    {
                        "bearerAuth": []
                    }
                ],
                "responses": {
                    "202": {
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Action"
                                }
                            }
                        },
                        "description": ""
                    },
                    "200": {
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Action"
                                }
                            }
                        },
                        "description": "A replay of an earlier request with the same key."
                    },
                    "400": {
                        "content": {
                            "application/problem+json": {
                                "schema": {
                                    "$ref": "#/components/schemas/ProblemDetails"
                                }
                            }
                        },
                        "description": "`validation_error`"
                    },
                    "403": {
                        "content": {
                            "application/problem+json": {
                                "schema": {
                                    "$ref": "#/components/schemas/ProblemDetails"
                                }
                            }
                        },
                        "description": "`read_only_key`, `billing_account_required`, `project_not_ready`"
                    },
                    "404": {
                        "content": {
                            "application/problem+json": {
                                "schema": {
                                    "$ref": "#/components/schemas/ProblemDetails"
                                }
                            }
                        },
                        "description": "`not_found`"
                    },
                    "409": {
                        "content": {
                            "application/problem+json": {
                                "schema": {
                                    "$ref": "#/components/schemas/ProblemDetails"
                                }
                            }
                        },
                        "description": "`idempotency_key_reused`, `action_in_progress`, `conflict`"
                    },
                    "502": {
                        "content": {
                            "application/problem+json": {
                                "schema": {
                                    "$ref": "#/components/schemas/ProblemDetails"
                                }
                            }
                        },
                        "description": "`upstream_error`"
                    },
                    "503": {
                        "content": {
                            "application/problem+json": {
                                "schema": {
                                    "$ref": "#/components/schemas/ProblemDetails"
                                }
                            }
                        },
                        "description": "`node_maintenance`"
                    }
                }
            }
        },
        "/projects/{project_slug}/servers/{server_id}/actions/power-on/": {
            "post": {
                "operationId": "servers_power_on",
                "description": "Start the server.",
                "parameters": [
                    {
                        "in": "header",
                        "name": "Idempotency-Key",
                        "schema": {
                            "type": "string"
                        },
                        "description": "1 to 64 characters. Repeating a request with the same key and body answers with the action it started, whatever state that reached, with status 200 and `Idempotent-Replayed: true`."
                    },
                    {
                        "in": "path",
                        "name": "project_slug",
                        "schema": {
                            "type": "string"
                        },
                        "required": true
                    },
                    {
                        "in": "path",
                        "name": "server_id",
                        "schema": {
                            "type": "string",
                            "pattern": "^[0-9a-f]{1,32}$"
                        },
                        "required": true
                    }
                ],
                "tags": [
                    "actions"
                ],
                "security": [
                    {
                        "bearerAuth": []
                    }
                ],
                "responses": {
                    "202": {
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Action"
                                }
                            }
                        },
                        "description": ""
                    },
                    "200": {
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Action"
                                }
                            }
                        },
                        "description": "A replay of an earlier request with the same key."
                    },
                    "400": {
                        "content": {
                            "application/problem+json": {
                                "schema": {
                                    "$ref": "#/components/schemas/ProblemDetails"
                                }
                            }
                        },
                        "description": "`validation_error`"
                    },
                    "403": {
                        "content": {
                            "application/problem+json": {
                                "schema": {
                                    "$ref": "#/components/schemas/ProblemDetails"
                                }
                            }
                        },
                        "description": "`read_only_key`, `billing_account_required`, `project_not_ready`"
                    },
                    "404": {
                        "content": {
                            "application/problem+json": {
                                "schema": {
                                    "$ref": "#/components/schemas/ProblemDetails"
                                }
                            }
                        },
                        "description": "`not_found`"
                    },
                    "409": {
                        "content": {
                            "application/problem+json": {
                                "schema": {
                                    "$ref": "#/components/schemas/ProblemDetails"
                                }
                            }
                        },
                        "description": "`idempotency_key_reused`, `action_in_progress`, `conflict`"
                    },
                    "502": {
                        "content": {
                            "application/problem+json": {
                                "schema": {
                                    "$ref": "#/components/schemas/ProblemDetails"
                                }
                            }
                        },
                        "description": "`upstream_error`"
                    },
                    "503": {
                        "content": {
                            "application/problem+json": {
                                "schema": {
                                    "$ref": "#/components/schemas/ProblemDetails"
                                }
                            }
                        },
                        "description": "`node_maintenance`"
                    }
                }
            }
        },
        "/projects/{project_slug}/servers/{server_id}/actions/reboot/": {
            "post": {
                "operationId": "servers_reboot",
                "description": "Reboot the server. A server with `pending_changes` has them applied by this reboot.",
                "parameters": [
                    {
                        "in": "header",
                        "name": "Idempotency-Key",
                        "schema": {
                            "type": "string"
                        },
                        "description": "1 to 64 characters. Repeating a request with the same key and body answers with the action it started, whatever state that reached, with status 200 and `Idempotent-Replayed: true`."
                    },
                    {
                        "in": "path",
                        "name": "project_slug",
                        "schema": {
                            "type": "string"
                        },
                        "required": true
                    },
                    {
                        "in": "path",
                        "name": "server_id",
                        "schema": {
                            "type": "string",
                            "pattern": "^[0-9a-f]{1,32}$"
                        },
                        "required": true
                    }
                ],
                "tags": [
                    "actions"
                ],
                "security": [
                    {
                        "bearerAuth": []
                    }
                ],
                "responses": {
                    "202": {
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Action"
                                }
                            }
                        },
                        "description": ""
                    },
                    "200": {
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Action"
                                }
                            }
                        },
                        "description": "A replay of an earlier request with the same key."
                    },
                    "400": {
                        "content": {
                            "application/problem+json": {
                                "schema": {
                                    "$ref": "#/components/schemas/ProblemDetails"
                                }
                            }
                        },
                        "description": "`validation_error`"
                    },
                    "403": {
                        "content": {
                            "application/problem+json": {
                                "schema": {
                                    "$ref": "#/components/schemas/ProblemDetails"
                                }
                            }
                        },
                        "description": "`read_only_key`, `billing_account_required`, `project_not_ready`"
                    },
                    "404": {
                        "content": {
                            "application/problem+json": {
                                "schema": {
                                    "$ref": "#/components/schemas/ProblemDetails"
                                }
                            }
                        },
                        "description": "`not_found`"
                    },
                    "409": {
                        "content": {
                            "application/problem+json": {
                                "schema": {
                                    "$ref": "#/components/schemas/ProblemDetails"
                                }
                            }
                        },
                        "description": "`idempotency_key_reused`, `action_in_progress`, `conflict`"
                    },
                    "502": {
                        "content": {
                            "application/problem+json": {
                                "schema": {
                                    "$ref": "#/components/schemas/ProblemDetails"
                                }
                            }
                        },
                        "description": "`upstream_error`"
                    },
                    "503": {
                        "content": {
                            "application/problem+json": {
                                "schema": {
                                    "$ref": "#/components/schemas/ProblemDetails"
                                }
                            }
                        },
                        "description": "`node_maintenance`"
                    }
                }
            }
        },
        "/projects/{project_slug}/servers/{server_id}/actions/reinstall/": {
            "post": {
                "operationId": "servers_reinstall",
                "description": "Erase the server's disk and install an image on it, with the given SSH keys. Everything on the disk is lost.",
                "parameters": [
                    {
                        "in": "header",
                        "name": "Idempotency-Key",
                        "schema": {
                            "type": "string"
                        },
                        "description": "1 to 64 characters. Repeating a request with the same key and body answers with the action it started, whatever state that reached, with status 200 and `Idempotent-Replayed: true`."
                    },
                    {
                        "in": "path",
                        "name": "project_slug",
                        "schema": {
                            "type": "string"
                        },
                        "required": true
                    },
                    {
                        "in": "path",
                        "name": "server_id",
                        "schema": {
                            "type": "string",
                            "pattern": "^[0-9a-f]{1,32}$"
                        },
                        "required": true
                    }
                ],
                "tags": [
                    "actions"
                ],
                "requestBody": {
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/ReinstallRequest"
                            }
                        }
                    },
                    "required": true
                },
                "security": [
                    {
                        "bearerAuth": []
                    }
                ],
                "responses": {
                    "202": {
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Action"
                                }
                            }
                        },
                        "description": ""
                    },
                    "200": {
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Action"
                                }
                            }
                        },
                        "description": "A replay of an earlier request with the same key."
                    },
                    "400": {
                        "content": {
                            "application/problem+json": {
                                "schema": {
                                    "$ref": "#/components/schemas/ProblemDetails"
                                }
                            }
                        },
                        "description": "`validation_error`, `feature_unavailable`"
                    },
                    "403": {
                        "content": {
                            "application/problem+json": {
                                "schema": {
                                    "$ref": "#/components/schemas/ProblemDetails"
                                }
                            }
                        },
                        "description": "`read_only_key`, `billing_account_required`, `project_not_ready`"
                    },
                    "404": {
                        "content": {
                            "application/problem+json": {
                                "schema": {
                                    "$ref": "#/components/schemas/ProblemDetails"
                                }
                            }
                        },
                        "description": "`not_found`"
                    },
                    "409": {
                        "content": {
                            "application/problem+json": {
                                "schema": {
                                    "$ref": "#/components/schemas/ProblemDetails"
                                }
                            }
                        },
                        "description": "`idempotency_key_reused`, `action_in_progress`, `conflict`"
                    },
                    "502": {
                        "content": {
                            "application/problem+json": {
                                "schema": {
                                    "$ref": "#/components/schemas/ProblemDetails"
                                }
                            }
                        },
                        "description": "`upstream_error`"
                    },
                    "503": {
                        "content": {
                            "application/problem+json": {
                                "schema": {
                                    "$ref": "#/components/schemas/ProblemDetails"
                                }
                            }
                        },
                        "description": "`node_maintenance`"
                    }
                }
            }
        },
        "/projects/{project_slug}/servers/{server_id}/actions/reset-password/": {
            "post": {
                "operationId": "servers_reset_password",
                "description": "Set a new random root password on the running server, through its guest agent. Once the action succeeds, reading it (`GET .../actions/{id}/`) shows the password in `result.password` for 15 minutes, never to a read-only key, and only while it is still the server's; lists and replays leave it out.",
                "parameters": [
                    {
                        "in": "header",
                        "name": "Idempotency-Key",
                        "schema": {
                            "type": "string"
                        },
                        "description": "1 to 64 characters. Repeating a request with the same key and body answers with the action it started, whatever state that reached, with status 200 and `Idempotent-Replayed: true`."
                    },
                    {
                        "in": "path",
                        "name": "project_slug",
                        "schema": {
                            "type": "string"
                        },
                        "required": true
                    },
                    {
                        "in": "path",
                        "name": "server_id",
                        "schema": {
                            "type": "string",
                            "pattern": "^[0-9a-f]{1,32}$"
                        },
                        "required": true
                    }
                ],
                "tags": [
                    "actions"
                ],
                "security": [
                    {
                        "bearerAuth": []
                    }
                ],
                "responses": {
                    "202": {
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Action"
                                }
                            }
                        },
                        "description": ""
                    },
                    "200": {
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Action"
                                }
                            }
                        },
                        "description": "A replay of an earlier request with the same key."
                    },
                    "400": {
                        "content": {
                            "application/problem+json": {
                                "schema": {
                                    "$ref": "#/components/schemas/ProblemDetails"
                                }
                            }
                        },
                        "description": "`validation_error`"
                    },
                    "403": {
                        "content": {
                            "application/problem+json": {
                                "schema": {
                                    "$ref": "#/components/schemas/ProblemDetails"
                                }
                            }
                        },
                        "description": "`read_only_key`, `billing_account_required`, `project_not_ready`"
                    },
                    "404": {
                        "content": {
                            "application/problem+json": {
                                "schema": {
                                    "$ref": "#/components/schemas/ProblemDetails"
                                }
                            }
                        },
                        "description": "`not_found`"
                    },
                    "409": {
                        "content": {
                            "application/problem+json": {
                                "schema": {
                                    "$ref": "#/components/schemas/ProblemDetails"
                                }
                            }
                        },
                        "description": "`idempotency_key_reused`"
                    },
                    "502": {
                        "content": {
                            "application/problem+json": {
                                "schema": {
                                    "$ref": "#/components/schemas/ProblemDetails"
                                }
                            }
                        },
                        "description": "`upstream_error`"
                    },
                    "503": {
                        "content": {
                            "application/problem+json": {
                                "schema": {
                                    "$ref": "#/components/schemas/ProblemDetails"
                                }
                            }
                        },
                        "description": "`node_maintenance`"
                    }
                }
            }
        },
        "/projects/{project_slug}/servers/{server_id}/actions/shutdown/": {
            "post": {
                "operationId": "servers_shutdown",
                "description": "Ask the operating system to shut down, as pressing the power button would. It may ignore the request.",
                "parameters": [
                    {
                        "in": "header",
                        "name": "Idempotency-Key",
                        "schema": {
                            "type": "string"
                        },
                        "description": "1 to 64 characters. Repeating a request with the same key and body answers with the action it started, whatever state that reached, with status 200 and `Idempotent-Replayed: true`."
                    },
                    {
                        "in": "path",
                        "name": "project_slug",
                        "schema": {
                            "type": "string"
                        },
                        "required": true
                    },
                    {
                        "in": "path",
                        "name": "server_id",
                        "schema": {
                            "type": "string",
                            "pattern": "^[0-9a-f]{1,32}$"
                        },
                        "required": true
                    }
                ],
                "tags": [
                    "actions"
                ],
                "security": [
                    {
                        "bearerAuth": []
                    }
                ],
                "responses": {
                    "202": {
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Action"
                                }
                            }
                        },
                        "description": ""
                    },
                    "200": {
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Action"
                                }
                            }
                        },
                        "description": "A replay of an earlier request with the same key."
                    },
                    "400": {
                        "content": {
                            "application/problem+json": {
                                "schema": {
                                    "$ref": "#/components/schemas/ProblemDetails"
                                }
                            }
                        },
                        "description": "`validation_error`"
                    },
                    "403": {
                        "content": {
                            "application/problem+json": {
                                "schema": {
                                    "$ref": "#/components/schemas/ProblemDetails"
                                }
                            }
                        },
                        "description": "`read_only_key`, `billing_account_required`, `project_not_ready`"
                    },
                    "404": {
                        "content": {
                            "application/problem+json": {
                                "schema": {
                                    "$ref": "#/components/schemas/ProblemDetails"
                                }
                            }
                        },
                        "description": "`not_found`"
                    },
                    "409": {
                        "content": {
                            "application/problem+json": {
                                "schema": {
                                    "$ref": "#/components/schemas/ProblemDetails"
                                }
                            }
                        },
                        "description": "`idempotency_key_reused`, `action_in_progress`, `conflict`"
                    },
                    "502": {
                        "content": {
                            "application/problem+json": {
                                "schema": {
                                    "$ref": "#/components/schemas/ProblemDetails"
                                }
                            }
                        },
                        "description": "`upstream_error`"
                    },
                    "503": {
                        "content": {
                            "application/problem+json": {
                                "schema": {
                                    "$ref": "#/components/schemas/ProblemDetails"
                                }
                            }
                        },
                        "description": "`node_maintenance`"
                    }
                }
            }
        },
        "/projects/{project_slug}/servers/{server_id}/cancel/": {
            "post": {
                "operationId": "servers_cancel",
                "description": "Ask for the server to be cancelled, at the end of its paid term or immediately. A server keeps one cancellation request: sending the same request again answers 200 and changes nothing, so a request whose answer was lost can simply be sent again, while a request of the other kind is 409. Once WHMCS has carried out an immediate cancellation the server is gone, and a repeat answers 404. Safe to repeat as it is, it takes no `Idempotency-Key`: one sent is ignored. It counts against the key's rate limit for writes.",
                "parameters": [
                    {
                        "in": "path",
                        "name": "project_slug",
                        "schema": {
                            "type": "string"
                        },
                        "required": true
                    },
                    {
                        "in": "path",
                        "name": "server_id",
                        "schema": {
                            "type": "string",
                            "pattern": "^[0-9a-f]{1,32}$"
                        },
                        "required": true
                    }
                ],
                "tags": [
                    "servers"
                ],
                "requestBody": {
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/CancelRequest"
                            }
                        }
                    },
                    "required": true
                },
                "security": [
                    {
                        "bearerAuth": []
                    }
                ],
                "responses": {
                    "200": {
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Cancellation"
                                }
                            }
                        },
                        "description": ""
                    },
                    "400": {
                        "content": {
                            "application/problem+json": {
                                "schema": {
                                    "$ref": "#/components/schemas/ProblemDetails"
                                }
                            }
                        },
                        "description": "`validation_error`"
                    },
                    "403": {
                        "content": {
                            "application/problem+json": {
                                "schema": {
                                    "$ref": "#/components/schemas/ProblemDetails"
                                }
                            }
                        },
                        "description": "`insufficient_role`, `read_only_key`, `billing_account_required`, `project_not_ready`"
                    },
                    "404": {
                        "content": {
                            "application/problem+json": {
                                "schema": {
                                    "$ref": "#/components/schemas/ProblemDetails"
                                }
                            }
                        },
                        "description": "`not_found`"
                    },
                    "409": {
                        "content": {
                            "application/problem+json": {
                                "schema": {
                                    "$ref": "#/components/schemas/ProblemDetails"
                                }
                            }
                        },
                        "description": "`conflict`"
                    },
                    "502": {
                        "content": {
                            "application/problem+json": {
                                "schema": {
                                    "$ref": "#/components/schemas/ProblemDetails"
                                }
                            }
                        },
                        "description": "`upstream_error`"
                    },
                    "503": {
                        "content": {
                            "application/problem+json": {
                                "schema": {
                                    "$ref": "#/components/schemas/ProblemDetails"
                                }
                            }
                        },
                        "description": "`upstream_unavailable`"
                    }
                }
            }
        },
        "/projects/{project_slug}/servers/{server_id}/firewall-groups/": {
            "put": {
                "operationId": "servers_firewall_groups_update",
                "description": "Set the firewall groups attached to the server: the list replaces the current one, and [] detaches every group. Each id must be one of the project's groups.",
                "parameters": [
                    {
                        "in": "path",
                        "name": "project_slug",
                        "schema": {
                            "type": "string"
                        },
                        "required": true
                    },
                    {
                        "in": "path",
                        "name": "server_id",
                        "schema": {
                            "type": "string",
                            "pattern": "^[0-9a-f]{1,32}$"
                        },
                        "required": true
                    }
                ],
                "tags": [
                    "servers"
                ],
                "requestBody": {
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/ServerFirewallGroupsRequest"
                            }
                        }
                    },
                    "required": true
                },
                "security": [
                    {
                        "bearerAuth": []
                    }
                ],
                "responses": {
                    "200": {
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/ServerFirewallGroups"
                                }
                            }
                        },
                        "description": ""
                    },
                    "400": {
                        "content": {
                            "application/problem+json": {
                                "schema": {
                                    "$ref": "#/components/schemas/ProblemDetails"
                                }
                            }
                        },
                        "description": "`validation_error`"
                    },
                    "403": {
                        "content": {
                            "application/problem+json": {
                                "schema": {
                                    "$ref": "#/components/schemas/ProblemDetails"
                                }
                            }
                        },
                        "description": "`read_only_key`, `billing_account_required`, `project_not_ready`"
                    },
                    "404": {
                        "content": {
                            "application/problem+json": {
                                "schema": {
                                    "$ref": "#/components/schemas/ProblemDetails"
                                }
                            }
                        },
                        "description": "`not_found`"
                    },
                    "502": {
                        "content": {
                            "application/problem+json": {
                                "schema": {
                                    "$ref": "#/components/schemas/ProblemDetails"
                                }
                            }
                        },
                        "description": "`upstream_error`"
                    },
                    "503": {
                        "content": {
                            "application/problem+json": {
                                "schema": {
                                    "$ref": "#/components/schemas/ProblemDetails"
                                }
                            }
                        },
                        "description": "`upstream_unavailable`"
                    }
                }
            }
        },
        "/projects/{project_slug}/servers/{server_id}/reverse-dns/": {
            "get": {
                "operationId": "servers_reverse_dns_list",
                "description": "The reverse DNS name of each of the server's IPv4 addresses; `ptr` is null where none is set.",
                "parameters": [
                    {
                        "name": "page",
                        "required": false,
                        "in": "query",
                        "description": "A page number within the paginated result set. A page past the end, or one that is not a number, answers 404 not_found.",
                        "schema": {
                            "type": "integer"
                        }
                    },
                    {
                        "name": "page_size",
                        "required": false,
                        "in": "query",
                        "description": "Number of results per page: 50 by default, at most 100.",
                        "schema": {
                            "type": "integer"
                        }
                    },
                    {
                        "in": "path",
                        "name": "project_slug",
                        "schema": {
                            "type": "string"
                        },
                        "required": true
                    },
                    {
                        "in": "path",
                        "name": "server_id",
                        "schema": {
                            "type": "string",
                            "pattern": "^[0-9a-f]{1,32}$"
                        },
                        "required": true
                    }
                ],
                "tags": [
                    "servers"
                ],
                "security": [
                    {
                        "bearerAuth": []
                    }
                ],
                "responses": {
                    "200": {
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/PaginatedReverseDnsList"
                                }
                            }
                        },
                        "description": ""
                    },
                    "403": {
                        "content": {
                            "application/problem+json": {
                                "schema": {
                                    "$ref": "#/components/schemas/ProblemDetails"
                                }
                            }
                        },
                        "description": "`billing_account_required`, `project_not_ready`"
                    },
                    "404": {
                        "content": {
                            "application/problem+json": {
                                "schema": {
                                    "$ref": "#/components/schemas/ProblemDetails"
                                }
                            }
                        },
                        "description": "`not_found`"
                    },
                    "502": {
                        "content": {
                            "application/problem+json": {
                                "schema": {
                                    "$ref": "#/components/schemas/ProblemDetails"
                                }
                            }
                        },
                        "description": "`upstream_error`"
                    },
                    "503": {
                        "content": {
                            "application/problem+json": {
                                "schema": {
                                    "$ref": "#/components/schemas/ProblemDetails"
                                }
                            }
                        },
                        "description": "`reverse_dns_unavailable`"
                    }
                }
            }
        },
        "/projects/{project_slug}/servers/{server_id}/reverse-dns/{address}/": {
            "put": {
                "operationId": "servers_reverse_dns_set",
                "description": "Set the reverse DNS name of one of the server's addresses: one of its IPv4 addresses, or any address inside one of its IPv6 subnets.",
                "parameters": [
                    {
                        "in": "path",
                        "name": "address",
                        "schema": {
                            "type": "string",
                            "pattern": "^[0-9a-fA-F.:]{2,45}$"
                        },
                        "required": true
                    },
                    {
                        "in": "path",
                        "name": "project_slug",
                        "schema": {
                            "type": "string"
                        },
                        "required": true
                    },
                    {
                        "in": "path",
                        "name": "server_id",
                        "schema": {
                            "type": "string",
                            "pattern": "^[0-9a-f]{1,32}$"
                        },
                        "required": true
                    }
                ],
                "tags": [
                    "servers"
                ],
                "requestBody": {
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/ReverseDnsUpdateRequest"
                            }
                        }
                    },
                    "required": true
                },
                "security": [
                    {
                        "bearerAuth": []
                    }
                ],
                "responses": {
                    "200": {
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/ReverseDns"
                                }
                            }
                        },
                        "description": ""
                    },
                    "400": {
                        "content": {
                            "application/problem+json": {
                                "schema": {
                                    "$ref": "#/components/schemas/ProblemDetails"
                                }
                            }
                        },
                        "description": "`validation_error`"
                    },
                    "403": {
                        "content": {
                            "application/problem+json": {
                                "schema": {
                                    "$ref": "#/components/schemas/ProblemDetails"
                                }
                            }
                        },
                        "description": "`read_only_key`, `billing_account_required`, `project_not_ready`"
                    },
                    "404": {
                        "content": {
                            "application/problem+json": {
                                "schema": {
                                    "$ref": "#/components/schemas/ProblemDetails"
                                }
                            }
                        },
                        "description": "`not_found`"
                    },
                    "502": {
                        "content": {
                            "application/problem+json": {
                                "schema": {
                                    "$ref": "#/components/schemas/ProblemDetails"
                                }
                            }
                        },
                        "description": "`upstream_error`"
                    },
                    "503": {
                        "content": {
                            "application/problem+json": {
                                "schema": {
                                    "$ref": "#/components/schemas/ProblemDetails"
                                }
                            }
                        },
                        "description": "`reverse_dns_unavailable`"
                    }
                }
            },
            "delete": {
                "operationId": "servers_reverse_dns_clear",
                "description": "Remove the reverse DNS name of one of the server's addresses.",
                "parameters": [
                    {
                        "in": "path",
                        "name": "address",
                        "schema": {
                            "type": "string",
                            "pattern": "^[0-9a-fA-F.:]{2,45}$"
                        },
                        "required": true
                    },
                    {
                        "in": "path",
                        "name": "project_slug",
                        "schema": {
                            "type": "string"
                        },
                        "required": true
                    },
                    {
                        "in": "path",
                        "name": "server_id",
                        "schema": {
                            "type": "string",
                            "pattern": "^[0-9a-f]{1,32}$"
                        },
                        "required": true
                    }
                ],
                "tags": [
                    "servers"
                ],
                "security": [
                    {
                        "bearerAuth": []
                    }
                ],
                "responses": {
                    "204": {
                        "description": "No response body"
                    },
                    "403": {
                        "content": {
                            "application/problem+json": {
                                "schema": {
                                    "$ref": "#/components/schemas/ProblemDetails"
                                }
                            }
                        },
                        "description": "`read_only_key`, `billing_account_required`, `project_not_ready`"
                    },
                    "404": {
                        "content": {
                            "application/problem+json": {
                                "schema": {
                                    "$ref": "#/components/schemas/ProblemDetails"
                                }
                            }
                        },
                        "description": "`not_found`"
                    },
                    "502": {
                        "content": {
                            "application/problem+json": {
                                "schema": {
                                    "$ref": "#/components/schemas/ProblemDetails"
                                }
                            }
                        },
                        "description": "`upstream_error`"
                    },
                    "503": {
                        "content": {
                            "application/problem+json": {
                                "schema": {
                                    "$ref": "#/components/schemas/ProblemDetails"
                                }
                            }
                        },
                        "description": "`reverse_dns_unavailable`"
                    }
                }
            }
        },
        "/projects/{project_slug}/ssh-keys/": {
            "get": {
                "operationId": "ssh_keys_list",
                "description": "The project's SSH keys, which its servers can be created or reinstalled with.",
                "parameters": [
                    {
                        "name": "page",
                        "required": false,
                        "in": "query",
                        "description": "A page number within the paginated result set. A page past the end, or one that is not a number, answers 404 not_found.",
                        "schema": {
                            "type": "integer"
                        }
                    },
                    {
                        "name": "page_size",
                        "required": false,
                        "in": "query",
                        "description": "Number of results per page: 50 by default, at most 100.",
                        "schema": {
                            "type": "integer"
                        }
                    },
                    {
                        "in": "path",
                        "name": "project_slug",
                        "schema": {
                            "type": "string"
                        },
                        "required": true
                    }
                ],
                "tags": [
                    "ssh-keys"
                ],
                "security": [
                    {
                        "bearerAuth": []
                    }
                ],
                "responses": {
                    "200": {
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/PaginatedSshKeyList"
                                }
                            }
                        },
                        "description": ""
                    },
                    "403": {
                        "content": {
                            "application/problem+json": {
                                "schema": {
                                    "$ref": "#/components/schemas/ProblemDetails"
                                }
                            }
                        },
                        "description": "`billing_account_required`, `project_not_ready`"
                    },
                    "404": {
                        "content": {
                            "application/problem+json": {
                                "schema": {
                                    "$ref": "#/components/schemas/ProblemDetails"
                                }
                            }
                        },
                        "description": "`not_found`"
                    },
                    "502": {
                        "content": {
                            "application/problem+json": {
                                "schema": {
                                    "$ref": "#/components/schemas/ProblemDetails"
                                }
                            }
                        },
                        "description": "`upstream_error`"
                    }
                }
            },
            "post": {
                "operationId": "ssh_keys_create",
                "description": "Add a public key to the project. A key that is already in the project, whatever its comment, answers `409 key_exists` with the existing key's id in `key_id`, so a create whose response was lost can be sent again. While one create of a key is running, another create of the same key answers `409 conflict`.",
                "parameters": [
                    {
                        "in": "path",
                        "name": "project_slug",
                        "schema": {
                            "type": "string"
                        },
                        "required": true
                    }
                ],
                "tags": [
                    "ssh-keys"
                ],
                "requestBody": {
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/SshKeyCreateRequest"
                            }
                        }
                    },
                    "required": true
                },
                "security": [
                    {
                        "bearerAuth": []
                    }
                ],
                "responses": {
                    "201": {
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/SshKey"
                                }
                            }
                        },
                        "description": ""
                    },
                    "400": {
                        "content": {
                            "application/problem+json": {
                                "schema": {
                                    "$ref": "#/components/schemas/ProblemDetails"
                                }
                            }
                        },
                        "description": "`validation_error`"
                    },
                    "403": {
                        "content": {
                            "application/problem+json": {
                                "schema": {
                                    "$ref": "#/components/schemas/ProblemDetails"
                                }
                            }
                        },
                        "description": "`billing_account_required`, `project_not_ready`"
                    },
                    "404": {
                        "content": {
                            "application/problem+json": {
                                "schema": {
                                    "$ref": "#/components/schemas/ProblemDetails"
                                }
                            }
                        },
                        "description": "`not_found`"
                    },
                    "409": {
                        "content": {
                            "application/problem+json": {
                                "schema": {
                                    "$ref": "#/components/schemas/ProblemDetails"
                                }
                            }
                        },
                        "description": "`key_exists`, `conflict`"
                    },
                    "502": {
                        "content": {
                            "application/problem+json": {
                                "schema": {
                                    "$ref": "#/components/schemas/ProblemDetails"
                                }
                            }
                        },
                        "description": "`upstream_error`"
                    }
                }
            }
        },
        "/projects/{project_slug}/ssh-keys/{key_id}/": {
            "get": {
                "operationId": "ssh_keys_retrieve",
                "description": "One of the project's SSH keys.",
                "parameters": [
                    {
                        "in": "path",
                        "name": "key_id",
                        "schema": {
                            "type": "string",
                            "pattern": "^[0-9]+$"
                        },
                        "required": true
                    },
                    {
                        "in": "path",
                        "name": "project_slug",
                        "schema": {
                            "type": "string"
                        },
                        "required": true
                    }
                ],
                "tags": [
                    "ssh-keys"
                ],
                "security": [
                    {
                        "bearerAuth": []
                    }
                ],
                "responses": {
                    "200": {
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/SshKey"
                                }
                            }
                        },
                        "description": ""
                    },
                    "403": {
                        "content": {
                            "application/problem+json": {
                                "schema": {
                                    "$ref": "#/components/schemas/ProblemDetails"
                                }
                            }
                        },
                        "description": "`billing_account_required`, `project_not_ready`"
                    },
                    "404": {
                        "content": {
                            "application/problem+json": {
                                "schema": {
                                    "$ref": "#/components/schemas/ProblemDetails"
                                }
                            }
                        },
                        "description": "`not_found`"
                    },
                    "502": {
                        "content": {
                            "application/problem+json": {
                                "schema": {
                                    "$ref": "#/components/schemas/ProblemDetails"
                                }
                            }
                        },
                        "description": "`upstream_error`"
                    }
                }
            },
            "patch": {
                "operationId": "ssh_keys_rename",
                "description": "Rename a key. The public key itself cannot change: add the new key and delete the old one.",
                "parameters": [
                    {
                        "in": "path",
                        "name": "key_id",
                        "schema": {
                            "type": "string",
                            "pattern": "^[0-9]+$"
                        },
                        "required": true
                    },
                    {
                        "in": "path",
                        "name": "project_slug",
                        "schema": {
                            "type": "string"
                        },
                        "required": true
                    }
                ],
                "tags": [
                    "ssh-keys"
                ],
                "requestBody": {
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/PatchedSshKeyRenameRequest"
                            }
                        }
                    }
                },
                "security": [
                    {
                        "bearerAuth": []
                    }
                ],
                "responses": {
                    "200": {
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/SshKey"
                                }
                            }
                        },
                        "description": ""
                    },
                    "400": {
                        "content": {
                            "application/problem+json": {
                                "schema": {
                                    "$ref": "#/components/schemas/ProblemDetails"
                                }
                            }
                        },
                        "description": "`validation_error`"
                    },
                    "403": {
                        "content": {
                            "application/problem+json": {
                                "schema": {
                                    "$ref": "#/components/schemas/ProblemDetails"
                                }
                            }
                        },
                        "description": "`billing_account_required`, `project_not_ready`"
                    },
                    "404": {
                        "content": {
                            "application/problem+json": {
                                "schema": {
                                    "$ref": "#/components/schemas/ProblemDetails"
                                }
                            }
                        },
                        "description": "`not_found`"
                    },
                    "502": {
                        "content": {
                            "application/problem+json": {
                                "schema": {
                                    "$ref": "#/components/schemas/ProblemDetails"
                                }
                            }
                        },
                        "description": "`upstream_error`"
                    }
                }
            },
            "delete": {
                "operationId": "ssh_keys_delete",
                "description": "Delete a key from the project.",
                "parameters": [
                    {
                        "in": "path",
                        "name": "key_id",
                        "schema": {
                            "type": "string",
                            "pattern": "^[0-9]+$"
                        },
                        "required": true
                    },
                    {
                        "in": "path",
                        "name": "project_slug",
                        "schema": {
                            "type": "string"
                        },
                        "required": true
                    }
                ],
                "tags": [
                    "ssh-keys"
                ],
                "security": [
                    {
                        "bearerAuth": []
                    }
                ],
                "responses": {
                    "204": {
                        "description": "No response body"
                    },
                    "403": {
                        "content": {
                            "application/problem+json": {
                                "schema": {
                                    "$ref": "#/components/schemas/ProblemDetails"
                                }
                            }
                        },
                        "description": "`billing_account_required`, `project_not_ready`"
                    },
                    "404": {
                        "content": {
                            "application/problem+json": {
                                "schema": {
                                    "$ref": "#/components/schemas/ProblemDetails"
                                }
                            }
                        },
                        "description": "`not_found`"
                    },
                    "502": {
                        "content": {
                            "application/problem+json": {
                                "schema": {
                                    "$ref": "#/components/schemas/ProblemDetails"
                                }
                            }
                        },
                        "description": "`upstream_error`"
                    }
                }
            }
        }
    },
    "components": {
        "schemas": {
            "Action": {
                "type": "object",
                "properties": {
                    "id": {
                        "type": "integer",
                        "readOnly": true
                    },
                    "type": {
                        "$ref": "#/components/schemas/ActionTypeEnum"
                    },
                    "status": {
                        "$ref": "#/components/schemas/ActionStatusEnum"
                    },
                    "resource": {
                        "$ref": "#/components/schemas/ActionResource"
                    },
                    "started_at": {
                        "type": "string",
                        "format": "date-time"
                    },
                    "finished_at": {
                        "type": "string",
                        "format": "date-time",
                        "nullable": true
                    },
                    "error": {
                        "allOf": [
                            {
                                "$ref": "#/components/schemas/ActionError"
                            }
                        ],
                        "nullable": true,
                        "readOnly": true
                    },
                    "result": {
                        "type": "object",
                        "additionalProperties": {},
                        "readOnly": true
                    }
                },
                "required": [
                    "error",
                    "finished_at",
                    "id",
                    "resource",
                    "result",
                    "started_at",
                    "type"
                ]
            },
            "ActionError": {
                "type": "object",
                "properties": {
                    "code": {
                        "type": "string",
                        "description": "failed, outcome_unknown, task_result_unavailable, timeout or resource_moved."
                    },
                    "message": {
                        "type": "string"
                    }
                },
                "required": [
                    "code",
                    "message"
                ]
            },
            "ActionResource": {
                "type": "object",
                "properties": {
                    "type": {
                        "type": "string"
                    },
                    "id": {
                        "type": "string"
                    }
                },
                "required": [
                    "id",
                    "type"
                ]
            },
            "ActionStatusEnum": {
                "enum": [
                    "running",
                    "unknown",
                    "success",
                    "error"
                ],
                "type": "string",
                "description": "* `running` - Running\n* `unknown` - Unknown\n* `success` - Success\n* `error` - Error"
            },
            "ActionTypeEnum": {
                "enum": [
                    "server.power_on",
                    "server.power_off",
                    "server.shutdown",
                    "server.reboot",
                    "server.reinstall",
                    "server.reset_password",
                    "server.restore_snapshot",
                    "server.create_snapshot",
                    "server.mount_iso",
                    "server.unmount_iso",
                    "server.enable_ipv6",
                    "server.enable_private_network"
                ],
                "type": "string",
                "description": "* `server.power_on` - Power On\n* `server.power_off` - Power Off\n* `server.shutdown` - Shutdown\n* `server.reboot` - Reboot\n* `server.reinstall` - Reinstall\n* `server.reset_password` - Reset Password\n* `server.restore_snapshot` - Restore Snapshot\n* `server.create_snapshot` - Create Snapshot\n* `server.mount_iso` - Mount Iso\n* `server.unmount_iso` - Unmount Iso\n* `server.enable_ipv6` - Enable Ipv6\n* `server.enable_private_network` - Enable Private Network"
            },
            "Bandwidth": {
                "type": "object",
                "properties": {
                    "pooled": {
                        "type": "boolean",
                        "description": "Shared with the account's other servers in the location."
                    },
                    "allocated_gb": {
                        "type": "integer",
                        "nullable": true,
                        "description": "This server's monthly allowance."
                    },
                    "extra_gb": {
                        "type": "integer",
                        "nullable": true,
                        "description": "Extra bandwidth bought for this month."
                    },
                    "used_gb": {
                        "type": "integer",
                        "nullable": true,
                        "description": "Used this month."
                    },
                    "pool": {
                        "allOf": [
                            {
                                "$ref": "#/components/schemas/BandwidthPool"
                            }
                        ],
                        "nullable": true,
                        "description": "The pool's totals; null when not pooled."
                    }
                },
                "required": [
                    "allocated_gb",
                    "extra_gb",
                    "pool",
                    "pooled",
                    "used_gb"
                ]
            },
            "BandwidthPool": {
                "type": "object",
                "properties": {
                    "allocated_gb": {
                        "type": "integer",
                        "nullable": true
                    },
                    "extra_gb": {
                        "type": "integer",
                        "nullable": true
                    },
                    "used_gb": {
                        "type": "integer",
                        "nullable": true
                    }
                },
                "required": [
                    "allocated_gb",
                    "extra_gb",
                    "used_gb"
                ]
            },
            "Billing": {
                "type": "object",
                "properties": {
                    "service_id": {
                        "type": "integer"
                    },
                    "status": {
                        "type": "string",
                        "nullable": true,
                        "description": "As WHMCS reports it, e.g. Active or Suspended."
                    },
                    "billing_cycle": {
                        "type": "string",
                        "nullable": true,
                        "description": "monthly, quarterly, semiannually and so on."
                    },
                    "next_due_date": {
                        "type": "string",
                        "format": "date",
                        "nullable": true
                    },
                    "recurring_amount": {
                        "type": "string",
                        "nullable": true,
                        "description": "Decimal string with two places."
                    },
                    "currency": {
                        "type": "string",
                        "description": "ISO 4217."
                    },
                    "upgradeable_to": {
                        "type": "array",
                        "items": {
                            "type": "integer"
                        },
                        "description": "Product ids this server can be upgraded to."
                    }
                },
                "required": [
                    "billing_cycle",
                    "currency",
                    "next_due_date",
                    "recurring_amount",
                    "service_id",
                    "status",
                    "upgradeable_to"
                ]
            },
            "CancelRequest": {
                "type": "object",
                "properties": {
                    "when": {
                        "allOf": [
                            {
                                "$ref": "#/components/schemas/WhenEnum"
                            }
                        ],
                        "description": "end_of_term: when the paid period ends; immediate: now, and the server is deleted.\n\n* `end_of_term` - end_of_term\n* `immediate` - immediate"
                    },
                    "reason": {
                        "type": "string",
                        "description": "Why. Required for end_of_term.",
                        "maxLength": 1000
                    }
                },
                "required": [
                    "when"
                ]
            },
            "Cancellation": {
                "type": "object",
                "properties": {
                    "status": {
                        "$ref": "#/components/schemas/CancellationStatusEnum"
                    },
                    "when": {
                        "$ref": "#/components/schemas/WhenEnum"
                    }
                },
                "required": [
                    "status",
                    "when"
                ]
            },
            "CancellationStatusEnum": {
                "enum": [
                    "cancellation_requested"
                ],
                "type": "string",
                "description": "* `cancellation_requested` - cancellation_requested"
            },
            "CurrentUser": {
                "type": "object",
                "properties": {
                    "id": {
                        "type": "integer"
                    },
                    "email": {
                        "type": "string",
                        "format": "email"
                    },
                    "first_name": {
                        "type": "string"
                    },
                    "last_name": {
                        "type": "string"
                    },
                    "projects": {
                        "type": "array",
                        "items": {
                            "$ref": "#/components/schemas/ProjectRef"
                        }
                    }
                },
                "required": [
                    "email",
                    "first_name",
                    "id",
                    "last_name",
                    "projects"
                ]
            },
            "DirectionEnum": {
                "enum": [
                    "ingress",
                    "egress"
                ],
                "type": "string",
                "description": "* `ingress` - Inbound traffic to the servers\n* `egress` - Outbound traffic from the servers"
            },
            "FirewallGroup": {
                "type": "object",
                "description": "A firewall group: rules that allow traffic, and the servers they apply to.",
                "properties": {
                    "id": {
                        "type": "integer",
                        "readOnly": true
                    },
                    "name": {
                        "type": "string",
                        "maxLength": 255
                    },
                    "direction": {
                        "allOf": [
                            {
                                "$ref": "#/components/schemas/DirectionEnum"
                            }
                        ],
                        "description": "`ingress` rules allow traffic to the servers, `egress` rules traffic from them. Fixed when the group is created.\n\n* `ingress` - Inbound traffic to the servers\n* `egress` - Outbound traffic from the servers"
                    },
                    "servers": {
                        "type": "array",
                        "items": {
                            "type": "string"
                        },
                        "readOnly": true,
                        "description": "The ids of the servers the group is attached to."
                    },
                    "rules": {
                        "type": "array",
                        "items": {
                            "$ref": "#/components/schemas/FirewallRule"
                        },
                        "readOnly": true
                    },
                    "created_at": {
                        "type": "string",
                        "format": "date-time",
                        "readOnly": true
                    }
                },
                "required": [
                    "created_at",
                    "direction",
                    "id",
                    "name",
                    "rules",
                    "servers"
                ]
            },
            "FirewallGroupRequest": {
                "type": "object",
                "description": "A firewall group: rules that allow traffic, and the servers they apply to.",
                "properties": {
                    "name": {
                        "type": "string",
                        "minLength": 1,
                        "maxLength": 255
                    },
                    "direction": {
                        "allOf": [
                            {
                                "$ref": "#/components/schemas/DirectionEnum"
                            }
                        ],
                        "description": "`ingress` rules allow traffic to the servers, `egress` rules traffic from them. Fixed when the group is created.\n\n* `ingress` - Inbound traffic to the servers\n* `egress` - Outbound traffic from the servers"
                    }
                },
                "required": [
                    "direction",
                    "name"
                ]
            },
            "FirewallRule": {
                "type": "object",
                "description": "A rule in a firewall group. Every field is present, and null where it is not set.",
                "properties": {
                    "id": {
                        "type": "integer",
                        "readOnly": true
                    },
                    "protocol": {
                        "allOf": [
                            {
                                "$ref": "#/components/schemas/ProtocolEnum"
                            }
                        ],
                        "readOnly": true
                    },
                    "port_min": {
                        "type": "integer",
                        "maximum": 65535,
                        "minimum": 1,
                        "readOnly": true,
                        "nullable": true,
                        "description": "The first port of the range, for `tcp` and `udp` only. Leave both ports empty to allow every port."
                    },
                    "port_max": {
                        "type": "integer",
                        "maximum": 65535,
                        "minimum": 1,
                        "readOnly": true,
                        "nullable": true,
                        "description": "The last port of the range; empty for `port_min` alone. Needs `port_min`."
                    },
                    "source_cidr": {
                        "type": "string",
                        "readOnly": true,
                        "nullable": true,
                        "description": "Where the traffic comes from, for rules of an `ingress` group. A network in CIDR notation, such as `192.0.2.0/24` or `2001:db8::/32`, or a single address, which is stored as a `/32` or `/128` prefix. Send the network address: `192.0.2.1/24` is refused rather than read as `192.0.2.0/24`, so a typo cannot change what the rule matches. A scope id, quotes and whitespace are refused. A network of one address family matches that family only. Returned in canonical form. Empty or null means any address."
                    },
                    "destination_cidr": {
                        "type": "string",
                        "readOnly": true,
                        "nullable": true,
                        "description": "Where the traffic goes, for rules of an `egress` group. A network in CIDR notation, such as `192.0.2.0/24` or `2001:db8::/32`, or a single address, which is stored as a `/32` or `/128` prefix. Send the network address: `192.0.2.1/24` is refused rather than read as `192.0.2.0/24`, so a typo cannot change what the rule matches. A scope id, quotes and whitespace are refused. A network of one address family matches that family only. Returned in canonical form. Empty or null means any address."
                    },
                    "priority": {
                        "type": "integer",
                        "maximum": 64996,
                        "minimum": 1,
                        "readOnly": true,
                        "default": 1000,
                        "description": "Orders the rules in a group, lowest first, from 1 to 64996. Every rule allows traffic, so the order never changes what is allowed."
                    },
                    "comment": {
                        "type": "string",
                        "readOnly": true,
                        "nullable": true,
                        "description": "A note; it changes nothing.",
                        "maxLength": 255
                    }
                },
                "required": [
                    "comment",
                    "destination_cidr",
                    "id",
                    "port_max",
                    "port_min",
                    "priority",
                    "protocol",
                    "source_cidr"
                ]
            },
            "FirewallRuleRequest": {
                "type": "object",
                "description": "A rule allows the traffic it matches: a protocol, optionally ports, and an address range for its direction.",
                "properties": {
                    "protocol": {
                        "$ref": "#/components/schemas/ProtocolEnum"
                    },
                    "port_min": {
                        "type": "integer",
                        "maximum": 65535,
                        "minimum": 1,
                        "nullable": true,
                        "description": "The first port of the range, for `tcp` and `udp` only. Leave both ports empty to allow every port."
                    },
                    "port_max": {
                        "type": "integer",
                        "maximum": 65535,
                        "minimum": 1,
                        "nullable": true,
                        "description": "The last port of the range; empty for `port_min` alone. Needs `port_min`."
                    },
                    "source_cidr": {
                        "type": "string",
                        "nullable": true,
                        "description": "Where the traffic comes from, for rules of an `ingress` group. A network in CIDR notation, such as `192.0.2.0/24` or `2001:db8::/32`, or a single address, which is stored as a `/32` or `/128` prefix. Send the network address: `192.0.2.1/24` is refused rather than read as `192.0.2.0/24`, so a typo cannot change what the rule matches. A scope id, quotes and whitespace are refused. A network of one address family matches that family only. Returned in canonical form. Empty or null means any address."
                    },
                    "destination_cidr": {
                        "type": "string",
                        "nullable": true,
                        "description": "Where the traffic goes, for rules of an `egress` group. A network in CIDR notation, such as `192.0.2.0/24` or `2001:db8::/32`, or a single address, which is stored as a `/32` or `/128` prefix. Send the network address: `192.0.2.1/24` is refused rather than read as `192.0.2.0/24`, so a typo cannot change what the rule matches. A scope id, quotes and whitespace are refused. A network of one address family matches that family only. Returned in canonical form. Empty or null means any address."
                    },
                    "priority": {
                        "type": "integer",
                        "maximum": 64996,
                        "minimum": 1,
                        "default": 1000,
                        "description": "Orders the rules in a group, lowest first, from 1 to 64996. Every rule allows traffic, so the order never changes what is allowed."
                    },
                    "comment": {
                        "type": "string",
                        "nullable": true,
                        "description": "A note; it changes nothing.",
                        "maxLength": 255
                    }
                },
                "required": [
                    "protocol"
                ]
            },
            "IPv4Address": {
                "type": "object",
                "properties": {
                    "address": {
                        "type": "string",
                        "format": "ipv4"
                    },
                    "primary": {
                        "type": "boolean"
                    },
                    "netmask": {
                        "type": "string",
                        "nullable": true
                    },
                    "gateway": {
                        "type": "string",
                        "nullable": true,
                        "description": "Set for the primary address only."
                    }
                },
                "required": [
                    "address",
                    "gateway",
                    "netmask",
                    "primary"
                ]
            },
            "IPv4Detail": {
                "type": "object",
                "properties": {
                    "id": {
                        "type": "integer"
                    },
                    "name": {
                        "type": "string"
                    },
                    "ipv4_setup_fee": {
                        "$ref": "#/components/schemas/SetupFee"
                    },
                    "default_price": {
                        "type": "string"
                    }
                },
                "required": [
                    "default_price",
                    "id",
                    "ipv4_setup_fee",
                    "name"
                ]
            },
            "IPv6Detail": {
                "type": "object",
                "properties": {
                    "id": {
                        "type": "integer"
                    },
                    "name": {
                        "type": "string"
                    },
                    "ipv6_setup_fee": {
                        "$ref": "#/components/schemas/SetupFee"
                    }
                },
                "required": [
                    "id",
                    "ipv6_setup_fee",
                    "name"
                ]
            },
            "IPv6Subnet": {
                "type": "object",
                "properties": {
                    "subnet": {
                        "type": "string",
                        "description": "A subnet routed to the server, in CIDR notation."
                    }
                },
                "required": [
                    "subnet"
                ]
            },
            "Image": {
                "type": "object",
                "properties": {
                    "name": {
                        "type": "string",
                        "nullable": true,
                        "description": "The image's name, as reinstall takes it."
                    },
                    "display_name": {
                        "type": "string",
                        "nullable": true
                    }
                },
                "required": [
                    "display_name",
                    "name"
                ]
            },
            "Invitation": {
                "type": "object",
                "properties": {
                    "id": {
                        "type": "string",
                        "format": "uuid",
                        "readOnly": true
                    },
                    "project": {
                        "type": "integer"
                    },
                    "email": {
                        "type": "string",
                        "format": "email",
                        "maxLength": 254
                    },
                    "role": {
                        "$ref": "#/components/schemas/InvitationRoleEnum"
                    },
                    "invited_by": {
                        "type": "string",
                        "readOnly": true
                    },
                    "is_accepted": {
                        "type": "boolean",
                        "readOnly": true
                    }
                },
                "required": [
                    "email",
                    "id",
                    "invited_by",
                    "is_accepted",
                    "project"
                ]
            },
            "InvitationRequest": {
                "type": "object",
                "properties": {
                    "project": {
                        "type": "integer"
                    },
                    "email": {
                        "type": "string",
                        "format": "email",
                        "minLength": 1,
                        "maxLength": 254
                    },
                    "role": {
                        "$ref": "#/components/schemas/InvitationRoleEnum"
                    }
                },
                "required": [
                    "email",
                    "project"
                ]
            },
            "InvitationRoleEnum": {
                "enum": [
                    "admin",
                    "member"
                ],
                "type": "string",
                "description": "* `admin` - Administrator\n* `member` - Member"
            },
            "IsoRef": {
                "type": "object",
                "properties": {
                    "id": {
                        "type": "integer"
                    },
                    "name": {
                        "type": "string",
                        "nullable": true
                    }
                },
                "required": [
                    "id",
                    "name"
                ]
            },
            "Location": {
                "type": "object",
                "properties": {
                    "code": {
                        "type": "string",
                        "nullable": true,
                        "description": "HostHatch's location code, as in the order request."
                    },
                    "city": {
                        "type": "string",
                        "nullable": true
                    },
                    "country_code": {
                        "type": "string",
                        "nullable": true,
                        "description": "ISO 3166-1 alpha-2, upper case."
                    }
                },
                "required": [
                    "city",
                    "code",
                    "country_code"
                ]
            },
            "Membership": {
                "type": "object",
                "properties": {
                    "id": {
                        "type": "integer",
                        "readOnly": true
                    },
                    "user_id": {
                        "type": "integer",
                        "readOnly": true
                    },
                    "first_name": {
                        "type": "string",
                        "readOnly": true
                    },
                    "last_name": {
                        "type": "string",
                        "readOnly": true
                    },
                    "display_name": {
                        "type": "string",
                        "readOnly": true
                    },
                    "role": {
                        "$ref": "#/components/schemas/MembershipRoleEnum"
                    }
                },
                "required": [
                    "display_name",
                    "first_name",
                    "id",
                    "last_name",
                    "role",
                    "user_id"
                ]
            },
            "MembershipRequest": {
                "type": "object",
                "properties": {
                    "role": {
                        "$ref": "#/components/schemas/MembershipRoleEnum"
                    }
                },
                "required": [
                    "role"
                ]
            },
            "MembershipRoleEnum": {
                "enum": [
                    "owner",
                    "admin",
                    "member"
                ],
                "type": "string",
                "description": "* `owner` - Owner\n* `admin` - Administrator\n* `member` - Member"
            },
            "Network": {
                "type": "object",
                "properties": {
                    "ipv4": {
                        "type": "array",
                        "items": {
                            "$ref": "#/components/schemas/IPv4Address"
                        },
                        "description": "The primary address first."
                    },
                    "ipv6": {
                        "type": "array",
                        "items": {
                            "$ref": "#/components/schemas/IPv6Subnet"
                        }
                    },
                    "private_network": {
                        "allOf": [
                            {
                                "$ref": "#/components/schemas/PrivateNetwork"
                            }
                        ],
                        "nullable": true
                    }
                },
                "required": [
                    "ipv4",
                    "ipv6",
                    "private_network"
                ]
            },
            "OperatingSystem": {
                "type": "object",
                "properties": {
                    "name": {
                        "type": "string"
                    },
                    "versions": {
                        "type": "array",
                        "items": {
                            "$ref": "#/components/schemas/OperatingSystemVersion"
                        }
                    },
                    "available_in": {
                        "type": "array",
                        "items": {
                            "type": "integer"
                        }
                    }
                },
                "required": [
                    "available_in",
                    "name",
                    "versions"
                ]
            },
            "OperatingSystemVersion": {
                "type": "object",
                "properties": {
                    "id": {
                        "type": "integer"
                    },
                    "version": {
                        "type": "string"
                    },
                    "template_name": {
                        "type": "string"
                    }
                },
                "required": [
                    "id",
                    "template_name",
                    "version"
                ]
            },
            "PaginatedActionList": {
                "type": "object",
                "required": [
                    "count",
                    "results"
                ],
                "properties": {
                    "count": {
                        "type": "integer",
                        "example": 123
                    },
                    "next": {
                        "type": "string",
                        "nullable": true,
                        "format": "uri",
                        "example": "http://api.example.org/accounts/?page=4"
                    },
                    "previous": {
                        "type": "string",
                        "nullable": true,
                        "format": "uri",
                        "example": "http://api.example.org/accounts/?page=2"
                    },
                    "results": {
                        "type": "array",
                        "items": {
                            "$ref": "#/components/schemas/Action"
                        }
                    }
                }
            },
            "PaginatedFirewallGroupList": {
                "type": "object",
                "required": [
                    "count",
                    "results"
                ],
                "properties": {
                    "count": {
                        "type": "integer",
                        "example": 123
                    },
                    "next": {
                        "type": "string",
                        "nullable": true,
                        "format": "uri",
                        "example": "http://api.example.org/accounts/?page=4"
                    },
                    "previous": {
                        "type": "string",
                        "nullable": true,
                        "format": "uri",
                        "example": "http://api.example.org/accounts/?page=2"
                    },
                    "results": {
                        "type": "array",
                        "items": {
                            "$ref": "#/components/schemas/FirewallGroup"
                        }
                    }
                }
            },
            "PaginatedFirewallRuleList": {
                "type": "object",
                "required": [
                    "count",
                    "results"
                ],
                "properties": {
                    "count": {
                        "type": "integer",
                        "example": 123
                    },
                    "next": {
                        "type": "string",
                        "nullable": true,
                        "format": "uri",
                        "example": "http://api.example.org/accounts/?page=4"
                    },
                    "previous": {
                        "type": "string",
                        "nullable": true,
                        "format": "uri",
                        "example": "http://api.example.org/accounts/?page=2"
                    },
                    "results": {
                        "type": "array",
                        "items": {
                            "$ref": "#/components/schemas/FirewallRule"
                        }
                    }
                }
            },
            "PaginatedInvitationList": {
                "type": "object",
                "required": [
                    "count",
                    "results"
                ],
                "properties": {
                    "count": {
                        "type": "integer",
                        "example": 123
                    },
                    "next": {
                        "type": "string",
                        "nullable": true,
                        "format": "uri",
                        "example": "http://api.example.org/accounts/?page=4"
                    },
                    "previous": {
                        "type": "string",
                        "nullable": true,
                        "format": "uri",
                        "example": "http://api.example.org/accounts/?page=2"
                    },
                    "results": {
                        "type": "array",
                        "items": {
                            "$ref": "#/components/schemas/Invitation"
                        }
                    }
                }
            },
            "PaginatedProjectList": {
                "type": "object",
                "required": [
                    "count",
                    "results"
                ],
                "properties": {
                    "count": {
                        "type": "integer",
                        "example": 123
                    },
                    "next": {
                        "type": "string",
                        "nullable": true,
                        "format": "uri",
                        "example": "http://api.example.org/accounts/?page=4"
                    },
                    "previous": {
                        "type": "string",
                        "nullable": true,
                        "format": "uri",
                        "example": "http://api.example.org/accounts/?page=2"
                    },
                    "results": {
                        "type": "array",
                        "items": {
                            "$ref": "#/components/schemas/Project"
                        }
                    }
                }
            },
            "PaginatedReverseDnsList": {
                "type": "object",
                "required": [
                    "count",
                    "results"
                ],
                "properties": {
                    "count": {
                        "type": "integer",
                        "example": 123
                    },
                    "next": {
                        "type": "string",
                        "nullable": true,
                        "format": "uri",
                        "example": "http://api.example.org/accounts/?page=4"
                    },
                    "previous": {
                        "type": "string",
                        "nullable": true,
                        "format": "uri",
                        "example": "http://api.example.org/accounts/?page=2"
                    },
                    "results": {
                        "type": "array",
                        "items": {
                            "$ref": "#/components/schemas/ReverseDns"
                        }
                    }
                }
            },
            "PaginatedServerSummaryList": {
                "type": "object",
                "required": [
                    "count",
                    "results"
                ],
                "properties": {
                    "count": {
                        "type": "integer",
                        "example": 123
                    },
                    "next": {
                        "type": "string",
                        "nullable": true,
                        "format": "uri",
                        "example": "http://api.example.org/accounts/?page=4"
                    },
                    "previous": {
                        "type": "string",
                        "nullable": true,
                        "format": "uri",
                        "example": "http://api.example.org/accounts/?page=2"
                    },
                    "results": {
                        "type": "array",
                        "items": {
                            "$ref": "#/components/schemas/ServerSummary"
                        }
                    }
                }
            },
            "PaginatedSshKeyList": {
                "type": "object",
                "required": [
                    "count",
                    "results"
                ],
                "properties": {
                    "count": {
                        "type": "integer",
                        "example": 123
                    },
                    "next": {
                        "type": "string",
                        "nullable": true,
                        "format": "uri",
                        "example": "http://api.example.org/accounts/?page=4"
                    },
                    "previous": {
                        "type": "string",
                        "nullable": true,
                        "format": "uri",
                        "example": "http://api.example.org/accounts/?page=2"
                    },
                    "results": {
                        "type": "array",
                        "items": {
                            "$ref": "#/components/schemas/SshKey"
                        }
                    }
                }
            },
            "PatchedFirewallGroupRenameRequest": {
                "type": "object",
                "properties": {
                    "name": {
                        "type": "string",
                        "minLength": 1,
                        "maxLength": 255
                    }
                }
            },
            "PatchedFirewallRuleRequest": {
                "type": "object",
                "description": "A rule allows the traffic it matches: a protocol, optionally ports, and an address range for its direction.",
                "properties": {
                    "protocol": {
                        "$ref": "#/components/schemas/ProtocolEnum"
                    },
                    "port_min": {
                        "type": "integer",
                        "maximum": 65535,
                        "minimum": 1,
                        "nullable": true,
                        "description": "The first port of the range, for `tcp` and `udp` only. Leave both ports empty to allow every port."
                    },
                    "port_max": {
                        "type": "integer",
                        "maximum": 65535,
                        "minimum": 1,
                        "nullable": true,
                        "description": "The last port of the range; empty for `port_min` alone. Needs `port_min`."
                    },
                    "source_cidr": {
                        "type": "string",
                        "nullable": true,
                        "description": "Where the traffic comes from, for rules of an `ingress` group. A network in CIDR notation, such as `192.0.2.0/24` or `2001:db8::/32`, or a single address, which is stored as a `/32` or `/128` prefix. Send the network address: `192.0.2.1/24` is refused rather than read as `192.0.2.0/24`, so a typo cannot change what the rule matches. A scope id, quotes and whitespace are refused. A network of one address family matches that family only. Returned in canonical form. Empty or null means any address."
                    },
                    "destination_cidr": {
                        "type": "string",
                        "nullable": true,
                        "description": "Where the traffic goes, for rules of an `egress` group. A network in CIDR notation, such as `192.0.2.0/24` or `2001:db8::/32`, or a single address, which is stored as a `/32` or `/128` prefix. Send the network address: `192.0.2.1/24` is refused rather than read as `192.0.2.0/24`, so a typo cannot change what the rule matches. A scope id, quotes and whitespace are refused. A network of one address family matches that family only. Returned in canonical form. Empty or null means any address."
                    },
                    "priority": {
                        "type": "integer",
                        "maximum": 64996,
                        "minimum": 1,
                        "default": 1000,
                        "description": "Orders the rules in a group, lowest first, from 1 to 64996. Every rule allows traffic, so the order never changes what is allowed."
                    },
                    "comment": {
                        "type": "string",
                        "nullable": true,
                        "description": "A note; it changes nothing.",
                        "maxLength": 255
                    }
                }
            },
            "PatchedInvitationRequest": {
                "type": "object",
                "properties": {
                    "project": {
                        "type": "integer"
                    },
                    "email": {
                        "type": "string",
                        "format": "email",
                        "minLength": 1,
                        "maxLength": 254
                    },
                    "role": {
                        "$ref": "#/components/schemas/InvitationRoleEnum"
                    }
                }
            },
            "PatchedProjectRequest": {
                "type": "object",
                "properties": {
                    "name": {
                        "type": "string",
                        "minLength": 1,
                        "maxLength": 100
                    },
                    "slug": {
                        "type": "string",
                        "minLength": 1,
                        "description": "A unique slug name for your project. No spaces are allowed!",
                        "pattern": "^[-a-zA-Z0-9_]+$"
                    }
                }
            },
            "PatchedServerUpdateRequest": {
                "type": "object",
                "properties": {
                    "hostname": {
                        "type": "string",
                        "minLength": 2,
                        "maxLength": 64
                    }
                }
            },
            "PatchedSshKeyRenameRequest": {
                "type": "object",
                "properties": {
                    "name": {
                        "type": "string",
                        "minLength": 1,
                        "maxLength": 255
                    }
                }
            },
            "Plan": {
                "type": "object",
                "properties": {
                    "name": {
                        "type": "string",
                        "nullable": true
                    },
                    "category": {
                        "type": "string",
                        "nullable": true
                    },
                    "cpu_cores": {
                        "type": "integer",
                        "nullable": true
                    },
                    "ram_mb": {
                        "type": "integer",
                        "nullable": true
                    },
                    "disk_gb": {
                        "type": "integer",
                        "nullable": true
                    },
                    "boot_disk_gb": {
                        "type": "integer",
                        "nullable": true
                    }
                },
                "required": [
                    "boot_disk_gb",
                    "category",
                    "cpu_cores",
                    "disk_gb",
                    "name",
                    "ram_mb"
                ]
            },
            "PrivateNetwork": {
                "type": "object",
                "properties": {
                    "eligible": {
                        "type": "boolean",
                        "nullable": true
                    },
                    "enabled": {
                        "type": "boolean",
                        "nullable": true
                    }
                },
                "required": [
                    "eligible",
                    "enabled"
                ]
            },
            "Product": {
                "type": "object",
                "properties": {
                    "pid": {
                        "type": "integer"
                    },
                    "product_name": {
                        "type": "string"
                    },
                    "product_description": {
                        "type": "array",
                        "items": {
                            "type": "string"
                        }
                    },
                    "setup_fee": {
                        "$ref": "#/components/schemas/SetupFee"
                    },
                    "billing_cycles": {
                        "type": "array",
                        "items": {
                            "type": "string"
                        }
                    },
                    "supported_locations": {
                        "type": "array",
                        "items": {
                            "type": "string"
                        }
                    },
                    "default_billing_cycle": {
                        "type": "string"
                    },
                    "default_price": {
                        "type": "string"
                    },
                    "out_of_stock_locations": {
                        "type": "array",
                        "items": {
                            "type": "string"
                        }
                    },
                    "upgrade_out_of_stock_locations": {
                        "type": "array",
                        "items": {
                            "type": "string"
                        }
                    },
                    "server_type": {
                        "type": "string"
                    }
                },
                "required": [
                    "billing_cycles",
                    "default_billing_cycle",
                    "default_price",
                    "out_of_stock_locations",
                    "pid",
                    "product_description",
                    "product_name",
                    "server_type",
                    "setup_fee",
                    "supported_locations",
                    "upgrade_out_of_stock_locations"
                ]
            },
            "ProductType": {
                "type": "object",
                "properties": {
                    "id": {
                        "type": "integer"
                    },
                    "type": {
                        "type": "string"
                    },
                    "tagline": {
                        "type": "string"
                    },
                    "available_in": {
                        "type": "array",
                        "items": {
                            "type": "string"
                        }
                    }
                },
                "required": [
                    "available_in",
                    "id",
                    "tagline",
                    "type"
                ]
            },
            "Products": {
                "type": "object",
                "properties": {
                    "product_types": {
                        "type": "array",
                        "items": {
                            "$ref": "#/components/schemas/ProductType"
                        }
                    },
                    "products": {
                        "type": "array",
                        "items": {
                            "$ref": "#/components/schemas/Product"
                        }
                    },
                    "operation_systems": {
                        "type": "array",
                        "items": {
                            "$ref": "#/components/schemas/OperatingSystem"
                        }
                    },
                    "ipv6_detail": {
                        "$ref": "#/components/schemas/IPv6Detail"
                    },
                    "ipv4_detail": {
                        "type": "array",
                        "items": {
                            "$ref": "#/components/schemas/IPv4Detail"
                        }
                    }
                },
                "required": [
                    "ipv4_detail",
                    "ipv6_detail",
                    "operation_systems",
                    "product_types",
                    "products"
                ]
            },
            "Project": {
                "type": "object",
                "properties": {
                    "id": {
                        "type": "integer",
                        "readOnly": true
                    },
                    "name": {
                        "type": "string",
                        "maxLength": 100
                    },
                    "slug": {
                        "type": "string",
                        "description": "A unique slug name for your project. No spaces are allowed!",
                        "pattern": "^[-a-zA-Z0-9_]+$"
                    },
                    "members": {
                        "type": "array",
                        "items": {
                            "$ref": "#/components/schemas/Membership"
                        },
                        "readOnly": true
                    },
                    "invitations": {
                        "type": "array",
                        "items": {
                            "$ref": "#/components/schemas/Invitation"
                        },
                        "readOnly": true
                    },
                    "dashboard_url": {
                        "type": "string",
                        "readOnly": true
                    },
                    "is_owner": {
                        "type": "boolean",
                        "readOnly": true
                    }
                },
                "required": [
                    "dashboard_url",
                    "id",
                    "invitations",
                    "is_owner",
                    "members",
                    "name"
                ]
            },
            "ProjectRef": {
                "type": "object",
                "properties": {
                    "slug": {
                        "type": "string",
                        "description": "Use this to address the project in every other endpoint.",
                        "pattern": "^[-a-zA-Z0-9_]+$"
                    },
                    "name": {
                        "type": "string"
                    }
                },
                "required": [
                    "name",
                    "slug"
                ]
            },
            "ProjectRequest": {
                "type": "object",
                "properties": {
                    "name": {
                        "type": "string",
                        "minLength": 1,
                        "maxLength": 100
                    },
                    "slug": {
                        "type": "string",
                        "minLength": 1,
                        "description": "A unique slug name for your project. No spaces are allowed!",
                        "pattern": "^[-a-zA-Z0-9_]+$"
                    }
                },
                "required": [
                    "name"
                ]
            },
            "ProtocolEnum": {
                "enum": [
                    "tcp",
                    "udp",
                    "icmp",
                    "any"
                ],
                "type": "string",
                "description": "* `tcp` - TCP\n* `udp` - UDP\n* `icmp` - ICMP\n* `any` - Any protocol"
            },
            "ReinstallRequest": {
                "type": "object",
                "properties": {
                    "image": {
                        "type": "string",
                        "minLength": 1,
                        "description": "The name of an image, as Server.image.name spells it.",
                        "maxLength": 255
                    },
                    "ssh_keys": {
                        "type": "array",
                        "items": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "description": "Ids of the project's SSH keys to install. Leave it out to keep the server's keys; [] removes them.",
                        "maxItems": 100
                    },
                    "user_data": {
                        "type": "string",
                        "nullable": true,
                        "minLength": 1,
                        "description": "Cloud-init user data, starting with #cloud-config or #!. Not available yet.",
                        "maxLength": 65536
                    }
                },
                "required": [
                    "image"
                ]
            },
            "ReverseDns": {
                "type": "object",
                "properties": {
                    "address": {
                        "type": "string"
                    },
                    "ptr": {
                        "type": "string",
                        "nullable": true,
                        "description": "The reverse DNS name; null when none is set."
                    }
                },
                "required": [
                    "address",
                    "ptr"
                ]
            },
            "ReverseDnsUpdateRequest": {
                "type": "object",
                "properties": {
                    "ptr": {
                        "type": "string",
                        "minLength": 1,
                        "description": "A domain name, e.g. web-01.example.com.",
                        "maxLength": 255
                    }
                },
                "required": [
                    "ptr"
                ]
            },
            "Server": {
                "type": "object",
                "properties": {
                    "id": {
                        "type": "string"
                    },
                    "hostname": {
                        "type": "string",
                        "nullable": true
                    },
                    "status": {
                        "$ref": "#/components/schemas/ServerStatusEnum"
                    },
                    "pending_changes": {
                        "type": "boolean",
                        "description": "The server has changes that its next reboot through the API applies."
                    },
                    "location": {
                        "$ref": "#/components/schemas/Location"
                    },
                    "image": {
                        "$ref": "#/components/schemas/Image"
                    },
                    "plan": {
                        "$ref": "#/components/schemas/Plan"
                    },
                    "network": {
                        "$ref": "#/components/schemas/Network"
                    },
                    "bandwidth": {
                        "allOf": [
                            {
                                "$ref": "#/components/schemas/Bandwidth"
                            }
                        ],
                        "nullable": true
                    },
                    "firewall_groups": {
                        "type": "array",
                        "items": {
                            "type": "integer"
                        },
                        "nullable": true,
                        "description": "Null when they could not be read just now."
                    },
                    "ssh_keys": {
                        "type": "array",
                        "items": {
                            "type": "integer"
                        }
                    },
                    "iso": {
                        "allOf": [
                            {
                                "$ref": "#/components/schemas/IsoRef"
                            }
                        ],
                        "nullable": true,
                        "description": "The mounted ISO, if any."
                    },
                    "has_user_data": {
                        "type": "boolean",
                        "description": "The server was installed with cloud-init user data."
                    },
                    "billing": {
                        "allOf": [
                            {
                                "$ref": "#/components/schemas/Billing"
                            }
                        ],
                        "nullable": true,
                        "description": "Null when the server has no billing service, or billing could not be read just now."
                    },
                    "created_at": {
                        "type": "string",
                        "format": "date-time",
                        "nullable": true
                    }
                },
                "required": [
                    "bandwidth",
                    "billing",
                    "created_at",
                    "firewall_groups",
                    "has_user_data",
                    "hostname",
                    "id",
                    "image",
                    "iso",
                    "location",
                    "network",
                    "pending_changes",
                    "plan",
                    "ssh_keys",
                    "status"
                ]
            },
            "ServerFirewallGroups": {
                "type": "object",
                "properties": {
                    "firewall_groups": {
                        "type": "array",
                        "items": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "description": "Ids of the project's firewall groups. They replace the server's groups; [] detaches them all.",
                        "maxItems": 100
                    }
                },
                "required": [
                    "firewall_groups"
                ]
            },
            "ServerFirewallGroupsRequest": {
                "type": "object",
                "properties": {
                    "firewall_groups": {
                        "type": "array",
                        "items": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "description": "Ids of the project's firewall groups. They replace the server's groups; [] detaches them all.",
                        "maxItems": 100
                    }
                },
                "required": [
                    "firewall_groups"
                ]
            },
            "ServerStatusEnum": {
                "enum": [
                    "running",
                    "stopped",
                    "suspended"
                ],
                "type": "string",
                "description": "* `running` - running\n* `stopped` - stopped\n* `suspended` - suspended"
            },
            "ServerSummary": {
                "type": "object",
                "description": "A server in a list. Fetch the server for everything else.",
                "properties": {
                    "id": {
                        "type": "string"
                    },
                    "hostname": {
                        "type": "string",
                        "nullable": true
                    },
                    "status": {
                        "$ref": "#/components/schemas/ServerStatusEnum"
                    },
                    "ipv4_primary": {
                        "type": "string",
                        "format": "ipv4",
                        "nullable": true
                    },
                    "location": {
                        "$ref": "#/components/schemas/Location"
                    },
                    "plan": {
                        "$ref": "#/components/schemas/ServerSummaryPlan"
                    }
                },
                "required": [
                    "hostname",
                    "id",
                    "ipv4_primary",
                    "location",
                    "plan",
                    "status"
                ]
            },
            "ServerSummaryPlan": {
                "type": "object",
                "properties": {
                    "name": {
                        "type": "string",
                        "nullable": true
                    }
                },
                "required": [
                    "name"
                ]
            },
            "SetupFee": {
                "type": "object",
                "properties": {
                    "msetupfee": {
                        "type": "string"
                    },
                    "qsetupfee": {
                        "type": "string"
                    },
                    "ssetupfee": {
                        "type": "string"
                    },
                    "asetupfee": {
                        "type": "string"
                    },
                    "bsetupfee": {
                        "type": "string"
                    },
                    "tsetupfee": {
                        "type": "string"
                    }
                },
                "required": [
                    "asetupfee",
                    "bsetupfee",
                    "msetupfee",
                    "qsetupfee",
                    "ssetupfee",
                    "tsetupfee"
                ]
            },
            "SshKey": {
                "type": "object",
                "properties": {
                    "id": {
                        "type": "integer"
                    },
                    "name": {
                        "type": "string"
                    },
                    "public_key": {
                        "type": "string"
                    },
                    "fingerprint": {
                        "type": "string",
                        "nullable": true,
                        "readOnly": true,
                        "description": "The SHA256 fingerprint, as `ssh-keygen -lf` prints it. Null for a key the API would refuse today, such as a DSA key added before keys were checked."
                    },
                    "created_at": {
                        "type": "string",
                        "format": "date-time",
                        "description": "When the key was added. Only the day is recorded, so the time is midnight UTC."
                    }
                },
                "required": [
                    "created_at",
                    "fingerprint",
                    "id",
                    "name",
                    "public_key"
                ]
            },
            "SshKeyCreateRequest": {
                "type": "object",
                "properties": {
                    "name": {
                        "type": "string",
                        "minLength": 1,
                        "maxLength": 255
                    },
                    "public_key": {
                        "type": "string",
                        "minLength": 1,
                        "description": "One public key in OpenSSH format, as in a .pub file: ssh-ed25519, ecdsa-sha2-nistp256, -nistp384, -nistp521, or ssh-rsa of at least 2048 bits. The comment after the key is not kept; the name is the key's label.",
                        "maxLength": 2048
                    }
                },
                "required": [
                    "name",
                    "public_key"
                ]
            },
            "WhenEnum": {
                "enum": [
                    "end_of_term",
                    "immediate"
                ],
                "type": "string",
                "description": "* `end_of_term` - end_of_term\n* `immediate` - immediate"
            },
            "ProblemDetails": {
                "type": "object",
                "description": "An RFC 9457 problem details document. `code` is stable and machine-readable; `detail` is a sentence for humans and may change. Some errors add members, such as `action_id`.",
                "properties": {
                    "type": {
                        "type": "string",
                        "format": "uri",
                        "example": "https://docs.hosthatch.com/api/errors#not_found"
                    },
                    "title": {
                        "type": "string"
                    },
                    "status": {
                        "type": "integer"
                    },
                    "detail": {
                        "type": "string"
                    },
                    "code": {
                        "type": "string",
                        "enum": [
                            "action_in_progress",
                            "already_enabled",
                            "api_key_expired",
                            "authentication_required",
                            "billing_account_required",
                            "conflict",
                            "feature_unavailable",
                            "group_in_use",
                            "idempotency_key_reused",
                            "insufficient_capacity",
                            "insufficient_role",
                            "internal_error",
                            "invalid_api_key",
                            "invitation_pending",
                            "iso_limit_reached",
                            "iso_mounted",
                            "key_exists",
                            "limit_reached",
                            "method_not_allowed",
                            "name_taken",
                            "node_maintenance",
                            "not_acceptable",
                            "not_eligible",
                            "not_found",
                            "permission_denied",
                            "project_deleting",
                            "project_not_empty",
                            "project_not_ready",
                            "rate_limited",
                            "read_only_key",
                            "reverse_dns_unavailable",
                            "rule_exists",
                            "snapshot_limit_reached",
                            "unsupported_media_type",
                            "upstream_error",
                            "upstream_unavailable",
                            "validation_error"
                        ]
                    },
                    "instance": {
                        "type": "string",
                        "description": "The request path."
                    },
                    "errors": {
                        "type": "array",
                        "description": "Present on `validation_error` only. `field` is null for errors about the whole request.",
                        "items": {
                            "type": "object",
                            "properties": {
                                "field": {
                                    "type": "string",
                                    "nullable": true
                                },
                                "code": {
                                    "type": "string"
                                },
                                "message": {
                                    "type": "string"
                                }
                            },
                            "required": [
                                "field",
                                "code",
                                "message"
                            ]
                        }
                    }
                },
                "required": [
                    "type",
                    "title",
                    "status",
                    "code"
                ]
            }
        },
        "securitySchemes": {
            "bearerAuth": {
                "type": "http",
                "scheme": "bearer",
                "description": "An API key from your profile page, sent as `Authorization: Bearer <key>`."
            }
        }
    },
    "servers": [
        {
            "url": "https://console.hosthatch.com/api/v1"
        }
    ],
    "tags": [
        {
            "name": "account",
            "description": "The user an API key belongs to."
        },
        {
            "name": "projects",
            "description": "Projects, their members and invitations."
        },
        {
            "name": "catalogue",
            "description": "What can be ordered: products, images, locations and prices."
        },
        {
            "name": "servers",
            "description": "Servers in a project."
        },
        {
            "name": "actions",
            "description": "Asynchronous operations on servers. Poll an action for its outcome."
        },
        {
            "name": "orders",
            "description": "Orders for new servers, upgrades and extra bandwidth."
        },
        {
            "name": "ssh-keys",
            "description": "SSH keys available to a project's servers."
        },
        {
            "name": "snapshots",
            "description": "Snapshots of a project's servers."
        },
        {
            "name": "firewall-groups",
            "description": "Firewall groups and their rules. Every rule allows traffic. A server with any group attached refuses new inbound connections that no ingress rule allows, and once it has an egress group, outbound traffic that no egress rule allows. Rules are stateful: replies to an allowed connection pass. Changes reach the servers in the background, after the request has been answered."
        },
        {
            "name": "isos",
            "description": "ISO images that can be mounted on servers."
        }
    ],
    "security": [
        {
            "bearerAuth": []
        }
    ]
}