Endpoints

Anmodninger og svar for endpoints i arbejdsområdets Admin API

Dette er anmodnings- og svarreferencen for hvert /v2/admin-endpoint. Autentificering, idempotens, anmodningsgrænser, tokenoprettelse og scopes betydning er dokumenteret i Workspace Admin API. Genanvendelige felttyper og eksempler findes i Skemaer og eksempler. Læs hver endpointrække sammen med Kontrakt for svar og fejl, som viser alle mulige fælles og endpointspecifikke svartekster ved manglende succes.

Fælles kontrakt

Hver sti begynder med den installerede app-api-oprindelse. Arbejdsområdet udledes udelukkende af det autentificerede token; klienter må ikke sende cpoId. Alle dokumenterede ressourcestiværdier af typen :...Id er positive decimale heltal. Hver anmodning kræver præcis én:

Authorization: Bearer <workspace-access-token>

Anmodninger vist med JSON-anmodningstekst kræver Content-Type: application/json. Alle ændringshandlinger kræver Idempotency-Key (POST, PUT, PATCH og DELETE), inklusive POST /v2/admin/reports/send; medmindre en række angiver andet, er indholdstypen ved succes application/json, JSON-datoer er RFC 3339-strenge, og tal er JSON-tal.

Hver anmodning kan indeholde X-Request-Id og X-Error-Format: envelope; se Kontrakt for svar og fejl. Disse headere ændrer ikke skemaer for vellykkede svar.

Notation anvendt nedenfor:

  • none betyder ingen anmodningstekst. En DELETE, der dokumenterer en JSON-anmodningstekst, kræver stadig denne tekst.
  • ? markerer en valgfri egenskab eller forespørgselsparameter.
  • T | null betyder, at egenskaben er til stede og kan være null.
  • 204 empty betyder ingen svartekst.
  • CursorPage<T> betyder { items: T[], nextCursor: number|string|null }, undtagen hvor rækken udtrykkeligt angiver et page- eller pagination-objekt.
  • Alle tilfælde, hvor en underordnet ressource ikke findes, inklusive ID'er fra andre arbejdsområder, bruger 404 { "error": "Workspace resource not found", "code": "RESOURCE_NOT_FOUND" }, medmindre en funktion dokumenterer en mere specifik konflikt.

Fælles anmodningsskemaer

Input til arbejdsområder og steder

WorkspacePatch = {
  name?: string(1..100), email?: email|null, website?: string|null,
  addressLine1?: string|null, addressLine2?: string|null,
  postalCode?: string|null, city?: string|null, state?: string|null,
  countryId?: positive integer
} // at least one property

SiteInput = {
  name: string(1..255), description?: string|null = null,
  addressLine1?: string|null = null, addressLine2?: string|null = null,
  postalCode?: string|null = null, city?: string|null = null, state?: string|null = null,
  countryId: positive integer, timezoneId: positive integer,
  latitude?: number[-90,90]|null = null, longitude?: number[-180,180]|null = null
}

Input til strømstyring

PowerConfigurationInput = { pools: PowerPoolInput[0..200] }
PowerPoolInput = {
  id?: positive integer|null, name?: string(0..255),
  limit: integer[0,100000000], meterSources?: ExternalMeterInput[0..16],
  children?: (PowerPoolInput | ChargerPoolChild)[0..1000]
}
ChargerPoolChild = { chargepointId: positive integer, priority?: integer[-1000000,1000000] }
ExternalMeterInput = {
  id?: positive integer|null, sourceId?: positive integer|null,
  provider?: "perific", name?: string(0..255), externalId: string(1..80),
  measurementMode?: "available_headroom"|"external_non_ev_load_only"|"total_site_load_including_ev",
  valueMode?: "perific_relative"|"perific_direct"|"perific_meter",
  reserveA?: integer[0,100000], offlineSafeA?: integer[0,100000],
  ttlSeconds?: integer[30,86400], enabled?: boolean
}

