Überblick über die Admin-API

Workspace-Admin-API

Die Workspace-Admin-API ermöglicht Server-zu-Server-Integrationen zur Verwaltung eines EVCharge-Workspaces. Diese Dokumentation richtet sich an Workspace-Administratoren und externe Integratoren. Sie verwendet widerrufbare workspacegebundene Tokens und feingranulare Scopes; Kunden-Anmeldetokens und Browsersitzungen werden nicht akzeptiert.

Dieses Verzeichnis ist die maßgebliche Entwicklerreferenz für die von app-api implementierte /v2/admin-API. Es dokumentiert weder Kunden-/Mobilrouten noch die eigenen HTTP-Routen des Admin-Portals.

Basis-URL und Ressourcengrenze

Alle Routen sind relativ zum bereitgestellten Origin app-api:

https://api.evcharge.mobi/v2/admin/...

Workspace-IDs werden weder in URL, Query noch Body akzeptiert. Jedes Token gehört genau einem Workspace; die API leitet cpoId aus dem authentifizierten Token-Prinzipal ab. Gehört ein verschachtelter Standort, Ladegerät, Benutzer, Tarif, Profil, Zuweisung oder Transaktion nicht dazu, liefert sie dieselbe nicht auskunftgebende 404 RESOURCE_NOT_FOUND-Antwort.

Zugriffstoken erhalten

Ein menschlicher Workspace-Administrator erstellt Tokens in den Workspace-Einstellungen unter API-Zugriff. Die Tokenverwaltung steht Workspace-Tokens bewusst nicht zur Verfügung.

  • API-Zugriff ist in jedem Paket enthalten, auch in Free. Der Administrator benötigt Bearbeitungsrechte für den Workspace.
  • Der Workspace-Host muss die Admin-API über adminApiEnabled aktivieren; andernfalls erhält ein gültiges Token ein nicht auskunftgebendes 404 von app-api.
  • Der Administrator darf nur Scopes vergeben, die seine aktuellen Rechte und die Workspace-Funktionsberechtigungen erlauben.
  • Neue Tokens können unbefristet sein (Standard in den Workspace-Einstellungen) oder eine vom Administrator gewählte Lebensdauer von 1–365 ganzen Tagen haben; der Server berechnet das absolute Ablaufdatum. Unbefristete Tokens bleiben bis zum Widerruf gültig.
  • Ein Workspace kann höchstens 50 aktive Tokens haben.
  • Die Zugangsinformation wird einmal im Klartext angezeigt. Speichern Sie sie sofort in einem Secret-Manager.
  • Name, Scopes und Ablaufzeit sind unveränderlich. Zur Rotation erstellen, verteilen und prüfen Sie einen Ersatz und widerrufen das alte Token.
  • Ein Widerruf wirkt sofort. Widerrufene Zeilen bleiben als unveränderlicher, geschwärzter Workspace-Verlauf sichtbar. Es gibt weder Bearer-Token-Introspektion noch einen Endpunkt zum endgültigen Löschen.

app-api bietet keinen Endpunkt zum Ausstellen, Aktualisieren, Auflisten oder Widerrufen dieser Zugangsdaten. Der Tokenbezug erfolgt daher vorab über das menschlich bediente Admin-Portal, nicht über einen weiteren hier beschriebenen Endpunkt.

Speichern Sie das Token niemals in der Versionsverwaltung, in URLs, Abfrageparametern, Cookies, Logs, Analysedaten oder Fehlerberichten.

Authentifizierung

Senden Sie bei jeder Anfrage genau einen Header gemäß RFC 6750:

Authorization: Bearer evc_ws_<selector>.<secret>

Die exakte opake Zugangsinformation besteht aus evc_ws_, einem 16-stelligen kanonischen Base64url-Selektor, . und einem 43-stelligen kanonischen Base64url-Geheimnis. Senden Sie sie vollständig und unverändert; kodieren Sie sie nicht erneut als Base64.

Die API weist doppelte Autorisierungsheader, kommaverknüpfte Werte, andere Schemata, leere Bearer-Werte, Kunden-JWTs und außerhalb dieses Headers übergebene Zugangsdaten zurück.

Fehlerhafte, unbekannte, abgelaufene, widerrufene oder anderweitig ungültige Tokens erhalten dieselbe Antwort:

HTTP/1.1 401 Unauthorized
WWW-Authenticate: Bearer
Cache-Control: no-store
Content-Type: application/json

{
  "error": "Unauthorized",
  "code": "INVALID_WORKSPACE_TOKEN"
}

Der Dienst prüft bei jeder Anfrage Tokenstatus und aktuelle Workspace-Berechtigungen. Das Entfernen einer Berechtigung kann betroffene Scopes daher vor Tokenablauf deaktivieren.

Workspace-Tokens sind opake Zugangsdaten, keine JWTs. Sie haben kein Refresh-Token und keinen Refresh-Endpunkt. Befristete Tokens verlieren bei ihrem absoluten expiresAt die Gültigkeit; unbefristete gelten bis zum Widerruf. Rotation bedeutet, im Portal Ersatzdaten zu erstellen, im Client einzusetzen und die alten zu widerrufen.

Anfragekonventionen

  • Verwenden Sie Content-Type: application/json für Anfragen mit JSON-Body.
  • Optionale Anfragewerte X-Request-Id werden getrimmt und nur mit 1–128 Zeichen aus A-Z, a-z, 0-9, ., _, : oder - akzeptiert; sonst erzeugt der Server eine UUID. Jede Antwort gibt den gewählten Wert als X-Request-Id zurück.
  • Optionales X-Error-Format: envelope wandelt jede JSON-Fehlerantwort in den unter Antwort- und Fehlervertrag dokumentierten strukturierten Umschlag um. Jeder andere Wert behält den Standard-Kompatibilitäts-Body bei.
  • IDs in Pfadparametern sind positive Ganzzahlen. Vom Portal gelieferte Zugriffstoken-IDs sind Dezimalzeichenfolgen, da sie vorzeichenlose 64-Bit-Datenbankwerte darstellen.
  • Datums- und Zeitwerte sind RFC-3339-Zeichenfolgen mit ausdrücklichem Offset, zum Beispiel 2026-08-13T12:30:00Z.
  • Erfolgreiche Löschvorgänge liefern normalerweise 204 No Content.
  • Erstellungsvorgänge liefern normalerweise 201 Created.
  • OCPP-Arbeit, die lediglich eingereiht wurde, kann 202 Accepted liefern. Dies ist keine Bestätigung des Geräts, sofern die Antwort das nicht ausdrücklich sagt.
  • Authentifizierte Antworten verwenden Cache-Control: no-store. QR- und Berichtsexport-Endpunkte liefern Binärdaten mit ausdrücklichen Inhaltsheadern.
  • Zugelassene Browser-Origins können X-Request-Id, Idempotency-Replayed, Retry-After und Content-Disposition über CORS lesen. So können Browserclients Anfragen zuordnen, idempotente Wiederholungen erkennen, Wartezeiten einhalten und serverseitig gewählte Downloadnamen übernehmen.

Idempotenz

Alle Admin-Anfragen mit POST, PUT, PATCH und DELETE müssen einen Idempotency-Key-Header enthalten. Schlüssel bestehen aus 1–255 sichtbaren Zeichen und gelten für Token, Methode und Pfad.

Idempotency-Key: provisioning-2026-08-13-site-42

Ein abgeschlossener Schlüssel mit identischer URL und identischem Body spielt die gespeicherte Antwort erneut ab und ergänzt:

Idempotency-Replayed: true

Derselbe Schlüssel mit anderer Anfrage liefert 409 IDEMPOTENCY_CONFLICT. Eine noch verarbeitete Anfrage liefert 409 IDEMPOTENT_REQUEST_PROCESSING mit Retry-After: 5.

Abgeschlossene Antworten und endgültige Ergebnisse werden ab ihrer letzten Aktualisierung sieben Tage für Wiederholung oder Abgleich aufbewahrt. Danach kann derselbe Schlüssel als neuer Befehl gelten. Clients müssen daher global eindeutige Schlüssel verwenden und dürfen sie nicht absichtlich wiederverwenden.

Läuft eine Verarbeitungssperre ab, endet die Verbindung nach Ausführungsbeginn oder liefert der Vorgang einen Serverfehler, kann die API eine externe Wirkung nicht sicher feststellen. Während der siebentägigen Aufbewahrung bleibt der Schlüssel endgültig unbestimmt und liefert 409 IDEMPOTENCY_OUTCOME_UNKNOWN; er wird weder erneut übernommen noch automatisch ausgeführt. Prüfen Sie vor manueller Wiederherstellung die Wirkungen und senden Sie denselben Vorgang bis zum abgeschlossenen Abgleich nicht mit einem neuen Schlüssel.

