Endpointid

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:

  • none tähendab päringusisu puudumist. DELETE, mis dokumenteerib JSON-sisu, nõuab seda endiselt.
  • ? tähistab valikulist omadust või päringuparameetrit.
  • T | null tähendab, et omadus on olemas ja lubab nulli.
  • 204 empty tähendab vastusesisu puudumist.
  • CursorPage<T> tähendab { items: T[], nextCursor: number|string|null }, välja arvatud juhul, kui rida nimetab selgelt page või pagination objekti.
  • 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:

DTOVäljad
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; detail lisab normaliseeritud chargers ja pistiku oleku
GeocodeCandidateplaceId, displayName, latitude, longitude; teenusepakkuja autentimisandmeid ega erimetaandmeid ei tagastata kunagi
MetricsWindowfrom, to, seansipiirangud/loendused ning vajadusel totalsCapped
Chargerid, name, identifier, cpoId, site, normaliseeritud status, isPublic, RFID/Smarti/automaatika lipud, provisioned, connection, evses, connectors, createdAt, updatedAt; detail lisab varjatud configuration, firmware ja loendused
ConnectorportId, connectorId, pistiku teatme-ID-d, maxVoltage, maxAmperage, maxElectricPower
ReportSessionid, laadija/asukoht, pordi ja pistiku ID-d, minimeeritud kasutaja, active, energyWh, algus/lõpp/kestus ja valuutapõhised neto-/maksu-/kogukulud
ReportScheduleid, workspaceId, enabled, recipientEmail, format, UTC sendDay/sendTime, loomise/uuendamise ja viimase saatmise ohutud metaandmed koos katsete arvuga
Tariffid, cpoId, name, tüübi/asukoha/valuuta/hinnapiirkonna objektid, tax, fallbackPrice, tegelik price, components, assignmentCount
ChargingProfileid, cpoId, label, description, stackLevel, asukoha/eesmärgi/liigi/korduvuse/kiirusühiku objektid, kehtivus, ajakava, assignmentCount, ajatemplid
Userid, membershipId, name, email, maskeeritud rfids, laadija access, limitCount; detail lisab phone, createdAt ja limits. OCPP autoriseerimisandmeid, näiteks contractId, ei tagastata kunagi.
RFIDid, maskedUid, name, type, valid; toorest UID-d ei tagastata kunagi
AccessallChargers, sorditud chargerIds ja items, mis sisaldab pääsuõiguse/laadija/asukoha/aegumise metaandmeid
Limitid, limitTypeId, label, energyValue, timeValue
LocalUserLoendi 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 teePääsuulatusPäringEdukas vastus
GET /v2/adminworkspaces:readSisu: puudub200 { workspace: Workspace }
PATCH /v2/adminworkspaces:updateSisu: WorkspacePatch200 { workspace: Workspace }
GET /v2/admin/dashboardworkspaces:read + reports:readSisu/päring: puudub200 { window, stats { chargerCount, onlineChargerCount, siteCount, userCount }, sessions: DashboardSession[], analytics }; seansse on kuni 1000 90 päeva jooksul

Asukoha ja võimsushalduse endpointid

