Krajnje točke

Zahtjevi i odgovori krajnjih točaka administratorskog API-ja radnog prostora

Ovo je referenca zahtjeva i odgovora za svaku krajnju točku /v2/admin. Autentifikacija, idempotentnost, ograničenja učestalosti, stvaranje tokena i značenje opsega pristupa dokumentirani su u odjeljku Administratorski API radnog prostora. Višekratno upotrebljivi tipovi pojedinih polja i primjeri nalaze se u odjeljku Sheme i primjeri. Svaki redak krajnje točke čitajte zajedno s odjeljkom Ugovor odgovora i pogrešaka, koji navodi sva moguća tijela zajedničkih neuspješnih odgovora i onih specifičnih za krajnju točku.

Zajednički ugovor

Svaka putanja započinje ishodištem postavljene usluge app-api. Radni prostor određuje se isključivo iz autentificiranog tokena; klijenti ne smiju slati cpoId. Sve dokumentirane vrijednosti :...Id u putanjama resursa pozitivni su decimalni cijeli brojevi. Svaki zahtjev zahtijeva točno jedno:

Authorization: Bearer <workspace-access-token>

Zahtjevi prikazani s JSON tijelom zahtijevaju Content-Type: application/json. Sve operacije koje mijenjaju podatke zahtijevaju Idempotency-Key (POST, PUT, PATCH i DELETE), uključujući POST /v2/admin/reports/send; ako u retku nije navedeno drukčije, vrsta sadržaja uspješnog odgovora je application/json, JSON datumi su tekstualni nizovi RFC 3339, a brojevi su JSON brojevi.

Svaki zahtjev može uključivati X-Request-Id i X-Error-Format: envelope; pogledajte Ugovor odgovora i pogrešaka. Ta zaglavlja ne mijenjaju sheme uspješnih odgovora.

Oznake koje se upotrebljavaju u nastavku:

  • none znači da nema tijela zahtjeva. DELETE za koji je dokumentirano JSON tijelo i dalje zahtijeva to tijelo.
  • ? označava neobavezno svojstvo ili parametar upita.
  • T | null znači da je svojstvo prisutno i može biti null.
  • 204 empty znači da nema tijela odgovora.
  • CursorPage<T> znači { items: T[], nextCursor: number|string|null }, osim kada redak izričito imenuje objekt page ili pagination.
  • Za sve slučajeve kada ugniježđeni resurs nije pronađen, uključujući ID-jeve iz drugog radnog prostora, upotrebljava se 404 { "error": "Workspace resource not found", "code": "RESOURCE_NOT_FOUND" }, osim ako za značajku nije dokumentiran konkretniji sukob.

Zajedničke sheme zahtjeva

Ulazni podaci radnog prostora i 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
}

Ulazni podaci upravljanja snagom

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
}

Ulazni podaci punjača

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

Ulazni podaci izvještaja

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

Rasponi izvještaja moraju zadovoljavati from < to i ne smiju prelaziti 90 dana. Ako se izostave, upotrebljava se najnovije razdoblje od 90 dana. userId i anonymous=true međusobno se isključuju. Zakazani izvozi nadoknađuju propuštenu UTC minutu i upotrebljavaju ograničene ponovne pokušaje (čekanje od 5/10 minuta, vremenska rezervacija zastarjelog preuzimanja zadatka od 30 minuta, tri pokušaja).

Ulazni podaci tarifa

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 }

Ulazni podaci profila punjenja

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 }

Ulazni podaci korisnika

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 stvaranju ograničenja barem jedno od polja energyValue ili timeValue mora biti veće od nule. Adresama e-pošte uklanjaju se rubni razmaci i pretvaraju se u mala slova. RFID UID-jevi prihvaćaju se samo pri upisu, a u odgovorima za čitanje prikazuju se maskirani.

Sažetak DTO-ova odgovora

