Endpointit

Työtilan Admin API:n endpoint-pyynnöt ja -vastaukset

Tämä on jokaisen /v2/admin-endpointin pyyntö-/vastausviite. Todennus, idempotenssi, pyyntörajoitukset, tunnusten luonti ja käyttöalueiden merkitykset dokumentoidaan kohdassa Työtilan Admin API. Uudelleenkäytettävät kenttätyypit ja esimerkit ovat kohdassa Skeemat ja esimerkit. Lue jokainen endpoint-rivi yhdessä Vastaus- ja virhesopimuksen kanssa, joka luettelee kaikki mahdolliset yhteiset ja endpoint-kohtaiset epäonnistumisrungot.

Yhteinen sopimus

Jokainen polku alkaa käyttöönotetusta app-api-alkuperästä. Työtila johdetaan yksinomaan todennetusta tunnuksesta; asiakkaat eivät saa lähettää cpoId. Kaikki dokumentoidut resurssipolkujen :...Id-arvot ovat positiivisia desimaalikokonaislukuja. Jokainen pyyntö edellyttää täsmälleen yhtä:

Authorization: Bearer <workspace-access-token>

JSON-rungolla esitetyt pyynnöt edellyttävät Content-Type: application/json. Kaikki muutokset edellyttävät Idempotency-Key (POST, PUT, PATCH ja DELETE), mukaan lukien POST /v2/admin/reports/send; ellei rivillä toisin mainita, onnistumisen sisältötyyppi on application/json, JSON-päiväykset ovat RFC 3339 -merkkijonoja ja numerot JSON-numeroita.

Jokainen pyyntö voi sisältää X-Request-Id ja X-Error-Format: envelope; katso Vastaus- ja virhesopimus. Nämä otsakkeet eivät muuta onnistumisskeemoja.

Alla käytetty merkintätapa:

  • none tarkoittaa, ettei pyynnöllä ole runkoa. JSON-rungon dokumentoiva DELETE edellyttää silti sitä runkoa.
  • ? merkitsee valinnaista ominaisuutta tai kyselyparametria.
  • T | null tarkoittaa, että ominaisuus on mukana ja sallii null-arvon.
  • 204 empty tarkoittaa, ettei vastauksella ole runkoa.
  • CursorPage<T> tarkoittaa { items: T[], nextCursor: number|string|null }, paitsi kun rivi nimeää nimenomaisesti page- tai pagination-objektin.
  • Kaikki puuttuvat sisäkkäiset resurssit, myös toisen työtilan tunnisteet, käyttävät 404 { "error": "Workspace resource not found", "code": "RESOURCE_NOT_FOUND" }, ellei toiminnossa dokumentoida tarkempaa ristiriitaa.

Yhteiset pyyntöskeemat

Työtilan ja kohteen syötteet

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
}

Tehonhallinnan syöte

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
}

Laturien syötteet

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

Raporttisyötteet

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

Raporttijaksojen on täytettävä from < to, eivätkä ne saa ylittää 90 päivää. Jos ne puuttuvat, käytetään viimeisintä 90 päivän jaksoa. userId ja anonymous=true sulkevat toisensa pois. Ajastetut viennit korvaavat väliin jääneen UTC-minuutin ja käyttävät rajattuja uusintayrityksiä (5/10 minuutin viive, 30 minuutin vanhentuneen varauksen vuokra, kolme yritystä).

Tariffisyötteet

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 }

Latausprofiilien syötteet

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 }

Käyttäjäsyötteet

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 }

Rajaa luotaessa vähintään toisen arvoista energyValue tai timeValue on oltava nollaa suurempi. Sähköposteista poistetaan reunavälit ja ne muutetaan pieniksi kirjaimiksi. RFID-UID:t hyväksytään vain kirjoituksissa ja peitetään lukuvastauksissa.

Vastaus-DTO:iden yhteenveto

Endpoint-taulukot näyttävät kaikki ylimmän tason vastauskääreet. Tässä ovat niiden tärkeimmät uudelleenkäytettävät DTO:t:

DTOKentät
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; tietonäkymä lisää normalisoidun chargers ja liittimen tilan
GeocodeCandidateplaceId, displayName, latitude, longitude; tarjoajan tunnistetietoja ja tarjoajakohtaisia metatietoja ei koskaan palauteta
MetricsWindowfrom, to, lataustapahtumien rajat/määrät ja tarvittaessa totalsCapped
Chargerid, name, identifier, cpoId, site, normalisoitu status, isPublic, RFID-/Smart-/automaatioliput, provisioned, connection, evses, connectors, createdAt, updatedAt; tietonäkymä lisää peitetyn configuration, firmware ja määrät
ConnectorportId, connectorId, liittimen hakutunnisteet, maxVoltage, maxAmperage, maxElectricPower
ReportSessionid, laturi/kohde, portin ja liittimen tunnisteet, minimoitu käyttäjä, active, energyWh, aloitus/lopetus/kesto sekä valuuttakohtaiset netto-/vero-/kokonaiskustannukset
ReportScheduleid, workspaceId, enabled, recipientEmail, format, UTC sendDay/sendTime, luonti/päivitys ja turvalliset viimeisen toimituksen metatiedot yritysmäärineen
Tariffid, cpoId, name, tyyppi-/kohde-/valuutta-/tarjousalueobjektit, tax, fallbackPrice, voimassa oleva price, components, assignmentCount
ChargingProfileid, cpoId, label, description, stackLevel, sijainti-/tarkoitus-/laji-/toistuvuus-/latausnopeusyksikköobjektit, voimassaolo, ajastus, assignmentCount, aikaleimat
Userid, membershipId, name, email, peitetty rfids, laturin access, limitCount; tietonäkymä lisää phone, createdAt ja limits. OCPP-valtuutustietoja, kuten contractId, ei koskaan palauteta.
RFIDid, maskedUid, name, type, valid; raakaa UID:tä ei koskaan palauteta
AccessallChargers, järjestetty chargerIds ja items, joka sisältää käyttöoikeus-/laturi-/kohde-/vanhenemismetatiedot
Limitid, limitTypeId, label, energyValue, timeValue
LocalUserLuettelo-DTO: id, customerId, name, email, expiresAt, systemManaged. Paikallisten käyttäjien muutokset käyttävät erillisiä LocalUserMutation/LocalUserUpdate-rakenteita kohdassa Skeemat ja esimerkit.

Luettelo-/tietoreitit palauttavat hakuobjekteja kelvollisten tunnisteiden löytämiseksi. Käsittele tuntemattomia lisäkenttiä tulevaisuuteen yhteensopivina ja haarauta vain dokumentoitujen vakaiden kenttien ja virhekoodien perusteella.

Työtilaendpointit

Metodi ja polkuKäyttöaluePyyntöOnnistumisvastaus
GET /v2/adminworkspaces:readRunko: ei ole200 { workspace: Workspace }
PATCH /v2/adminworkspaces:updateRunko: WorkspacePatch200 { workspace: Workspace }
GET /v2/admin/dashboardworkspaces:read + reports:readRunko/kysely: ei ole200 { window, stats { chargerCount, onlineChargerCount, siteCount, userCount }, sessions: DashboardSession[], analytics }; lataustapahtumia on enintään 1 000 per 90 päivää

Kohde- ja tehonhallintaendpointit

Metodi ja polkuKäyttöaluePyyntöOnnistumisvastaus
GET /v2/admin/sitessites:readRunko/kysely: ei ole200 { items: Site[], metricsWindow: MetricsWindow, lookups { countries, timezones } }
GET /v2/admin/sites/geocodesites:readKysely: valinnaiset street (enintään 160), city, state, country (kukin enintään 100), countryCode (enintään 2); valinnainen Accept-Language-otsake; kadun/kaupungin/osavaltion yhdistelmässä vaaditaan vähintään kaksi merkkiä200 { results: GeocodeCandidate[] }; samanlaiset keskeneräiset haut yhdistetään ja tarjoajan työ käyttää rajattua sarjoitettua jonoa sekä rajattua palvelinvälimuistia; virheelliset haut palauttavat 400 INVALID_GEOCODE_QUERY, täysi jono 429 GEOCODING_BUSY ja Retry-After, ja tarjoajan virheet 502 GEOCODING_UNAVAILABLE
POST /v2/admin/sitessites:createRunko: SiteInput201 { site: Site }
GET /v2/admin/sites/:siteIdsites:read + reports:readRunko/kysely: ei ole200 { site: SiteDetail, recentSessions: SiteSession[], totals, metricsWindow }
PATCH /v2/admin/sites/:siteIdsites:updateRunko: täydellinen SiteInput200 { site: Site }
DELETE /v2/admin/sites/:siteIdsites:deleteRunko: ei ole204 empty; ei-tyhjä kohde palauttaa 409 SITE_NOT_EMPTY
GET /v2/admin/sites/:siteId/power-managementsites:power-managementRunko/kysely: ei ole200 { configuration: PowerConfiguration }, joka sisältää omistetun kohteen, laturit/liittimet, ryhmät, mittarilähteet, määritykset ja yhteensopivuustilan
PUT /v2/admin/sites/:siteId/power-managementsites:power-managementRunko: PowerConfigurationInput200 { configuration: PowerConfiguration }; OCPP-hylkäys, aikakatkaisu tai samanaikainen muutos palauttaa 409 POWER_MANAGEMENT_CONFLICT tekemättä korvausta