Laderinput

ChargerCreate = { name: string(1..40), identifier: string(1..40), password?: string(0..40) = "", siteId: positive integer }
ChargerPatch = {
  name?: string(1..40), siteId?: positive integer, invertedRfid?: boolean,
  smartMode?: integer[0,3], automationDisabled?: boolean
} // at least one
ConnectorPatch = {
  connectorFormatId: positive integer, connectorTypeId: positive integer,
  powerTypeId: positive integer, maxVoltage: integer[1,10000],
  maxAmperage: integer[1,10000], maxElectricPower: integer[1,100000000]
}

Rapportinput

ReportFilters = {
  from?: RFC3339, to?: RFC3339, siteId?: positive integer,
  chargerId?: positive integer, userId?: positive integer,
  anonymous?: true|false|1|0, active?: true|false|1|0
}
ReportScheduleInput = {
  enabled: boolean, recipientEmail: email(max 255; may be empty only when disabled), format: "csv"|"pdf",
  sendDay: integer[1,28], sendTime: UTC "HH:mm"
}

Rapportintervaller skal opfylde from < to og må ikke overstige 90 dage. Ved udeladelse bruges det seneste 90-dagesinterval. userId og anonymous=true udelukker hinanden. Planlagte eksporter indhenter et overskredet UTC-minut og bruger begrænsede genforsøg: 5/10 minutters ventetid, en 30-minutters lås på forældede behandlingskrav og tre forsøg.

Tarifinput

TariffInput = {
  name: string(1..64),
  exactly one of currencyId: positive integer, currencyCode: 3 letters, currency: 3 letters,
  biddingZoneId?: positive integer|null, tax?: finite number
}
TariffComponentInput = {
  typeId: positive integer, seasonId: positive integer, priority?: finite number,
  price: finite number, validFromMonth?: finite number, validToMonth?: finite number,
  validFromWeekDay?: finite number, validToWeekDay?: finite number,
  validFromHour?: finite number, validToHour?: finite number
}
TariffAssignmentCreateInput = { tariffId: positive integer, connectorId?: nonnegative integer }
TariffAssignmentUpdateInput = { tariffId: positive integer, connectorId: positive integer }

Input til ladeprofiler

ChargingProfileInput = {
  label: string(1..40), locationId: positive integer, stackLevel: nonnegative number,
  purposeId: positive integer, kindId: positive integer,
  recurrencyKindId?: positive integer|null, validFrom?: RFC3339|null,
  validTo?: RFC3339|null, startSchedule?: RFC3339|null,
  rateUnitId: positive integer, minChargingRate?: nonnegative number|null
}
ChargingProfileCreate = ChargingProfileInput & { schedule?: SchedulePeriod[0..256] }
SchedulePeriod = { startPeriod: nonnegative number, limit: nonnegative number, numberOfPhases?: positive integer|null }
ChargingScheduleInput = { rateUnitId: positive integer, periods: SchedulePeriod[1..256] }
ProfileAssignmentInput = { profileId: positive integer, connectorId?: nonnegative integer }

Brugerinput

UserCreate = { email: email(max 255), name: string(1..255) }
InvitationInput = {
  email: email, name?: string|null, rfid?: string|null,
  allChargers?: boolean, chargerIds?: unique positive integer[0..500]
} // chargerIds must be non-empty unless allChargers=true
AccessInput = { allChargers?: boolean, chargerIds?: unique positive integer[0..500] }
LimitCreate = { limitTypeId: positive integer, energyValue?: nonnegative integer = 0, timeValue?: nonnegative integer = 0 }
LimitPatch = { limitTypeId?: positive integer, energyValue?: nonnegative integer, timeValue?: nonnegative integer }

Mindst én af energyValue eller timeValue skal være større end nul, når en grænse oprettes. Indledende og afsluttende mellemrum fjernes fra e-mailadresser, som konverteres til små bogstaver. RFID-UID'er accepteres kun ved skrivning og maskeres i læsesvar.

