Končne točke

Zahteve in odgovori končnih točk Admin API delovnega prostora

To je referenca zahtev/odgovorov za vsako končno točko /v2/admin. Overjanje, idempotentnost, omejitve zahtev, ustvarjanje žetonov in pomen obsegov so dokumentirani v Admin API delovnega prostora. Ponovno uporabni tipi polj in primeri so v Shemah in primerih. Vsako vrstico končne točke berite skupaj s Pogodbo odgovorov in napak, ki navaja vsa možna skupna in posebna neuspešna telesa odgovorov.

Skupna pogodba

Vsaka pot se začne z nameščenim izvorom app-api. Delovni prostor se določi izključno iz overjenega žetona; odjemalci ne smejo pošiljati cpoId. Vse dokumentirane vrednosti :...Id poti virov so pozitivna desetiška cela števila. Vsaka zahteva zahteva natanko eno:

Authorization: Bearer <workspace-access-token>

Zahteve, prikazane s telesom JSON, zahtevajo Content-Type: application/json. Vse spremembe zahtevajo Idempotency-Key (POST, PUT, PATCH in DELETE), vključno z POST /v2/admin/reports/send; razen če vrstica navaja drugače, je uspešna vrsta vsebine application/json, datumi JSON so nizi RFC 3339 in števila so števila JSON.

Vsaka zahteva lahko vsebuje X-Request-Id in X-Error-Format: envelope; glejte Pogodba odgovorov in napak. Ti glavi ne spreminjata shem uspešnih odgovorov.

Spodaj uporabljene oznake:

  • none pomeni brez telesa zahteve. DELETE, ki dokumentira telo JSON, to telo še vedno zahteva.
  • ? označuje neobvezno lastnost ali parameter poizvedbe.
  • T | null pomeni, da je lastnost prisotna in dovoljuje null.
  • 204 empty pomeni brez telesa odgovora.
  • CursorPage<T> pomeni { items: T[], nextCursor: number|string|null }, razen kjer vrstica izrecno imenuje objekt page ali pagination.
  • Vsi manjkajoči gnezdeni viri, tudi ID-ji drugih delovnih prostorov, uporabljajo 404 { "error": "Workspace resource not found", "code": "RESOURCE_NOT_FOUND" }, razen če funkcija dokumentira natančnejši spor.

Skupne sheme zahtev

Vhodi delovnega prostora in lokacije

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
}

Vhod upravljanja moči

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
}

Vhodi polnilnic

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]
}

Vhodi poročil

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"
}

Obdobja poročil morajo ustrezati from < to in ne smejo presegati 90 dni. Če so izpuščena, se uporabi zadnjih 90 dni. userId in anonymous=true se izključujeta. Načrtovani izvozi nadoknadijo zamujeno minuto UTC in uporabljajo omejene ponovitve (odmik 5/10 minut, 30-minutni najem zastale rezervacije, trije poskusi).

Vhodi tarif

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 }

Vhodi profilov polnjenja

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 }

Vhodi uporabnikov

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 }

Pri ustvarjanju omejitve mora biti vsaj eno od energyValue ali timeValue večje od nič. E-poštni naslovi se obrežejo in pretvorijo v male črke. UID-ji RFID so sprejeti samo pri zapisovanju in zakriti v bralnih odgovorih.

Povzetek DTO odgovorov

Tabele končnih točk prikazujejo vse ovojnice odgovorov najvišje ravni. To so glavni ponovno uporabni DTO-ji v teh ovojnicah:

DTOPolja
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; podrobnosti dodajo normalizirani chargers in stanje priključka
GeocodeCandidateplaceId, displayName, latitude, longitude; poverilnice in posebni metapodatki ponudnika se nikoli ne vrnejo
MetricsWindowfrom, to, omejitve/števila sej in totalsCapped, kadar velja
Chargerid, name, identifier, cpoId, site, normalizirani status, isPublic, zastavice RFID/Smart/avtomatizacije, provisioned, connection, evses, connectors, createdAt, updatedAt; podrobnosti dodajo zakriti configuration, firmware in števila
ConnectorportId, connectorId, ID-ji šifrantov priključka, maxVoltage, maxAmperage, maxElectricPower
ReportSessionid, polnilnica/lokacija, ID-ji vrat in priključka, minimizirani uporabnik, active, energyWh, začetek/konec/trajanje in neto/davčni/skupni stroški po valuti
ReportScheduleid, workspaceId, enabled, recipientEmail, format, UTC sendDay/sendTime, ustvarjanje/posodobitev in varni metapodatki zadnje dostave s številom poskusov
Tariffid, cpoId, name, objekti vrste/lokacije/valute/trgovalnega območja, tax, fallbackPrice, dejanski price, components, assignmentCount
ChargingProfileid, cpoId, label, description, stackLevel, objekti lokacije/namena/vrste/ponavljanja/enote hitrosti, veljavnost, urnik, assignmentCount, časovni žigi
Userid, membershipId, name, email, zakriti rfids, access polnilnice, limitCount; podrobnosti dodajo phone, createdAt in limits. Poverilnice pooblastil OCPP, kot je contractId, se nikoli ne vrnejo.
RFIDid, maskedUid, name, type, valid; surovi UID se nikoli ne vrne
AccessallChargers, razvrščeni chargerIds in items, ki vsebuje metapodatke pravice/polnilnice/lokacije/poteka
Limitid, limitTypeId, label, energyValue, timeValue
LocalUserDTO seznama: id, customerId, name, email, expiresAt, systemManaged. Spremembe lokalnih uporabnikov uporabljajo ločeni obliki LocalUserMutation/LocalUserUpdate v Shemah in primerih.

Poti seznamov/podrobnosti vračajo objekte šifrantov, da lahko klicatelji odkrijejo veljavne ID-je. Neznana dodana polja obravnavajte kot združljiva s prihodnjimi različicami in razvejite samo po dokumentiranih stabilnih poljih in kodah napak.

Končne točke delovnega prostora

Metoda in potObsegZahtevaUspešen odgovor
GET /v2/adminworkspaces:readTelo: brez200 { workspace: Workspace }
PATCH /v2/adminworkspaces:updateTelo: WorkspacePatch200 { workspace: Workspace }
GET /v2/admin/dashboardworkspaces:read + reports:readTelo/poizvedba: brez200 { window, stats { chargerCount, onlineChargerCount, siteCount, userCount }, sessions: DashboardSession[], analytics }; seje so omejene na 1.000 v 90 dneh

Končne točke lokacij in upravljanja moči

Metoda in potObsegZahtevaUspešen odgovor
GET /v2/admin/sitessites:readTelo/poizvedba: brez200 { items: Site[], metricsWindow: MetricsWindow, lookups { countries, timezones } }
GET /v2/admin/sites/geocodesites:readPoizvedba: neobvezni street (največ 160), city, state, country (vsak največ 100), countryCode (največ 2); neobvezna glava Accept-Language; ulica/mesto/zvezna država morajo skupaj vsebovati vsaj dva znaka200 { results: GeocodeCandidate[] }; enaka sočasna iskanja se združijo in delo ponudnika uporablja omejeno zaporedno vrsto ter omejen strežniški predpomnilnik; neveljavna iskanja vrnejo 400 INVALID_GEOCODE_QUERY, zapolnjena vrsta vrne 429 GEOCODING_BUSY z Retry-After, napake ponudnika pa 502 GEOCODING_UNAVAILABLE
POST /v2/admin/sitessites:createTelo: SiteInput201 { site: Site }
GET /v2/admin/sites/:siteIdsites:read + reports:readTelo/poizvedba: brez200 { site: SiteDetail, recentSessions: SiteSession[], totals, metricsWindow }
PATCH /v2/admin/sites/:siteIdsites:updateTelo: celotni SiteInput200 { site: Site }
DELETE /v2/admin/sites/:siteIdsites:deleteTelo: brez204 empty; neprazna lokacija vrne 409 SITE_NOT_EMPTY
GET /v2/admin/sites/:siteId/power-managementsites:power-managementTelo/poizvedba: brez200 { configuration: PowerConfiguration }, ki vsebuje lokacijo v lasti, polnilnice/priključke, skupine, vire meritev, dodelitve in stanje združljivosti
PUT /v2/admin/sites/:siteId/power-managementsites:power-managementTelo: PowerConfigurationInput200 { configuration: PowerConfiguration }; zavrnitev OCPP, časovna omejitev ali sočasna sprememba vrne 409 POWER_MANAGEMENT_CONFLICT brez uveljavitve zamenjave