Laturien endpointit

Metodi ja polkuKäyttöaluePyyntöOnnistumisvastaus
GET /v2/admin/chargerschargers:readRunko/kysely: ei ole200 { items: Charger[], metricsWindow: MetricsWindow, connectorLookups { formats, types, powerTypes } }
POST /v2/admin/chargerschargers:createRunko: ChargerCreate; tunniste muutetaan isoiksi kirjaimiksi201 { charger: Charger }; salasanaa ei koskaan palauteta
GET /v2/admin/chargers/:chargerIdchargers:readRunko/kysely: ei ole200 { charger: ChargerDetail }
PATCH /v2/admin/chargers/:chargerIdchargers:updateRunko: ChargerPatch200 { charger: ChargerDetail }
DELETE /v2/admin/chargers/:chargerIdchargers:deleteRunko: ei ole204 empty
PATCH /v2/admin/chargers/:chargerId/credentialschargers:credentialsRunko: { password: string(0..40) }200 { success: true }
PATCH /v2/admin/chargers/:chargerId/connectors/:portIdchargers:connector-settingsRunko: ConnectorPatch200 { connector: Connector }
PATCH /v2/admin/chargers/:chargerId/public-listingchargers:publicRunko: { isPublic: boolean }200 { isPublic: boolean }; puuttuva valmius palauttaa 409 CHARGER_CONFLICT
GET /v2/admin/chargers/:chargerId/public-readinesschargers:readRunko/kysely: ei ole200 { readiness: { ready, missingRequirements, connectorIds, missingTariffConnectorIds, ...commercialState } }
GET /v2/admin/chargers/:chargerId/logschargers:readKysely: 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:readKysely: 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:readKysely: connector?: integer[0,255]200 image/png binääri, 300 px, Content-Disposition: inline, Cache-Control: no-store
GET /v2/admin/chargers/:chargerId/composite-scheduleschargers:readKysely: cursor?, limit?=20 (1..50), connectorId?200 { items: CompositeSchedule[], nextCursor: number or null }
GET /v2/admin/chargers/:chargerId/configurationchargers:readRunko/kysely: ei ole200 { items: ChargerConfiguration[] }; salaisuuden kaltaiset arvot ovat [REDACTED]
PATCH /v2/admin/chargers/:chargerId/configurationchargers:configurationRunko: { key: string(1..50), value: string(0..500) }200 { status: string }, jossa tila on laturin/OCPP:n tulos
POST /v2/admin/chargers/:chargerId/configuration/reloadchargers:configurationRunko: ei ole200 { status: string }
GET /v2/admin/chargers/:chargerId/firmwarechargers:readRunko/kysely: ei ole200 { firmware: { status, notifiedAt, currentVersion, bootNotifiedAt } }
POST /v2/admin/chargers/:chargerId/firmwarechargers:firmwareRunko: { url: HTTP-or-HTTPS URL, max 2048 characters }202 { status: string }
POST /v2/admin/chargers/:chargerId/commands/resetchargers:commandsRunko: { resetType: "Soft" or "Hard" }200 { status: string }
POST /v2/admin/chargers/:chargerId/commands/availabilitychargers:commandsRunko: { availabilityType: "Operative" or "Inoperative" }200 { status: string }
POST /v2/admin/chargers/:chargerId/commands/triggerchargers:commandsRunko: { messageType: "BootNotification", "Heartbeat", "StatusNotification", or "MeterValues" }200 { status: string, connectorResults: { connectorId, status }[] }
POST /v2/admin/chargers/:chargerId/commands/unlockchargers:commandsRunko: { connectorId: positive integer }200 { status: string }
POST /v2/admin/chargers/:chargerId/commands/composite-schedulechargers:commandsRunko: { connectorId: nonnegative integer, durationSeconds?: integer[60,604800], chargingRateUnit?: "W" or "A" }200 { status: string, connectorId: number, compositeSchedule: CompositeSchedule or null }

