# Let customers run their servers

> Build a Container Apps server panel in your storefront, with power and console, files, snapshots, databases, schedules, ports, software and sharing.

Source: https://docs.coritan.com/organizations/storefront/portal-servers/

Your storefront's server panel runs on the portal API. It gives a customer the controls that the [Container Apps](/managed-containers/) guides describe for the Coritan dashboard, on the servers they bought from you. Every route on this page is under `/portal/servers/{uuid}/` or `/portal/snapshots/`, and takes the customer's token as `Authorization: Bearer $CUSTOMER_TOKEN`.

Most routes have the same path after `{uuid}` as the platform's `/api/v1/client/servers/{uuid}/` routes and take the same body, so the API sections of the Container Apps guides apply once you change the base path and the token. This page covers what the portal does differently, and the routes those guides do not have.

## Before you begin

- Get a customer token as [Sign customers in to your storefront](/organizations/storefront/customer-sign-in/) describes.
- Find the server's `uuid`. It is `resource.uuid` on the customer's service; see [Show the customer's services](/organizations/storefront/customer-portal/#show-the-customer-s-services).

## Open a server

```bash
curl "https://api.coritan.com/api/v1/orgs/acme/portal/servers/$SERVER_UUID" \
  -H "Authorization: Bearer $CUSTOMER_TOKEN"
```

The answer is the server as the customer should see it: its `name`, `status`, plan limits such as `memory_mb` and `disk_mb`, and its `join_address`. On a free server, `ip_address` and `port` are empty and players use the `join_address`. `entitlements` lists what the plan includes, and one the plan leaves out has `allowed: false` with a `reason` and a `detail` to show in its place. `legacy_backup_count` says whether the server has backups worth a tab, `sleep` holds a free server's sleep state, and `lock` says whether we have locked the server.

Three fields say what this customer may do:

| Field | Meaning |
| --- | --- |
| `is_owner` | `true` for the customer whose service it is, and `false` for a customer the owner shared it with. |
| `permissions` | `["*"]` for the owner. Otherwise, the permissions the owner granted. |
| `capabilities` | One `true` or `false` flag per permission, named with underscores, such as `file_read_content`. Show or hide each control by these flags. |

`GET /resources` returns the power `state` and live use of CPU, memory, disk and network, in the shape [Use the console and power controls](/managed-containers/console/) describes. Poll it while the panel is open. `GET /status-ping` asks a Minecraft server who is online, and never fails: `reachable` is `false` when the game does not answer.

## Who can do what

The owner can do everything. A customer the owner shared the server with can do what their permissions allow, and a request outside them answers `403` with `Insufficient permissions`. `GET /permissions` lists every permission an owner can grant.

| Permission | Lets the customer |
| --- | --- |
| `control.console` | Send console commands. |
| `control.start`, `control.stop`, `control.restart` | Send that power signal. `kill` needs `control.stop`. Waking and keeping a free server need `control.start`. |
| `websocket.connect` | Open the live console. |
| `file.read`, `file.read-content` | List files, and read or download them. |
| `file.create`, `file.update`, `file.delete`, `file.archive` | Upload, create and copy files, or download one from a URL. Edit, rename and change modes. Delete. Compress and extract. |
| `file.sftp` | Connect over SFTP. |
| `snapshot.read`, `snapshot.create`, `snapshot.restore`, `snapshot.download`, `snapshot.delete` | List, take, restore, download and delete snapshots. Locking one needs `snapshot.delete`. |
| `backup.read`, `backup.restore`, `backup.download`, `backup.delete` | List, restore, download and delete old backups. Locking one needs `backup.delete`. |
| `database.read`, `database.create`, `database.update`, `database.delete` | List databases, create them, rotate their passwords and delete them. |
| `database.view_password` | See a database's password, and use the SQL editor and table browser. |
| `schedule.read`, `schedule.create`, `schedule.update`, `schedule.delete` | See schedules and their runs, create them, change them and their tasks or run them now, and delete them. |
| `allocation.read`, `allocation.create`, `allocation.update`, `allocation.delete` | See ports, add or request one, choose the primary port or publish one, and release one. |
| `startup.read`, `startup.update` | See the Java memory and startup flags, and change them and the startup variables. |
| `settings.rename` | Rename the server and change its join address subdomain. |
| `settings.reinstall` | Reinstall the server, change its software, install and remove add-ons, and run world optimization. |

Viewing the server, its resources, its sleep state, its software and its custom domain needs no particular permission. Only the owner can share the server, list it in your server directory, and link a custom domain.

> [!WARNING]
> Snapshots belong to the owner's account, not to one server. A customer with `snapshot.restore` on one server can restore any of the owner's snapshots onto it, including one taken from another server.

## Share a server

The owner shares a server with another customer of your organization by username or email address:

```bash
curl -X POST "https://api.coritan.com/api/v1/orgs/acme/portal/servers/$SERVER_UUID/users" \
  -H "Authorization: Bearer $CUSTOMER_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"username_or_email": "alex@example.com", "permissions": ["control.console", "control.start", "control.stop", "file.read", "file.read-content"]}'
```

A customer with that username or email gets access at once, and we email them. An email address with no customer behind it gets a pending invite instead, with `kind` set to `invite` and an `expires_at` 14 days away. The invite becomes access when a customer with that address signs in to your storefront.

- `GET /users` lists who has access, each with `id`, `kind` (`grant` or `invite`), `status`, `username`, `email` and `permissions`. A shared customer sees the others by username only, without emails or invites.
- `PUT /users/{subuser_id}` with `permissions` replaces what a customer may do.
- `DELETE /users/{subuser_id}` removes a customer or cancels an invite, and we email a customer who was removed. A shared customer can remove themselves the same way, or with `POST /users/leave`.

[Share a server with other users](/managed-containers/users/) explains each permission in the words the Coritan dashboard uses.

## Power and the console

Send a power signal with `POST /power`:

```bash
curl -X POST "https://api.coritan.com/api/v1/orgs/acme/portal/servers/$SERVER_UUID/power" \
  -H "Authorization: Bearer $CUSTOMER_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"signal": "restart"}'
```

`signal` is `start`, `stop`, `restart` or `kill`, and the answer confirms only that we sent it, so read `GET /resources` for the result. `POST /command` runs a console command, given as `command` in the body or in the query string, up to 1,000 characters.

For the live console, `GET /websocket` returns the socket's address as `socket`, and the customer's token as `token`. Open the socket with the token in the `token` query parameter:

```javascript
const res = await fetch(`https://api.coritan.com/api/v1/orgs/acme/portal/servers/${uuid}/websocket`, {
  headers: { Authorization: `Bearer ${customerToken}` },
});
const { socket, token } = await res.json();
const ws = new WebSocket(`${socket}?token=${encodeURIComponent(token)}`);
ws.onopen = () => ws.send(JSON.stringify({ event: "send logs", args: [null] }));
ws.onmessage = (message) => {
  const { event, args } = JSON.parse(message.data);
  if (event === "console output") showLine(args[0]);
};
```

The socket speaks the events that [Use the console and power controls](/managed-containers/console/) lists. Send `send command` and `set state` only when the customer holds `control.console` or the power permission, because the socket refuses them otherwise. When the owner removes a customer's access, the socket closes with code `4003`. Do not reopen a socket that closed with `4001`, `4003`, `4008`, `4010` or `4011` until something changes: the token expired, access ended, the session ended, or the server is suspended or gone.

## Wake a free server

A free server sleeps when nobody plays on it, as [How free servers work](/managed-containers/free-servers/) explains. `GET /sleep` returns its `sleep` state: the `phase` (`awake`, `starting`, `queued` or `asleep`), `sleeps_at` to count down from, and the customer's place in the start queue. A paid server answers with `policy` set to `none`.

- `POST /wake` asks for the server to start. When `sleep.challenge_required` is `true`, show the Cloudflare Turnstile challenge first, with the site key from `GET /storefront/branding`, and send its answer as `turnstile_token`.
- `POST /keep` marks a free server as still in use, which resets its count of days without activity. On a server we suspended for inactivity, it also reactivates the server and cancels its deletion. A paid server answers `409`.

## Files and SFTP

The file routes are the ones [Manage server files](/managed-containers/files/) describes, under `/files/`. Upload with a multipart form, one `files` part per file:

```bash
curl -X POST "https://api.coritan.com/api/v1/orgs/acme/portal/servers/$SERVER_UUID/files/upload?directory=/plugins" \
  -H "Authorization: Bearer $CUSTOMER_TOKEN" \
  -F "files=@EssentialsX.jar"