Končne točke polnilnic

Metoda in potObsegZahtevaUspešen odgovor
GET /v2/admin/chargerschargers:readTelo/poizvedba: brez200 { items: Charger[], metricsWindow: MetricsWindow, connectorLookups { formats, types, powerTypes } }
POST /v2/admin/chargerschargers:createTelo: ChargerCreate; identifikator se pretvori v velike črke201 { charger: Charger }; geslo se nikoli ne vrne
GET /v2/admin/chargers/:chargerIdchargers:readTelo/poizvedba: brez200 { charger: ChargerDetail }
PATCH /v2/admin/chargers/:chargerIdchargers:updateTelo: ChargerPatch200 { charger: ChargerDetail }
DELETE /v2/admin/chargers/:chargerIdchargers:deleteTelo: brez204 empty
PATCH /v2/admin/chargers/:chargerId/credentialschargers:credentialsTelo: { password: string(0..40) }200 { success: true }
PATCH /v2/admin/chargers/:chargerId/connectors/:portIdchargers:connector-settingsTelo: ConnectorPatch200 { connector: Connector }
PATCH /v2/admin/chargers/:chargerId/public-listingchargers:publicTelo: { isPublic: boolean }200 { isPublic: boolean }; neizpolnjena pripravljenost vrne 409 CHARGER_CONFLICT
GET /v2/admin/chargers/:chargerId/public-readinesschargers:readTelo/poizvedba: brez200 { readiness: { ready, missingRequirements, connectorIds, missingTariffConnectorIds, ...commercialState } }
GET /v2/admin/chargers/:chargerId/logschargers:readPoizvedba: 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:readPoizvedba: 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:readPoizvedba: connector?: integer[0,255]200 image/png binarni, 300 px, Content-Disposition: inline, Cache-Control: no-store
GET /v2/admin/chargers/:chargerId/composite-scheduleschargers:readPoizvedba: cursor?, limit?=20 (1..50), connectorId?200 { items: CompositeSchedule[], nextCursor: number or null }
GET /v2/admin/chargers/:chargerId/configurationchargers:readTelo/poizvedba: brez200 { items: ChargerConfiguration[] }; vrednosti, podobne skrivnostim, so [REDACTED]
PATCH /v2/admin/chargers/:chargerId/configurationchargers:configurationTelo: { key: string(1..50), value: string(0..500) }200 { status: string }, kjer je stanje rezultat polnilnice/OCPP
POST /v2/admin/chargers/:chargerId/configuration/reloadchargers:configurationTelo: brez200 { status: string }
GET /v2/admin/chargers/:chargerId/firmwarechargers:readTelo/poizvedba: brez200 { firmware: { status, notifiedAt, currentVersion, bootNotifiedAt } }
POST /v2/admin/chargers/:chargerId/firmwarechargers:firmwareTelo: { url: HTTP-or-HTTPS URL, max 2048 characters }202 { status: string }
POST /v2/admin/chargers/:chargerId/commands/resetchargers:commandsTelo: { resetType: "Soft" or "Hard" }200 { status: string }
POST /v2/admin/chargers/:chargerId/commands/availabilitychargers:commandsTelo: { availabilityType: "Operative" or "Inoperative" }200 { status: string }
POST /v2/admin/chargers/:chargerId/commands/triggerchargers:commandsTelo: { messageType: "BootNotification", "Heartbeat", "StatusNotification", or "MeterValues" }200 { status: string, connectorResults: { connectorId, status }[] }
POST /v2/admin/chargers/:chargerId/commands/unlockchargers:commandsTelo: { connectorId: positive integer }200 { status: string }
POST /v2/admin/chargers/:chargerId/commands/composite-schedulechargers:commandsTelo: { connectorId: nonnegative integer, durationSeconds?: integer[60,604800], chargingRateUnit?: "W" or "A" }200 { status: string, connectorId: number, compositeSchedule: CompositeSchedule or null }

Končne točke poročil

