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:
nonebetyder ingen anmodningstekst. EnDELETE, der dokumenterer en JSON-anmodningstekst, kræver stadig denne tekst.?markerer en valgfri egenskab eller forespørgselsparameter.T | nullbetyder, at egenskaben er til stede og kan være null.204 emptybetyder ingen svartekst.CursorPage<T>betyder{ items: T[], nextCursor: number|string|null }, undtagen hvor rækken udtrykkeligt angiver etpage- ellerpagination-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:
| DTO | Felter |
|---|---|
Workspace | id, name, email, website, address { line1, line2, postalCode, city, state, countryId, countryCode, countryName }, createdAt, updatedAt |
Site | id, name, description, address, timezone { id, name }, latitude, longitude, chargerCount; detalje tilføjer normaliserede chargers og stiktilstand |
GeocodeCandidate | placeId, displayName, latitude, longitude; leverandørens legitimationsoplysninger og leverandørspecifikke metadata returneres aldrig |
MetricsWindow | from, to, sessionsgrænser/-antal og totalsCapped, hvor det er relevant |
Charger | id, 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 |
Connector | portId, connectorId, stikopslags-ID'er, maxVoltage, maxAmperage, maxElectricPower |
ReportSession | id, lader/sted, port- og stik-ID'er, minimerede brugerdata, active, energyWh, start/stop/varighed og netto-/moms-/totalomkostninger pr. valuta |
ReportSchedule | id, workspaceId, enabled, recipientEmail, format, UTC sendDay/sendTime, oprettelses-/opdateringsmetadata og sikre metadata om seneste levering, inklusive antal forsøg |
Tariff | id, cpoId, name, type-/sted-/valuta-/budområdeobjekter, tax, fallbackPrice, effektiv price, components, assignmentCount |
ChargingProfile | id, cpoId, label, description, stackLevel, objekter for placering/formål/type/gentagelse/rateenhed, gyldighed, tidsplan, assignmentCount, tidsstempler |
User | id, membershipId, name, email, maskerede rfids, laderens access, limitCount; detalje tilføjer phone, createdAt og limits. OCPP-autorisationsoplysninger som contractId returneres aldrig. |
RFID | id, maskedUid, name, type, valid; rå UID returneres aldrig |
Access | allChargers, sorterede chargerIds og items med metadata om adgang/lader/sted/udløb |
Limit | id, limitTypeId, label, energyValue, timeValue |
LocalUser | Liste-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 sti | Scope | Anmodning | Vellykket svar |
|---|---|---|---|
GET /v2/admin | workspaces:read | Anmodningstekst: ingen | 200 { workspace: Workspace } |
PATCH /v2/admin | workspaces:update | Anmodningstekst: WorkspacePatch | 200 { workspace: Workspace } |
GET /v2/admin/dashboard | workspaces:read + reports:read | Anmodningstekst/forespørgsel: ingen | 200 { 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 sti | Scope | Anmodning | Vellykket svar |
|---|---|---|---|
GET /v2/admin/sites | sites:read | Anmodningstekst/forespørgsel: ingen | 200 { items: Site[], metricsWindow: MetricsWindow, lookups { countries, timezones } } |
GET /v2/admin/sites/geocode | sites:read | Forespø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ævet | 200 { 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/sites | sites:create | Anmodningstekst: SiteInput | 201 { site: Site } |
GET /v2/admin/sites/:siteId | sites:read + reports:read | Anmodningstekst/forespørgsel: ingen | 200 { site: SiteDetail, recentSessions: SiteSession[], totals, metricsWindow } |
PATCH /v2/admin/sites/:siteId | sites:update | Anmodningstekst: fuldstændig SiteInput | 200 { site: Site } |
DELETE /v2/admin/sites/:siteId | sites:delete | Anmodningstekst: ingen | 204 empty; et sted, som ikke er tomt, returnerer 409 SITE_NOT_EMPTY |
GET /v2/admin/sites/:siteId/power-management | sites:power-management | Anmodningstekst/forespørgsel: ingen | 200 { configuration: PowerConfiguration } med ejet sted, ladere/stik, puljer, målerkilder, tildelinger og kompatibilitetstilstand |
PUT /v2/admin/sites/:siteId/power-management | sites:power-management | Anmodningstekst: PowerConfigurationInput | 200 { configuration: PowerConfiguration }; OCPP-afvisning, timeout eller samtidig ændring returnerer 409 POWER_MANAGEMENT_CONFLICT uden at anvende erstatningen |
Lader-endpoints
| Metode og sti | Scope | Anmodning | Vellykket svar |
|---|---|---|---|
GET /v2/admin/chargers | chargers:read | Anmodningstekst/forespørgsel: ingen | 200 { items: Charger[], metricsWindow: MetricsWindow, connectorLookups { formats, types, powerTypes } } |
POST /v2/admin/chargers | chargers:create | Anmodningstekst: ChargerCreate; identifikatoren konverteres til store bogstaver | 201 { charger: Charger }; adgangskoden returneres aldrig |
GET /v2/admin/chargers/:chargerId | chargers:read | Anmodningstekst/forespørgsel: ingen | 200 { charger: ChargerDetail } |
PATCH /v2/admin/chargers/:chargerId | chargers:update | Anmodningstekst: ChargerPatch | 200 { charger: ChargerDetail } |
DELETE /v2/admin/chargers/:chargerId | chargers:delete | Anmodningstekst: ingen | 204 empty |
PATCH /v2/admin/chargers/:chargerId/credentials | chargers:credentials | Anmodningstekst: { password: string(0..40) } | 200 { success: true } |
PATCH /v2/admin/chargers/:chargerId/connectors/:portId | chargers:connector-settings | Anmodningstekst: ConnectorPatch | 200 { connector: Connector } |
PATCH /v2/admin/chargers/:chargerId/public-listing | chargers:public | Anmodningstekst: { isPublic: boolean } | 200 { isPublic: boolean }; manglende parathed returnerer 409 CHARGER_CONFLICT |
GET /v2/admin/chargers/:chargerId/public-readiness | chargers:read | Anmodningstekst/forespørgsel: ingen | 200 { readiness: { ready, missingRequirements, connectorIds, missingTariffConnectorIds, ...commercialState } } |
GET /v2/admin/chargers/:chargerId/logs | chargers:read | Forespørgsel: cursor?, limit?=50 (1..200), from?, to?, action?, direction?, levelId? | 200 { items: RedactedOcppLog[], nextCursor: number or null } |
GET /v2/admin/chargers/:chargerId/sessions | chargers:read + reports:read | Forespø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/qr | chargers:read | Forespø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-schedules | chargers:read | Forespørgsel: cursor?, limit?=20 (1..50), connectorId? | 200 { items: CompositeSchedule[], nextCursor: number or null } |
GET /v2/admin/chargers/:chargerId/configuration | chargers:read | Anmodningstekst/forespørgsel: ingen | 200 { items: ChargerConfiguration[] }; værdier med hemmeligt indhold er [REDACTED] |
PATCH /v2/admin/chargers/:chargerId/configuration | chargers:configuration | Anmodningstekst: { key: string(1..50), value: string(0..500) } | 200 { status: string }, hvor status er laderens/OCPP-resultatet |
POST /v2/admin/chargers/:chargerId/configuration/reload | chargers:configuration | Anmodningstekst: ingen | 200 { status: string } |
GET /v2/admin/chargers/:chargerId/firmware | chargers:read | Anmodningstekst/forespørgsel: ingen | 200 { firmware: { status, notifiedAt, currentVersion, bootNotifiedAt } } |
POST /v2/admin/chargers/:chargerId/firmware | chargers:firmware | Anmodningstekst: { url: HTTP-or-HTTPS URL, max 2048 characters } | 202 { status: string } |
POST /v2/admin/chargers/:chargerId/commands/reset | chargers:commands | Anmodningstekst: { resetType: "Soft" or "Hard" } | 200 { status: string } |
POST /v2/admin/chargers/:chargerId/commands/availability | chargers:commands | Anmodningstekst: { availabilityType: "Operative" or "Inoperative" } | 200 { status: string } |
POST /v2/admin/chargers/:chargerId/commands/trigger | chargers:commands | Anmodningstekst: { messageType: "BootNotification", "Heartbeat", "StatusNotification", or "MeterValues" } | 200 { status: string, connectorResults: { connectorId, status }[] } |
POST /v2/admin/chargers/:chargerId/commands/unlock | chargers:commands | Anmodningstekst: { connectorId: positive integer } | 200 { status: string } |
POST /v2/admin/chargers/:chargerId/commands/composite-schedule | chargers:commands | Anmodningstekst: { connectorId: nonnegative integer, durationSeconds?: integer[60,604800], chargingRateUnit?: "W" or "A" } | 200 { status: string, connectorId: number, compositeSchedule: CompositeSchedule or null } |
Rapport-endpoints
| Metode og sti | Scope | Anmodning | Vellykket svar |
|---|---|---|---|
GET /v2/admin/reports/data | reports:read | Forespørgsel: ReportFilters, uigennemsigtig cursor?, limit?=50 (1..100) | 200 { items: ReportSession[], pageTotals, page { limit, nextCursor }, range { from, to, toExclusive: true } } |
GET /v2/admin/reports/schedule | reports:read | Anmodningstekst/forespørgsel: ingen | 200 { schedule: ReportSchedule or null } |
PUT /v2/admin/reports/schedule | reports:schedules | Anmodningstekst: streng ReportScheduleInput | 200 { schedule: ReportSchedule } |
POST /v2/admin/reports/send | reports:send | Anmodningstekst: ingen; headeren Idempotency-Key er påkrævet | 200 { sent: true, format: "csv" or "pdf", rowCount: number, range { from, to } }; ingen gemt tidsplan returnerer 409 REPORT_SCHEDULE_REQUIRED |
GET /v2/admin/reports/measurements | reports:read | Forespø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/export | reports:export | Forespø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 sti | Scope | Anmodning | Vellykket svar |
|---|---|---|---|
GET /v2/admin/tariffs | tariffs:read | Anmodningstekst/forespørgsel: ingen | 200 { items: Tariff[], lookups { currencies, biddingZones, currencyRates, componentTypes, seasons, tariffTypes } } |
POST /v2/admin/tariffs | tariffs:create | Anmodningstekst: TariffInput | 201 { tariff: Tariff } |
GET /v2/admin/tariffs/:tariffId | tariffs:read | Anmodningstekst/forespørgsel: ingen | 200 { tariff: Tariff, lookups } |
PATCH /v2/admin/tariffs/:tariffId | tariffs:update | Anmodningstekst: fuldstændig TariffInput | 200 { tariff: Tariff } |
PUT /v2/admin/tariffs/:tariffId/components | tariffs:components | Anmodningstekst: { components: TariffComponentInput[0..256] } | 200 { tariff: Tariff, components: TariffComponent[] } |
DELETE /v2/admin/tariffs/:tariffId | tariffs:delete | Anmodningstekst: ingen | 204 empty; henvisninger fra opladningsposter returnerer 409 TARIFF_CONFLICT |
GET /v2/admin/tariffs/:tariffId/market-prices | tariffs:read | Forespørgsel: påkrævet startsAt, ikke-negativt Unix-tidsstempel | 200 { items: { id, value, currencyId, startsAt, endsAt, startsAtIso, endsAtIso, intervalMinutes }[], truncated: boolean }; højst 10.000 rækker |
GET /v2/admin/chargers/:chargerId/tariff-assignments | chargers:tariff-assignments + tariffs:read | Anmodningstekst/forespørgsel: ingen | 200 { items: TariffAssignment[], tariffs: Tariff[] } |
POST /v2/admin/chargers/:chargerId/tariff-assignments | chargers:tariff-assignments + tariffs:assign | Anmodningstekst: TariffAssignmentCreateInput; udeladt connectorId eller connectorId=0 betyder alle stik | 201 { assignments: TariffAssignment[] } |
PATCH /v2/admin/chargers/:chargerId/tariff-assignments/:assignmentId | chargers:tariff-assignments + tariffs:assign | Anmodningstekst: TariffAssignmentUpdateInput; stik er påkrævet og må ikke være 0 | 200 { assignment: TariffAssignment } |
DELETE /v2/admin/chargers/:chargerId/tariff-assignments/:assignmentId | chargers:tariff-assignments + tariffs:assign | Anmodningstekst: ingen | 204 empty |
TariffAssignment indeholder id, chargerId, connectorId, en sikker tarif-/valutaoversigt, createdAt og updatedAt.
Endpoints til ladeprofiler
| Metode og sti | Scope | Anmodning | Vellykket svar |
|---|---|---|---|
GET /v2/admin/charging-profiles | chargingProfiles:read | Anmodningstekst/forespørgsel: ingen | 200 { items: ChargingProfile[], lookups { locations, purposes, kinds, recurrencyKinds, rateUnits, allowedRateUnits } } |
POST /v2/admin/charging-profiles | chargingProfiles:create | Anmodningstekst: ChargingProfileCreate | 201 { profile: ChargingProfile } |
GET /v2/admin/charging-profiles/:profileId | chargingProfiles:read | Anmodningstekst/forespørgsel: ingen | 200 { profile: ChargingProfile, lookups, isEditBlocked: boolean, usage { simpleChargingSchedule, smartSchedule, chargePoolChargepoint, isUsed } } |
PATCH /v2/admin/charging-profiles/:profileId | chargingProfiles:update | Anmodningstekst: fuldstændig ChargingProfileInput | 200 { profile: ChargingProfile, ocppSync: OcppCommandResult[] } |
PUT /v2/admin/charging-profiles/:profileId/schedule | chargingProfiles:update | Anmodningstekst: ChargingScheduleInput | 200 { profile: ChargingProfile, schedule: SchedulePeriod[], ocppSync: OcppCommandResult[] } |
DELETE /v2/admin/charging-profiles/:profileId | chargingProfiles:delete | Anmodningstekst: ingen | 204 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-assignments | chargers:profile-assignments + chargingProfiles:read | Anmodningstekst/forespørgsel: ingen | 200 { items: ProfileAssignment[], profiles: ChargingProfile[] } |
POST /v2/admin/chargers/:chargerId/profile-assignments | chargers:profile-assignments + chargingProfiles:assign | Anmodningstekst: ProfileAssignmentInput | 201 { assignment: ProfileAssignment, ocpp: OcppCommandResult } |
PATCH /v2/admin/chargers/:chargerId/profile-assignments/:assignmentId | chargers:profile-assignments + chargingProfiles:assign | Anmodningstekst: ProfileAssignmentInput | 200 { assignment: ProfileAssignment, ocpp: OcppCommandResult } |
DELETE /v2/admin/chargers/:chargerId/profile-assignments/:assignmentId | chargers:profile-assignments + chargingProfiles:assign | Anmodningstekst: ingen | 204 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 sti | Scope | Anmodning | Vellykket svar |
|---|---|---|---|
GET /v2/admin/users | users:read | Forespø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/users | users:create | Anmodningstekst: UserCreate; kunden skal allerede være registreret | 201 { 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/invitations | users:invitations + users:access; samt users:rfid, hvis rfid angives | Anmodningstekst: InvitationInput | 200 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/resend | users:invitations | Anmodningstekst: { email: email } | 200 { result: { targetedChargers, emailSent, emailRetryReady } }; global ventetid pr. modtager håndhæves |
DELETE /v2/admin/users/invitations | users:invitations | Anmodningstekst: { email: email } | 204 empty |
GET /v2/admin/users/:userId | users:read + reports:read | Anmodningstekst/forespørgsel: ingen | 200 { user: UserDetail, sessions: UserSession[], totals { count, energyWh, durationSeconds }, window, limitTypes, chargers }; højst 200 sessioner over 90 dage |
PATCH /v2/admin/users/:userId | users:update | Anmodningstekst: { name: string(1..255) } | 200 { user: User } |
DELETE /v2/admin/users/:userId | users:delete | Anmodningstekst: ingen | 204 empty |
GET /v2/admin/users/:userId/vehicles | users:read | Forespø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/rfids | users:read | Anmodningstekst/forespørgsel: ingen | 200 { items: RFID[] }; UID'er er maskerede |
POST /v2/admin/users/:userId/rfids | users:rfid | Anmodningstekst: { uid: string(1..36), name?: string or null } | 201 { rfid: RFID }; rå UID returneres ikke |
PATCH /v2/admin/users/:userId/rfids/:rfidId | users:rfid | Anmodningstekst: { name: string or null } | 200 { rfid: RFID } |
DELETE /v2/admin/users/:userId/rfids/:rfidId | users:rfid | Anmodningstekst: ingen | 204 empty |
GET /v2/admin/users/:userId/access | users:read | Anmodningstekst/forespørgsel: ingen | 200 { access: Access } |
PUT /v2/admin/users/:userId/access | users:access | Anmodningstekst: AccessInput | 200 { access: Access } |
DELETE /v2/admin/users/:userId/access/:accessId | users:access | Anmodningstekst: ingen | 204 empty |
GET /v2/admin/users/:userId/limits | users:read | Anmodningstekst/forespørgsel: ingen | 200 { items: Limit[] } |
POST /v2/admin/users/:userId/limits | users:limits | Anmodningstekst: LimitCreate | 201 { limit: Limit } |
PATCH /v2/admin/users/:userId/limits/:limitId | users:limits | Anmodningstekst: LimitPatch, mindst én egenskab | 200 { limit: Limit } |
DELETE /v2/admin/users/:userId/limits/:limitId | users:limits | Anmodningstekst: ingen | 204 empty |
GET /v2/admin/chargers/:chargerId/local-users | chargers:read + users:read | Anmodningstekst/forespørgsel: ingen | 200 { charger: ChargerSummary, items: LocalUser[], invitations: { email }[], availableMembers: [] }; API'et udelader bevidst portalens brede fortegnelse over tilgængelige medlemmer |
POST /v2/admin/chargers/:chargerId/local-users | chargers:local-users + users:access | Anmodningstekst: { customerId: positive integer, expiresAt?: RFC3339 or null } | 201 { localUser: LocalUserMutation } |
POST /v2/admin/chargers/:chargerId/local-users/invitations | chargers:local-users + users:invitations + users:access | Anmodningstekst: { 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/invitations | chargers:local-users + users:invitations | Anmodningstekst: { email: email } | 204 empty |
PATCH /v2/admin/chargers/:chargerId/local-users/:localUserId | chargers:local-users + users:access | Anmodningstekst: { expiresAt: RFC3339 or null } | 200 { localUser: LocalUserUpdate } |
DELETE /v2/admin/chargers/:chargerId/local-users/:localUserId | chargers:local-users + users:access | Anmodningstekst: ingen | 204 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:
| Endpoint | Indholdstype | Vigtige headere |
|---|---|---|
| Laderens QR-kode | image/png | Cache-Control: no-store, Content-Disposition: inline, X-Content-Type-Options: nosniff |
| Rapporteksport | text/csv; charset=utf-8 eller application/pdf | Cache-Control: private, no-store, Content-Disposition: attachment, X-Content-Type-Options: nosniff |
Fejl fra binære endpoints er stadig JSON.