Tablice krajnjih točaka prikazuju svaku omotnicu odgovora na najvišoj razini. Ovo su glavni višekratno upotrebljivi DTO-ovi unutar tih omotnica:

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; pojedinosti dodaju normalizirani chargers i stanje priključka
GeocodeCandidateplaceId, displayName, latitude, longitude; vjerodajnice pružatelja usluge i njegovi specifični metapodaci nikada se ne vraćaju
MetricsWindowfrom, to, ograničenja/broj sesija i totalsCapped kada je primjenjivo
Chargerid, name, identifier, cpoId, site, normalizirani status, isPublic, oznake za RFID/pametno punjenje/automatizaciju, provisioned, connection, evses, connectors, createdAt, updatedAt; pojedinosti dodaju configuration sa skrivenim osjetljivim podacima, firmware i brojeve
ConnectorportId, connectorId, ID-jevi referentnih podataka priključka, maxVoltage, maxAmperage, maxElectricPower
ReportSessionid, punjač/lokacija, ID-jevi porta i priključka, minimalni podaci o korisniku, active, energyWh, početak/završetak/trajanje te neto iznos/porez/ukupni troškovi po valuti
ReportScheduleid, workspaceId, enabled, recipientEmail, format, UTC sendDay/sendTime, metapodaci stvaranja/ažuriranja i sigurni metapodaci posljednje dostave, uključujući broj pokušaja
Tariffid, cpoId, name, objekti tipa/lokacije/valute/zone trgovanja, tax, fallbackPrice, efektivni price, components, assignmentCount
ChargingProfileid, cpoId, label, description, stackLevel, objekti lokacije/namjene/vrste/ponavljanja/jedinice ograničenja, valjanost, raspored, assignmentCount, vremenske oznake
Userid, membershipId, name, email, maskirani rfids, access punjača, limitCount; pojedinosti dodaju phone, createdAt i limits. OCPP autorizacijske vjerodajnice poput contractId nikada se ne vraćaju.
RFIDid, maskedUid, name, type, valid; sirovi UID nikada se ne vraća
AccessallChargers, sortirani chargerIds i items s metapodacima dopuštenja pristupa/punjača/lokacije/isteka
Limitid, limitTypeId, label, energyValue, timeValue
LocalUserDTO popisa: id, customerId, name, email, expiresAt, systemManaged. Operacije izmjene lokalnih korisnika upotrebljavaju zasebne oblike LocalUserMutation/LocalUserUpdate iz odjeljka Sheme i primjeri.

Referentni objekti vraćaju se rutama za popise i pojedinosti kako bi pozivatelji mogli pronaći valjane ID-jeve. Nepoznata dodana polja smatrajte proširenjima kompatibilnima s budućim verzijama, a odluke temeljite samo na dokumentiranim stabilnim poljima i kodovima pogrešaka.

Krajnje točke za radni prostor

Metoda i putanjaOpseg pristupaZahtjevUspješan odgovor
GET /v2/adminworkspaces:readTijelo: nema200 { workspace: Workspace }
PATCH /v2/adminworkspaces:updateTijelo: WorkspacePatch200 { workspace: Workspace }
GET /v2/admin/dashboardworkspaces:read + reports:readTijelo/upit: nema200 { window, stats { chargerCount, onlineChargerCount, siteCount, userCount }, sessions: DashboardSession[], analytics }; sesije su ograničene na 1.000 tijekom 90 dana

Krajnje točke za lokacije i upravljanje snagom

Metoda i putanjaOpseg pristupaZahtjevUspješan odgovor
GET /v2/admin/sitessites:readTijelo/upit: nema200 { items: Site[], metricsWindow: MetricsWindow, lookups { countries, timezones } }
GET /v2/admin/sites/geocodesites:readUpit: neobavezni street (najviše 160), city, state, country (svaki najviše 100), countryCode (najviše 2); neobavezno zaglavlje Accept-Language; potrebna su ukupno barem dva znaka ulice/grada/pokrajine200 { results: GeocodeCandidate[] }; ista pretraživanja koja su u tijeku objedinjuju se, a rad pružatelja usluge upotrebljava ograničeni serijalizirani red i ograničenu predmemoriju na poslužitelju; nevaljana pretraživanja vraćaju 400 INVALID_GEOCODE_QUERY, zasićenje reda vraća 429 GEOCODING_BUSY uz Retry-After, a kvarovi pružatelja usluge vraćaju 502 GEOCODING_UNAVAILABLE
POST /v2/admin/sitessites:createTijelo: SiteInput201 { site: Site }
GET /v2/admin/sites/:siteIdsites:read + reports:readTijelo/upit: nema200 { site: SiteDetail, recentSessions: SiteSession[], totals, metricsWindow }
PATCH /v2/admin/sites/:siteIdsites:updateTijelo: potpuni SiteInput200 { site: Site }
DELETE /v2/admin/sites/:siteIdsites:deleteTijelo: nema204 empty; lokacija koja nije prazna vraća 409 SITE_NOT_EMPTY
GET /v2/admin/sites/:siteId/power-managementsites:power-managementTijelo/upit: nema200 { configuration: PowerConfiguration } s pripadajućom lokacijom, punjačima/priključcima, skupinama, izvorima mjernih podataka, dodjelama i stanjem kompatibilnosti
PUT /v2/admin/sites/:siteId/power-managementsites:power-managementTijelo: PowerConfigurationInput200 { configuration: PowerConfiguration }; OCPP odbijanje, istek vremena ili istodobna promjena vraćaju 409 POWER_MANAGEMENT_CONFLICT bez primjene zamjene