Oversigt over svar-DTO'er

Endpointtabellerne viser alle svaromslutninger på øverste niveau. Dette er de vigtigste genanvendelige DTO'er inde i disse omslutninger:

DTOFelter
Workspaceid, name, email, website, address { line1, line2, postalCode, city, state, countryId, countryCode, countryName }, createdAt, updatedAt
Siteid, name, description, address, timezone { id, name }, latitude, longitude, chargerCount; detalje tilføjer normaliserede chargers og stiktilstand
GeocodeCandidateplaceId, displayName, latitude, longitude; leverandørens legitimationsoplysninger og leverandørspecifikke metadata returneres aldrig
MetricsWindowfrom, to, sessionsgrænser/-antal og totalsCapped, hvor det er relevant
Chargerid, name, identifier, cpoId, site, normaliseret status, isPublic, RFID-/smart-/automatiseringsflag, provisioned, connection, evses, connectors, createdAt, updatedAt; detalje tilføjer configuration med følsomme værdier skjult, firmware og antal
ConnectorportId, connectorId, stikopslags-ID'er, maxVoltage, maxAmperage, maxElectricPower
ReportSessionid, lader/sted, port- og stik-ID'er, minimerede brugerdata, active, energyWh, start/stop/varighed og netto-/moms-/totalomkostninger pr. valuta
ReportScheduleid, workspaceId, enabled, recipientEmail, format, UTC sendDay/sendTime, oprettelses-/opdateringsmetadata og sikre metadata om seneste levering, inklusive antal forsøg
Tariffid, cpoId, name, type-/sted-/valuta-/budområdeobjekter, tax, fallbackPrice, effektiv price, components, assignmentCount
ChargingProfileid, cpoId, label, description, stackLevel, objekter for placering/formål/type/gentagelse/rateenhed, gyldighed, tidsplan, assignmentCount, tidsstempler
Userid, membershipId, name, email, maskerede rfids, laderens access, limitCount; detalje tilføjer phone, createdAt og limits. OCPP-autorisationsoplysninger som contractId returneres aldrig.
RFIDid, maskedUid, name, type, valid; rå UID returneres aldrig
AccessallChargers, sorterede chargerIds og items med metadata om adgang/lader/sted/udløb
Limitid, limitTypeId, label, energyValue, timeValue
LocalUserListe-DTO: id, customerId, name, email, expiresAt, systemManaged. Ændringer af lokale brugere bruger de særskilte LocalUserMutation/LocalUserUpdate-strukturer i Skemaer og eksempler.

Opslagsobjekter returneres af liste- og detaljeruter, så klienter kan finde gyldige ID'er. Behandl ukendte tilføjede felter som fremadkompatible, og basér kun logik på dokumenterede stabile felter og fejlkoder.

Arbejdsområde-endpoints

Metode og stiScopeAnmodningVellykket svar
GET /v2/adminworkspaces:readAnmodningstekst: ingen200 { workspace: Workspace }
PATCH /v2/adminworkspaces:updateAnmodningstekst: WorkspacePatch200 { workspace: Workspace }
GET /v2/admin/dashboardworkspaces:read + reports:readAnmodningstekst/forespørgsel: ingen200 { window, stats { chargerCount, onlineChargerCount, siteCount, userCount }, sessions: DashboardSession[], analytics }; sessioner er begrænset til 1.000 over 90 dage

Endpoints til steder og strømstyring

