Sammelaktionen
Wendet eine Aktion auf mehrere Kunden gleichzeitig an, für Mehrfachauswahl-Workflows.
POST /api/customers/bulk
Wendet eine einzelne Aktion auf eine Liste von Kunden-IDs an. Jede ID wird unabhängig
verarbeitet: Ein einzelner Konflikt oder ein fehlender Kunde bricht die restlichen nicht ab. Die
Antwort ist immer 200 OK, auch wenn einzelne IDs fehlgeschlagen sind. Prüfe daher failed
statt dich allein auf den HTTP-Status zu verlassen.
Authentifizierung
BASE_URL="https://uptimeify.io"
TOKEN="<your-api-token>"Anfrage (Request Body)
{
"ids": [101, 102, 103],
"action": "reports",
"payload": {
"enabled": true
}
}| Feld | Typ | Erforderlich | Beschreibung |
|---|---|---|---|
ids | number[] | ja | Kunden-IDs (die numerische id, nicht publicId). Nicht leer, maximal 200 Einträge, positive Ganzzahlen, keine Duplikate. |
action | string | ja | Eine von reports, activate, deactivate, delete, package. |
payload | object | abhängig von action | Erforderlich für reports und package (siehe unten). Wird bei activate, deactivate, delete ignoriert. |
Aktionen
| Aktion | Wirkung | payload |
|---|---|---|
reports | Setzt monthlyReportsEnabled bei jedem Kunden. | { "enabled": boolean } (erforderlich) |
activate | Setzt den Kundenstatus auf active (kein Effekt, falls bereits aktiv) und kaskadiert die Monitor-Status entsprechend. | keins |
deactivate | Setzt den Kundenstatus auf inactive (kein Effekt, falls bereits inaktiv) und kaskadiert die Monitor-Status entsprechend. | keins |
delete | Löscht den Kunden endgültig (Hard Delete). Monitore und Check-Historie werden per Kaskade mitgelöscht. Nicht rückgängig zu machen. | keins |
package | Weist dem Kunden ein anderes Paket per ID zu. | { "packageId": number } (erforderlich) |
package akzeptiert ausschließlich eine numerische packageId, die zur Organisation des
jeweiligen Kunden gehört. Für alle Aufrufenden außer globalen Admins ist das dasselbe wie die
eigene Organisation, denn nur deren Kunden sind überhaupt adressierbar. Ein globaler Admin, der
Kunden mehrerer Organisationen bearbeitet, braucht je Kunde eine packageId aus dessen eigener
Organisation; eine fremde wird mit invalidPackageType abgelehnt. Anders als bei Kunden aktualisieren
wird kein legacy packageType-String oder Display-Name aufgelöst, denn das Erraten des gemeinten
Pakets über bis zu 200 Zeilen hinweg ist genau das, was der Sammelaktions-Endpunkt nicht tut. Die
ID lässt sich zuvor über Paket-Konfigurationen auflisten ermitteln.
payload.enabled und payload.packageId werden einmalig im Voraus validiert, bevor
irgendein Kunde angefasst wird. Ein fehlerhaftes Payload lässt die gesamte Anfrage mit
400 invalidRequestBody fehlschlagen; es wird niemals zu 200 identischen Einzel-Fehlern pro ID.
Beispiel-Request
curl -X POST "$BASE_URL/api/customers/bulk" \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{
"ids": [101, 102, 103],
"action": "reports",
"payload": { "enabled": true }
}'Beispiel-Response (Teilergebnis)
{
"ok": [101, 103],
"failed": [
{ "id": 102, "reason": "customerNotFound" }
]
}ok listet die aktualisierten IDs. failed listet die nicht aktualisierten IDs, jeweils mit
einem reason-String. Zeige das Teilergebnis an (zum Beispiel „2 von 3 aktualisiert"), niemals
einen pauschalen Erfolg allein aufgrund des 200-Status der Anfrage.
Häufige Fehler
Diese lassen die gesamte Anfrage fehlschlagen, bevor überhaupt ein Kunde angefasst wird:
401 unauthorizeddu bist nicht eingeloggt403 forbiddendeine Rolle istreadonly, oder du bist Global Supporter (beide sind für diesen Endpunkt nur lesend)400 invalidRequestBodyidsfehlt/ist leer/ist kein Array, enthält mehr als 200 Einträge, enthält eine Nicht-Ganzzahl, einen Wert<= 0oder ein Duplikat;actionist keine der fünf unterstützten Aktionen; oderpayload.enabledbzw.payload.packageIdfehlt oder hat den falschen Typ für die gewählte Aktion
Diese erscheinen pro ID, innerhalb von failed[].reason, ohne die Anfrage fehlschlagen zu lassen:
| Reason | Bedeutung |
|---|---|
customerNotFound | Die ID existiert nicht oder gehört zu einer anderen Organisation (Global Admins dürfen jede ID ansprechen; alle anderen sind auf ihre eigene Organisation beschränkt). Bewusst nicht von „existiert nicht" zu unterscheiden, damit dieser Endpunkt nicht zum Aufspüren fremder IDs missbraucht werden kann. |
invalidPackageType | Nur bei Aktion package: payload.packageId löst sich nicht auf eine Paket-Konfiguration auf, die zur Organisation dieses Kunden gehört. |
organizationIdRequired | Die Session des Aufrufers hat weder einen Organisationsbezug noch Global-Admin-Scope. Nur bei einer fehlerhaften Session/einem fehlerhaften Token möglich; ein normal authentifizierter Aufrufer sieht das nie. |
unknown | Jede andere Ablehnung, am häufigsten ein kunden-gescopter Aufrufer (eine eingeschränkte Rolle, oder ein kunden-gescoptes API-/Agent-Token), der eine ID außerhalb seiner zugewiesenen Kunden anspricht. Außerdem die Rückfallebene für jeden Fehler ohne stabilen data.code. |