Krajnje točke za punjače

Metoda i putanjaOpseg pristupaZahtjevUspješan odgovor
GET /v2/admin/chargerschargers:readTijelo/upit: nema200 { items: Charger[], metricsWindow: MetricsWindow, connectorLookups { formats, types, powerTypes } }
POST /v2/admin/chargerschargers:createTijelo: ChargerCreate; identifikator se pretvara u velika slova201 { charger: Charger }; lozinka se nikada ne vraća
GET /v2/admin/chargers/:chargerIdchargers:readTijelo/upit: nema200 { charger: ChargerDetail }
PATCH /v2/admin/chargers/:chargerIdchargers:updateTijelo: ChargerPatch200 { charger: ChargerDetail }
DELETE /v2/admin/chargers/:chargerIdchargers:deleteTijelo: nema204 empty
PATCH /v2/admin/chargers/:chargerId/credentialschargers:credentialsTijelo: { password: string(0..40) }200 { success: true }
PATCH /v2/admin/chargers/:chargerId/connectors/:portIdchargers:connector-settingsTijelo: ConnectorPatch200 { connector: Connector }
PATCH /v2/admin/chargers/:chargerId/public-listingchargers:publicTijelo: { isPublic: boolean }200 { isPublic: boolean }; neispunjeni uvjeti spremnosti vraćaju 409 CHARGER_CONFLICT
GET /v2/admin/chargers/:chargerId/public-readinesschargers:readTijelo/upit: nema200 { readiness: { ready, missingRequirements, connectorIds, missingTariffConnectorIds, ...commercialState } }
GET /v2/admin/chargers/:chargerId/logschargers:readUpit: 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:readUpit: 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:readUpit: connector?: integer[0,255]200 image/png binarno, 300 px, Content-Disposition: inline, Cache-Control: no-store
GET /v2/admin/chargers/:chargerId/composite-scheduleschargers:readUpit: cursor?, limit?=20 (1..50), connectorId?200 { items: CompositeSchedule[], nextCursor: number or null }
GET /v2/admin/chargers/:chargerId/configurationchargers:readTijelo/upit: nema200 { items: ChargerConfiguration[] }; vrijednosti nalik tajnama su [REDACTED]
PATCH /v2/admin/chargers/:chargerId/configurationchargers:configurationTijelo: { key: string(1..50), value: string(0..500) }200 { status: string }, gdje je status rezultat punjača/OCPP-a
POST /v2/admin/chargers/:chargerId/configuration/reloadchargers:configurationTijelo: nema200 { status: string }
GET /v2/admin/chargers/:chargerId/firmwarechargers:readTijelo/upit: nema200 { firmware: { status, notifiedAt, currentVersion, bootNotifiedAt } }
POST /v2/admin/chargers/:chargerId/firmwarechargers:firmwareTijelo: { url: HTTP-or-HTTPS URL, max 2048 characters }202 { status: string }
POST /v2/admin/chargers/:chargerId/commands/resetchargers:commandsTijelo: { resetType: "Soft" or "Hard" }200 { status: string }
POST /v2/admin/chargers/:chargerId/commands/availabilitychargers:commandsTijelo: { availabilityType: "Operative" or "Inoperative" }200 { status: string }
POST /v2/admin/chargers/:chargerId/commands/triggerchargers:commandsTijelo: { messageType: "BootNotification", "Heartbeat", "StatusNotification", or "MeterValues" }200 { status: string, connectorResults: { connectorId, status }[] }
POST /v2/admin/chargers/:chargerId/commands/unlockchargers:commandsTijelo: { connectorId: positive integer }200 { status: string }
POST /v2/admin/chargers/:chargerId/commands/composite-schedulechargers:commandsTijelo: { connectorId: nonnegative integer, durationSeconds?: integer[60,604800], chargingRateUnit?: "W" or "A" }200 { status: string, connectorId: number, compositeSchedule: CompositeSchedule or null }