Metode og stiScopeAnmodningVellykket svar
GET /v2/admin/sitessites:readAnmodningstekst/forespørgsel: ingen200 { items: Site[], metricsWindow: MetricsWindow, lookups { countries, timezones } }
GET /v2/admin/sites/geocodesites:readForespørgsel: valgfri street (højst 160), city, state, country (højst 100 hver), countryCode (højst 2); valgfri Accept-Language-header; mindst to tegn tilsammen i gade/by/delstat er påkrævet200 { results: GeocodeCandidate[] }; identiske igangværende søgninger samles, og leverandørarbejde bruger en afgrænset seriel kø samt en afgrænset servercache; ugyldige søgninger returnerer 400 INVALID_GEOCODE_QUERY, en fuld kø returnerer 429 GEOCODING_BUSY med Retry-After, og leverandørfejl returnerer 502 GEOCODING_UNAVAILABLE
POST /v2/admin/sitessites:createAnmodningstekst: SiteInput201 { site: Site }
GET /v2/admin/sites/:siteIdsites:read + reports:readAnmodningstekst/forespørgsel: ingen200 { site: SiteDetail, recentSessions: SiteSession[], totals, metricsWindow }
PATCH /v2/admin/sites/:siteIdsites:updateAnmodningstekst: fuldstændig SiteInput200 { site: Site }
DELETE /v2/admin/sites/:siteIdsites:deleteAnmodningstekst: ingen204 empty; et sted, som ikke er tomt, returnerer 409 SITE_NOT_EMPTY
GET /v2/admin/sites/:siteId/power-managementsites:power-managementAnmodningstekst/forespørgsel: ingen200 { configuration: PowerConfiguration } med ejet sted, ladere/stik, puljer, målerkilder, tildelinger og kompatibilitetstilstand
PUT /v2/admin/sites/:siteId/power-managementsites:power-managementAnmodningstekst: PowerConfigurationInput200 { configuration: PowerConfiguration }; OCPP-afvisning, timeout eller samtidig ændring returnerer 409 POWER_MANAGEMENT_CONFLICT uden at anvende erstatningen

Lader-endpoints