Alle schreibenden Admin-Endpunkte, einschließlich POST /reports/send, benötigen Idempotency-Key.

Anfragelimits

Grenzen gelten sowohl für das einzelne Token als auch für dessen Workspace. Die im Repository festgelegten Standardwerte sind:

GrenzeStandard
Zeitfenster60 Sekunden
Pro Token300 Anfragen
Pro Workspace1.000 Anfragen

Eine gedrosselte Anfrage liefert 429 Too Many Requests und einen Retry-After-Header. Bereitstellungen können diese Werte überschreiben.

Fehler

JSON-Fehler verwenden ein stabiles code, wenn der Aufrufer danach verzweigen muss:

{
  "error": "Insufficient workspace-token scope",
  "code": "INSUFFICIENT_SCOPE"
}

Validierungsfehler verwenden Feld-Arrays:

{
  "validationErrors": {
    "name": ["String must contain at least 1 character(s)"]
  }
}

Häufige Statuswerte sind:

StatusBedeutung
400Ungültiger Idempotenz-/Benutzercursor-/Geocoder-Vertrag; Pfad-/Body-/Query-Schemafehler sind normalerweise 422
401Ungültiges Workspace-Token
403Gültiges Token ohne erforderlichen wirksamen Scope oder Berechtigung
404Workspace oder verschachtelte Ressource ist für dieses Token nicht sichtbar
409Konflikt bei Ressourcenstatus, Abhängigkeit, Gleichzeitigkeit oder Idempotenz
422Feldvalidierungsfehler, Bereichsüberschreitung oder Überschreitung der Exportgrenze
429Token- oder Workspace-Anfragelimit überschritten
502Ein nachgelagerter Vorgang wie die Berichtszustellung ist fehlgeschlagen
503Berechtigungs- oder Idempotenzspeicher ist vorübergehend nicht verfügbar

Scope-Katalog

Der folgende Scope-Katalog wird bei der Token-Erstellung verwendet. Schreibende oder besonders wirksame Scopes können den entsprechenden Lese-Scope einschließen, Lese-Scopes gewähren jedoch niemals Schreibrechte. Verfügbare Scopes hängen von Administratorrechten und aktivierten Workspace-Funktionen ab.

DomäneLese-ScopesSchreibende und besonders wirksame ScopesZusätzliche Berechtigung, falls erforderlich
Workspaceworkspaces:readworkspaces:update—
Standortesites:readsites:create, sites:update, sites:delete, sites:power-managementdlmPowerManagement für Leistungsmanagement
Ladegerätechargers:readchargers:create, chargers:update, chargers:delete, chargers:credentials, chargers:configuration, chargers:firmware, chargers:commands, chargers:public, chargers:connector-settings, chargers:local-users, chargers:tariff-assignments, chargers:profile-assignmentsfirmwareOperations, publicCharging, tariffs oder smartCharging für die passende Fähigkeit
Benutzerusers:readusers:create, users:update, users:delete, users:invitations, users:rfid, users:access, users:limits—
LadeprofilechargingProfiles:readchargingProfiles:create, chargingProfiles:update, chargingProfiles:delete, chargingProfiles:assignsmartCharging
Tarifetariffs:readtariffs:create, tariffs:update, tariffs:delete, tariffs:components, tariffs:assigntariffs
Berichtereports:readreports:export, reports:schedules, reports:sendscheduledReports für Zeitpläne und Sofortversand

Der API-Zugriff selbst ist in jedem Paket enthalten und wird über die Host-Einstellung adminApiEnabled gesteuert. Die oben genannten zusätzlichen Funktionsberechtigungen gelten weiterhin; API-Zugriff gewährt keine Funktionen außerhalb des Workspace-Pakets.

Endpunktreferenz

Die folgenden Tabellen enthalten alle 87 Workspace-Admin-Routen. Mehrere Scopes in einer Zelle sind sämtlich erforderlich.

Workspace

