Tööruumi Admin API endpointide päringud ja vastused
See on iga /v2/admin endpointi päringu/vastuse viide. Autentimist, idempotentsust, päringupiiranguid, pääsutõendite loomist ja pääsuulatuste semantikat kirjeldab Tööruumi Admin API. Korduvkasutatavad väljatüübid ja näited on Skeemides ja näidetes. Lugege iga endpointi rida koos Vastuste ja vigade lepinguga, mis loetleb kõik ühised ja endpointipõhised ebaedukad vastusesisud.
Ühine leping
Iga tee algab juurutatud app-api päritoluga. Tööruum saadakse ainult autenditud pääsutõendist; kliendid ei tohi saata cpoId. Kõik dokumenteeritud :...Id ressursitee väärtused on positiivsed kümnendtäisarvud. Iga päring vajab täpselt üht:
Authorization: Bearer <workspace-access-token>
JSON-sisuga näidatud päringud nõuavad Content-Type: application/json. Kõik muudatused nõuavad Idempotency-Key (POST, PUT, PATCH ja DELETE), ka POST /v2/admin/reports/send; kui rida ei ütle teisiti, on eduka vastuse sisutüüp application/json, JSON-kuupäevad on RFC 3339 stringid ja arvud JSON-arvud.
Iga päring võib sisaldada X-Request-Id ja X-Error-Format: envelope; vt Vastuste ja vigade leping. Need päised ei muuda eduskeeme.
Allpool kasutatud tähistus:
nonetähendab päringusisu puudumist.DELETE, mis dokumenteerib JSON-sisu, nõuab seda endiselt.?tähistab valikulist omadust või päringuparameetrit.T | nulltähendab, et omadus on olemas ja lubab nulli.204 emptytähendab vastusesisu puudumist.CursorPage<T>tähendab{ items: T[], nextCursor: number|string|null }, välja arvatud juhul, kui rida nimetab selgeltpagevõipaginationobjekti.- Kõik puuduvad pesastatud ressursid, ka teise tööruumi ID-d, kasutavad
404 { "error": "Workspace resource not found", "code": "RESOURCE_NOT_FOUND" }, kui funktsioon ei dokumenteeri täpsemat konflikti.
Ühised päringuskeemid
Tööruumi ja asukoha sisendid
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
}
Võimsushalduse sisend
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
}
Laadija sisendid
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]
}
Aruannete sisendid
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"
}
Aruandevahemikud peavad vastama from < to ega tohi ületada 90 päeva. Puudumisel kasutatakse viimast 90 päeva. userId ja anonymous=true on teineteist välistavad. Ajastatud ekspordid teevad vahele jäänud UTC-minuti tasa ning kasutavad piiratud korduskatseid (5/10 minuti viivitus, aegunud hõive 30 minuti liising, kolm katset).
Tariifi sisendid
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 }
Laadimisprofiilide sisendid
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 }
Kasutaja sisendid
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 }
Piirangu loomisel peab vähemalt üks väärtustest energyValue või timeValue olema nullist suurem. E-posti aadresside ääretühikud eemaldatakse ja tähed tehakse väikseks. RFID UID-sid aktsepteeritakse vaid kirjutamisel ja need maskeeritakse lugemisvastustes.
Vastuse DTO kokkuvõte
Endpointide tabelid näitavad kõiki ülataseme vastuseümbrisi. Need on nende peamised korduvkasutatavad DTO-d:
| DTO | Väljad |
|---|---|
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; detail lisab normaliseeritud chargers ja pistiku oleku |
GeocodeCandidate | placeId, displayName, latitude, longitude; teenusepakkuja autentimisandmeid ega erimetaandmeid ei tagastata kunagi |
MetricsWindow | from, to, seansipiirangud/loendused ning vajadusel totalsCapped |
Charger | id, name, identifier, cpoId, site, normaliseeritud status, isPublic, RFID/Smarti/automaatika lipud, provisioned, connection, evses, connectors, createdAt, updatedAt; detail lisab varjatud configuration, firmware ja loendused |
Connector | portId, connectorId, pistiku teatme-ID-d, maxVoltage, maxAmperage, maxElectricPower |
ReportSession | id, laadija/asukoht, pordi ja pistiku ID-d, minimeeritud kasutaja, active, energyWh, algus/lõpp/kestus ja valuutapõhised neto-/maksu-/kogukulud |
ReportSchedule | id, workspaceId, enabled, recipientEmail, format, UTC sendDay/sendTime, loomise/uuendamise ja viimase saatmise ohutud metaandmed koos katsete arvuga |
Tariff | id, cpoId, name, tüübi/asukoha/valuuta/hinnapiirkonna objektid, tax, fallbackPrice, tegelik price, components, assignmentCount |
ChargingProfile | id, cpoId, label, description, stackLevel, asukoha/eesmärgi/liigi/korduvuse/kiirusühiku objektid, kehtivus, ajakava, assignmentCount, ajatemplid |
User | id, membershipId, name, email, maskeeritud rfids, laadija access, limitCount; detail lisab phone, createdAt ja limits. OCPP autoriseerimisandmeid, näiteks contractId, ei tagastata kunagi. |
RFID | id, maskedUid, name, type, valid; toorest UID-d ei tagastata kunagi |
Access | allChargers, sorditud chargerIds ja items, mis sisaldab pääsuõiguse/laadija/asukoha/aegumise metaandmeid |
Limit | id, limitTypeId, label, energyValue, timeValue |
LocalUser | Loendi DTO: id, customerId, name, email, expiresAt, systemManaged. Kohalike kasutajate muudatused kasutavad eraldi LocalUserMutation/LocalUserUpdate kujusid jaotises Skeemid ja näited. |
Loendi-/detailimarsruudid tagastavad teatmeobjekte, et kliendid leiaksid kehtivad ID-d. Käsitlege lisatud tundmatuid välju tulevikuga ühilduvatena ja harunege ainult dokumenteeritud stabiilsete väljade ja veakoodide alusel.
Tööruumi endpointid
| Meetod ja tee | Pääsuulatus | Päring | Edukas vastus |
|---|---|---|---|
GET /v2/admin | workspaces:read | Sisu: puudub | 200 { workspace: Workspace } |
PATCH /v2/admin | workspaces:update | Sisu: WorkspacePatch | 200 { workspace: Workspace } |
GET /v2/admin/dashboard | workspaces:read + reports:read | Sisu/päring: puudub | 200 { window, stats { chargerCount, onlineChargerCount, siteCount, userCount }, sessions: DashboardSession[], analytics }; seansse on kuni 1000 90 päeva jooksul |
Asukoha ja võimsushalduse endpointid
| Meetod ja tee | Pääsuulatus | Päring | Edukas vastus |
|---|---|---|---|
GET /v2/admin/sites | sites:read | Sisu/päring: puudub | 200 { items: Site[], metricsWindow: MetricsWindow, lookups { countries, timezones } } |
GET /v2/admin/sites/geocode | sites:read | Päring: valikulised street (max 160), city, state, country (igaüks max 100), countryCode (max 2); valikuline Accept-Language päis; tänav/linn/osariik peab kokku sisaldama vähemalt kaht märki | 200 { results: GeocodeCandidate[] }; identsed pooleliolevad otsingud liidetakse ning teenusepakkuja töö kasutab piiratud järjestikust järjekorda ja serverivahemälu; vigased otsingud tagastavad 400 INVALID_GEOCODE_QUERY, täis järjekord 429 GEOCODING_BUSY koos Retry-After ja teenusepakkuja tõrked 502 GEOCODING_UNAVAILABLE |
POST /v2/admin/sites | sites:create | Sisu: SiteInput | 201 { site: Site } |
GET /v2/admin/sites/:siteId | sites:read + reports:read | Sisu/päring: puudub | 200 { site: SiteDetail, recentSessions: SiteSession[], totals, metricsWindow } |
PATCH /v2/admin/sites/:siteId | sites:update | Sisu: täielik SiteInput | 200 { site: Site } |
DELETE /v2/admin/sites/:siteId | sites:delete | Sisu: puudub | 204 empty; mittetühi asukoht tagastab 409 SITE_NOT_EMPTY |
GET /v2/admin/sites/:siteId/power-management | sites:power-management | Sisu/päring: puudub | 200 { configuration: PowerConfiguration }, mis sisaldab omatavat asukohta, laadijaid/pistikuid, rühmi, arvestiallikaid, määranguid ja ühilduvusolekut |
PUT /v2/admin/sites/:siteId/power-management | sites:power-management | Sisu: PowerConfigurationInput | 200 { configuration: PowerConfiguration }; OCPP keeldumine, ajalõpp või samaaegne muudatus tagastab 409 POWER_MANAGEMENT_CONFLICT asendust rakendamata |
Laadija endpointid
| Meetod ja tee | Pääsuulatus | Päring | Edukas vastus |
|---|---|---|---|
GET /v2/admin/chargers | chargers:read | Sisu/päring: puudub | 200 { items: Charger[], metricsWindow: MetricsWindow, connectorLookups { formats, types, powerTypes } } |
POST /v2/admin/chargers | chargers:create | Sisu: ChargerCreate; identifikaator tehakse suurtäheliseks | 201 { charger: Charger }; parooli ei tagastata kunagi |
GET /v2/admin/chargers/:chargerId | chargers:read | Sisu/päring: puudub | 200 { charger: ChargerDetail } |
PATCH /v2/admin/chargers/:chargerId | chargers:update | Sisu: ChargerPatch | 200 { charger: ChargerDetail } |
DELETE /v2/admin/chargers/:chargerId | chargers:delete | Sisu: puudub | 204 empty |
PATCH /v2/admin/chargers/:chargerId/credentials | chargers:credentials | Sisu: { password: string(0..40) } | 200 { success: true } |
PATCH /v2/admin/chargers/:chargerId/connectors/:portId | chargers:connector-settings | Sisu: ConnectorPatch | 200 { connector: Connector } |
PATCH /v2/admin/chargers/:chargerId/public-listing | chargers:public | Sisu: { isPublic: boolean } | 200 { isPublic: boolean }; täitmata valmidus tagastab 409 CHARGER_CONFLICT |
GET /v2/admin/chargers/:chargerId/public-readiness | chargers:read | Sisu/päring: puudub | 200 { readiness: { ready, missingRequirements, connectorIds, missingTariffConnectorIds, ...commercialState } } |
GET /v2/admin/chargers/:chargerId/logs | chargers:read | Päring: 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 | Päring: 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 | Päring: connector?: integer[0,255] | 200 image/png kahendsisu, 300 px, Content-Disposition: inline, Cache-Control: no-store |
GET /v2/admin/chargers/:chargerId/composite-schedules | chargers:read | Päring: cursor?, limit?=20 (1..50), connectorId? | 200 { items: CompositeSchedule[], nextCursor: number or null } |
GET /v2/admin/chargers/:chargerId/configuration | chargers:read | Sisu/päring: puudub | 200 { items: ChargerConfiguration[] }; saladuselaadsed väärtused on [REDACTED] |
PATCH /v2/admin/chargers/:chargerId/configuration | chargers:configuration | Sisu: { key: string(1..50), value: string(0..500) } | 200 { status: string }, kus olek on laadija/OCPP tulemus |
POST /v2/admin/chargers/:chargerId/configuration/reload | chargers:configuration | Sisu: puudub | 200 { status: string } |
GET /v2/admin/chargers/:chargerId/firmware | chargers:read | Sisu/päring: puudub | 200 { firmware: { status, notifiedAt, currentVersion, bootNotifiedAt } } |
POST /v2/admin/chargers/:chargerId/firmware | chargers:firmware | Sisu: { url: HTTP-or-HTTPS URL, max 2048 characters } | 202 { status: string } |
POST /v2/admin/chargers/:chargerId/commands/reset | chargers:commands | Sisu: { resetType: "Soft" or "Hard" } | 200 { status: string } |
POST /v2/admin/chargers/:chargerId/commands/availability | chargers:commands | Sisu: { availabilityType: "Operative" or "Inoperative" } | 200 { status: string } |
POST /v2/admin/chargers/:chargerId/commands/trigger | chargers:commands | Sisu: { messageType: "BootNotification", "Heartbeat", "StatusNotification", or "MeterValues" } | 200 { status: string, connectorResults: { connectorId, status }[] } |
POST /v2/admin/chargers/:chargerId/commands/unlock | chargers:commands | Sisu: { connectorId: positive integer } | 200 { status: string } |
POST /v2/admin/chargers/:chargerId/commands/composite-schedule | chargers:commands | Sisu: { connectorId: nonnegative integer, durationSeconds?: integer[60,604800], chargingRateUnit?: "W" or "A" } | 200 { status: string, connectorId: number, compositeSchedule: CompositeSchedule or null } |
Aruannete endpointid
| Meetod ja tee | Pääsuulatus | Päring | Edukas vastus |
|---|---|---|---|
GET /v2/admin/reports/data | reports:read | Päring: ReportFilters, läbipaistmatu cursor?, limit?=50 (1..100) | 200 { items: ReportSession[], pageTotals, page { limit, nextCursor }, range { from, to, toExclusive: true } } |
GET /v2/admin/reports/schedule | reports:read | Sisu/päring: puudub | 200 { schedule: ReportSchedule or null } |
PUT /v2/admin/reports/schedule | reports:schedules | Sisu: range ReportScheduleInput | 200 { schedule: ReportSchedule } |
POST /v2/admin/reports/send | reports:send | Sisu: puudub; Idempotency-Key päis on kohustuslik | 200 { sent: true, format: "csv" or "pdf", rowCount: number, range { from, to } }; salvestatud ajakava puudumine tagastab 409 REPORT_SCHEDULE_REQUIRED |
GET /v2/admin/reports/measurements | reports:read | Päring: kohustuslik transactionLogId, läbipaistmatu cursor?, limit?=500 (1..1000) | 200 { transactionLogId, measurements: { name, unit, lines[] }[], page { limit, nextCursor, sampleValuesTruncated, sampleLimitPerMeterValue: 64 } } |
GET /v2/admin/reports/export | reports:export | Päring: ReportFilters, format?="csv" or "pdf" | 200 CSV/PDF-kahendsisu manuse nimega, Cache-Control: private, no-store, X-Content-Type-Options: nosniff; üle 2000 rea tagastab 422 REPORT_EXPORT_ROW_LIMIT |
Tariifi endpointid
| Meetod ja tee | Pääsuulatus | Päring | Edukas vastus |
|---|---|---|---|
GET /v2/admin/tariffs | tariffs:read | Sisu/päring: puudub | 200 { items: Tariff[], lookups { currencies, biddingZones, currencyRates, componentTypes, seasons, tariffTypes } } |
POST /v2/admin/tariffs | tariffs:create | Sisu: TariffInput | 201 { tariff: Tariff } |
GET /v2/admin/tariffs/:tariffId | tariffs:read | Sisu/päring: puudub | 200 { tariff: Tariff, lookups } |
PATCH /v2/admin/tariffs/:tariffId | tariffs:update | Sisu: täielik TariffInput | 200 { tariff: Tariff } |
PUT /v2/admin/tariffs/:tariffId/components | tariffs:components | Sisu: { components: TariffComponentInput[0..256] } | 200 { tariff: Tariff, components: TariffComponent[] } |
DELETE /v2/admin/tariffs/:tariffId | tariffs:delete | Sisu: puudub | 204 empty; laadimiskirjete viited tagastavad 409 TARIFF_CONFLICT |
GET /v2/admin/tariffs/:tariffId/market-prices | tariffs:read | Päring: kohustuslik startsAt, mittenegatiivne Unixi ajatempel | 200 { items: { id, value, currencyId, startsAt, endsAt, startsAtIso, endsAtIso, intervalMinutes }[], truncated: boolean }; kuni 10 000 rida |
GET /v2/admin/chargers/:chargerId/tariff-assignments | chargers:tariff-assignments + tariffs:read | Sisu/päring: puudub | 200 { items: TariffAssignment[], tariffs: Tariff[] } |
POST /v2/admin/chargers/:chargerId/tariff-assignments | chargers:tariff-assignments + tariffs:assign | Sisu: TariffAssignmentCreateInput; puuduv connectorId või connectorId=0 tähendab kõiki pistikuid | 201 { assignments: TariffAssignment[] } |
PATCH /v2/admin/chargers/:chargerId/tariff-assignments/:assignmentId | chargers:tariff-assignments + tariffs:assign | Sisu: TariffAssignmentUpdateInput; pistik on kohustuslik ega tohi olla 0 | 200 { assignment: TariffAssignment } |
DELETE /v2/admin/chargers/:chargerId/tariff-assignments/:assignmentId | chargers:tariff-assignments + tariffs:assign | Sisu: puudub | 204 empty |
TariffAssignment sisaldab id, chargerId, connectorId, ohutut tariifi/valuuta kokkuvõtet, createdAt ja updatedAt.
Laadimisprofiilide endpointid
| Meetod ja tee | Pääsuulatus | Päring | Edukas vastus |
|---|---|---|---|
GET /v2/admin/charging-profiles | chargingProfiles:read | Sisu/päring: puudub | 200 { items: ChargingProfile[], lookups { locations, purposes, kinds, recurrencyKinds, rateUnits, allowedRateUnits } } |
POST /v2/admin/charging-profiles | chargingProfiles:create | Sisu: ChargingProfileCreate | 201 { profile: ChargingProfile } |
GET /v2/admin/charging-profiles/:profileId | chargingProfiles:read | Sisu/päring: puudub | 200 { profile: ChargingProfile, lookups, isEditBlocked: boolean, usage { simpleChargingSchedule, smartSchedule, chargePoolChargepoint, isUsed } } |
PATCH /v2/admin/charging-profiles/:profileId | chargingProfiles:update | Sisu: täielik ChargingProfileInput | 200 { profile: ChargingProfile, ocppSync: OcppCommandResult[] } |
PUT /v2/admin/charging-profiles/:profileId/schedule | chargingProfiles:update | Sisu: ChargingScheduleInput | 200 { profile: ChargingProfile, schedule: SchedulePeriod[], ocppSync: OcppCommandResult[] } |
DELETE /v2/admin/charging-profiles/:profileId | chargingProfiles:delete | Sisu: puudub | 204 empty alles pärast kõigi määratud laadijate tühjendamise kinnitust ja oleku kordusvalideerimist; muidu 409 ja profiil säilib |
GET /v2/admin/chargers/:chargerId/profile-assignments | chargers:profile-assignments + chargingProfiles:read | Sisu/päring: puudub | 200 { items: ProfileAssignment[], profiles: ChargingProfile[] } |
POST /v2/admin/chargers/:chargerId/profile-assignments | chargers:profile-assignments + chargingProfiles:assign | Sisu: ProfileAssignmentInput | 201 { assignment: ProfileAssignment, ocpp: OcppCommandResult } |
PATCH /v2/admin/chargers/:chargerId/profile-assignments/:assignmentId | chargers:profile-assignments + chargingProfiles:assign | Sisu: ProfileAssignmentInput | 200 { assignment: ProfileAssignment, ocpp: OcppCommandResult } |
DELETE /v2/admin/chargers/:chargerId/profile-assignments/:assignmentId | chargers:profile-assignments + chargingProfiles:assign | Sisu: puudub | 204 empty pärast sünkroonitud tühjendamist |
ProfileAssignment sisaldab määrangu ID-d, laadija/pistiku ID-sid ja ohutut profiilikokkuvõtet. OCPP tulemuseobjektid avaldavad stabiilset päringu-/olekuteavet, mitte kunagi autentimisandmeid.
Kasutaja, RFID, juurdepääsu, piirangu ja kohaliku kasutaja endpointid
| Meetod ja tee | Pääsuulatus | Päring | Edukas vastus |
|---|---|---|---|
GET /v2/admin/users | users:read | Päring: olekule vastav cursor? (members: positiivne arv; invitations: autenditud läbipaistmatu i2.*; all: vana liikmevoo arvuline jätk või autenditud läbipaistmatu a2.* liitkursor), limit?=50 (1..100), status?="all", "members", or "invitations"; valikuline X-Admin-User-Search päis (max 100) | 200 { items: User[], invitations: Invitation[], chargers: ChargerSummary[], page { nextCursor, memberNextCursor, invitationNextCursor, limit } }; kutsed jaotatakse lehtedeks ja täiendatakse sama normaliseeritud e-posti avaldisega, nii et vana tähesuurus/tühikud ei peida ridu; kursorid on seotud tööruumi ja otsingufiltriga, ei sisalda loetavat e-posti aadressi ning tuleb tagastada muutmata; all kursorid liigutavad liikme- ja kutsevooge sõltumatult |
POST /v2/admin/users | users:create | Sisu: UserCreate; klient peab olema juba registreeritud | 201 { user: User }; tundmatu e-post tagastab olemasolu mitteavalduva 404 RESOURCE_NOT_FOUND sisu ja peaks kasutama kutseid |
POST /v2/admin/users/invitations | users:invitations + users:access; lisaks users:rfid, kui rfid on antud | Sisu: InvitationInput | 200 or 201 { result }; seotud tulemus on { kind:"attached", user, accessChanged, rfidChanged }; ootel tulemus on { kind:"invited", email, name, maskedRfid, chargerIds, createdCount, emailSent, emailRetryReady, alreadyInvited } |
POST /v2/admin/users/invitations/resend | users:invitations | Sisu: { email: email } | 200 { result: { targetedChargers, emailSent, emailRetryReady } }; rakendatakse saajaülest globaalset ooteaega |
DELETE /v2/admin/users/invitations | users:invitations | Sisu: { email: email } | 204 empty |
GET /v2/admin/users/:userId | users:read + reports:read | Sisu/päring: puudub | 200 { user: UserDetail, sessions: UserSession[], totals { count, energyWh, durationSeconds }, window, limitTypes, chargers }; kuni 200 seanssi 90 päeva jooksul |
PATCH /v2/admin/users/:userId | users:update | Sisu: { name: string(1..255) } | 200 { user: User } |
DELETE /v2/admin/users/:userId | users:delete | Sisu: puudub | 204 empty |
GET /v2/admin/users/:userId/vehicles | users:read | Päring: arvuline cursor?, limit?=50 (1..100) | 200 { items: Vehicle[], page { nextCursor, limit } }; sõiduki DTO sisaldab ohutuid teenusepakkuja/oleku/mudeli/telemeetria välju |
GET /v2/admin/users/:userId/rfids | users:read | Sisu/päring: puudub | 200 { items: RFID[] }; UID-d on maskeeritud |
POST /v2/admin/users/:userId/rfids | users:rfid | Sisu: { uid: string(1..36), name?: string or null } | 201 { rfid: RFID }; toorest UID-d ei kajastata tagasi |
PATCH /v2/admin/users/:userId/rfids/:rfidId | users:rfid | Sisu: { name: string or null } | 200 { rfid: RFID } |
DELETE /v2/admin/users/:userId/rfids/:rfidId | users:rfid | Sisu: puudub | 204 empty |
GET /v2/admin/users/:userId/access | users:read | Sisu/päring: puudub | 200 { access: Access } |
PUT /v2/admin/users/:userId/access | users:access | Sisu: AccessInput | 200 { access: Access } |
DELETE /v2/admin/users/:userId/access/:accessId | users:access | Sisu: puudub | 204 empty |
GET /v2/admin/users/:userId/limits | users:read | Sisu/päring: puudub | 200 { items: Limit[] } |
POST /v2/admin/users/:userId/limits | users:limits | Sisu: LimitCreate | 201 { limit: Limit } |
PATCH /v2/admin/users/:userId/limits/:limitId | users:limits | Sisu: LimitPatch, vähemalt üks omadus | 200 { limit: Limit } |
DELETE /v2/admin/users/:userId/limits/:limitId | users:limits | Sisu: puudub | 204 empty |
GET /v2/admin/chargers/:chargerId/local-users | chargers:read + users:read | Sisu/päring: puudub | 200 { charger: ChargerSummary, items: LocalUser[], invitations: { email }[], availableMembers: [] }; API jätab teadlikult välja portaali laia saadaolevate liikmete kataloogi |
POST /v2/admin/chargers/:chargerId/local-users | chargers:local-users + users:access | Sisu: { 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 | Sisu: { email: email } | 200 or 201 { result }; olemasolev klient: { invited:false, localUser: LocalUserMutation }; kutse: { invited:true, alreadyInvited, emailSent, emailRetryReady } |
DELETE /v2/admin/chargers/:chargerId/local-users/invitations | chargers:local-users + users:invitations | Sisu: { email: email } | 204 empty |
PATCH /v2/admin/chargers/:chargerId/local-users/:localUserId | chargers:local-users + users:access | Sisu: { expiresAt: RFC3339 or null } | 200 { localUser: LocalUserUpdate } |
DELETE /v2/admin/chargers/:chargerId/local-users/:localUserId | chargers:local-users + users:access | Sisu: puudub | 204 empty |
Taglessi süsteemikasutaja on nende toimingute eest kaitstud. Kutse-e-kirja tõrked tagastavad ohutu kohaletoimetamisoleku SMTP üksikasju avaldamata; klient võib korrata, kui emailRetryReady on true.
Kahendvastused
Kaks endpointide rühma ei tagasta õnnestumisel JSON-i:
| Endpoint | Sisutüüp | Olulised päised |
|---|---|---|
| Laadija QR | image/png | Cache-Control: no-store, Content-Disposition: inline, X-Content-Type-Options: nosniff |
| Aruande eksport | text/csv; charset=utf-8 või application/pdf | Cache-Control: private, no-store, Content-Disposition: attachment, X-Content-Type-Options: nosniff |
Kahendendpointide vead on endiselt JSON.