Metode og stiScopeAnmodningVellykket svar
GET /v2/admin/chargerschargers:readAnmodningstekst/forespørgsel: ingen200 { items: Charger[], metricsWindow: MetricsWindow, connectorLookups { formats, types, powerTypes } }
POST /v2/admin/chargerschargers:createAnmodningstekst: ChargerCreate; identifikatoren konverteres til store bogstaver201 { charger: Charger }; adgangskoden returneres aldrig
GET /v2/admin/chargers/:chargerIdchargers:readAnmodningstekst/forespørgsel: ingen200 { charger: ChargerDetail }
PATCH /v2/admin/chargers/:chargerIdchargers:updateAnmodningstekst: ChargerPatch200 { charger: ChargerDetail }
DELETE /v2/admin/chargers/:chargerIdchargers:deleteAnmodningstekst: ingen204 empty
PATCH /v2/admin/chargers/:chargerId/credentialschargers:credentialsAnmodningstekst: { password: string(0..40) }200 { success: true }
PATCH /v2/admin/chargers/:chargerId/connectors/:portIdchargers:connector-settingsAnmodningstekst: ConnectorPatch200 { connector: Connector }
PATCH /v2/admin/chargers/:chargerId/public-listingchargers:publicAnmodningstekst: { isPublic: boolean }200 { isPublic: boolean }; manglende parathed returnerer 409 CHARGER_CONFLICT
GET /v2/admin/chargers/:chargerId/public-readinesschargers:readAnmodningstekst/forespørgsel: ingen200 { readiness: { ready, missingRequirements, connectorIds, missingTariffConnectorIds, ...commercialState } }
GET /v2/admin/chargers/:chargerId/logschargers:readForespørgsel: cursor?, limit?=50 (1..200), from?, to?, action?, direction?, levelId?200 { items: RedactedOcppLog[], nextCursor: number or null }
GET /v2/admin/chargers/:chargerId/sessionschargers:read + reports:readForespørgsel: page?=1, limit?=25 (1..100), from?, to?, customerId?: positive integer or "unknown"200 { items: ChargerSession[], pagination { page, limit, total, totalPages }, filters { customers }, totals, totalsCapped }
GET /v2/admin/chargers/:chargerId/qrchargers:readForespørgsel: connector?: integer[0,255]200 image/png-binærdata, 300 px, Content-Disposition: inline, Cache-Control: no-store
GET /v2/admin/chargers/:chargerId/composite-scheduleschargers:readForespørgsel: cursor?, limit?=20 (1..50), connectorId?200 { items: CompositeSchedule[], nextCursor: number or null }
GET /v2/admin/chargers/:chargerId/configurationchargers:readAnmodningstekst/forespørgsel: ingen200 { items: ChargerConfiguration[] }; værdier med hemmeligt indhold er [REDACTED]
PATCH /v2/admin/chargers/:chargerId/configurationchargers:configurationAnmodningstekst: { key: string(1..50), value: string(0..500) }200 { status: string }, hvor status er laderens/OCPP-resultatet
POST /v2/admin/chargers/:chargerId/configuration/reloadchargers:configurationAnmodningstekst: ingen200 { status: string }
GET /v2/admin/chargers/:chargerId/firmwarechargers:readAnmodningstekst/forespørgsel: ingen200 { firmware: { status, notifiedAt, currentVersion, bootNotifiedAt } }
POST /v2/admin/chargers/:chargerId/firmwarechargers:firmwareAnmodningstekst: { url: HTTP-or-HTTPS URL, max 2048 characters }202 { status: string }
POST /v2/admin/chargers/:chargerId/commands/resetchargers:commandsAnmodningstekst: { resetType: "Soft" or "Hard" }200 { status: string }
POST /v2/admin/chargers/:chargerId/commands/availabilitychargers:commandsAnmodningstekst: { availabilityType: "Operative" or "Inoperative" }200 { status: string }
POST /v2/admin/chargers/:chargerId/commands/triggerchargers:commandsAnmodningstekst: { messageType: "BootNotification", "Heartbeat", "StatusNotification", or "MeterValues" }200 { status: string, connectorResults: { connectorId, status }[] }
POST /v2/admin/chargers/:chargerId/commands/unlockchargers:commandsAnmodningstekst: { connectorId: positive integer }200 { status: string }
POST /v2/admin/chargers/:chargerId/commands/composite-schedulechargers:commandsAnmodningstekst: { connectorId: nonnegative integer, durationSeconds?: integer[60,604800], chargingRateUnit?: "W" or "A" }200 { status: string, connectorId: number, compositeSchedule: CompositeSchedule or null }

Rapport-endpoints

Metode og stiScopeAnmodningVellykket svar
GET /v2/admin/reports/datareports:readForespørgsel: ReportFilters, uigennemsigtig cursor?, limit?=50 (1..100)200 { items: ReportSession[], pageTotals, page { limit, nextCursor }, range { from, to, toExclusive: true } }
GET /v2/admin/reports/schedulereports:readAnmodningstekst/forespørgsel: ingen200 { schedule: ReportSchedule or null }
PUT /v2/admin/reports/schedulereports:schedulesAnmodningstekst: streng ReportScheduleInput200 { schedule: ReportSchedule }
POST /v2/admin/reports/sendreports:sendAnmodningstekst: ingen; headeren Idempotency-Key er påkrævet200 { sent: true, format: "csv" or "pdf", rowCount: number, range { from, to } }; ingen gemt tidsplan returnerer 409 REPORT_SCHEDULE_REQUIRED
GET /v2/admin/reports/measurementsreports:readForespørgsel: påkrævet transactionLogId, uigennemsigtig cursor?, limit?=500 (1..1000)200 { transactionLogId, measurements: { name, unit, lines[] }[], page { limit, nextCursor, sampleValuesTruncated, sampleLimitPerMeterValue: 64 } }
GET /v2/admin/reports/exportreports:exportForespørgsel: ReportFilters, format?="csv" or "pdf"200 CSV/PDF-binærdata med filnavn til vedhæftning, Cache-Control: private, no-store, X-Content-Type-Options: nosniff; mere end 2.000 rækker returnerer 422 REPORT_EXPORT_ROW_LIMIT