Raporttien endpointit

Metodi ja polkuKäyttöaluePyyntöOnnistumisvastaus
GET /v2/admin/reports/datareports:readKysely: ReportFilters, läpinäkymätön cursor?, limit?=50 (1..100)200 { items: ReportSession[], pageTotals, page { limit, nextCursor }, range { from, to, toExclusive: true } }
GET /v2/admin/reports/schedulereports:readRunko/kysely: ei ole200 { schedule: ReportSchedule or null }
PUT /v2/admin/reports/schedulereports:schedulesRunko: tiukka ReportScheduleInput200 { schedule: ReportSchedule }
POST /v2/admin/reports/sendreports:sendRunko: ei ole; Idempotency-Key-otsake on pakollinen200 { sent: true, format: "csv" or "pdf", rowCount: number, range { from, to } }; puuttuva tallennettu ajastus palauttaa 409 REPORT_SCHEDULE_REQUIRED
GET /v2/admin/reports/measurementsreports:readKysely: pakollinen transactionLogId, läpinäkymätön cursor?, limit?=500 (1..1000)200 { transactionLogId, measurements: { name, unit, lines[] }[], page { limit, nextCursor, sampleValuesTruncated, sampleLimitPerMeterValue: 64 } }
GET /v2/admin/reports/exportreports:exportKysely: ReportFilters, format?="csv" or "pdf"200 CSV/PDF-binääri liitetiedoston nimellä, Cache-Control: private, no-store, X-Content-Type-Options: nosniff; yli 2 000 riviä palauttaa 422 REPORT_EXPORT_ROW_LIMIT

Tariffiendpointit

Metodi ja polkuKäyttöaluePyyntöOnnistumisvastaus
GET /v2/admin/tariffstariffs:readRunko/kysely: ei ole200 { items: Tariff[], lookups { currencies, biddingZones, currencyRates, componentTypes, seasons, tariffTypes } }
POST /v2/admin/tariffstariffs:createRunko: TariffInput201 { tariff: Tariff }
GET /v2/admin/tariffs/:tariffIdtariffs:readRunko/kysely: ei ole200 { tariff: Tariff, lookups }
PATCH /v2/admin/tariffs/:tariffIdtariffs:updateRunko: täydellinen TariffInput200 { tariff: Tariff }
PUT /v2/admin/tariffs/:tariffId/componentstariffs:componentsRunko: { components: TariffComponentInput[0..256] }200 { tariff: Tariff, components: TariffComponent[] }
DELETE /v2/admin/tariffs/:tariffIdtariffs:deleteRunko: ei ole204 empty; lataustietueviittaukset palauttavat 409 TARIFF_CONFLICT
GET /v2/admin/tariffs/:tariffId/market-pricestariffs:readKysely: pakollinen startsAt, ei-negatiivinen Unix-aikaleima200 { items: { id, value, currencyId, startsAt, endsAt, startsAtIso, endsAtIso, intervalMinutes }[], truncated: boolean }; enintään 10 000 riviä
GET /v2/admin/chargers/:chargerId/tariff-assignmentschargers:tariff-assignments + tariffs:readRunko/kysely: ei ole200 { items: TariffAssignment[], tariffs: Tariff[] }
POST /v2/admin/chargers/:chargerId/tariff-assignmentschargers:tariff-assignments + tariffs:assignRunko: TariffAssignmentCreateInput; puuttuva connectorId tai connectorId=0 tarkoittaa kaikkia liittimiä201 { assignments: TariffAssignment[] }
PATCH /v2/admin/chargers/:chargerId/tariff-assignments/:assignmentIdchargers:tariff-assignments + tariffs:assignRunko: TariffAssignmentUpdateInput; liitin on pakollinen eikä voi olla 0200 { assignment: TariffAssignment }
DELETE /v2/admin/chargers/:chargerId/tariff-assignments/:assignmentIdchargers:tariff-assignments + tariffs:assignRunko: ei ole204 empty

TariffAssignment sisältää id, chargerId, connectorId, turvallisen tariffi-/valuuttayhteenvedon, createdAt ja updatedAt.

Latausprofiilien endpointit