MethodePfadErforderlicher ScopeZweck
GET/v2/adminworkspaces:readUnbedenkliche Workspace-Metadaten und Referenzen lesen.
PATCH/v2/adminworkspaces:updateEin oder mehrere Workspace-Metadatenfelder aktualisieren.
GET/v2/admin/dashboardworkspaces:read + reports:readBegrenzte Workspace-Zähler und operative 90-Tage-Aggregate lesen.

Workspace-Patch-Felder: name, email, website, addressLine1, addressLine2, postalCode, city, state und countryId. Mindestens ein Feld ist erforderlich. Leere nullfähige Zeichenfolgen werden zu null normalisiert.

Standorte und Leistungsmanagement

MethodePfadErforderlicher ScopeZweck
GET/v2/admin/sitessites:readStandorte mit begrenzten 90-Tage-Summen und Standortreferenzdaten auflisten.
GET/v2/admin/sites/geocodesites:readNormalisierte Standortadressen über den gemeinsamen gedrosselten Geocoder mit Cache suchen.
POST/v2/admin/sitessites:createErstellen Sie einen Standort.
GET/v2/admin/sites/:siteIdsites:read + reports:readStandortdetails, letzte Ladevorgänge, Summen und operative Aggregate lesen.
PATCH/v2/admin/sites/:siteIdsites:updateBearbeitbares Standortdokument ersetzen.
DELETE/v2/admin/sites/:siteIdsites:deleteLöschen Sie einen leeren Standort; Abhängigkeiten führen zu einem Konflikt.
GET/v2/admin/sites/:siteId/power-managementsites:power-managementDynamischen Lastmanagement-Baum des Standorts lesen.
PUT/v2/admin/sites/:siteId/power-managementsites:power-managementErsetzen Sie die Leistungsmanagement-Konfiguration des Standorts atomar.

Bodys zum Erstellen und Ändern eines Standorts verwenden:

{
  "name": "Main depot",
  "description": null,
  "addressLine1": "1 Example Street",
  "addressLine2": null,
  "postalCode": "LV-1001",
  "city": "Riga",
  "state": null,
  "countryId": 1,
  "timezoneId": 1,
  "latitude": 56.9496,
  "longitude": 24.1052
}

Standort-Geocoding akzeptiert optionale Query-Felder street, city, state, country und zweistelliges countryCode sowie Anfrageheader Accept-Language. Straße/Ort/Region müssen zusammen mindestens zwei Zeichen umfassen. Antworten enthalten nur placeId, displayName, latitude und longitude; Anbieterzugangsdaten und spezifische Metadaten werden nicht ausgegeben. Der Server nutzt die gemeinsame Warteschlange mit einer Anfrage pro Sekunde, acht Sekunden Timeout, begrenzten 24-Stunden-Cache und globale Workspace-Token-Limits.

Leistungsmanagement akzeptiert { "pools": [...] }. Ein Pool hat id, name, limit, optional meterSources und rekursives children. Ein untergeordnetes Ladegerät hat chargepointId und priority. Die API begrenzt Baum- und Zähleranzahl und führt beim Ersetzen installierten Zustands zweiphasiges OCPP-Löschen mit erneuter Prüfung durch. Abgelehnte, abgelaufene oder konkurrierende Änderungen liefern 409 POWER_MANAGEMENT_CONFLICT und erhalten die vorige Konfiguration.

Ladegeräte