Krajnje točke za izvještaje

Metoda i putanjaOpseg pristupaZahtjevUspješan odgovor
GET /v2/admin/reports/datareports:readUpit: ReportFilters, neprozirni cursor?, limit?=50 (1..100)200 { items: ReportSession[], pageTotals, page { limit, nextCursor }, range { from, to, toExclusive: true } }
GET /v2/admin/reports/schedulereports:readTijelo/upit: nema200 { schedule: ReportSchedule or null }
PUT /v2/admin/reports/schedulereports:schedulesTijelo: strogi ReportScheduleInput200 { schedule: ReportSchedule }
POST /v2/admin/reports/sendreports:sendTijelo: nema; zaglavlje Idempotency-Key je obavezno200 { sent: true, format: "csv" or "pdf", rowCount: number, range { from, to } }; ako nema spremljenog rasporeda, vraća 409 REPORT_SCHEDULE_REQUIRED
GET /v2/admin/reports/measurementsreports:readUpit: obavezni transactionLogId, neprozirni cursor?, limit?=500 (1..1000)200 { transactionLogId, measurements: { name, unit, lines[] }[], page { limit, nextCursor, sampleValuesTruncated, sampleLimitPerMeterValue: 64 } }
GET /v2/admin/reports/exportreports:exportUpit: ReportFilters, format?="csv" or "pdf"200 binarni CSV/PDF s nazivom datoteke privitka, Cache-Control: private, no-store, X-Content-Type-Options: nosniff; više od 2.000 redaka vraća 422 REPORT_EXPORT_ROW_LIMIT

Krajnje točke za tarife

Metoda i putanjaOpseg pristupaZahtjevUspješan odgovor
GET /v2/admin/tariffstariffs:readTijelo/upit: nema200 { items: Tariff[], lookups { currencies, biddingZones, currencyRates, componentTypes, seasons, tariffTypes } }
POST /v2/admin/tariffstariffs:createTijelo: TariffInput201 { tariff: Tariff }
GET /v2/admin/tariffs/:tariffIdtariffs:readTijelo/upit: nema200 { tariff: Tariff, lookups }
PATCH /v2/admin/tariffs/:tariffIdtariffs:updateTijelo: potpuni TariffInput200 { tariff: Tariff }
PUT /v2/admin/tariffs/:tariffId/componentstariffs:componentsTijelo: { components: TariffComponentInput[0..256] }200 { tariff: Tariff, components: TariffComponent[] }
DELETE /v2/admin/tariffs/:tariffIdtariffs:deleteTijelo: nema204 empty; poveznice iz zapisa punjenja vraćaju 409 TARIFF_CONFLICT
GET /v2/admin/tariffs/:tariffId/market-pricestariffs:readUpit: obavezan startsAt, nenegativna vremenska oznaka Unixa200 { items: { id, value, currencyId, startsAt, endsAt, startsAtIso, endsAtIso, intervalMinutes }[], truncated: boolean }; najviše 10.000 redaka
GET /v2/admin/chargers/:chargerId/tariff-assignmentschargers:tariff-assignments + tariffs:readTijelo/upit: nema200 { items: TariffAssignment[], tariffs: Tariff[] }
POST /v2/admin/chargers/:chargerId/tariff-assignmentschargers:tariff-assignments + tariffs:assignTijelo: TariffAssignmentCreateInput; izostavljeni connectorId ili connectorId=0 označava sve priključke201 { assignments: TariffAssignment[] }
PATCH /v2/admin/chargers/:chargerId/tariff-assignments/:assignmentIdchargers:tariff-assignments + tariffs:assignTijelo: TariffAssignmentUpdateInput; priključak je obavezan i ne može biti 0200 { assignment: TariffAssignment }
DELETE /v2/admin/chargers/:chargerId/tariff-assignments/:assignmentIdchargers:tariff-assignments + tariffs:assignTijelo: nema204 empty

TariffAssignment sadrži id, chargerId, connectorId, siguran sažetak tarife/valute, createdAt i updatedAt.

Krajnje točke za profile punjenja