Metodi ja polkuKäyttöaluePyyntöOnnistumisvastaus
GET /v2/admin/charging-profileschargingProfiles:readRunko/kysely: ei ole200 { items: ChargingProfile[], lookups { locations, purposes, kinds, recurrencyKinds, rateUnits, allowedRateUnits } }
POST /v2/admin/charging-profileschargingProfiles:createRunko: ChargingProfileCreate201 { profile: ChargingProfile }
GET /v2/admin/charging-profiles/:profileIdchargingProfiles:readRunko/kysely: ei ole200 { profile: ChargingProfile, lookups, isEditBlocked: boolean, usage { simpleChargingSchedule, smartSchedule, chargePoolChargepoint, isUsed } }
PATCH /v2/admin/charging-profiles/:profileIdchargingProfiles:updateRunko: täydellinen ChargingProfileInput200 { profile: ChargingProfile, ocppSync: OcppCommandResult[] }
PUT /v2/admin/charging-profiles/:profileId/schedulechargingProfiles:updateRunko: ChargingScheduleInput200 { profile: ChargingProfile, schedule: SchedulePeriod[], ocppSync: OcppCommandResult[] }
DELETE /v2/admin/charging-profiles/:profileIdchargingProfiles:deleteRunko: ei ole204 empty vasta kun kaikki määritetyt laturit hyväksyvät tyhjennyksen ja tila validoidaan uudelleen; muuten 409 ja profiili säilyy
GET /v2/admin/chargers/:chargerId/profile-assignmentschargers:profile-assignments + chargingProfiles:readRunko/kysely: ei ole200 { items: ProfileAssignment[], profiles: ChargingProfile[] }
POST /v2/admin/chargers/:chargerId/profile-assignmentschargers:profile-assignments + chargingProfiles:assignRunko: ProfileAssignmentInput201 { assignment: ProfileAssignment, ocpp: OcppCommandResult }
PATCH /v2/admin/chargers/:chargerId/profile-assignments/:assignmentIdchargers:profile-assignments + chargingProfiles:assignRunko: ProfileAssignmentInput200 { assignment: ProfileAssignment, ocpp: OcppCommandResult }
DELETE /v2/admin/chargers/:chargerId/profile-assignments/:assignmentIdchargers:profile-assignments + chargingProfiles:assignRunko: ei ole204 empty synkronoidun tyhjennyksen jälkeen

ProfileAssignment sisältää määritystunnisteen, laturin/liittimen tunnisteet ja turvallisen profiiliyhteenvedon. OCPP-tulosobjektit näyttävät vakaat pyyntö-/tilatiedot mutta eivät koskaan tunnistetietoja.

Käyttäjä-, RFID-, käyttöoikeus-, raja- ja paikalliskäyttäjäendpointit