Metoda in potObsegZahtevaUspešen odgovor
GET /v2/admin/reports/datareports:readPoizvedba: ReportFilters, neprosojni cursor?, limit?=50 (1..100)200 { items: ReportSession[], pageTotals, page { limit, nextCursor }, range { from, to, toExclusive: true } }
GET /v2/admin/reports/schedulereports:readTelo/poizvedba: brez200 { schedule: ReportSchedule or null }
PUT /v2/admin/reports/schedulereports:schedulesTelo: strogi ReportScheduleInput200 { schedule: ReportSchedule }
POST /v2/admin/reports/sendreports:sendTelo: brez; glava Idempotency-Key je obvezna200 { sent: true, format: "csv" or "pdf", rowCount: number, range { from, to } }; brez shranjenega urnika vrne 409 REPORT_SCHEDULE_REQUIRED
GET /v2/admin/reports/measurementsreports:readPoizvedba: obvezni transactionLogId, neprosojni cursor?, limit?=500 (1..1000)200 { transactionLogId, measurements: { name, unit, lines[] }[], page { limit, nextCursor, sampleValuesTruncated, sampleLimitPerMeterValue: 64 } }
GET /v2/admin/reports/exportreports:exportPoizvedba: ReportFilters, format?="csv" or "pdf"200 binarni CSV/PDF z imenom priloge, Cache-Control: private, no-store, X-Content-Type-Options: nosniff; več kot 2.000 vrstic vrne 422 REPORT_EXPORT_ROW_LIMIT

Končne točke tarif

Metoda in potObsegZahtevaUspešen odgovor
GET /v2/admin/tariffstariffs:readTelo/poizvedba: brez200 { items: Tariff[], lookups { currencies, biddingZones, currencyRates, componentTypes, seasons, tariffTypes } }
POST /v2/admin/tariffstariffs:createTelo: TariffInput201 { tariff: Tariff }
GET /v2/admin/tariffs/:tariffIdtariffs:readTelo/poizvedba: brez200 { tariff: Tariff, lookups }
PATCH /v2/admin/tariffs/:tariffIdtariffs:updateTelo: celotni TariffInput200 { tariff: Tariff }
PUT /v2/admin/tariffs/:tariffId/componentstariffs:componentsTelo: { components: TariffComponentInput[0..256] }200 { tariff: Tariff, components: TariffComponent[] }
DELETE /v2/admin/tariffs/:tariffIdtariffs:deleteTelo: brez204 empty; sklici zapisov polnjenja vrnejo 409 TARIFF_CONFLICT
GET /v2/admin/tariffs/:tariffId/market-pricestariffs:readPoizvedba: obvezni startsAt, nenegativen časovni žig Unix200 { items: { id, value, currencyId, startsAt, endsAt, startsAtIso, endsAtIso, intervalMinutes }[], truncated: boolean }; največ 10.000 vrstic
GET /v2/admin/chargers/:chargerId/tariff-assignmentschargers:tariff-assignments + tariffs:readTelo/poizvedba: brez200 { items: TariffAssignment[], tariffs: Tariff[] }
POST /v2/admin/chargers/:chargerId/tariff-assignmentschargers:tariff-assignments + tariffs:assignTelo: TariffAssignmentCreateInput; izpuščeni connectorId ali connectorId=0 pomeni vse priključke201 { assignments: TariffAssignment[] }
PATCH /v2/admin/chargers/:chargerId/tariff-assignments/:assignmentIdchargers:tariff-assignments + tariffs:assignTelo: TariffAssignmentUpdateInput; priključek je obvezen in ne sme biti 0200 { assignment: TariffAssignment }
DELETE /v2/admin/chargers/:chargerId/tariff-assignments/:assignmentIdchargers:tariff-assignments + tariffs:assignTelo: brez204 empty

TariffAssignment vsebuje id, chargerId, connectorId, varen povzetek tarife/valute, createdAt in updatedAt.

Končne točke profilov polnjenja

