# List FTP users of a web hosting package

> The FTP users of one web hosting package, with how to connect.

- Effect: Read - Changes nothing.
- Idempotent: yes
- Stability: beta
- MCP tool: `manitu_webhosting_web_ftpuser_list` on https://mcp.manitu.de/mcp
- REST: `POST https://api.manitu.de/v1/webhosting/web/ftpuser/list`
- Needs: `service_webhosting`
- Page: /reference/webhosting/web/ftpuser/list/

## MCP tool

`manitu_webhosting_web_ftpuser_list`

### Description for the model

Lists the FTP users of a web hosting package of the manitu customer account this connection works in, by its site_id from manitu_webhosting_list: for each its username (what the customer logs in with), description, status, whether it can log in now, when it expires, its directory, disk space limit, and whether its password should be renewed. connection says how to connect - host, and the protocols with their ports (SFTP on port 23, not 22) - give it when the customer sets up an FTP program. count_max is how many FTP users the package allows.

### Arguments

- `site_id` (integer | string, required) - The site_id from manitu_webhosting_list - never guess one. (pattern `"^[1-9][0-9]*$"`; minimum `1`)

### Example

```json
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "manitu_webhosting_web_ftpuser_list",
    "arguments": {
      "site_id": 12345
    }
  }
}
```

## REST

`POST https://api.manitu.de/v1/webhosting/web/ftpuser/list`

### Authentication

One of `X-API-Key`, `Authorization: Bearer …` - never more than one in a request.

### Request body

JSON; unknown fields are refused.

- `site_id` (integer | string, required) - The site_id from manitu_webhosting_list - never guess one. (pattern `"^[1-9][0-9]*$"`; minimum `1`)

### Response

In `data`; the rest of the body as on every call.

- `ftp_user_list` (array of object, required)
  - `ftp_user_list[].username` (string, required) - The user name to log in with (ftp<number>) - what the other FTP user tools take.
  - `ftp_user_list[].description` (string | null, required) - What the customer wrote about it (his description), null if nothing - not its name or user name.
  - `ftp_user_list[].status` (string, required) - active, or inactive (switched off by the customer, kept for later). (one of `"active"`, `"inactive"`)
  - `ftp_user_list[].is_usable_now` (boolean, required) - It can log in right now: active and not expired.
  - `ftp_user_list[].expires_at` (string | null, required) - When the FTP user expires. From this moment on it can no longer be used (the moment itself is excluded); null: without end. (format `date-time`)
  - `ftp_user_list[].home_dir` (string | null, required) - The directory it starts in and cannot leave, relative to the package (/ = the whole package).
  - `ftp_user_list[].quota_mb` (integer | null, required) - Disk space in MB the files it owns may take; null: no limit of its own (the package's applies).
  - `ftp_user_list[].password_change_recommended` (boolean, required) - The password is kept in an outdated form - the customer should set a new one.
  - `ftp_user_list[].created_at` (string | null, required) - When it was created. (format `date-time`)
  - `ftp_user_list[].last_login_at` (string | null, required) - Its last login, null if never. (format `date-time`)
- `count_max` (integer | null, required) - How many FTP users the package allows.
- `connection` (object, required)
  - `connection.host` (string | null, required) - The host to connect to - the web server of the package.
  - `connection.method_list` (array of object, required) - The ways to connect, the one to prefer first. SFTP is on port 23, NOT 22; implicit FTPS is not offered; plain FTP (unencrypted) only if nothing else works.
    - `connection.method_list[].protocol` (string, required) - sftp (SSH file transfer), ftps_explicit (FTP with explicit TLS, AUTH TLS), ftp (unencrypted). (one of `"sftp"`, `"ftps_explicit"`, `"ftp"`)
    - `connection.method_list[].port` (integer, required)
    - `connection.method_list[].is_encrypted` (boolean, required)
    - `connection.method_list[].is_recommended` (boolean, required)
  - `connection.web_ftp_url` (string, required) - FTP in the browser, with the same user name and password.

### Statuses

- `200` Success.
- `400` The request does not match the declared input schema.
- `401` No credential was presented, or it was not recognised.
- `403` The credential is not permitted to use this operation.
- `500` The server failed. Nothing about the request was wrong. Whether a change took effect is not known - check before trying it again.
- `503` The channel this operation forwards through is unavailable.

### Example

```sh
curl -X POST 'https://api.manitu.de/v1/webhosting/web/ftpuser/list' \
  -H 'X-API-Key: $API_KEY' \
  -H 'Content-Type: application/json' \
  -d '{"site_id":12345}'
```

## Example result

```json
{
  "ftp_user_list": [
    {
      "username": "string",
      "description": "Example",
      "status": "active",
      "is_usable_now": true,
      "expires_at": "2026-10-23T12:00:00+02:00",
      "home_dir": "/web",
      "quota_mb": 1,
      "password_change_recommended": true,
      "created_at": "2026-10-23T12:00:00+02:00",
      "last_login_at": "2026-10-23T12:00:00+02:00"
    }
  ],
  "count_max": 1,
  "connection": {
    "host": "string",
    "method_list": [
      {
        "protocol": "sftp",
        "port": 1,
        "is_encrypted": true,
        "is_recommended": true
      }
    ],
    "web_ftp_url": "https://www.example.com/"
  }
}
```