Metodi ja polkuKäyttöaluePyyntöOnnistumisvastaus
GET /v2/admin/usersusers:readKysely: tilaa vastaava cursor? (members: positiivinen numero; invitations: todennettu läpinäkymätön i2.*; all: vanhan jäsenvirran numeerinen jatko tai todennettu läpinäkymätön a2.*-yhdistelmä), limit?=50 (1..100), status?="all", "members", or "invitations"; valinnainen X-Admin-User-Search-otsake (enintään 100)200 { items: User[], invitations: Invitation[], chargers: ChargerSummary[], page { nextCursor, memberNextCursor, invitationNextCursor, limit } }; kutsut sivutetaan ja täydennetään samalla normalisoidulla sähköposti-ilmaisulla, joten vanhat kirjainkoot/reunavälit eivät piilota rivejä; kursorit sidotaan työtilaan ja hakusuodattimeen, ne eivät sisällä luettavaa sähköpostiosoitetta ja ne on palautettava muuttamattomina; all-kursorit siirtävät jäsen- ja kutsuvirtoja erikseen
POST /v2/admin/usersusers:createRunko: UserCreate; asiakkaan on oltava jo rekisteröity201 { user: User }; tuntematon sähköposti palauttaa resurssien olemassaoloa paljastamattoman 404 RESOURCE_NOT_FOUND-rungon ja sen tulisi käyttää kutsuja
POST /v2/admin/users/invitationsusers:invitations + users:access; lisäksi users:rfid, jos rfid annetaanRunko: InvitationInput200 or 201 { result }; liitetty tulos on { kind:"attached", user, accessChanged, rfidChanged }; odottava tulos on { kind:"invited", email, name, maskedRfid, chargerIds, createdCount, emailSent, emailRetryReady, alreadyInvited }
POST /v2/admin/users/invitations/resendusers:invitationsRunko: { email: email }200 { result: { targetedChargers, emailSent, emailRetryReady } }; vastaanottajakohtainen globaali odotusaika pakotetaan
DELETE /v2/admin/users/invitationsusers:invitationsRunko: { email: email }204 empty
GET /v2/admin/users/:userIdusers:read + reports:readRunko/kysely: ei ole200 { user: UserDetail, sessions: UserSession[], totals { count, energyWh, durationSeconds }, window, limitTypes, chargers }; enintään 200 lataustapahtumaa 90 päivässä
PATCH /v2/admin/users/:userIdusers:updateRunko: { name: string(1..255) }200 { user: User }
DELETE /v2/admin/users/:userIdusers:deleteRunko: ei ole204 empty
GET /v2/admin/users/:userId/vehiclesusers:readKysely: numeerinen cursor?, limit?=50 (1..100)200 { items: Vehicle[], page { nextCursor, limit } }; ajoneuvo-DTO sisältää turvalliset tarjoaja-/tila-/malli-/telemetriakentät
GET /v2/admin/users/:userId/rfidsusers:readRunko/kysely: ei ole200 { items: RFID[] }; UID:t on peitetty
POST /v2/admin/users/:userId/rfidsusers:rfidRunko: { uid: string(1..36), name?: string or null }201 { rfid: RFID }; raakaa UID:tä ei palauteta takaisin
PATCH /v2/admin/users/:userId/rfids/:rfidIdusers:rfidRunko: { name: string or null }200 { rfid: RFID }
DELETE /v2/admin/users/:userId/rfids/:rfidIdusers:rfidRunko: ei ole204 empty
GET /v2/admin/users/:userId/accessusers:readRunko/kysely: ei ole200 { access: Access }
PUT /v2/admin/users/:userId/accessusers:accessRunko: AccessInput200 { access: Access }
DELETE /v2/admin/users/:userId/access/:accessIdusers:accessRunko: ei ole204 empty
GET /v2/admin/users/:userId/limitsusers:readRunko/kysely: ei ole200 { items: Limit[] }
POST /v2/admin/users/:userId/limitsusers:limitsRunko: LimitCreate201 { limit: Limit }
PATCH /v2/admin/users/:userId/limits/:limitIdusers:limitsRunko: LimitPatch, vähintään yksi ominaisuus200 { limit: Limit }
DELETE /v2/admin/users/:userId/limits/:limitIdusers:limitsRunko: ei ole204 empty
GET /v2/admin/chargers/:chargerId/local-userschargers:read + users:readRunko/kysely: ei ole200 { charger: ChargerSummary, items: LocalUser[], invitations: { email }[], availableMembers: [] }; API jättää tarkoituksella pois portaalin laajan käytettävissä olevien jäsenten hakemiston
POST /v2/admin/chargers/:chargerId/local-userschargers:local-users + users:accessRunko: { customerId: positive integer, expiresAt?: RFC3339 or null }201 { localUser: LocalUserMutation }
POST /v2/admin/chargers/:chargerId/local-users/invitationschargers:local-users + users:invitations + users:accessRunko: { email: email }200 or 201 { result }; olemassa oleva asiakas: { invited:false, localUser: LocalUserMutation }; kutsu: { invited:true, alreadyInvited, emailSent, emailRetryReady }
DELETE /v2/admin/chargers/:chargerId/local-users/invitationschargers:local-users + users:invitationsRunko: { email: email }204 empty
PATCH /v2/admin/chargers/:chargerId/local-users/:localUserIdchargers:local-users + users:accessRunko: { expiresAt: RFC3339 or null }200 { localUser: LocalUserUpdate }
DELETE /v2/admin/chargers/:chargerId/local-users/:localUserIdchargers:local-users + users:accessRunko: ei ole204 empty

Tagless-järjestelmäkäyttäjä on suojattu näiltä toiminnoilta. Kutsusähköpostin virheet palauttavat turvallisen toimitustilan paljastamatta SMTP-tietoja; kutsuja voi yrittää uudelleen, kun emailRetryReady on true.

Binäärivastaukset

Kaksi endpoint-ryhmää ei palauta JSONia onnistuessaan:

EndpointSisältötyyppiTärkeät otsakkeet
Laturin QRimage/pngCache-Control: no-store, Content-Disposition: inline, X-Content-Type-Options: nosniff
Raporttivientitext/csv; charset=utf-8 tai application/pdfCache-Control: private, no-store, Content-Disposition: attachment, X-Content-Type-Options: nosniff

Binääristen endpointien virheet ovat silti JSONia.