Metoda in potObsegZahtevaUspešen odgovor
GET /v2/admin/charging-profileschargingProfiles:readTelo/poizvedba: brez200 { items: ChargingProfile[], lookups { locations, purposes, kinds, recurrencyKinds, rateUnits, allowedRateUnits } }
POST /v2/admin/charging-profileschargingProfiles:createTelo: ChargingProfileCreate201 { profile: ChargingProfile }
GET /v2/admin/charging-profiles/:profileIdchargingProfiles:readTelo/poizvedba: brez200 { profile: ChargingProfile, lookups, isEditBlocked: boolean, usage { simpleChargingSchedule, smartSchedule, chargePoolChargepoint, isUsed } }
PATCH /v2/admin/charging-profiles/:profileIdchargingProfiles:updateTelo: celotni ChargingProfileInput200 { profile: ChargingProfile, ocppSync: OcppCommandResult[] }
PUT /v2/admin/charging-profiles/:profileId/schedulechargingProfiles:updateTelo: ChargingScheduleInput200 { profile: ChargingProfile, schedule: SchedulePeriod[], ocppSync: OcppCommandResult[] }
DELETE /v2/admin/charging-profiles/:profileIdchargingProfiles:deleteTelo: brez204 empty šele ko vse dodeljene polnilnice sprejmejo čiščenje in je stanje ponovno preverjeno; sicer 409 in profil ostane
GET /v2/admin/chargers/:chargerId/profile-assignmentschargers:profile-assignments + chargingProfiles:readTelo/poizvedba: brez200 { items: ProfileAssignment[], profiles: ChargingProfile[] }
POST /v2/admin/chargers/:chargerId/profile-assignmentschargers:profile-assignments + chargingProfiles:assignTelo: ProfileAssignmentInput201 { assignment: ProfileAssignment, ocpp: OcppCommandResult }
PATCH /v2/admin/chargers/:chargerId/profile-assignments/:assignmentIdchargers:profile-assignments + chargingProfiles:assignTelo: ProfileAssignmentInput200 { assignment: ProfileAssignment, ocpp: OcppCommandResult }
DELETE /v2/admin/chargers/:chargerId/profile-assignments/:assignmentIdchargers:profile-assignments + chargingProfiles:assignTelo: brez204 empty po sinhroniziranem čiščenju

ProfileAssignment vsebuje ID dodelitve, ID-je polnilnice/priključka in varen povzetek profila. Objekti rezultatov OCPP razkrivajo stabilne podatke zahteve/stanja in nikoli poverilnic.

Končne točke uporabnikov, RFID, dostopa, omejitev in lokalnih uporabnikov