```

Each file can be up to 100 MB. When some files of a batch fail after others have landed, the answer lists the uploaded names in `files` and the others in `failed`. `POST /files/pull` downloads a file from a URL onto the server, `GET /files/pull/status` reports on it and `POST /files/pull/cancel?download_id=...` stops it.

`GET /sftp` returns the `host`, `port` and `username` to connect with. The username is the customer's own email address and a short server reference, so a shared customer signs in as themselves. The password is the customer's storefront password. A customer who signed up with a social account has none until they set one; see [Social sign-in](/organizations/storefront/customer-sign-in/#social-sign-in). [Connect to a server with SFTP](/managed-containers/sftp/) covers the rest.

## Take and restore snapshots

A snapshot saves the server's files to the account, and can be restored onto any of the owner's servers. The [Snapshots](/snapshots/) guides explain how they work and what the storage allowance counts.

1. Check that one fits with `GET /snapshots/estimate`. It answers `estimated_bytes`, `remaining_bytes`, `fits` and `shortfall_bytes`. The estimate is the server's disk use before compression, so the snapshot is never larger.
2. Take it:

```bash
curl -X POST "https://api.coritan.com/api/v1/orgs/acme/portal/servers/$SERVER_UUID/snapshots" \
  -H "Authorization: Bearer $CUSTOMER_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"name": "Before the 1.21 update", "ignored_files": ["logs"], "is_locked": true}'
```

`name` is up to 191 characters, `ignored_files` leaves out up to 50 paths, and `is_locked` keeps the snapshot from being rotated away. With no body, the snapshot is called `manual-snapshot`.

| Route | What it does |
| --- | --- |
| `GET /snapshots` | Lists this server's snapshots. `scope=account` lists every snapshot the owner holds, each marked for whether it can restore onto this server. A shared customer gets this server's list either way. |
| `POST /snapshots/{snapshot_uuid}/restore` | Restores any of the owner's snapshots onto this server. `truncate` (default `true`) deletes the current files first, and `allow_mismatch` confirms a restore from the same game on another loader. |
| `GET /snapshots/{snapshot_uuid}/download` | Returns a short-lived download `url`. |
| `POST /snapshots/{snapshot_uuid}/lock` | Locks or unlocks a snapshot. |
| `DELETE /snapshots/{snapshot_uuid}` | Deletes a snapshot. |
| `GET /snapshots/seed` | For a server ordered from a snapshot, the restore it is waiting on or has finished. `POST /snapshots/seed/retry` runs a failed one again. |

The account routes under `/portal/snapshots/` do the same for the customer's own snapshots without naming a server, so they work after the server has gone. `GET /portal/snapshots` lists them, `GET /portal/snapshots/allowance` returns the storage allowance, and `GET`, `DELETE`, `POST .../lock` and `GET .../download` act on one. `POST /portal/snapshots/{snapshot_uuid}/restore` needs `target_server_uuid`, because there is no server in the path to restore onto.

## Backups

Snapshots have replaced backups, so `POST /backups` answers `410` with `reason` set to `replaced_by_snapshots`. A server that took backups before keeps them: `GET /backups` lists them, and restore, download, lock and delete work as [Manage server backups](/managed-containers/backups/) describes.

## Databases

`POST /databases` creates a database on the server's database host. `name_suffix` names it with lowercase letters, digits and underscores, up to 48 characters (default `db`), and `remote` limits where it accepts connections from (default `%`, anywhere). Send an `Idempotency-Key` header so a retry does not create two.

```bash
curl -X POST "https://api.coritan.com/api/v1/orgs/acme/portal/servers/$SERVER_UUID/databases" \
  -H "Authorization: Bearer $CUSTOMER_TOKEN" \
  -H "Idempotency-Key: 1f9e6c2a-luckperms" \
  -H "Content-Type: application/json" \
  -d '{"name_suffix": "luckperms"}'
```

| Route | What it does |
| --- | --- |
| `GET /databases` | Lists the server's databases. |
| `GET /databases/{database_id}/credentials` | Returns the password and connection details. |
| `POST /databases/{database_id}/rotate-password` | Sets a new password. |
| `POST /databases/{database_id}/retry` | Tries a failed creation again. |
| `DELETE /databases/{database_id}` | Deletes the database. |
| `POST /databases/{database_id}/query` | Runs the SQL in `sql`, up to 65,536 characters, as the database's own user. |
| `GET /databases/{database_id}/tables` | Lists tables. `.../tables/{table}/columns` describes one. |
| `GET /databases/{database_id}/tables/{table}/rows` | Reads rows: `limit` (1–100, default 50), `offset`, `search`, `sort` and `direction`. |
| `POST`, `PATCH` `/databases/{database_id}/tables/{table}/rows` | Inserts a row from `values`, or changes the row whose primary key is `key`. |
| `POST /databases/{database_id}/tables/{table}/rows/delete` | Deletes the row whose primary key is `key`. |
| `GET /databases/{database_id}/tables/{table}/export.csv` | Downloads the table as CSV. `X-Export-Truncated: 1` means it holds only part of the table. |
| `POST .../tables/{table}/truncate`, `DELETE .../tables/{table}` | Empties or drops a table. |

[Create and manage server databases](/managed-containers/databases/) explains the database host and the connection details.

## Schedules

Schedules run tasks on a timetable, as [Schedule server tasks](/managed-containers/schedules/) describes, with the same body under `/schedules/`:

```bash
curl -X POST "https://api.coritan.com/api/v1/orgs/acme/portal/servers/$SERVER_UUID/schedules" \
  -H "Authorization: Bearer $CUSTOMER_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"name": "Nightly restart", "cron_minute": "0", "cron_hour": "4", "cron_day_of_month": "*", "cron_month": "*", "cron_day_of_week": "*", "timezone": "Europe/London", "tasks": [{"action": "command", "payload": {"command": "say Restarting in 60 seconds"}}, {"action": "power", "payload": {"signal": "restart"}, "time_offset": 60}]}'
```

A shared customer needs `schedule.update` to change tasks, and also the permission each task's action needs by hand: `control.console` for a command, the power permission for a power task, and `snapshot.create` for a snapshot. That way a schedule never does what the customer could not do themselves. `GET /schedules/{schedule_uuid}/runs` lists recent runs, newest first, and `POST /schedules/{schedule_uuid}/execute` runs a schedule now.

## Ports

`GET /allocations` lists the server's ports and how many it may have, and `GET /allocations/available-ports` lists free ones. `POST /allocations` adds a port, with an optional `port`, `notes`, and `on_dedicated_ip` to open it on the server's Floating IP. `POST /allocations/{allocation_id}/primary` makes a port the one players connect to, `POST /allocations/{allocation_id}/publish-port` publishes one on the game's default port of a Floating IP, and `DELETE /allocations/{allocation_id}` releases it. [Manage server ports](/managed-containers/ports/) explains each.

Your organization can decide that extra ports on free servers go through a request to your staff instead. `GET /allocations/request` then answers `required: true`, with the customer's `open_request` if they have one, and `POST /allocations` answers `403` with `reason` set to `request_required`. Send the request with a note that says what the port is for:

```bash
curl -X POST "https://api.coritan.com/api/v1/orgs/acme/portal/servers/$SERVER_UUID/allocations/request" \
  -H "Authorization: Bearer $CUSTOMER_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"note": "A second port for the web map plugin"}'
