---
title: "FTP Monitor erstellen"
description: "Erstellt einen neuen FTP Monitor."
---

`POST /api/ftp-monitors`

## Authentifizierung

Dieser Endpoint benötigt ein API-Token:

`Authorization: Bearer <token>`

## Request Body

- `customerId` (required, number | string): interne numerische Kunden-ID oder Customer-`publicId`-UUID
- `name` (required, string)
- `hostname` (required, string): Muss ein Hostname sein (kein Protokoll, kein Pfad).
- `port` (optional, number | null): Wenn weggelassen/null, nutzt der Worker einen Default-Port.
- `status` (optional): `active`, `maintenance`, `disabled` (akzeptiert auch `inactive` und normalisiert zu `disabled`)
- `checkInterval` (optional, number): Minuten (min: 1, max: 60)
- `timeoutSeconds` (optional, number): Sekunden (min: 1, max: 60)
- `checkMode` (optional, string): `protocol` | `tcp`. Standard: `protocol`.
  - Im Modus `tcp` führt der Monitor nur eine reine TCP-Port-Erreichbarkeitsprüfung durch: `ftpConfig` ist nicht erforderlich und wird nicht gespeichert. Im Modus `protocol` läuft die vollständige FTP-Login-Prüfung (bisheriges Verhalten).
- `ftpConfig` (optional, object): FTP-Verbindungsoptionen (als JSON gespeichert)
  - Erforderlich (`user` + `password`), außer `checkMode` ist `tcp`.

### `ftpConfig`

Der Monitoring-Worker liest diese Keys:

- `user` (optional, string): Default `anonymous`
- `password` (optional, string): Default `anonymous@`
- `secure` (optional, boolean | `"implicit"`):
  - `false` (Default): plain FTP
  - `true`: explicit TLS
  - `"implicit"`: implicit TLS (Worker nutzt default Port `990`, wenn `port` nicht gesetzt ist)

```json
{
  "customerId": "6764e84f-f02a-43e6-a46d-cecaec556723",
  "name": "FTP Availability",
  "hostname": "claas.sh",
  "port": 21,
  "status": "active",
  "checkInterval": 5,
  "timeoutSeconds": 30,
  "ftpConfig": {
    "user": "root",
    "password": "exampleRoot",
    "secure": "explicit"
  }
}
```

## Beispiel (cURL)

```bash
BASE_URL="https://uptimeify.io"
TOKEN="<your-api-token>"

curl -X POST \
  "$BASE_URL/api/ftp-monitors" \
  -H "Authorization: Bearer $TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"customerId":"6764e84f-f02a-43e6-a46d-cecaec556723","name":"FTP Availability","hostname":"claas.sh","port":21,"status":"active","checkInterval":5,"timeoutSeconds":30,"ftpConfig":{"user":"root","password":"exampleRoot","secure":"explicit"}}'
```

## Response

```json
{
  "id": 400,
  "organizationId": 1,
  "customerId": 2,
  "name": "FTP Availability",
  "hostname": "claas.sh",
  "port": 21,
  "status": "active",
  "checkInterval": 5,
  "timeoutSeconds": 30,
  "allowedCheckCountryCodes": null,
  "notificationPhoneNumber": null,
  "notificationEmail": null,
  "lastCheckedAt": null,
  "createdAt": "2026-02-25T10:00:00.000Z",
  "updatedAt": "2026-02-25T10:00:00.000Z",
  "config": {
    "user": "root",
    "password": "exampleRoot",
    "secure": "explicit"
  },
  "ftpConfig": {
    "user": "root",
    "password": "exampleRoot",
    "secure": "explicit"
  }
}
```

## Häufige Fehler

- `400 Invalid Customer identifier` wenn `customerId` weder gültige UUID noch Legacy-ID ist
- `400 hostname must be a valid hostname (no protocol, no path)` bei ungültigem Hostname
- `401 Unauthorized` wenn du nicht authentifiziert bist
- `403 Forbidden` wenn du keinen Zugriff hast oder keine Monitore erstellen darfst (z.B. Read-only oder Global Supporter)
- `404 Customer not found` wenn `customerId` nicht existiert