Tarif-endpoints

Metode og stiScopeAnmodningVellykket svar
GET /v2/admin/tariffstariffs:readAnmodningstekst/forespørgsel: ingen200 { items: Tariff[], lookups { currencies, biddingZones, currencyRates, componentTypes, seasons, tariffTypes } }
POST /v2/admin/tariffstariffs:createAnmodningstekst: TariffInput201 { tariff: Tariff }
GET /v2/admin/tariffs/:tariffIdtariffs:readAnmodningstekst/forespørgsel: ingen200 { tariff: Tariff, lookups }
PATCH /v2/admin/tariffs/:tariffIdtariffs:updateAnmodningstekst: fuldstændig TariffInput200 { tariff: Tariff }
PUT /v2/admin/tariffs/:tariffId/componentstariffs:componentsAnmodningstekst: { components: TariffComponentInput[0..256] }200 { tariff: Tariff, components: TariffComponent[] }
DELETE /v2/admin/tariffs/:tariffIdtariffs:deleteAnmodningstekst: ingen204 empty; henvisninger fra opladningsposter returnerer 409 TARIFF_CONFLICT
GET /v2/admin/tariffs/:tariffId/market-pricestariffs:readForespørgsel: påkrævet startsAt, ikke-negativt Unix-tidsstempel200 { items: { id, value, currencyId, startsAt, endsAt, startsAtIso, endsAtIso, intervalMinutes }[], truncated: boolean }; højst 10.000 rækker
GET /v2/admin/chargers/:chargerId/tariff-assignmentschargers:tariff-assignments + tariffs:readAnmodningstekst/forespørgsel: ingen200 { items: TariffAssignment[], tariffs: Tariff[] }
POST /v2/admin/chargers/:chargerId/tariff-assignmentschargers:tariff-assignments + tariffs:assignAnmodningstekst: TariffAssignmentCreateInput; udeladt connectorId eller connectorId=0 betyder alle stik201 { assignments: TariffAssignment[] }
PATCH /v2/admin/chargers/:chargerId/tariff-assignments/:assignmentIdchargers:tariff-assignments + tariffs:assignAnmodningstekst: TariffAssignmentUpdateInput; stik er påkrævet og må ikke være 0200 { assignment: TariffAssignment }
DELETE /v2/admin/chargers/:chargerId/tariff-assignments/:assignmentIdchargers:tariff-assignments + tariffs:assignAnmodningstekst: ingen204 empty

TariffAssignment indeholder id, chargerId, connectorId, en sikker tarif-/valutaoversigt, createdAt og updatedAt.

Endpoints til ladeprofiler

Metode og stiScopeAnmodningVellykket svar
GET /v2/admin/charging-profileschargingProfiles:readAnmodningstekst/forespørgsel: ingen200 { items: ChargingProfile[], lookups { locations, purposes, kinds, recurrencyKinds, rateUnits, allowedRateUnits } }
POST /v2/admin/charging-profileschargingProfiles:createAnmodningstekst: ChargingProfileCreate201 { profile: ChargingProfile }
GET /v2/admin/charging-profiles/:profileIdchargingProfiles:readAnmodningstekst/forespørgsel: ingen200 { profile: ChargingProfile, lookups, isEditBlocked: boolean, usage { simpleChargingSchedule, smartSchedule, chargePoolChargepoint, isUsed } }
PATCH /v2/admin/charging-profiles/:profileIdchargingProfiles:updateAnmodningstekst: fuldstændig ChargingProfileInput200 { profile: ChargingProfile, ocppSync: OcppCommandResult[] }
PUT /v2/admin/charging-profiles/:profileId/schedulechargingProfiles:updateAnmodningstekst: ChargingScheduleInput200 { profile: ChargingProfile, schedule: SchedulePeriod[], ocppSync: OcppCommandResult[] }
DELETE /v2/admin/charging-profiles/:profileIdchargingProfiles:deleteAnmodningstekst: ingen204 empty først efter alle tildelte ladere har accepteret rydning, og tilstanden er valideret igen; ellers 409, og profilen bevares
GET /v2/admin/chargers/:chargerId/profile-assignmentschargers:profile-assignments + chargingProfiles:readAnmodningstekst/forespørgsel: ingen200 { items: ProfileAssignment[], profiles: ChargingProfile[] }
POST /v2/admin/chargers/:chargerId/profile-assignmentschargers:profile-assignments + chargingProfiles:assignAnmodningstekst: ProfileAssignmentInput201 { assignment: ProfileAssignment, ocpp: OcppCommandResult }
PATCH /v2/admin/chargers/:chargerId/profile-assignments/:assignmentIdchargers:profile-assignments + chargingProfiles:assignAnmodningstekst: ProfileAssignmentInput200 { assignment: ProfileAssignment, ocpp: OcppCommandResult }
DELETE /v2/admin/chargers/:chargerId/profile-assignments/:assignmentIdchargers:profile-assignments + chargingProfiles:assignAnmodningstekst: ingen204 empty efter synkroniseret rydning