```

`note` is 3–500 characters. The request opens a conversation in your support inbox tagged `port-request`, and a second request while one is open returns the first. Your staff add the port as [Manage customer servers in the staff console](/organizations/staff-console/servers/) describes.

## Software and add-ons

The software routes are the ones [Change the server software](/managed-containers/software/) and the guides after it describe, under `/software/`. Reading them needs only access to the server. Changing what the server runs, installing, updating and removing add-ons, resource packs, safe mode and Bedrock packs need `settings.reinstall`, and the Java memory and startup flags at `GET` and `PATCH /software/jvm` need `startup.read` and `startup.update`.

- `GET /software/context` says what the server runs now. `GET /software/catalog`, `.../catalog/{key}/versions` and `.../versions/{version}/builds` list what it can change to, and `POST /software/change` changes it. A change that wipes the server needs `confirm_server_name`.
- `POST /software/search` finds add-ons, `GET /software/versions/{source_uuid}/{identifier}` lists an add-on's versions and `GET /software/dependencies/{source_uuid}/{identifier}` what one needs. `POST /software/install` installs one; `mode` set to `replace` wipes the server first and needs `confirm_server_name`.
- `GET /software` lists what we installed, `GET /software/addons` every add-on on disk, and `GET /software/updates` newer builds. `GET /software/installs` follows install jobs, which `.../cancel` and `.../retry` act on.
- `POST /software/bedrock` with `enabled` turns Bedrock crossplay on or off for a Java server.

## Import files from another host

`POST /import/test-connection` and `POST /import/start` take the body [Import a server from another host](/managed-containers/import/) describes. Testing needs `file.read` and starting needs `file.create`. `truncate` set to `true` wipes the server first, so it also needs `file.delete`. `GET /import/current` returns the running import, `GET /import/status/{import_id}` reports on one, and `DELETE /import/{import_id}` stops it.

## Change the server's settings

| Route | What it does |
| --- | --- |
| `PATCH /settings` | `name` renames the server: 2–48 characters with at least one letter or number. `world_optimization_enabled` turns world optimization on or off. A free server can turn it on but not off. |
| `PATCH /subdomain` | Changes the first part of the join address: 3–28 lowercase letters, digits and hyphens, not only digits. |
| `PATCH /startup-variables` | Changes the startup variables the game allows, as `variables`. They apply at the next restart. |
| `POST /reinstall` | Deletes every file and installs the server again. Send the server's name as `confirm_server_name`; case does not matter. A server whose install never finished needs no name. |
| `GET /world-optimization` | What removing unused chunks has done to the world, with its recent runs. |
| `POST /world-optimization` | Runs world optimization now, once a day, on a stopped server with the setting on. |

## Link a custom domain

The owner can give the join address a name on their own domain, such as `play.example.com`.

1. Read `GET /custom-domain`. `expected_cname_target` is the address the customer's DNS record must point at.
2. Ask the customer to add a CNAME record for their name, pointing at that address. For a domain's root, use a DNS provider that flattens CNAME records or offers ALIAS records.
3. Link it:

```bash
curl -X POST "https://api.coritan.com/api/v1/orgs/acme/portal/servers/$SERVER_UUID/custom-domain" \
  -H "Authorization: Bearer $CUSTOMER_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"domain": "example.com", "subdomain": "play", "include_in_list": true}'