Metoda i putanjaOpseg pristupaZahtjevUspješan odgovor
GET /v2/admin/charging-profileschargingProfiles:readTijelo/upit: nema200 { items: ChargingProfile[], lookups { locations, purposes, kinds, recurrencyKinds, rateUnits, allowedRateUnits } }
POST /v2/admin/charging-profileschargingProfiles:createTijelo: ChargingProfileCreate201 { profile: ChargingProfile }
GET /v2/admin/charging-profiles/:profileIdchargingProfiles:readTijelo/upit: nema200 { profile: ChargingProfile, lookups, isEditBlocked: boolean, usage { simpleChargingSchedule, smartSchedule, chargePoolChargepoint, isUsed } }
PATCH /v2/admin/charging-profiles/:profileIdchargingProfiles:updateTijelo: potpuni ChargingProfileInput200 { profile: ChargingProfile, ocppSync: OcppCommandResult[] }
PUT /v2/admin/charging-profiles/:profileId/schedulechargingProfiles:updateTijelo: ChargingScheduleInput200 { profile: ChargingProfile, schedule: SchedulePeriod[], ocppSync: OcppCommandResult[] }
DELETE /v2/admin/charging-profiles/:profileIdchargingProfiles:deleteTijelo: nema204 empty tek nakon što svi dodijeljeni punjači prihvate čišćenje i stanje se ponovno provjeri; u suprotnom 409, a profil ostaje
GET /v2/admin/chargers/:chargerId/profile-assignmentschargers:profile-assignments + chargingProfiles:readTijelo/upit: nema200 { items: ProfileAssignment[], profiles: ChargingProfile[] }
POST /v2/admin/chargers/:chargerId/profile-assignmentschargers:profile-assignments + chargingProfiles:assignTijelo: ProfileAssignmentInput201 { assignment: ProfileAssignment, ocpp: OcppCommandResult }
PATCH /v2/admin/chargers/:chargerId/profile-assignments/:assignmentIdchargers:profile-assignments + chargingProfiles:assignTijelo: ProfileAssignmentInput200 { assignment: ProfileAssignment, ocpp: OcppCommandResult }
DELETE /v2/admin/chargers/:chargerId/profile-assignments/:assignmentIdchargers:profile-assignments + chargingProfiles:assignTijelo: nema204 empty nakon sinkroniziranog čišćenja

ProfileAssignment sadrži ID dodjele, ID-jeve punjača/priključka i siguran sažetak profila. Objekti OCPP rezultata prikazuju stabilne podatke o zahtjevu/statusu, a nikada vjerodajnice.

Krajnje točke za korisnike, RFID, pristup, ograničenja i lokalne korisnike