MethodePfadErforderlicher ScopeZweck oder Eingabe
GET/v2/admin/chargerschargers:readLadegeräte mit Status und zeitlich begrenzten Energie-/Kostensummen auflisten.
POST/v2/admin/chargerschargers:createErstellen Sie aus name, identifier und siteId; password ist optional.
GET/v2/admin/chargers/:chargerIdchargers:readDaten zu Ladegerät, EVSE, Anschluss, Referenzen und Status lesen.
PATCH/v2/admin/chargers/:chargerIdchargers:updatename, siteId, invertedRfid, smartMode oder automationDisabled aktualisieren.
DELETE/v2/admin/chargers/:chargerIdchargers:deleteLöschen Sie ein Ladegerät unter Beachtung der Abhängigkeiten und Abrechnungsregeln.
PATCH/v2/admin/chargers/:chargerId/credentialschargers:credentialsLadegerätepasswort durch { "password": "..." } ersetzen.
PATCH/v2/admin/chargers/:chargerId/connectors/:portIdchargers:connector-settingsAnschlussformat/-typ, Stromart, Spannung, Stromstärke und Leistungsgrenzen aktualisieren.
PATCH/v2/admin/chargers/:chargerId/public-listingchargers:publicSetzen Sie `{ "isPublic": true
GET/v2/admin/chargers/:chargerId/public-readinesschargers:readBereitschaft zum öffentlichen Laden und fehlende Voraussetzungen lesen.
GET/v2/admin/chargers/:chargerId/logschargers:readGeschwärzte OCPP-Logs mit Cursorpaginierung lesen.
GET/v2/admin/chargers/:chargerId/sessionschargers:read + reports:readPaginierte Ladevorgänge und Summen lesen.
GET/v2/admin/chargers/:chargerId/qrchargers:read300 Pixel großen PNG-QR erzeugen; optional connector=0..255.
GET/v2/admin/chargers/:chargerId/composite-scheduleschargers:readGespeicherten Verlauf kombinierter Zeitpläne lesen.
GET/v2/admin/chargers/:chargerId/configurationchargers:readOCPP-Konfiguration mit geschwärzten sensiblen Werten lesen.
PATCH/v2/admin/chargers/:chargerId/configurationchargers:configurationKonfigurationsänderung mit key und value senden.
POST/v2/admin/chargers/:chargerId/configuration/reloadchargers:configurationAktuelle Gerätekonfiguration anfordern.
GET/v2/admin/chargers/:chargerId/firmwarechargers:readAktuelle Firmware und Updatestatus lesen.
POST/v2/admin/chargers/:chargerId/firmwarechargers:firmwareUpdate von einer HTTP(S)-{ "url": "..." } einreihen.
POST/v2/admin/chargers/:chargerId/commands/resetchargers:commandsSenden Sie `{ "resetType": "Soft"
POST/v2/admin/chargers/:chargerId/commands/availabilitychargers:commandsSenden Sie `{ "availabilityType": "Operative"
POST/v2/admin/chargers/:chargerId/commands/triggerchargers:commandsBootNotification, Heartbeat, StatusNotification oder MeterValues auslösen.
POST/v2/admin/chargers/:chargerId/commands/unlockchargers:commandsPositives connectorId entriegeln.
POST/v2/admin/chargers/:chargerId/commands/composite-schedulechargers:commandsKombinierten Zeitplan für connectorId, durationSeconds und chargingRateUnit anfordern.

Abfrageparameter für Ladegerätelogs sind cursor, limit (Standard 50, höchstens 200), from, to, action, direction und levelId. Für Ladevorgänge gelten page, limit (Standard 25, höchstens 100), from, to und customerId (positive ID oder unknown). Der Verlauf kombinierter Zeitpläne nutzt cursor, limit (Standard 20, höchstens 50) und optional connectorId.

Berichte

MethodePfadErforderlicher ScopeZweck
GET/v2/admin/reports/datareports:readGefilterte Ladeberichte mit Cursorpaginierung lesen.
GET/v2/admin/reports/measurementsreports:readBegrenzte Messwerte einer eigenen Transaktion lesen.
GET/v2/admin/reports/exportreports:exportLaden Sie einen CSV- oder PDF-Export herunter.
GET/v2/admin/reports/schedulereports:readZum Workspace gehörenden Exportzeitplan oder null lesen.
PUT/v2/admin/reports/schedulereports:schedulesErstellen oder ersetzen Sie den zum Workspace gehörenden Exportzeitplan.
POST/v2/admin/reports/sendreports:sendGespeicherten Export des vorherigen UTC-Kalendermonats per E-Mail versenden; Idempotenzschlüssel erforderlich.

Berichts- und Exportfilter sind from, to, siteId, chargerId, userId, anonymous und active. from/to verwenden standardmäßig die letzten 90 Tage und dürfen höchstens 90 Tage umfassen. userId lässt sich nicht mit anonymous=true kombinieren.

  • Datenpaginierung: opakes cursor, Standard limit=50, höchstens 100.
  • Messungen: erforderliches transactionLogId, opakes cursor, Standard limit=500, höchstens 1.000.
  • Export: format=csv|pdf, Standard csv, feste Obergrenze 2.000 Zeilen.
  • Exportantworten verwenden Content-Disposition: attachment, Cache-Control: private, no-store und X-Content-Type-Options: nosniff.

Zeitplan-Body:

{
  "enabled": true,
  "recipientEmail": "reports@example.com",
  "format": "csv",
  "sendDay": 5,
  "sendTime": "08:30"
}

sendDay liegt zwischen 1 und 28, sendTime wird in UTC interpretiert. Der Scheduler holt eine verpasste Minute im aktuellen Zustellmonat nach. Fehlgeschlagene Erstellung vor Übergabe wird nach 5 und 10 Minuten wiederholt; eine unterbrochene building-Reservierung ist nach 30 Minuten übernehmbar. Nach drei Versuchen endet die Automatik. Unmittelbar vor SMTP-Übergabe speichert er indeterminate; indeterminate und der alte Status sending sind endgültig, da erneuter Versand doppelte Anhänge erzeugen könnte. Betreiber müssen diese Ergebnisse vor Änderung des Zeitplanstatus manuell abgleichen. Jeder Takt wählt höchstens zehn Zeitpläne, startet nach 45 Sekunden keine weitere Arbeit und verwendet begrenzte SMTP-Timeouts. Der Job ist standardmäßig deaktiviert und muss nach SMTP- und Kapazitätsprüfung ausdrücklich aktiviert werden. Der API-Zeitplan gehört dem Workspace, nicht der Identität des Token-Erstellers.

Tarife

MethodePfadErforderlicher ScopeZweck
GET/v2/admin/tariffstariffs:readTarife und Referenzdaten auflisten.
POST/v2/admin/tariffstariffs:createErstellen Sie einen Tarif.
GET/v2/admin/tariffs/:tariffIdtariffs:readEinen eigenen Tarif mit Komponenten lesen.
PATCH/v2/admin/tariffs/:tariffIdtariffs:updateTarifdefinition aktualisieren.
PUT/v2/admin/tariffs/:tariffId/componentstariffs:componentsErsetzen Sie bis zu 256 Komponenten atomar.
DELETE/v2/admin/tariffs/:tariffIdtariffs:deleteLöschen Sie einen ungenutzten Tarif.
GET/v2/admin/tariffs/:tariffId/market-pricestariffs:readPreise der zum Tarif gehörenden Gebotszone ab numerischem startsAt lesen.
GET/v2/admin/chargers/:chargerId/tariff-assignmentschargers:tariff-assignments + tariffs:readTarifzuweisungen eines Ladegeräts auflisten.
POST/v2/admin/chargers/:chargerId/tariff-assignmentschargers:tariff-assignments + tariffs:assignWeisen Sie einen Tarif zu.
PATCH/v2/admin/chargers/:chargerId/tariff-assignments/:assignmentIdchargers:tariff-assignments + tariffs:assignZuweisungsziel ersetzen.
DELETE/v2/admin/chargers/:chargerId/tariff-assignments/:assignmentIdchargers:tariff-assignments + tariffs:assignEntfernen Sie eine Zuweisung.

Ein Tarif-Body enthält name, genau eines von currencyId, currencyCode oder currency, optional biddingZoneId und tax. Ein Zuweisungs-Body lautet:

{ "tariffId": 17, "connectorId": 0 }

Beim Anlegen einer Zuweisung gilt der Tarif für alle physischen Anschlüsse, wenn connectorId weggelassen oder ausdrücklich auf 0 gesetzt wird. Aktualisierungen betreffen eine gespeicherte Zuweisung und erfordern daher eine ausdrücklich positive physische connectorId; 0 wird abgelehnt.

Eine Komponente enthält typeId, seasonId, price, optional priority sowie optionale Gültigkeitsgrenzen für Monat, Wochentag und Stunde.

Ladeprofile

MethodePfadErforderlicher ScopeZweck
GET/v2/admin/charging-profileschargingProfiles:readProfile und eigene Referenzdaten auflisten.
POST/v2/admin/charging-profileschargingProfiles:createErstellen Sie ein Profil mit optionalem Zeitplan.
GET/v2/admin/charging-profiles/:profileIdchargingProfiles:readEin eigenes Profil lesen.
PATCH/v2/admin/charging-profiles/:profileIdchargingProfiles:updateProfilmetadaten ersetzen.
PUT/v2/admin/charging-profiles/:profileId/schedulechargingProfiles:updateZeitplan durch 1–256 Abschnitte ersetzen.
DELETE/v2/admin/charging-profiles/:profileIdchargingProfiles:deleteLöschen Sie installierte Zuweisungen und entfernen Sie sie erst nach akzeptierten OCPP-Ergebnissen und erneuter Prüfung.
GET/v2/admin/chargers/:chargerId/profile-assignmentschargers:profile-assignments + chargingProfiles:readLadeprofilzuweisungen auflisten.
POST/v2/admin/chargers/:chargerId/profile-assignmentschargers:profile-assignments + chargingProfiles:assignWeisen Sie ein Profil zu und synchronisieren Sie es.
PATCH/v2/admin/chargers/:chargerId/profile-assignments/:assignmentIdchargers:profile-assignments + chargingProfiles:assignZuweisung ersetzen und synchronisieren.
DELETE/v2/admin/chargers/:chargerId/profile-assignments/:assignmentIdchargers:profile-assignments + chargingProfiles:assignLöschen Sie das installierte Profil und entfernen Sie die Zuweisung.

Profilmetadaten sind label, locationId, stackLevel, purposeId, kindId, optional recurrencyKindId, validFrom, validTo, startSchedule, rateUnitId und optional minChargingRate. Ein Zeitplanabschnitt enthält startPeriod, limit und optional numberOfPhases. Ein Zuweisungs-Body enthält profileId und connectorId (Standard 0).

Profillöschungen und das Ersetzen des Leistungsmanagements können auf Gerätebestätigung warten. Ablehnung, Zeitüberschreitung oder konkurrierende Änderung erzeugen einen Konflikt und erhalten die Datenbankkonfiguration, statt eine erfolgreiche Gerätelöschung vorzutäuschen.

Benutzer, Einladungen, RFID, Zugriff und Grenzen

MethodePfadErforderlicher ScopeZweck
GET/v2/admin/usersusers:readMitglieder und Einladungen auflisten.
POST/v2/admin/usersusers:createOrdnen Sie einen bereits registrierten Kunden anhand von email und Workspace name zu.
POST/v2/admin/users/invitationsusers:invitations + users:access; bei übergebenem RFID zusätzlich users:rfidUnbekannte E-Mail-Adresse einladen oder bestehenden Kunden zuordnen.
POST/v2/admin/users/invitations/resendusers:invitationsMit { "email": "..." } erneut senden, unter Beachtung der Empfänger-Wartezeit.
DELETE/v2/admin/users/invitationsusers:invitationsWiderrufen Sie eine Einladung; die E-Mail-Adresse bleibt im JSON-Body.
GET/v2/admin/users/:userIdusers:read + reports:readBenutzerdetails und begrenzte Ladesummen lesen.
PATCH/v2/admin/users/:userIdusers:updateWorkspace-spezifische Anzeige name festlegen.
DELETE/v2/admin/users/:userIdusers:deleteMitglied und zugehörigen Workspace-Zugriff unter Beachtung möglicher Konflikte entfernen.
GET/v2/admin/users/:userId/vehiclesusers:readEigene Fahrzeuge auflisten.
GET/v2/admin/users/:userId/rfidsusers:readRFID-Metadaten mit maskierten UIDs auflisten.
POST/v2/admin/users/:userId/rfidsusers:rfidFügen Sie uid und optional name hinzu; Antworten zeigen nur die maskierte UID.
PATCH/v2/admin/users/:userId/rfids/:rfidIdusers:rfidRFID-Bezeichnung aktualisieren.
DELETE/v2/admin/users/:userId/rfids/:rfidIdusers:rfidLöschen Sie ein RFID und synchronisieren Sie betroffene Ladegeräte.
GET/v2/admin/users/:userId/accessusers:readLadegeräteberechtigungen lesen.
PUT/v2/admin/users/:userId/accessusers:accessZugriff mit allChargers und eindeutigen chargerIds ersetzen.
DELETE/v2/admin/users/:userId/access/:accessIdusers:accessEine Zugriffszeile widerrufen.
GET/v2/admin/users/:userId/limitsusers:readLadegrenzen auflisten.
POST/v2/admin/users/:userId/limitsusers:limitsErstellen Sie limitTypeId, energyValue und/oder timeValue.
PATCH/v2/admin/users/:userId/limits/:limitIdusers:limitsEin oder mehrere Grenzfelder aktualisieren.
DELETE/v2/admin/users/:userId/limits/:limitIdusers:limitsLöschen Sie eine Grenze.
GET/v2/admin/chargers/:chargerId/local-userschargers:read + users:readLokale Ladegerätebenutzer und ausstehende Einladungen auflisten.
POST/v2/admin/chargers/:chargerId/local-userschargers:local-users + users:accessFügen Sie ein vorhandenes customerId mit optionalem expiresAt hinzu.
POST/v2/admin/chargers/:chargerId/local-users/invitationschargers:local-users + users:invitations + users:accessPer E-Mail hinzufügen oder einladen.
DELETE/v2/admin/chargers/:chargerId/local-users/invitationschargers:local-users + users:invitationsWiderrufen Sie eine lokale Benutzereinladung per E-Mail-Adresse.
PATCH/v2/admin/chargers/:chargerId/local-users/:localUserIdchargers:local-users + users:accessNullfähiges expiresAt setzen.
DELETE/v2/admin/chargers/:chargerId/local-users/:localUserIdchargers:local-users + users:accessLokalen Zugriff entfernen und OCPP-Zustand synchronisieren.

Fahrzeugpaginierung und status=members-Benutzerpaginierung verwenden positives numerisches cursor. Einladungen nutzen opaken Cursor i2.*, während status=all nach der ersten Seite einen opaken zusammengesetzten a2.*-Cursor verwendet; numerische Cursor bleiben nur für alte Mitgliederfortsetzungen gültig. Benutzersuche erfolgt im Anfrageheader X-Admin-User-Search, damit E-Mails nicht in URLs oder Zugriffslogs erscheinen. limit ist standardmäßig 50, höchstens 100; die Benutzerliste unterstützt status=all|members|invitations. Behandeln Sie alle zurückgegebenen Cursor als opak und senden Sie sie unverändert zurück.

Die direkte Benutzererstellung erzeugt kein Passwort, keine Anmeldeidentität und keine Sitzung. Sie ordnet nur einen bereits registrierten Kunden zu. Für unbekannte E-Mail-Adressen verwenden Sie den Einladungsendpunkt. Der geschützte Tagless-Systembenutzer kann über diese Routen nicht geändert werden.

Beispiele

Setzen Sie Werte in Ihrer Shell, ohne das Token auszugeben:

export ADMIN_API_BASE_URL="https://api.example.com"
export WORKSPACE_TOKEN="<read from secret manager>"

Standorte auflisten:

curl --fail-with-body \
  -H "Authorization: Bearer ${WORKSPACE_TOKEN}" \
  "${ADMIN_API_BASE_URL}/v2/admin/sites"

Standort sicher erstellen:

curl --fail-with-body \
  -X POST \
  -H "Authorization: Bearer ${WORKSPACE_TOKEN}" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: site-main-depot-v1" \
  --data '{
    "name":"Main depot",
    "description":null,
    "addressLine1":"1 Example Street",
    "addressLine2":null,
    "postalCode":"LV-1001",
    "city":"Riga",
    "state":null,
    "countryId":1,
    "timezoneId":1,
    "latitude":56.9496,
    "longitude":24.1052
  }' \
  "${ADMIN_API_BASE_URL}/v2/admin/sites"

Laden Sie einen CSV-Bericht für einen ausdrücklich angegebenen UTC-Zeitraum herunter:

curl --fail-with-body \
  -H "Authorization: Bearer ${WORKSPACE_TOKEN}" \
  -o report.csv \
  "${ADMIN_API_BASE_URL}/v2/admin/reports/export?format=csv&from=2026-07-01T00%3A00%3A00Z&to=2026-08-01T00%3A00%3A00Z"

Bewusste Ausschlüsse

Die Workspace-Token-API bietet keine Vorgänge, die einen menschlichen Prinzipal oder weitergehende Befugnisse erfordern. Dazu gehören:

  • Tokens mit einem anderen Token erstellen, offenlegen, rotieren oder widerrufen;
  • Anmeldung, Passwortzurücksetzung, Sitzungen, menschliche Rollen-/Rechtedelegation und Workspace-Besitzänderungen;
  • Workspace-Erstellung/-löschung und Mitgliedschaft im Abrechnungskonto;
  • Zahlungseinstellungen, Stripe-Onboarding, Pakete, Rechnungen und Host-Abrechnung;
  • hostweite Supportvorgänge und Anbieter-Webhooks;
  • menschliche Benachrichtigungen, Navigationsumleitungen, Markenmaterial sowie Entwicklungs-/Testrouten.