Meetod ja teePääsuulatusPäringEdukas vastus
GET /v2/admin/sitessites:readSisu/päring: puudub200 { items: Site[], metricsWindow: MetricsWindow, lookups { countries, timezones } }
GET /v2/admin/sites/geocodesites:readPä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ärki200 { 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/sitessites:createSisu: SiteInput201 { site: Site }
GET /v2/admin/sites/:siteIdsites:read + reports:readSisu/päring: puudub200 { site: SiteDetail, recentSessions: SiteSession[], totals, metricsWindow }
PATCH /v2/admin/sites/:siteIdsites:updateSisu: täielik SiteInput200 { site: Site }
DELETE /v2/admin/sites/:siteIdsites:deleteSisu: puudub204 empty; mittetühi asukoht tagastab 409 SITE_NOT_EMPTY
GET /v2/admin/sites/:siteId/power-managementsites:power-managementSisu/päring: puudub200 { configuration: PowerConfiguration }, mis sisaldab omatavat asukohta, laadijaid/pistikuid, rühmi, arvestiallikaid, määranguid ja ühilduvusolekut
PUT /v2/admin/sites/:siteId/power-managementsites:power-managementSisu: PowerConfigurationInput200 { configuration: PowerConfiguration }; OCPP keeldumine, ajalõpp või samaaegne muudatus tagastab 409 POWER_MANAGEMENT_CONFLICT asendust rakendamata

Laadija endpointid

Meetod ja teePääsuulatusPäringEdukas vastus
GET /v2/admin/chargerschargers:readSisu/päring: puudub200 { items: Charger[], metricsWindow: MetricsWindow, connectorLookups { formats, types, powerTypes } }
POST /v2/admin/chargerschargers:createSisu: ChargerCreate; identifikaator tehakse suurtäheliseks201 { charger: Charger }; parooli ei tagastata kunagi
GET /v2/admin/chargers/:chargerIdchargers:readSisu/päring: puudub200 { charger: ChargerDetail }
PATCH /v2/admin/chargers/:chargerIdchargers:updateSisu: ChargerPatch200 { charger: ChargerDetail }
DELETE /v2/admin/chargers/:chargerIdchargers:deleteSisu: puudub204 empty
PATCH /v2/admin/chargers/:chargerId/credentialschargers:credentialsSisu: { password: string(0..40) }200 { success: true }
PATCH /v2/admin/chargers/:chargerId/connectors/:portIdchargers:connector-settingsSisu: ConnectorPatch200 { connector: Connector }
PATCH /v2/admin/chargers/:chargerId/public-listingchargers:publicSisu: { isPublic: boolean }200 { isPublic: boolean }; täitmata valmidus tagastab 409 CHARGER_CONFLICT
GET /v2/admin/chargers/:chargerId/public-readinesschargers:readSisu/päring: puudub200 { readiness: { ready, missingRequirements, connectorIds, missingTariffConnectorIds, ...commercialState } }
GET /v2/admin/chargers/:chargerId/logschargers:readPäring: 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:readPä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/qrchargers:readPäring: connector?: integer[0,255]200 image/png kahendsisu, 300 px, Content-Disposition: inline, Cache-Control: no-store
GET /v2/admin/chargers/:chargerId/composite-scheduleschargers:readPäring: cursor?, limit?=20 (1..50), connectorId?200 { items: CompositeSchedule[], nextCursor: number or null }
GET /v2/admin/chargers/:chargerId/configurationchargers:readSisu/päring: puudub200 { items: ChargerConfiguration[] }; saladuselaadsed väärtused on [REDACTED]
PATCH /v2/admin/chargers/:chargerId/configurationchargers:configurationSisu: { key: string(1..50), value: string(0..500) }200 { status: string }, kus olek on laadija/OCPP tulemus
POST /v2/admin/chargers/:chargerId/configuration/reloadchargers:configurationSisu: puudub200 { status: string }
GET /v2/admin/chargers/:chargerId/firmwarechargers:readSisu/päring: puudub200 { firmware: { status, notifiedAt, currentVersion, bootNotifiedAt } }
POST /v2/admin/chargers/:chargerId/firmwarechargers:firmwareSisu: { url: HTTP-or-HTTPS URL, max 2048 characters }202 { status: string }
POST /v2/admin/chargers/:chargerId/commands/resetchargers:commandsSisu: { resetType: "Soft" or "Hard" }200 { status: string }
POST /v2/admin/chargers/:chargerId/commands/availabilitychargers:commandsSisu: { availabilityType: "Operative" or "Inoperative" }200 { status: string }
POST /v2/admin/chargers/:chargerId/commands/triggerchargers:commandsSisu: { messageType: "BootNotification", "Heartbeat", "StatusNotification", or "MeterValues" }200 { status: string, connectorResults: { connectorId, status }[] }
POST /v2/admin/chargers/:chargerId/commands/unlockchargers:commandsSisu: { connectorId: positive integer }200 { status: string }
POST /v2/admin/chargers/:chargerId/commands/composite-schedulechargers:commandsSisu: { connectorId: nonnegative integer, durationSeconds?: integer[60,604800], chargingRateUnit?: "W" or "A" }200 { status: string, connectorId: number, compositeSchedule: CompositeSchedule or null }

Aruannete endpointid

Meetod ja teePääsuulatusPäringEdukas vastus
GET /v2/admin/reports/datareports:readPä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/schedulereports:readSisu/päring: puudub200 { schedule: ReportSchedule or null }
PUT /v2/admin/reports/schedulereports:schedulesSisu: range ReportScheduleInput200 { schedule: ReportSchedule }
POST /v2/admin/reports/sendreports:sendSisu: puudub; Idempotency-Key päis on kohustuslik200 { sent: true, format: "csv" or "pdf", rowCount: number, range { from, to } }; salvestatud ajakava puudumine tagastab 409 REPORT_SCHEDULE_REQUIRED
GET /v2/admin/reports/measurementsreports:readPä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/exportreports:exportPä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 teePääsuulatusPäringEdukas vastus
GET /v2/admin/tariffstariffs:readSisu/päring: puudub200 { items: Tariff[], lookups { currencies, biddingZones, currencyRates, componentTypes, seasons, tariffTypes } }
POST /v2/admin/tariffstariffs:createSisu: TariffInput201 { tariff: Tariff }
GET /v2/admin/tariffs/:tariffIdtariffs:readSisu/päring: puudub200 { tariff: Tariff, lookups }
PATCH /v2/admin/tariffs/:tariffIdtariffs:updateSisu: täielik TariffInput200 { tariff: Tariff }
PUT /v2/admin/tariffs/:tariffId/componentstariffs:componentsSisu: { components: TariffComponentInput[0..256] }200 { tariff: Tariff, components: TariffComponent[] }
DELETE /v2/admin/tariffs/:tariffIdtariffs:deleteSisu: puudub204 empty; laadimiskirjete viited tagastavad 409 TARIFF_CONFLICT
GET /v2/admin/tariffs/:tariffId/market-pricestariffs:readPäring: kohustuslik startsAt, mittenegatiivne Unixi ajatempel200 { items: { id, value, currencyId, startsAt, endsAt, startsAtIso, endsAtIso, intervalMinutes }[], truncated: boolean }; kuni 10 000 rida
GET /v2/admin/chargers/:chargerId/tariff-assignmentschargers:tariff-assignments + tariffs:readSisu/päring: puudub200 { items: TariffAssignment[], tariffs: Tariff[] }
POST /v2/admin/chargers/:chargerId/tariff-assignmentschargers:tariff-assignments + tariffs:assignSisu: TariffAssignmentCreateInput; puuduv connectorId või connectorId=0 tähendab kõiki pistikuid201 { assignments: TariffAssignment[] }
PATCH /v2/admin/chargers/:chargerId/tariff-assignments/:assignmentIdchargers:tariff-assignments + tariffs:assignSisu: TariffAssignmentUpdateInput; pistik on kohustuslik ega tohi olla 0200 { assignment: TariffAssignment }
DELETE /v2/admin/chargers/:chargerId/tariff-assignments/:assignmentIdchargers:tariff-assignments + tariffs:assignSisu: puudub204 empty

TariffAssignment sisaldab id, chargerId, connectorId, ohutut tariifi/valuuta kokkuvõtet, createdAt ja updatedAt.

Laadimisprofiilide endpointid

Meetod ja teePääsuulatusPäringEdukas vastus
GET /v2/admin/charging-profileschargingProfiles:readSisu/päring: puudub200 { items: ChargingProfile[], lookups { locations, purposes, kinds, recurrencyKinds, rateUnits, allowedRateUnits } }
POST /v2/admin/charging-profileschargingProfiles:createSisu: ChargingProfileCreate201 { profile: ChargingProfile }
GET /v2/admin/charging-profiles/:profileIdchargingProfiles:readSisu/päring: puudub200 { profile: ChargingProfile, lookups, isEditBlocked: boolean, usage { simpleChargingSchedule, smartSchedule, chargePoolChargepoint, isUsed } }
PATCH /v2/admin/charging-profiles/:profileIdchargingProfiles:updateSisu: täielik ChargingProfileInput200 { profile: ChargingProfile, ocppSync: OcppCommandResult[] }
PUT /v2/admin/charging-profiles/:profileId/schedulechargingProfiles:updateSisu: ChargingScheduleInput200 { profile: ChargingProfile, schedule: SchedulePeriod[], ocppSync: OcppCommandResult[] }
DELETE /v2/admin/charging-profiles/:profileIdchargingProfiles:deleteSisu: puudub204 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-assignmentschargers:profile-assignments + chargingProfiles:readSisu/päring: puudub200 { items: ProfileAssignment[], profiles: ChargingProfile[] }
POST /v2/admin/chargers/:chargerId/profile-assignmentschargers:profile-assignments + chargingProfiles:assignSisu: ProfileAssignmentInput201 { assignment: ProfileAssignment, ocpp: OcppCommandResult }
PATCH /v2/admin/chargers/:chargerId/profile-assignments/:assignmentIdchargers:profile-assignments + chargingProfiles:assignSisu: ProfileAssignmentInput200 { assignment: ProfileAssignment, ocpp: OcppCommandResult }
DELETE /v2/admin/chargers/:chargerId/profile-assignments/:assignmentIdchargers:profile-assignments + chargingProfiles:assignSisu: puudub204 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 teePääsuulatusPäringEdukas vastus
GET /v2/admin/usersusers:readPä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/usersusers:createSisu: UserCreate; klient peab olema juba registreeritud201 { user: User }; tundmatu e-post tagastab olemasolu mitteavalduva 404 RESOURCE_NOT_FOUND sisu ja peaks kasutama kutseid
POST /v2/admin/users/invitationsusers:invitations + users:access; lisaks users:rfid, kui rfid on antudSisu: InvitationInput200 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/resendusers:invitationsSisu: { email: email }200 { result: { targetedChargers, emailSent, emailRetryReady } }; rakendatakse saajaülest globaalset ooteaega
DELETE /v2/admin/users/invitationsusers:invitationsSisu: { email: email }204 empty
GET /v2/admin/users/:userIdusers:read + reports:readSisu/päring: puudub200 { user: UserDetail, sessions: UserSession[], totals { count, energyWh, durationSeconds }, window, limitTypes, chargers }; kuni 200 seanssi 90 päeva jooksul
PATCH /v2/admin/users/:userIdusers:updateSisu: { name: string(1..255) }200 { user: User }
DELETE /v2/admin/users/:userIdusers:deleteSisu: puudub204 empty
GET /v2/admin/users/:userId/vehiclesusers:readPä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/rfidsusers:readSisu/päring: puudub200 { items: RFID[] }; UID-d on maskeeritud
POST /v2/admin/users/:userId/rfidsusers:rfidSisu: { uid: string(1..36), name?: string or null }201 { rfid: RFID }; toorest UID-d ei kajastata tagasi
PATCH /v2/admin/users/:userId/rfids/:rfidIdusers:rfidSisu: { name: string or null }200 { rfid: RFID }
DELETE /v2/admin/users/:userId/rfids/:rfidIdusers:rfidSisu: puudub204 empty
GET /v2/admin/users/:userId/accessusers:readSisu/päring: puudub200 { access: Access }
PUT /v2/admin/users/:userId/accessusers:accessSisu: AccessInput200 { access: Access }
DELETE /v2/admin/users/:userId/access/:accessIdusers:accessSisu: puudub204 empty
GET /v2/admin/users/:userId/limitsusers:readSisu/päring: puudub200 { items: Limit[] }
POST /v2/admin/users/:userId/limitsusers:limitsSisu: LimitCreate201 { limit: Limit }
PATCH /v2/admin/users/:userId/limits/:limitIdusers:limitsSisu: LimitPatch, vähemalt üks omadus200 { limit: Limit }
DELETE /v2/admin/users/:userId/limits/:limitIdusers:limitsSisu: puudub204 empty
GET /v2/admin/chargers/:chargerId/local-userschargers:read + users:readSisu/päring: puudub200 { charger: ChargerSummary, items: LocalUser[], invitations: { email }[], availableMembers: [] }; API jätab teadlikult välja portaali laia saadaolevate liikmete kataloogi
POST /v2/admin/chargers/:chargerId/local-userschargers:local-users + users:accessSisu: { customerId: positive integer, expiresAt?: RFC3339 or null }201 { localUser: LocalUserMutation }
POST /v2/admin/chargers/:chargerId/local-users/invitationschargers:local-users + users:invitations + users:accessSisu: { 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/invitationschargers:local-users + users:invitationsSisu: { email: email }204 empty
PATCH /v2/admin/chargers/:chargerId/local-users/:localUserIdchargers:local-users + users:accessSisu: { expiresAt: RFC3339 or null }200 { localUser: LocalUserUpdate }
DELETE /v2/admin/chargers/:chargerId/local-users/:localUserIdchargers:local-users + users:accessSisu: puudub204 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:

EndpointSisutüüpOlulised päised
Laadija QRimage/pngCache-Control: no-store, Content-Disposition: inline, X-Content-Type-Options: nosniff
Aruande eksporttext/csv; charset=utf-8 või application/pdfCache-Control: private, no-store, Content-Disposition: attachment, X-Content-Type-Options: nosniff

Kahendendpointide vead on endiselt JSON.