Metoda i putanjaOpseg pristupaZahtjevUspješan odgovor
GET /v2/admin/usersusers:readUpit: cursor? usklađen sa statusom (members: pozitivan brojčani; invitations: autentificirani neprozirni i2.*; all: brojčani nastavak članova iz starije verzije ili autentificirani neprozirni objedinjeni a2.*), limit?=50 (1..100), status?="all", "members", or "invitations"; neobavezno zaglavlje X-Admin-User-Search (najviše 100)200 { items: User[], invitations: Invitation[], chargers: ChargerSummary[], page { nextCursor, memberNextCursor, invitationNextCursor, limit } }; pozivnice se dijele na stranice i dopunjavaju podacima pomoću istog izraza normalizirane adrese e-pošte kako velika/mala slova ili razmaci iz starijih zapisa ne bi sakrili retke; pokazivači su vezani uz radni prostor i filtar pretraživanja, ne sadrže čitljivu adresu e-pošte i moraju se vraćati nepromijenjeni; pokazivači all neovisno pomiču tokove članova i pozivnica
POST /v2/admin/usersusers:createTijelo: UserCreate; korisnik već mora biti registriran201 { user: User }; nepoznata adresa e-pošte vraća tijelo 404 RESOURCE_NOT_FOUND, koje ne otkriva postojanje resursa, i za nju treba upotrijebiti pozivnice
POST /v2/admin/users/invitationsusers:invitations + users:access; uz users:rfid ako je naveden rfidTijelo: InvitationInput200 or 201 { result }; rezultat povezivanja je { kind:"attached", user, accessChanged, rfidChanged }; rezultat na čekanju je { kind:"invited", email, name, maskedRfid, chargerIds, createdCount, emailSent, emailRetryReady, alreadyInvited }
POST /v2/admin/users/invitations/resendusers:invitationsTijelo: { email: email }200 { result: { targetedChargers, emailSent, emailRetryReady } }; primjenjuje se globalni obavezan razmak između slanja istom primatelju
DELETE /v2/admin/users/invitationsusers:invitationsTijelo: { email: email }204 empty
GET /v2/admin/users/:userIdusers:read + reports:readTijelo/upit: nema200 { user: UserDetail, sessions: UserSession[], totals { count, energyWh, durationSeconds }, window, limitTypes, chargers }; najviše 200 sesija tijekom 90 dana
PATCH /v2/admin/users/:userIdusers:updateTijelo: { name: string(1..255) }200 { user: User }
DELETE /v2/admin/users/:userIdusers:deleteTijelo: nema204 empty
GET /v2/admin/users/:userId/vehiclesusers:readUpit: brojčani cursor?, limit?=50 (1..100)200 { items: Vehicle[], page { nextCursor, limit } }; DTO vozila uključuje sigurna polja pružatelja usluge/statusa/modela/telemetrije
GET /v2/admin/users/:userId/rfidsusers:readTijelo/upit: nema200 { items: RFID[] }; UID-jevi su maskirani
POST /v2/admin/users/:userId/rfidsusers:rfidTijelo: { uid: string(1..36), name?: string or null }201 { rfid: RFID }; sirovi UID ne vraća se u odgovoru
PATCH /v2/admin/users/:userId/rfids/:rfidIdusers:rfidTijelo: { name: string or null }200 { rfid: RFID }
DELETE /v2/admin/users/:userId/rfids/:rfidIdusers:rfidTijelo: nema204 empty
GET /v2/admin/users/:userId/accessusers:readTijelo/upit: nema200 { access: Access }
PUT /v2/admin/users/:userId/accessusers:accessTijelo: AccessInput200 { access: Access }
DELETE /v2/admin/users/:userId/access/:accessIdusers:accessTijelo: nema204 empty
GET /v2/admin/users/:userId/limitsusers:readTijelo/upit: nema200 { items: Limit[] }
POST /v2/admin/users/:userId/limitsusers:limitsTijelo: LimitCreate201 { limit: Limit }
PATCH /v2/admin/users/:userId/limits/:limitIdusers:limitsTijelo: LimitPatch, barem jedno svojstvo200 { limit: Limit }
DELETE /v2/admin/users/:userId/limits/:limitIdusers:limitsTijelo: nema204 empty
GET /v2/admin/chargers/:chargerId/local-userschargers:read + users:readTijelo/upit: nema200 { charger: ChargerSummary, items: LocalUser[], invitations: { email }[], availableMembers: [] }; API namjerno izostavlja široki imenik dostupnih članova portala
POST /v2/admin/chargers/:chargerId/local-userschargers:local-users + users:accessTijelo: { customerId: positive integer, expiresAt?: RFC3339 or null }201 { localUser: LocalUserMutation }
POST /v2/admin/chargers/:chargerId/local-users/invitationschargers:local-users + users:invitations + users:accessTijelo: { email: email }200 or 201 { result }; postojeći korisnik: { invited:false, localUser: LocalUserMutation }; pozivnica: { invited:true, alreadyInvited, emailSent, emailRetryReady }
DELETE /v2/admin/chargers/:chargerId/local-users/invitationschargers:local-users + users:invitationsTijelo: { email: email }204 empty
PATCH /v2/admin/chargers/:chargerId/local-users/:localUserIdchargers:local-users + users:accessTijelo: { expiresAt: RFC3339 or null }200 { localUser: LocalUserUpdate }
DELETE /v2/admin/chargers/:chargerId/local-users/:localUserIdchargers:local-users + users:accessTijelo: nema204 empty

Sistemski korisnik Tagless zaštićen je od tih operacija. Neuspjelo slanje pozivnice e-poštom vraća sigurno stanje dostave bez otkrivanja SMTP pojedinosti; pozivatelji mogu pokušati ponovno kada je emailRetryReady istinit.

Binarni odgovori

Dvije skupine krajnjih točaka pri uspjehu ne vraćaju JSON:

Krajnja točkaVrsta sadržajaVažna zaglavlja
QR kod punjačaimage/pngCache-Control: no-store, Content-Disposition: inline, X-Content-Type-Options: nosniff
Izvoz izvještajatext/csv; charset=utf-8 ili application/pdfCache-Control: private, no-store, Content-Disposition: attachment, X-Content-Type-Options: nosniff

Pogreške binarnih krajnjih točaka i dalje su u JSON formatu.