ProfileAssignment indeholder tildelings-ID, lader-/stik-ID'er og en sikker profiloversigt. OCPP-resultatobjekter viser stabile anmodnings- og statusoplysninger og aldrig legitimationsoplysninger.

Endpoints til brugere, RFID, adgang, grænser og lokale brugere

Metode og stiScopeAnmodningVellykket svar
GET /v2/admin/usersusers:readForespørgsel: statusafstemt cursor? (members: positivt tal; invitations: autentificeret uigennemsigtig i2.*; all: numerisk fortsættelse af ældre medlemsliste eller autentificeret uigennemsigtig sammensat a2.*), limit?=50 (1..100), status?="all", "members", or "invitations"; valgfri X-Admin-User-Search-header (højst 100)200 { items: User[], invitations: Invitation[], chargers: ChargerSummary[], page { nextCursor, memberNextCursor, invitationNextCursor, limit } }; invitationer sideinddeles og udfyldes med samme normaliserede e-mailudtryk, så ældre brug af store/små bogstaver eller mellemrum ikke kan skjule rækker; markører er bundet til arbejdsområde og søgefilter, indeholder ingen læsbar e-mailadresse og skal returneres uændret; all-markører flytter medlems- og invitationsstrømme frem uafhængigt
POST /v2/admin/usersusers:createAnmodningstekst: UserCreate; kunden skal allerede være registreret201 { user: User }; en ukendt e-mailadresse returnerer 404 RESOURCE_NOT_FOUND-svarteksten, som ikke afslører ressourcens eksistens, og bør bruge invitationer
POST /v2/admin/users/invitationsusers:invitations + users:access; samt users:rfid, hvis rfid angivesAnmodningstekst: InvitationInput200 or 201 { result }; tilknyttet resultat er { kind:"attached", user, accessChanged, rfidChanged }; afventende resultat er { kind:"invited", email, name, maskedRfid, chargerIds, createdCount, emailSent, emailRetryReady, alreadyInvited }
POST /v2/admin/users/invitations/resendusers:invitationsAnmodningstekst: { email: email }200 { result: { targetedChargers, emailSent, emailRetryReady } }; global ventetid pr. modtager håndhæves
DELETE /v2/admin/users/invitationsusers:invitationsAnmodningstekst: { email: email }204 empty
GET /v2/admin/users/:userIdusers:read + reports:readAnmodningstekst/forespørgsel: ingen200 { user: UserDetail, sessions: UserSession[], totals { count, energyWh, durationSeconds }, window, limitTypes, chargers }; højst 200 sessioner over 90 dage
PATCH /v2/admin/users/:userIdusers:updateAnmodningstekst: { name: string(1..255) }200 { user: User }
DELETE /v2/admin/users/:userIdusers:deleteAnmodningstekst: ingen204 empty
GET /v2/admin/users/:userId/vehiclesusers:readForespørgsel: numerisk cursor?, limit?=50 (1..100)200 { items: Vehicle[], page { nextCursor, limit } }; køretøjs-DTO'en indeholder sikre felter for leverandør/status/model/telemetri
GET /v2/admin/users/:userId/rfidsusers:readAnmodningstekst/forespørgsel: ingen200 { items: RFID[] }; UID'er er maskerede
POST /v2/admin/users/:userId/rfidsusers:rfidAnmodningstekst: { uid: string(1..36), name?: string or null }201 { rfid: RFID }; rå UID returneres ikke
PATCH /v2/admin/users/:userId/rfids/:rfidIdusers:rfidAnmodningstekst: { name: string or null }200 { rfid: RFID }
DELETE /v2/admin/users/:userId/rfids/:rfidIdusers:rfidAnmodningstekst: ingen204 empty
GET /v2/admin/users/:userId/accessusers:readAnmodningstekst/forespørgsel: ingen200 { access: Access }
PUT /v2/admin/users/:userId/accessusers:accessAnmodningstekst: AccessInput200 { access: Access }
DELETE /v2/admin/users/:userId/access/:accessIdusers:accessAnmodningstekst: ingen204 empty
GET /v2/admin/users/:userId/limitsusers:readAnmodningstekst/forespørgsel: ingen200 { items: Limit[] }
POST /v2/admin/users/:userId/limitsusers:limitsAnmodningstekst: LimitCreate201 { limit: Limit }
PATCH /v2/admin/users/:userId/limits/:limitIdusers:limitsAnmodningstekst: LimitPatch, mindst én egenskab200 { limit: Limit }
DELETE /v2/admin/users/:userId/limits/:limitIdusers:limitsAnmodningstekst: ingen204 empty
GET /v2/admin/chargers/:chargerId/local-userschargers:read + users:readAnmodningstekst/forespørgsel: ingen200 { charger: ChargerSummary, items: LocalUser[], invitations: { email }[], availableMembers: [] }; API'et udelader bevidst portalens brede fortegnelse over tilgængelige medlemmer
POST /v2/admin/chargers/:chargerId/local-userschargers:local-users + users:accessAnmodningstekst: { customerId: positive integer, expiresAt?: RFC3339 or null }201 { localUser: LocalUserMutation }
POST /v2/admin/chargers/:chargerId/local-users/invitationschargers:local-users + users:invitations + users:accessAnmodningstekst: { email: email }200 or 201 { result }; eksisterende kunde: { invited:false, localUser: LocalUserMutation }; invitation: { invited:true, alreadyInvited, emailSent, emailRetryReady }
DELETE /v2/admin/chargers/:chargerId/local-users/invitationschargers:local-users + users:invitationsAnmodningstekst: { email: email }204 empty
PATCH /v2/admin/chargers/:chargerId/local-users/:localUserIdchargers:local-users + users:accessAnmodningstekst: { expiresAt: RFC3339 or null }200 { localUser: LocalUserUpdate }
DELETE /v2/admin/chargers/:chargerId/local-users/:localUserIdchargers:local-users + users:accessAnmodningstekst: ingen204 empty

Tagless-systembrugeren er beskyttet mod disse handlinger. Fejl ved invitationsmails returnerer en sikker leveringsstatus uden at afsløre SMTP-oplysninger; klienter kan prøve igen, når emailRetryReady er sand.

Binære svar

To endpointgrupper returnerer ikke JSON ved succes:

EndpointIndholdstypeVigtige headere
Laderens QR-kodeimage/pngCache-Control: no-store, Content-Disposition: inline, X-Content-Type-Options: nosniff
Rapporteksporttext/csv; charset=utf-8 eller application/pdfCache-Control: private, no-store, Content-Disposition: attachment, X-Content-Type-Options: nosniff

Fejl fra binære endpoints er stadig JSON.