```

`subdomain` defaults to `@`, the domain itself. The answer has `verification_status`: `verified` when we can see the record, or `pending` until we can. We keep checking, and `POST /custom-domain/verify` checks now. When the record stays missing across several checks, the status becomes `failed`, the name stops working and we email the owner once. It works again by itself when the record returns.

`include_in_list` shows the custom name in your server directory in place of the join address; change it later with `PATCH /custom-domain`. `DELETE /custom-domain` unlinks the name. Changing the server's subdomain moves the address the record must point at, so we email the owner the new one and the name waits as `pending` until the record moves.

## List the server in your directory

When your organization runs a public server directory, the owner decides whether their server appears in it. `GET /listing` returns `hidden`, the chosen `tags`, the `available_tags` and `max_tags`, and `feature_enabled`. `PATCH /listing` with `hidden` and `tags` changes them. Listing a server needs at least one of your tags and a join address. [Run a community with a server list, forum and guides](/organizations/storefront/community/) covers the directory itself.

## Result

Your storefront shows each server with the controls its customer may use, and every request is checked against the owner's grant, so a control your panel shows by mistake still cannot do more than the grant allows.

## Troubleshooting

`401` on every call
: The customer token is missing, expired or belongs to another organization. See [Troubleshooting](/organizations/storefront/customer-sign-in/#troubleshooting) for customer sign-in.

`403` with `Access denied`
: The customer neither owns the server nor has it shared with them. Check the `uuid` against their services.

`403` with `Insufficient permissions`
: The owner has not granted the permission this route needs. Hide the control when its `capabilities` flag is `false`.

`Only the server owner can manage subusers`
: A shared customer tried to share the server or change its directory listing. Only the owner can.

`409` with `reason` set to `server_deleting`
: The server is being deleted. Every route refuses it from then on.

`423` with `reason` set to `server_locked`
: We locked the server while we review activity that broke our acceptable use policy. Its files stay. Show the `message`.

`Type the server name to confirm a wipe and reinstall`
: `confirm_server_name` is missing or does not match the server's name.

`409` with `reason` set to `world_optimization_running`
: We are removing unused chunks and the server cannot start until that ends. Try again after `retry_after_seconds`.

`File exceeds maximum upload size of 100 MB`
: Upload the file over SFTP, or download it onto the server from a URL.

`Downloading a snapshot is not included on the free plan. …`
: Free plans leave out snapshot downloads. The customer can still restore the snapshot, or download files one by one from the file routes.

`403` with `reason` set to `request_required`
: Your organization asks for port requests on free servers. Send one with `POST /allocations/request`.

`Extra ports on this server are added from the Network tab, not requested`
: Port requests are off for this server. Add the port with `POST /allocations`.

`No matching account in this organization`
: No customer has that username. Use their email address instead, which sends an invite when they have no account yet.

`This server does not sleep; use the power action to start it.`
: The server is on a paid plan. Start it with `POST /power`.

## Related

- [Build a storefront on the Organization API](/organizations/storefront/)
- [Build the customer account area](/organizations/storefront/customer-portal/)
- [Container Apps](/managed-containers/)
- [Snapshots](/snapshots/)

## API

- `GET /api/v1/orgs/{org_slug}/portal/servers/{uuid}`: Get server (https://docs.coritan.com/api/reference/organizations/customer-portal/servers/#op-get-api-v1-orgs-org-slug-portal-servers-uuid)
- `GET /api/v1/orgs/{org_slug}/portal/servers/{uuid}/allocations`: List allocations (https://docs.coritan.com/api/reference/organizations/customer-portal/servers-allocations/#op-get-api-v1-orgs-org-slug-portal-servers-uuid-allocations)
- `POST /api/v1/orgs/{org_slug}/portal/servers/{uuid}/allocations`: Create allocation (https://docs.coritan.com/api/reference/organizations/customer-portal/servers-allocations/#op-post-api-v1-orgs-org-slug-portal-servers-uuid-allocations)
- `GET /api/v1/orgs/{org_slug}/portal/servers/{uuid}/allocations/available-ports`: Available ports (https://docs.coritan.com/api/reference/organizations/customer-portal/servers-allocations/#op-get-api-v1-orgs-org-slug-portal-servers-uuid-allocations-available-ports)
- `GET /api/v1/orgs/{org_slug}/portal/servers/{uuid}/allocations/request`: Get port request (https://docs.coritan.com/api/reference/organizations/customer-portal/servers-allocations/#op-get-api-v1-orgs-org-slug-portal-servers-uuid-allocations-request)
- `POST /api/v1/orgs/{org_slug}/portal/servers/{uuid}/allocations/request`: Ask staff for an extra port on a free server whose brand requires it (https://docs.coritan.com/api/reference/organizations/customer-portal/servers-allocations/#op-post-api-v1-orgs-org-slug-portal-servers-uuid-allocations-request)
- `DELETE /api/v1/orgs/{org_slug}/portal/servers/{uuid}/allocations/{allocation_id}`: Delete allocation (https://docs.coritan.com/api/reference/organizations/customer-portal/servers-allocations/#op-delete-api-v1-orgs-org-slug-portal-servers-uuid-allocations-allocation-id)
- `POST /api/v1/orgs/{org_slug}/portal/servers/{uuid}/allocations/{allocation_id}/primary`: Make one of the server's ports the one players type (https://docs.coritan.com/api/reference/organizations/customer-portal/servers-allocations/#op-post-api-v1-orgs-org-slug-portal-servers-uuid-allocations-allocation-id-primary)
- `POST /api/v1/orgs/{org_slug}/portal/servers/{uuid}/allocations/{allocation_id}/publish-port`: Publish a port on the game's default port of the attached floating IP (https://docs.coritan.com/api/reference/organizations/customer-portal/servers-allocations/#op-post-api-v1-orgs-org-slug-portal-servers-uuid-allocations-allocation-id-publish)
- `GET /api/v1/orgs/{org_slug}/portal/servers/{uuid}/backups`: List backups (https://docs.coritan.com/api/reference/organizations/customer-portal/servers-backups/#op-get-api-v1-orgs-org-slug-portal-servers-uuid-backups)
- `POST /api/v1/orgs/{org_slug}/portal/servers/{uuid}/backups`: Create backup (https://docs.coritan.com/api/reference/organizations/customer-portal/servers-backups/#op-post-api-v1-orgs-org-slug-portal-servers-uuid-backups)
- `DELETE /api/v1/orgs/{org_slug}/portal/servers/{uuid}/backups/{backup_uuid}`: Delete backup (https://docs.coritan.com/api/reference/organizations/customer-portal/servers-backups/#op-delete-api-v1-orgs-org-slug-portal-servers-uuid-backups-backup-uuid)
- `GET /api/v1/orgs/{org_slug}/portal/servers/{uuid}/backups/{backup_uuid}/download`: A short-lived signed URL the browser fetches the archive from directly (https://docs.coritan.com/api/reference/organizations/customer-portal/servers-backups/#op-get-api-v1-orgs-org-slug-portal-servers-uuid-backups-backup-uuid-download)
- `POST /api/v1/orgs/{org_slug}/portal/servers/{uuid}/backups/{backup_uuid}/lock`: Keep a backup, or release it (https://docs.coritan.com/api/reference/organizations/customer-portal/servers-backups/#op-post-api-v1-orgs-org-slug-portal-servers-uuid-backups-backup-uuid-lock)
- `POST /api/v1/orgs/{org_slug}/portal/servers/{uuid}/backups/{backup_uuid}/restore`: Restore backup (https://docs.coritan.com/api/reference/organizations/customer-portal/servers-backups/#op-post-api-v1-orgs-org-slug-portal-servers-uuid-backups-backup-uuid-restore)
- `POST /api/v1/orgs/{org_slug}/portal/servers/{uuid}/command`: Command (https://docs.coritan.com/api/reference/organizations/customer-portal/servers/#op-post-api-v1-orgs-org-slug-portal-servers-uuid-command)
- `GET /api/v1/orgs/{org_slug}/portal/servers/{uuid}/custom-domain`: Vanity CNAME state for this server's join address (https://docs.coritan.com/api/reference/organizations/customer-portal/servers-custom-domain/#op-get-api-v1-orgs-org-slug-portal-servers-uuid-custom-domain)
- `POST /api/v1/orgs/{org_slug}/portal/servers/{uuid}/custom-domain`: Link a customer hostname (https://docs.coritan.com/api/reference/organizations/customer-portal/servers-custom-domain/#op-post-api-v1-orgs-org-slug-portal-servers-uuid-custom-domain)
- `PATCH /api/v1/orgs/{org_slug}/portal/servers/{uuid}/custom-domain`: Show the vanity hostname, or the hosted one, in the public server list (https://docs.coritan.com/api/reference/organizations/customer-portal/servers-custom-domain/#op-patch-api-v1-orgs-org-slug-portal-servers-uuid-custom-domain)
- `DELETE /api/v1/orgs/{org_slug}/portal/servers/{uuid}/custom-domain`: Unlink custom domain (https://docs.coritan.com/api/reference/organizations/customer-portal/servers-custom-domain/#op-delete-api-v1-orgs-org-slug-portal-servers-uuid-custom-domain)
- `POST /api/v1/orgs/{org_slug}/portal/servers/{uuid}/custom-domain/verify`: Check the CNAME now rather than waiting for the next maintenance pass (https://docs.coritan.com/api/reference/organizations/customer-portal/servers-custom-domain/#op-post-api-v1-orgs-org-slug-portal-servers-uuid-custom-domain-verify)
- `GET /api/v1/orgs/{org_slug}/portal/servers/{uuid}/databases`: List databases (https://docs.coritan.com/api/reference/organizations/customer-portal/servers-databases/#op-get-api-v1-orgs-org-slug-portal-servers-uuid-databases)
- `POST /api/v1/orgs/{org_slug}/portal/servers/{uuid}/databases`: Create database (https://docs.coritan.com/api/reference/organizations/customer-portal/servers-databases/#op-post-api-v1-orgs-org-slug-portal-servers-uuid-databases)
- `DELETE /api/v1/orgs/{org_slug}/portal/servers/{uuid}/databases/{database_id}`: Delete database (https://docs.coritan.com/api/reference/organizations/customer-portal/servers-databases/#op-delete-api-v1-orgs-org-slug-portal-servers-uuid-databases-database-id)
- `GET /api/v1/orgs/{org_slug}/portal/servers/{uuid}/databases/{database_id}/credentials`: Get database credentials (https://docs.coritan.com/api/reference/organizations/customer-portal/servers-databases/#op-get-api-v1-orgs-org-slug-portal-servers-uuid-databases-database-id-credentials)
- `POST /api/v1/orgs/{org_slug}/portal/servers/{uuid}/databases/{database_id}/query`: Query database (https://docs.coritan.com/api/reference/organizations/customer-portal/servers-databases/#op-post-api-v1-orgs-org-slug-portal-servers-uuid-databases-database-id-query)
- `POST /api/v1/orgs/{org_slug}/portal/servers/{uuid}/databases/{database_id}/retry`: Retry database (https://docs.coritan.com/api/reference/organizations/customer-portal/servers-databases/#op-post-api-v1-orgs-org-slug-portal-servers-uuid-databases-database-id-retry)
- `POST /api/v1/orgs/{org_slug}/portal/servers/{uuid}/databases/{database_id}/rotate-password`: Rotate database password (https://docs.coritan.com/api/reference/organizations/customer-portal/servers-databases/#op-post-api-v1-orgs-org-slug-portal-servers-uuid-databases-database-id-rotate-passw)
- `GET /api/v1/orgs/{org_slug}/portal/servers/{uuid}/databases/{database_id}/tables`: List database tables (https://docs.coritan.com/api/reference/organizations/customer-portal/servers-databases/#op-get-api-v1-orgs-org-slug-portal-servers-uuid-databases-database-id-tables)
- `DELETE /api/v1/orgs/{org_slug}/portal/servers/{uuid}/databases/{database_id}/tables/{table}`: Drop database table (https://docs.coritan.com/api/reference/organizations/customer-portal/servers-databases/#op-delete-api-v1-orgs-org-slug-portal-servers-uuid-databases-database-id-tables-tab)
- `GET /api/v1/orgs/{org_slug}/portal/servers/{uuid}/databases/{database_id}/tables/{table}/columns`: Describe database table (https://docs.coritan.com/api/reference/organizations/customer-portal/servers-databases/#op-get-api-v1-orgs-org-slug-portal-servers-uuid-databases-database-id-tables-table)
- `GET /api/v1/orgs/{org_slug}/portal/servers/{uuid}/databases/{database_id}/tables/{table}/export.csv`: Export database table (https://docs.coritan.com/api/reference/organizations/customer-portal/servers-databases/#op-get-api-v1-orgs-org-slug-portal-servers-uuid-databases-database-id-tables-table)
- `GET /api/v1/orgs/{org_slug}/portal/servers/{uuid}/databases/{database_id}/tables/{table}/rows`: Read database rows (https://docs.coritan.com/api/reference/organizations/customer-portal/servers-databases/#op-get-api-v1-orgs-org-slug-portal-servers-uuid-databases-database-id-tables-table)
- `POST /api/v1/orgs/{org_slug}/portal/servers/{uuid}/databases/{database_id}/tables/{table}/rows`: Insert database row (https://docs.coritan.com/api/reference/organizations/customer-portal/servers-databases/#op-post-api-v1-orgs-org-slug-portal-servers-uuid-databases-database-id-tables-table)
- `PATCH /api/v1/orgs/{org_slug}/portal/servers/{uuid}/databases/{database_id}/tables/{table}/rows`: Update database row (https://docs.coritan.com/api/reference/organizations/customer-portal/servers-databases/#op-patch-api-v1-orgs-org-slug-portal-servers-uuid-databases-database-id-tables-tabl)
- `POST /api/v1/orgs/{org_slug}/portal/servers/{uuid}/databases/{database_id}/tables/{table}/rows/delete`: Delete database row (https://docs.coritan.com/api/reference/organizations/customer-portal/servers-databases/#op-post-api-v1-orgs-org-slug-portal-servers-uuid-databases-database-id-tables-table)
- `POST /api/v1/orgs/{org_slug}/portal/servers/{uuid}/databases/{database_id}/tables/{table}/truncate`: Truncate database table (https://docs.coritan.com/api/reference/organizations/customer-portal/servers-databases/#op-post-api-v1-orgs-org-slug-portal-servers-uuid-databases-database-id-tables-table)
- `POST /api/v1/orgs/{org_slug}/portal/servers/{uuid}/files/chmod`: Chmod files (https://docs.coritan.com/api/reference/organizations/customer-portal/servers-files/#op-post-api-v1-orgs-org-slug-portal-servers-uuid-files-chmod)
- `POST /api/v1/orgs/{org_slug}/portal/servers/{uuid}/files/compress`: Compress files (https://docs.coritan.com/api/reference/organizations/customer-portal/servers-files/#op-post-api-v1-orgs-org-slug-portal-servers-uuid-files-compress)
- `GET /api/v1/orgs/{org_slug}/portal/servers/{uuid}/files/contents`: File contents (https://docs.coritan.com/api/reference/organizations/customer-portal/servers-files/#op-get-api-v1-orgs-org-slug-portal-servers-uuid-files-contents)
- `POST /api/v1/orgs/{org_slug}/portal/servers/{uuid}/files/copy`: Copy file (https://docs.coritan.com/api/reference/organizations/customer-portal/servers-files/#op-post-api-v1-orgs-org-slug-portal-servers-uuid-files-copy)
- `POST /api/v1/orgs/{org_slug}/portal/servers/{uuid}/files/decompress`: Decompress file (https://docs.coritan.com/api/reference/organizations/customer-portal/servers-files/#op-post-api-v1-orgs-org-slug-portal-servers-uuid-files-decompress)
- `POST /api/v1/orgs/{org_slug}/portal/servers/{uuid}/files/delete`: Delete files (https://docs.coritan.com/api/reference/organizations/customer-portal/servers-files/#op-post-api-v1-orgs-org-slug-portal-servers-uuid-files-delete)
- `GET /api/v1/orgs/{org_slug}/portal/servers/{uuid}/files/download`: Download file (https://docs.coritan.com/api/reference/organizations/customer-portal/servers-files/#op-get-api-v1-orgs-org-slug-portal-servers-uuid-files-download)
- `GET /api/v1/orgs/{org_slug}/portal/servers/{uuid}/files/list`: List files (https://docs.coritan.com/api/reference/organizations/customer-portal/servers-files/#op-get-api-v1-orgs-org-slug-portal-servers-uuid-files-list)
- `POST /api/v1/orgs/{org_slug}/portal/servers/{uuid}/files/mkdir`: Mkdir (https://docs.coritan.com/api/reference/organizations/customer-portal/servers-files/#op-post-api-v1-orgs-org-slug-portal-servers-uuid-files-mkdir)
- `POST /api/v1/orgs/{org_slug}/portal/servers/{uuid}/files/pull`: Pull file (https://docs.coritan.com/api/reference/organizations/customer-portal/servers-files/#op-post-api-v1-orgs-org-slug-portal-servers-uuid-files-pull)
- `POST /api/v1/orgs/{org_slug}/portal/servers/{uuid}/files/pull/cancel`: Cancel pull (https://docs.coritan.com/api/reference/organizations/customer-portal/servers-files/#op-post-api-v1-orgs-org-slug-portal-servers-uuid-files-pull-cancel)
- `GET /api/v1/orgs/{org_slug}/portal/servers/{uuid}/files/pull/status`: Pull status (https://docs.coritan.com/api/reference/organizations/customer-portal/servers-files/#op-get-api-v1-orgs-org-slug-portal-servers-uuid-files-pull-status)
- `POST /api/v1/orgs/{org_slug}/portal/servers/{uuid}/files/rename`: Rename files (https://docs.coritan.com/api/reference/organizations/customer-portal/servers-files/#op-post-api-v1-orgs-org-slug-portal-servers-uuid-files-rename)
- `POST /api/v1/orgs/{org_slug}/portal/servers/{uuid}/files/upload`: Upload files (https://docs.coritan.com/api/reference/organizations/customer-portal/servers-files/#op-post-api-v1-orgs-org-slug-portal-servers-uuid-files-upload)
- `POST /api/v1/orgs/{org_slug}/portal/servers/{uuid}/files/write`: Write file (https://docs.coritan.com/api/reference/organizations/customer-portal/servers-files/#op-post-api-v1-orgs-org-slug-portal-servers-uuid-files-write)
- `GET /api/v1/orgs/{org_slug}/portal/servers/{uuid}/import/current`: Current server import (https://docs.coritan.com/api/reference/organizations/customer-portal/servers-import/#op-get-api-v1-orgs-org-slug-portal-servers-uuid-import-current)
- `POST /api/v1/orgs/{org_slug}/portal/servers/{uuid}/import/start`: Start server import (https://docs.coritan.com/api/reference/organizations/customer-portal/servers-import/#op-post-api-v1-orgs-org-slug-portal-servers-uuid-import-start)
- `GET /api/v1/orgs/{org_slug}/portal/servers/{uuid}/import/status/{import_id}`: Polled while an import runs (https://docs.coritan.com/api/reference/organizations/customer-portal/servers-import/#op-get-api-v1-orgs-org-slug-portal-servers-uuid-import-status-import-id)
- `POST /api/v1/orgs/{org_slug}/portal/servers/{uuid}/import/test-connection`: Test import connection (https://docs.coritan.com/api/reference/organizations/customer-portal/servers-import/#op-post-api-v1-orgs-org-slug-portal-servers-uuid-import-test-connection)
- `DELETE /api/v1/orgs/{org_slug}/portal/servers/{uuid}/import/{import_id}`: Cancel server import (https://docs.coritan.com/api/reference/organizations/customer-portal/servers-import/#op-delete-api-v1-orgs-org-slug-portal-servers-uuid-import-import-id)
- `POST /api/v1/orgs/{org_slug}/portal/servers/{uuid}/keep`: Tell us this world is still wanted, and lift a hold if one is on (https://docs.coritan.com/api/reference/organizations/customer-portal/servers/#op-post-api-v1-orgs-org-slug-portal-servers-uuid-keep)
- `GET /api/v1/orgs/{org_slug}/portal/servers/{uuid}/listing`: Public-list visibility and tags for the Server Settings tab (https://docs.coritan.com/api/reference/organizations/customer-portal/servers/#op-get-api-v1-orgs-org-slug-portal-servers-uuid-listing)
- `PATCH /api/v1/orgs/{org_slug}/portal/servers/{uuid}/listing`: Toggle public-list visibility and replace the listing tags (https://docs.coritan.com/api/reference/organizations/customer-portal/servers/#op-patch-api-v1-orgs-org-slug-portal-servers-uuid-listing)
- `GET /api/v1/orgs/{org_slug}/portal/servers/{uuid}/permissions`: List grantable permissions (https://docs.coritan.com/api/reference/organizations/customer-portal/servers/#op-get-api-v1-orgs-org-slug-portal-servers-uuid-permissions)
- `POST /api/v1/orgs/{org_slug}/portal/servers/{uuid}/power`: Power (https://docs.coritan.com/api/reference/organizations/customer-portal/servers/#op-post-api-v1-orgs-org-slug-portal-servers-uuid-power)
- `POST /api/v1/orgs/{org_slug}/portal/servers/{uuid}/reinstall`: Wipe server files and re-run the template install script + verify (https://docs.coritan.com/api/reference/organizations/customer-portal/servers/#op-post-api-v1-orgs-org-slug-portal-servers-uuid-reinstall)
- `GET /api/v1/orgs/{org_slug}/portal/servers/{uuid}/resources`: Get resources (https://docs.coritan.com/api/reference/organizations/customer-portal/servers/#op-get-api-v1-orgs-org-slug-portal-servers-uuid-resources)
- `GET /api/v1/orgs/{org_slug}/portal/servers/{uuid}/schedules`: List schedules (https://docs.coritan.com/api/reference/organizations/customer-portal/servers-schedules/#op-get-api-v1-orgs-org-slug-portal-servers-uuid-schedules)
- `POST /api/v1/orgs/{org_slug}/portal/servers/{uuid}/schedules`: Create schedule (https://docs.coritan.com/api/reference/organizations/customer-portal/servers-schedules/#op-post-api-v1-orgs-org-slug-portal-servers-uuid-schedules)
- `GET /api/v1/orgs/{org_slug}/portal/servers/{uuid}/schedules/{schedule_uuid}`: Get schedule (https://docs.coritan.com/api/reference/organizations/customer-portal/servers-schedules/#op-get-api-v1-orgs-org-slug-portal-servers-uuid-schedules-schedule-uuid)
- `PUT /api/v1/orgs/{org_slug}/portal/servers/{uuid}/schedules/{schedule_uuid}`: Update schedule (https://docs.coritan.com/api/reference/organizations/customer-portal/servers-schedules/#op-put-api-v1-orgs-org-slug-portal-servers-uuid-schedules-schedule-uuid)
- `DELETE /api/v1/orgs/{org_slug}/portal/servers/{uuid}/schedules/{schedule_uuid}`: Delete schedule (https://docs.coritan.com/api/reference/organizations/customer-portal/servers-schedules/#op-delete-api-v1-orgs-org-slug-portal-servers-uuid-schedules-schedule-uuid)
- `POST /api/v1/orgs/{org_slug}/portal/servers/{uuid}/schedules/{schedule_uuid}/execute`: Queue a run now (https://docs.coritan.com/api/reference/organizations/customer-portal/servers-schedules/#op-post-api-v1-orgs-org-slug-portal-servers-uuid-schedules-schedule-uuid-execute)
- `GET /api/v1/orgs/{org_slug}/portal/servers/{uuid}/schedules/{schedule_uuid}/runs`: Recent runs of a schedule, newest first, with the outcome of every step (https://docs.coritan.com/api/reference/organizations/customer-portal/servers-schedules/#op-get-api-v1-orgs-org-slug-portal-servers-uuid-schedules-schedule-uuid-runs)
- `POST /api/v1/orgs/{org_slug}/portal/servers/{uuid}/schedules/{schedule_uuid}/tasks`: Add schedule task (https://docs.coritan.com/api/reference/organizations/customer-portal/servers-schedules/#op-post-api-v1-orgs-org-slug-portal-servers-uuid-schedules-schedule-uuid-tasks)
- `POST /api/v1/orgs/{org_slug}/portal/servers/{uuid}/schedules/{schedule_uuid}/tasks/reorder`: Reorder schedule tasks (https://docs.coritan.com/api/reference/organizations/customer-portal/servers-schedules/#op-post-api-v1-orgs-org-slug-portal-servers-uuid-schedules-schedule-uuid-tasks-reor)
- `PUT /api/v1/orgs/{org_slug}/portal/servers/{uuid}/schedules/{schedule_uuid}/tasks/{task_id}`: Update schedule task (https://docs.coritan.com/api/reference/organizations/customer-portal/servers-schedules/#op-put-api-v1-orgs-org-slug-portal-servers-uuid-schedules-schedule-uuid-tasks-task)
- `DELETE /api/v1/orgs/{org_slug}/portal/servers/{uuid}/schedules/{schedule_uuid}/tasks/{task_id}`: Delete schedule task (https://docs.coritan.com/api/reference/organizations/customer-portal/servers-schedules/#op-delete-api-v1-orgs-org-slug-portal-servers-uuid-schedules-schedule-uuid-tasks-ta)
- `PATCH /api/v1/orgs/{org_slug}/portal/servers/{uuid}/settings`: Patch settings (https://docs.coritan.com/api/reference/organizations/customer-portal/servers/#op-patch-api-v1-orgs-org-slug-portal-servers-uuid-settings)
- `GET /api/v1/orgs/{org_slug}/portal/servers/{uuid}/sftp`: Connection details for this server's SFTP login (https://docs.coritan.com/api/reference/organizations/customer-portal/servers/#op-get-api-v1-orgs-org-slug-portal-servers-uuid-sftp)
- `GET /api/v1/orgs/{org_slug}/portal/servers/{uuid}/sleep`: Sleep and start-queue state for a free server (https://docs.coritan.com/api/reference/organizations/customer-portal/servers/#op-get-api-v1-orgs-org-slug-portal-servers-uuid-sleep)
- `GET /api/v1/orgs/{org_slug}/portal/servers/{uuid}/snapshots`: List snapshots (https://docs.coritan.com/api/reference/organizations/customer-portal/servers-snapshots/#op-get-api-v1-orgs-org-slug-portal-servers-uuid-snapshots)
- `POST /api/v1/orgs/{org_slug}/portal/servers/{uuid}/snapshots`: Create snapshot (https://docs.coritan.com/api/reference/organizations/customer-portal/servers-snapshots/#op-post-api-v1-orgs-org-slug-portal-servers-uuid-snapshots)
- `GET /api/v1/orgs/{org_slug}/portal/servers/{uuid}/snapshots/estimate`: How much of the allowance a snapshot of this server would use (https://docs.coritan.com/api/reference/organizations/customer-portal/servers-snapshots/#op-get-api-v1-orgs-org-slug-portal-servers-uuid-snapshots-estimate)
- `GET /api/v1/orgs/{org_slug}/portal/servers/{uuid}/snapshots/seed`: The restore a server ordered from a snapshot is waiting on, or got (https://docs.coritan.com/api/reference/organizations/customer-portal/servers-snapshots/#op-get-api-v1-orgs-org-slug-portal-servers-uuid-snapshots-seed)
- `POST /api/v1/orgs/{org_slug}/portal/servers/{uuid}/snapshots/seed/retry`: Run a failed seed again (https://docs.coritan.com/api/reference/organizations/customer-portal/servers-snapshots/#op-post-api-v1-orgs-org-slug-portal-servers-uuid-snapshots-seed-retry)
- `DELETE /api/v1/orgs/{org_slug}/portal/servers/{uuid}/snapshots/{snapshot_uuid}`: Delete snapshot (https://docs.coritan.com/api/reference/organizations/customer-portal/servers-snapshots/#op-delete-api-v1-orgs-org-slug-portal-servers-uuid-snapshots-snapshot-uuid)
- `GET /api/v1/orgs/{org_slug}/portal/servers/{uuid}/snapshots/{snapshot_uuid}/download`: Download snapshot (https://docs.coritan.com/api/reference/organizations/customer-portal/servers-snapshots/#op-get-api-v1-orgs-org-slug-portal-servers-uuid-snapshots-snapshot-uuid-download)
- `POST /api/v1/orgs/{org_slug}/portal/servers/{uuid}/snapshots/{snapshot_uuid}/lock`: Keep a snapshot, or release it (https://docs.coritan.com/api/reference/organizations/customer-portal/servers-snapshots/#op-post-api-v1-orgs-org-slug-portal-servers-uuid-snapshots-snapshot-uuid-lock)
- `POST /api/v1/orgs/{org_slug}/portal/servers/{uuid}/snapshots/{snapshot_uuid}/restore`: Restore onto this server, from any snapshot this customer owns (https://docs.coritan.com/api/reference/organizations/customer-portal/servers-snapshots/#op-post-api-v1-orgs-org-slug-portal-servers-uuid-snapshots-snapshot-uuid-restore)
- `GET /api/v1/orgs/{org_slug}/portal/servers/{uuid}/software`: List installed software (https://docs.coritan.com/api/reference/organizations/customer-portal/servers-software/#op-get-api-v1-orgs-org-slug-portal-servers-uuid-software)
- `GET /api/v1/orgs/{org_slug}/portal/servers/{uuid}/software/addons`: Every addon in the folders the server loads from, tracked or hand-uploaded (https://docs.coritan.com/api/reference/organizations/customer-portal/servers-software/#op-get-api-v1-orgs-org-slug-portal-servers-uuid-software-addons)
- `DELETE /api/v1/orgs/{org_slug}/portal/servers/{uuid}/software/addons/records/{record_uuid}`: Drop a tracking record whose files are gone, without touching the disk (https://docs.coritan.com/api/reference/organizations/customer-portal/servers-software/#op-delete-api-v1-orgs-org-slug-portal-servers-uuid-software-addons-records-record-u)
- `POST /api/v1/orgs/{org_slug}/portal/servers/{uuid}/software/addons/remove`: Delete one addon from disk, through the tracked uninstall when it has a record (https://docs.coritan.com/api/reference/organizations/customer-portal/servers-software/#op-post-api-v1-orgs-org-slug-portal-servers-uuid-software-addons-remove)
- `POST /api/v1/orgs/{org_slug}/portal/servers/{uuid}/software/addons/toggle`: Switch one addon file on or off (Foo.jar <- Foo.jar.disabled) (https://docs.coritan.com/api/reference/organizations/customer-portal/servers-software/#op-post-api-v1-orgs-org-slug-portal-servers-uuid-software-addons-toggle)
- `POST /api/v1/orgs/{org_slug}/portal/servers/{uuid}/software/bedrock`: Turn Bedrock crossplay on or off for a Java server (https://docs.coritan.com/api/reference/organizations/customer-portal/servers-software/#op-post-api-v1-orgs-org-slug-portal-servers-uuid-software-bedrock)
- `GET /api/v1/orgs/{org_slug}/portal/servers/{uuid}/software/bedrock/packs`: Behavior and resource packs on disk, which are active in the world, and importable uploads (https://docs.coritan.com/api/reference/organizations/customer-portal/servers-software/#op-get-api-v1-orgs-org-slug-portal-servers-uuid-software-bedrock-packs)
- `POST /api/v1/orgs/{org_slug}/portal/servers/{uuid}/software/bedrock/packs/disable-all`: Empty the world's activation lists so it boots on vanilla content; folders stay (https://docs.coritan.com/api/reference/organizations/customer-portal/servers-software/#op-post-api-v1-orgs-org-slug-portal-servers-uuid-software-bedrock-packs-disable-all)
- `POST /api/v1/orgs/{org_slug}/portal/servers/{uuid}/software/bedrock/packs/import`: Queue an import of an uploaded .mcaddon / .mcpack / .zip already on the server (https://docs.coritan.com/api/reference/organizations/customer-portal/servers-software/#op-post-api-v1-orgs-org-slug-portal-servers-uuid-software-bedrock-packs-import)
- `POST /api/v1/orgs/{org_slug}/portal/servers/{uuid}/software/bedrock/packs/{pack_uuid}/active`: Add a pack to, or drop it from, the world's activation list (https://docs.coritan.com/api/reference/organizations/customer-portal/servers-software/#op-post-api-v1-orgs-org-slug-portal-servers-uuid-software-bedrock-packs-pack-uuid-a)
- `POST /api/v1/orgs/{org_slug}/portal/servers/{uuid}/software/bedrock/packs/{pack_uuid}/remove`: Deactivate a pack, delete its folder, and drop its tracking row (https://docs.coritan.com/api/reference/organizations/customer-portal/servers-software/#op-post-api-v1-orgs-org-slug-portal-servers-uuid-software-bedrock-packs-pack-uuid-r)
- `PUT /api/v1/orgs/{org_slug}/portal/servers/{uuid}/software/bedrock/texturepack-required`: Texturepack-required: players must accept the resource packs to join (https://docs.coritan.com/api/reference/organizations/customer-portal/servers-software/#op-put-api-v1-orgs-org-slug-portal-servers-uuid-software-bedrock-texturepack-requir)
- `GET /api/v1/orgs/{org_slug}/portal/servers/{uuid}/software/catalog`: Software catalog (https://docs.coritan.com/api/reference/organizations/customer-portal/servers-software/#op-get-api-v1-orgs-org-slug-portal-servers-uuid-software-catalog)
- `GET /api/v1/orgs/{org_slug}/portal/servers/{uuid}/software/catalog/{key}/versions`: Software catalog versions (https://docs.coritan.com/api/reference/organizations/customer-portal/servers-software/#op-get-api-v1-orgs-org-slug-portal-servers-uuid-software-catalog-key-versions)
- `GET /api/v1/orgs/{org_slug}/portal/servers/{uuid}/software/catalog/{key}/versions/{version}/builds`: Publisher builds of one game version: the loader versions for Fabric/Forge (https://docs.coritan.com/api/reference/organizations/customer-portal/servers-software/#op-get-api-v1-orgs-org-slug-portal-servers-uuid-software-catalog-key-versions-versi)
- `POST /api/v1/orgs/{org_slug}/portal/servers/{uuid}/software/change`: Change server software (https://docs.coritan.com/api/reference/organizations/customer-portal/servers-software/#op-post-api-v1-orgs-org-slug-portal-servers-uuid-software-change)
- `GET /api/v1/orgs/{org_slug}/portal/servers/{uuid}/software/context`: Software context (https://docs.coritan.com/api/reference/organizations/customer-portal/servers-software/#op-get-api-v1-orgs-org-slug-portal-servers-uuid-software-context)
- `GET /api/v1/orgs/{org_slug}/portal/servers/{uuid}/software/dependencies/{source_uuid}/{identifier}`: What a version requires, named, with what is already installed marked (https://docs.coritan.com/api/reference/organizations/customer-portal/servers-software/#op-get-api-v1-orgs-org-slug-portal-servers-uuid-software-dependencies-source-uuid-i)
- `POST /api/v1/orgs/{org_slug}/portal/servers/{uuid}/software/install`: Install software (https://docs.coritan.com/api/reference/organizations/customer-portal/servers-software/#op-post-api-v1-orgs-org-slug-portal-servers-uuid-software-install)
- `GET /api/v1/orgs/{org_slug}/portal/servers/{uuid}/software/installs`: List software installs (https://docs.coritan.com/api/reference/organizations/customer-portal/servers-software/#op-get-api-v1-orgs-org-slug-portal-servers-uuid-software-installs)
- `GET /api/v1/orgs/{org_slug}/portal/servers/{uuid}/software/installs/{install_uuid}`: Get software install (https://docs.coritan.com/api/reference/organizations/customer-portal/servers-software/#op-get-api-v1-orgs-org-slug-portal-servers-uuid-software-installs-install-uuid)
- `POST /api/v1/orgs/{org_slug}/portal/servers/{uuid}/software/installs/{install_uuid}/cancel`: Cancel software install (https://docs.coritan.com/api/reference/organizations/customer-portal/servers-software/#op-post-api-v1-orgs-org-slug-portal-servers-uuid-software-installs-install-uuid-can)
- `POST /api/v1/orgs/{org_slug}/portal/servers/{uuid}/software/installs/{install_uuid}/retry`: Retry software install (https://docs.coritan.com/api/reference/organizations/customer-portal/servers-software/#op-post-api-v1-orgs-org-slug-portal-servers-uuid-software-installs-install-uuid-ret)
- `GET /api/v1/orgs/{org_slug}/portal/servers/{uuid}/software/jvm`: The heap slider and the allowlisted startup flags, as the panel shows them (https://docs.coritan.com/api/reference/organizations/customer-portal/servers-software/#op-get-api-v1-orgs-org-slug-portal-servers-uuid-software-jvm)
- `PATCH /api/v1/orgs/{org_slug}/portal/servers/{uuid}/software/jvm`: Move the heap, pick startup flags from the catalog, or reset both (https://docs.coritan.com/api/reference/organizations/customer-portal/servers-software/#op-patch-api-v1-orgs-org-slug-portal-servers-uuid-software-jvm)
- `GET /api/v1/orgs/{org_slug}/portal/servers/{uuid}/software/resource-pack`: The server resource pack as server.properties declares it (https://docs.coritan.com/api/reference/organizations/customer-portal/servers-software/#op-get-api-v1-orgs-org-slug-portal-servers-uuid-software-resource-pack)
- `PUT /api/v1/orgs/{org_slug}/portal/servers/{uuid}/software/resource-pack`: Point players at a pack, from a URL or a marketplace resource pack version (https://docs.coritan.com/api/reference/organizations/customer-portal/servers-software/#op-put-api-v1-orgs-org-slug-portal-servers-uuid-software-resource-pack)
- `DELETE /api/v1/orgs/{org_slug}/portal/servers/{uuid}/software/resource-pack`: Stop offering a server resource pack (https://docs.coritan.com/api/reference/organizations/customer-portal/servers-software/#op-delete-api-v1-orgs-org-slug-portal-servers-uuid-software-resource-pack)
- `POST /api/v1/orgs/{org_slug}/portal/servers/{uuid}/software/safe-mode`: Arm a one-shot --safeMode start (vanilla datapack only), optionally starting now (https://docs.coritan.com/api/reference/organizations/customer-portal/servers-software/#op-post-api-v1-orgs-org-slug-portal-servers-uuid-software-safe-mode)
- `POST /api/v1/orgs/{org_slug}/portal/servers/{uuid}/software/search`: Search software (https://docs.coritan.com/api/reference/organizations/customer-portal/servers-software/#op-post-api-v1-orgs-org-slug-portal-servers-uuid-software-search)
- `GET /api/v1/orgs/{org_slug}/portal/servers/{uuid}/software/sources`: Software sources (https://docs.coritan.com/api/reference/organizations/customer-portal/servers-software/#op-get-api-v1-orgs-org-slug-portal-servers-uuid-software-sources)
- `GET /api/v1/orgs/{org_slug}/portal/servers/{uuid}/software/updates`: Newer compatible builds for the addons the marketplace installed (https://docs.coritan.com/api/reference/organizations/customer-portal/servers-software/#op-get-api-v1-orgs-org-slug-portal-servers-uuid-software-updates)
- `GET /api/v1/orgs/{org_slug}/portal/servers/{uuid}/software/versions/{source_uuid}/{identifier}`: Software versions (https://docs.coritan.com/api/reference/organizations/customer-portal/servers-software/#op-get-api-v1-orgs-org-slug-portal-servers-uuid-software-versions-source-uuid-ident)
- `DELETE /api/v1/orgs/{org_slug}/portal/servers/{uuid}/software/{record_uuid}`: Uninstall software (https://docs.coritan.com/api/reference/organizations/customer-portal/servers-software/#op-delete-api-v1-orgs-org-slug-portal-servers-uuid-software-record-uuid)
- `POST /api/v1/orgs/{org_slug}/portal/servers/{uuid}/software/{record_uuid}/update`: Queue an in-place update: the old file is removed, the new build installed (https://docs.coritan.com/api/reference/organizations/customer-portal/servers-software/#op-post-api-v1-orgs-org-slug-portal-servers-uuid-software-record-uuid-update)
- `PATCH /api/v1/orgs/{org_slug}/portal/servers/{uuid}/startup-variables`: Update allowlisted startup env vars for the server's game (https://docs.coritan.com/api/reference/organizations/customer-portal/servers/#op-patch-api-v1-orgs-org-slug-portal-servers-uuid-startup-variables)
- `GET /api/v1/orgs/{org_slug}/portal/servers/{uuid}/status-ping`: Ask the game itself who is online (https://docs.coritan.com/api/reference/organizations/customer-portal/servers/#op-get-api-v1-orgs-org-slug-portal-servers-uuid-status-ping)
- `PATCH /api/v1/orgs/{org_slug}/portal/servers/{uuid}/subdomain`: Rename the gameproxy join-address subdomain for this server (https://docs.coritan.com/api/reference/organizations/customer-portal/servers/#op-patch-api-v1-orgs-org-slug-portal-servers-uuid-subdomain)
- `GET /api/v1/orgs/{org_slug}/portal/servers/{uuid}/users`: List org subusers (https://docs.coritan.com/api/reference/organizations/customer-portal/servers-users/#op-get-api-v1-orgs-org-slug-portal-servers-uuid-users)
- `POST /api/v1/orgs/{org_slug}/portal/servers/{uuid}/users`: Add org subuser (https://docs.coritan.com/api/reference/organizations/customer-portal/servers-users/#op-post-api-v1-orgs-org-slug-portal-servers-uuid-users)
- `POST /api/v1/orgs/{org_slug}/portal/servers/{uuid}/users/leave`: A subuser drops their own grant (https://docs.coritan.com/api/reference/organizations/customer-portal/servers-users/#op-post-api-v1-orgs-org-slug-portal-servers-uuid-users-leave)
- `PUT /api/v1/orgs/{org_slug}/portal/servers/{uuid}/users/{subuser_id}`: Update org subuser (https://docs.coritan.com/api/reference/organizations/customer-portal/servers-users/#op-put-api-v1-orgs-org-slug-portal-servers-uuid-users-subuser-id)
- `DELETE /api/v1/orgs/{org_slug}/portal/servers/{uuid}/users/{subuser_id}`: Delete org subuser (https://docs.coritan.com/api/reference/organizations/customer-portal/servers-users/#op-delete-api-v1-orgs-org-slug-portal-servers-uuid-users-subuser-id)
- `POST /api/v1/orgs/{org_slug}/portal/servers/{uuid}/wake`: Ask for a sleeping free server to be started (https://docs.coritan.com/api/reference/organizations/customer-portal/servers/#op-post-api-v1-orgs-org-slug-portal-servers-uuid-wake)
- `GET /api/v1/orgs/{org_slug}/portal/servers/{uuid}/websocket`: Return panel WS URL + the caller's bearer token for WS query auth (https://docs.coritan.com/api/reference/organizations/customer-portal/servers/#op-get-api-v1-orgs-org-slug-portal-servers-uuid-websocket)
- `GET /api/v1/orgs/{org_slug}/portal/servers/{uuid}/world-optimization`: What unused-chunk cleanup has done to this world, and when (https://docs.coritan.com/api/reference/organizations/customer-portal/servers/#op-get-api-v1-orgs-org-slug-portal-servers-uuid-world-optimization)
- `POST /api/v1/orgs/{org_slug}/portal/servers/{uuid}/world-optimization`: Queue an unused-chunk trim now, once per minintervalhours (https://docs.coritan.com/api/reference/organizations/customer-portal/servers/#op-post-api-v1-orgs-org-slug-portal-servers-uuid-world-optimization)
- `GET /api/v1/orgs/{org_slug}/portal/snapshots`: Every snapshot this customer holds, across every server they have had (https://docs.coritan.com/api/reference/organizations/customer-portal/snapshots/#op-get-api-v1-orgs-org-slug-portal-snapshots)
- `GET /api/v1/orgs/{org_slug}/portal/snapshots/allowance`: Snapshot allowance (https://docs.coritan.com/api/reference/organizations/customer-portal/snapshots/#op-get-api-v1-orgs-org-slug-portal-snapshots-allowance)
- `GET /api/v1/orgs/{org_slug}/portal/snapshots/{snapshot_uuid}`: One snapshot, for the order form that was handed its uuid in a link (https://docs.coritan.com/api/reference/organizations/customer-portal/snapshots/#op-get-api-v1-orgs-org-slug-portal-snapshots-snapshot-uuid)
- `DELETE /api/v1/orgs/{org_slug}/portal/snapshots/{snapshot_uuid}`: Delete a snapshot the account owns, with or without its source server (https://docs.coritan.com/api/reference/organizations/customer-portal/snapshots/#op-delete-api-v1-orgs-org-slug-portal-snapshots-snapshot-uuid)
- `GET /api/v1/orgs/{org_slug}/portal/snapshots/{snapshot_uuid}/download`: A signed URL for an archive whose server may no longer exist (https://docs.coritan.com/api/reference/organizations/customer-portal/snapshots/#op-get-api-v1-orgs-org-slug-portal-snapshots-snapshot-uuid-download)
- `POST /api/v1/orgs/{org_slug}/portal/snapshots/{snapshot_uuid}/lock`: Keep or release a snapshot the account owns, with or without its server (https://docs.coritan.com/api/reference/organizations/customer-portal/snapshots/#op-post-api-v1-orgs-org-slug-portal-snapshots-snapshot-uuid-lock)
- `POST /api/v1/orgs/{org_slug}/portal/snapshots/{snapshot_uuid}/restore`: Restore an account snapshot onto one of the customer's servers (https://docs.coritan.com/api/reference/organizations/customer-portal/snapshots/#op-post-api-v1-orgs-org-slug-portal-snapshots-snapshot-uuid-restore)