Metoda in potObsegZahtevaUspešen odgovor
GET /v2/admin/usersusers:readPoizvedba: stanju ustrezni cursor? (members: pozitivno število; invitations: overjeni neprosojni i2.*; all: številčno nadaljevanje starega toka članov ali overjeni neprosojni sestavljeni a2.*), limit?=50 (1..100), status?="all", "members", or "invitations"; neobvezna glava X-Admin-User-Search (največ 100)200 { items: User[], invitations: Invitation[], chargers: ChargerSummary[], page { nextCursor, memberNextCursor, invitationNextCursor, limit } }; povabila se straničijo in dopolnijo z istim normaliziranim e-poštnim izrazom, zato stare razlike v velikosti črk/presledkih ne morejo skriti vrstic; kazalci so vezani na delovni prostor in iskalni filter, ne vsebujejo berljivega e-poštnega naslova in jih je treba vrniti nespremenjene; kazalci all neodvisno premikajo tokova članov in povabil
POST /v2/admin/usersusers:createTelo: UserCreate; stranka mora biti že registrirana201 { user: User }; neznan e-poštni naslov vrne nerazkrivajoče telo 404 RESOURCE_NOT_FOUND in naj uporablja povabila
POST /v2/admin/users/invitationsusers:invitations + users:access; tudi users:rfid, če je podan rfidTelo: InvitationInput200 or 201 { result }; rezultat pripenjanja je { kind:"attached", user, accessChanged, rfidChanged }; čakajoči rezultat je { kind:"invited", email, name, maskedRfid, chargerIds, createdCount, emailSent, emailRetryReady, alreadyInvited }
POST /v2/admin/users/invitations/resendusers:invitationsTelo: { email: email }200 { result: { targetedChargers, emailSent, emailRetryReady } }; uveljavljen je globalni čakalni čas prejemnika
DELETE /v2/admin/users/invitationsusers:invitationsTelo: { email: email }204 empty
GET /v2/admin/users/:userIdusers:read + reports:readTelo/poizvedba: brez200 { user: UserDetail, sessions: UserSession[], totals { count, energyWh, durationSeconds }, window, limitTypes, chargers }; največ 200 sej v 90 dneh
PATCH /v2/admin/users/:userIdusers:updateTelo: { name: string(1..255) }200 { user: User }
DELETE /v2/admin/users/:userIdusers:deleteTelo: brez204 empty
GET /v2/admin/users/:userId/vehiclesusers:readPoizvedba: številčni cursor?, limit?=50 (1..100)200 { items: Vehicle[], page { nextCursor, limit } }; DTO vozila vključuje varna polja ponudnika/stanja/modela/telemetrije
GET /v2/admin/users/:userId/rfidsusers:readTelo/poizvedba: brez200 { items: RFID[] }; UID-ji so zakriti
POST /v2/admin/users/:userId/rfidsusers:rfidTelo: { uid: string(1..36), name?: string or null }201 { rfid: RFID }; surovi UID se ne vrne
PATCH /v2/admin/users/:userId/rfids/:rfidIdusers:rfidTelo: { name: string or null }200 { rfid: RFID }
DELETE /v2/admin/users/:userId/rfids/:rfidIdusers:rfidTelo: brez204 empty
GET /v2/admin/users/:userId/accessusers:readTelo/poizvedba: brez200 { access: Access }
PUT /v2/admin/users/:userId/accessusers:accessTelo: AccessInput200 { access: Access }
DELETE /v2/admin/users/:userId/access/:accessIdusers:accessTelo: brez204 empty
GET /v2/admin/users/:userId/limitsusers:readTelo/poizvedba: brez200 { items: Limit[] }
POST /v2/admin/users/:userId/limitsusers:limitsTelo: LimitCreate201 { limit: Limit }
PATCH /v2/admin/users/:userId/limits/:limitIdusers:limitsTelo: LimitPatch, vsaj ena lastnost200 { limit: Limit }
DELETE /v2/admin/users/:userId/limits/:limitIdusers:limitsTelo: brez204 empty
GET /v2/admin/chargers/:chargerId/local-userschargers:read + users:readTelo/poizvedba: brez200 { charger: ChargerSummary, items: LocalUser[], invitations: { email }[], availableMembers: [] }; API namenoma izpusti široki imenik razpoložljivih članov portala
POST /v2/admin/chargers/:chargerId/local-userschargers:local-users + users:accessTelo: { customerId: positive integer, expiresAt?: RFC3339 or null }201 { localUser: LocalUserMutation }
POST /v2/admin/chargers/:chargerId/local-users/invitationschargers:local-users + users:invitations + users:accessTelo: { email: email }200 or 201 { result }; obstoječa stranka: { invited:false, localUser: LocalUserMutation }; povabilo: { invited:true, alreadyInvited, emailSent, emailRetryReady }
DELETE /v2/admin/chargers/:chargerId/local-users/invitationschargers:local-users + users:invitationsTelo: { email: email }204 empty
PATCH /v2/admin/chargers/:chargerId/local-users/:localUserIdchargers:local-users + users:accessTelo: { expiresAt: RFC3339 or null }200 { localUser: LocalUserUpdate }
DELETE /v2/admin/chargers/:chargerId/local-users/:localUserIdchargers:local-users + users:accessTelo: brez204 empty

Sistemski uporabnik Tagless je zaščiten pred temi operacijami. Napake e-poštnih povabil vrnejo varno stanje dostave brez razkritja podrobnosti SMTP; klicatelji lahko ponovijo, ko je emailRetryReady true.

Binarni odgovori

Dve skupini končnih točk ob uspehu ne vrneta JSON:

Končna točkaVrsta vsebinePomembne glave
QR polnilniceimage/pngCache-Control: no-store, Content-Disposition: inline, X-Content-Type-Options: nosniff
Izvoz poročilatext/csv; charset=utf-8 ali application/pdfCache-Control: private, no-store, Content-Disposition: attachment, X-Content-Type-Options: nosniff

Napake binarnih končnih točk so še vedno JSON.