Крайни точки

Заявки и отговори на крайните точки на Admin API на работното пространство

Това е справочникът за заявки/отговори на всяка крайна точка /v2/admin. Удостоверяването, идемпотентността, лимитите на заявки, създаването на токени и значението на обхватите са описани в Admin API на работното пространство. Преизползваемите типове на ниво поле и примерите са в Схеми и примери. Четете всеки ред за крайна точка заедно с Договор за отговори и грешки, който изброява всички възможни общи и специфични неуспешни тела.

Общ договор

Всеки път започва с внедрения произход app-api. Работното пространство се извлича единствено от удостоверения токен; клиентите не трябва да изпращат cpoId. Всички документирани стойности :...Id в пътищата на ресурси са положителни десетични цели числа. Всяка заявка изисква точно една:

Authorization: Bearer <workspace-access-token>

Заявките, показани с JSON тяло, изискват Content-Type: application/json. Всички промени изискват Idempotency-Key (POST, PUT, PATCH и DELETE), включително POST /v2/admin/reports/send; освен ако редът не посочва друго, типът на съдържание при успех е application/json, JSON датите са низове RFC 3339, а числата са JSON числа.

Всяка заявка може да включва X-Request-Id и X-Error-Format: envelope; вижте Договор за отговори и грешки. Тези заглавки не променят схемите за успех.

Използвана по-долу нотация:

  • none означава липса на тяло на заявката. DELETE, който документира JSON тяло, все пак го изисква.
  • ? означава незадължително свойство или параметър на заявка.
  • T | null означава, че свойството присъства и допуска null.
  • 204 empty означава липса на тяло на отговора.
  • CursorPage<T> означава { items: T[], nextCursor: number|string|null }, освен когато редът изрично посочва обект page или pagination.
  • Всички липсващи вложени ресурси, включително идентификатори от друго работно пространство, използват 404 { "error": "Workspace resource not found", "code": "RESOURCE_NOT_FOUND" }, освен ако функцията не документира по-конкретен конфликт.

Общи схеми на заявки

Входни данни за работни пространства и обекти

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
}

Входни данни за управление на мощността

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
}

Входни данни за станции

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

Входни данни за отчети

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

Периодите на отчетите трябва да отговарят на from < to и не могат да надвишават 90 дни. Ако липсват, се използват последните 90 дни. userId и anonymous=true са взаимно изключващи се. Планираните експорти наваксват пропусната UTC минута и използват ограничени повторения (изчакване 5/10 минути, 30-минутен наем за блокирала обработка, три опита).

Входни данни за тарифи

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 }

Входни данни за профили за зареждане

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 }

Входни данни за потребители

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 }

При създаване на лимит поне едно от energyValue или timeValue трябва да е над нула. Имейлите се изчистват от крайни интервали и се преобразуват в малки букви. RFID UID се приемат само при запис и се маскират в отговорите за четене.

Обобщение на DTO за отговори

Таблиците с крайни точки показват всяка обвивка на отговор на най-горно ниво. Това са основните преизползваеми DTO в тези обвивки:

DTOПолета
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; детайлът добавя нормализирано chargers и състояние на конекторите
GeocodeCandidateplaceId, displayName, latitude, longitude; данни за достъп и специфични метаданни на доставчика никога не се връщат
MetricsWindowfrom, to, лимити/брой сесии и totalsCapped, когато е приложимо
Chargerid, name, identifier, cpoId, site, нормализирано status, isPublic, флагове RFID/Smart/автоматизация, provisioned, connection, evses, connectors, createdAt, updatedAt; детайлът добавя скрито configuration, firmware и бройки
ConnectorportId, connectorId, справочни ID на конектори, maxVoltage, maxAmperage, maxElectricPower
ReportSessionid, станция/обект, ID на порт и конектор, минимизиран потребител, active, energyWh, старт/стоп/продължителност и нетни разходи/данък/общи разходи по валута
ReportScheduleid, workspaceId, enabled, recipientEmail, format, UTC sendDay/sendTime, създаване/актуализация и безопасни метаданни за последна доставка, включително брой опити
Tariffid, cpoId, name, обекти за тип/обект/валута/ценова зона, tax, fallbackPrice, ефективно price, components, assignmentCount
ChargingProfileid, cpoId, label, description, stackLevel, обекти за местоположение/предназначение/вид/повторение/единица на скоростта, валидност, график, assignmentCount, времеви отпечатъци
Userid, membershipId, name, email, маскирано rfids, access на станцията, limitCount; детайлът добавя phone, createdAt и limits. Данни за OCPP оторизация като contractId никога не се връщат.
RFIDid, maskedUid, name, type, valid; необработеният UID никога не се връща
AccessallChargers, сортирано chargerIds и items, съдържащо метаданни за право/станция/обект/изтичане
Limitid, limitTypeId, label, energyValue, timeValue
LocalUserDTO за списък: id, customerId, name, email, expiresAt, systemManaged. Промените на локални потребители използват отделните структури LocalUserMutation/LocalUserUpdate в Схеми и примери.

Справочните обекти се връщат от маршрутите за списък/детайли, за да могат клиентите да открият валидни ID. Третирайте непознатите добавени полета като съвместими с бъдещи версии и разграничавайте само по документирани стабилни полета и кодове за грешка.

Крайни точки за работни пространства

Метод и пътОбхватЗаявкаУспешен отговор
GET /v2/adminworkspaces:readТяло: няма200 { workspace: Workspace }
PATCH /v2/adminworkspaces:updateТяло: WorkspacePatch200 { workspace: Workspace }
GET /v2/admin/dashboardworkspaces:read + reports:readТяло/заявка: няма200 { window, stats { chargerCount, onlineChargerCount, siteCount, userCount }, sessions: DashboardSession[], analytics }; сесиите са ограничени до 1000 за 90 дни

Крайни точки за обекти и управление на мощността

Метод и пътОбхватЗаявкаУспешен отговор
GET /v2/admin/sitessites:readТяло/заявка: няма200 { items: Site[], metricsWindow: MetricsWindow, lookups { countries, timezones } }
GET /v2/admin/sites/geocodesites:readЗаявка: незадължителни street (макс. 160), city, state, country (всяко макс. 100), countryCode (макс. 2); незадължителна заглавка Accept-Language; улица/град/област общо трябва да съдържат поне два знака200 { results: GeocodeCandidate[] }; еднакви текущи търсения се обединяват и работата на доставчика използва ограничена последователна опашка и ограничен сървърен кеш; невалидни търсения връщат 400 INVALID_GEOCODE_QUERY, пълна опашка връща 429 GEOCODING_BUSY с Retry-After, а грешки на доставчика — 502 GEOCODING_UNAVAILABLE
POST /v2/admin/sitessites:createТяло: SiteInput201 { site: Site }
GET /v2/admin/sites/:siteIdsites:read + reports:readТяло/заявка: няма200 { site: SiteDetail, recentSessions: SiteSession[], totals, metricsWindow }
PATCH /v2/admin/sites/:siteIdsites:updateТяло: пълно SiteInput200 { site: Site }
DELETE /v2/admin/sites/:siteIdsites:deleteТяло: няма204 empty; непразен обект връща 409 SITE_NOT_EMPTY
GET /v2/admin/sites/:siteId/power-managementsites:power-managementТяло/заявка: няма200 { configuration: PowerConfiguration }, съдържащо собствен обект, станции/конектори, групи, източници на измервания, присвоявания и състояние на съвместимост
PUT /v2/admin/sites/:siteId/power-managementsites:power-managementТяло: PowerConfigurationInput200 { configuration: PowerConfiguration }; отказ на OCPP, изтекло време или паралелна промяна връща 409 POWER_MANAGEMENT_CONFLICT, без да прилага замяната

Крайни точки за станции

Метод и пътОбхватЗаявкаУспешен отговор
GET /v2/admin/chargerschargers:readТяло/заявка: няма200 { items: Charger[], metricsWindow: MetricsWindow, connectorLookups { formats, types, powerTypes } }
POST /v2/admin/chargerschargers:createТяло: ChargerCreate; идентификаторът се преобразува в главни букви201 { charger: Charger }; паролата никога не се връща
GET /v2/admin/chargers/:chargerIdchargers:readТяло/заявка: няма200 { charger: ChargerDetail }
PATCH /v2/admin/chargers/:chargerIdchargers:updateТяло: ChargerPatch200 { charger: ChargerDetail }
DELETE /v2/admin/chargers/:chargerIdchargers:deleteТяло: няма204 empty
PATCH /v2/admin/chargers/:chargerId/credentialschargers:credentialsТяло: { password: string(0..40) }200 { success: true }
PATCH /v2/admin/chargers/:chargerId/connectors/:portIdchargers:connector-settingsТяло: ConnectorPatch200 { connector: Connector }
PATCH /v2/admin/chargers/:chargerId/public-listingchargers:publicТяло: { isPublic: boolean }200 { isPublic: boolean }; неизпълнената готовност връща 409 CHARGER_CONFLICT
GET /v2/admin/chargers/:chargerId/public-readinesschargers:readТяло/заявка: няма200 { readiness: { ready, missingRequirements, connectorIds, missingTariffConnectorIds, ...commercialState } }
GET /v2/admin/chargers/:chargerId/logschargers:readЗаявка: 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:readЗаявка: 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:readЗаявка: connector?: integer[0,255]200 image/png двоичен, 300 px, Content-Disposition: inline, Cache-Control: no-store
GET /v2/admin/chargers/:chargerId/composite-scheduleschargers:readЗаявка: cursor?, limit?=20 (1..50), connectorId?200 { items: CompositeSchedule[], nextCursor: number or null }
GET /v2/admin/chargers/:chargerId/configurationchargers:readТяло/заявка: няма200 { items: ChargerConfiguration[] }; стойностите, подобни на тайни, са [REDACTED]
PATCH /v2/admin/chargers/:chargerId/configurationchargers:configurationТяло: { key: string(1..50), value: string(0..500) }200 { status: string }, където състоянието е резултатът от станцията/OCPP
POST /v2/admin/chargers/:chargerId/configuration/reloadchargers:configurationТяло: няма200 { status: string }
GET /v2/admin/chargers/:chargerId/firmwarechargers:readТяло/заявка: няма200 { firmware: { status, notifiedAt, currentVersion, bootNotifiedAt } }
POST /v2/admin/chargers/:chargerId/firmwarechargers:firmwareТяло: { url: HTTP-or-HTTPS URL, max 2048 characters }202 { status: string }
POST /v2/admin/chargers/:chargerId/commands/resetchargers:commandsТяло: { resetType: "Soft" or "Hard" }200 { status: string }
POST /v2/admin/chargers/:chargerId/commands/availabilitychargers:commandsТяло: { availabilityType: "Operative" or "Inoperative" }200 { status: string }
POST /v2/admin/chargers/:chargerId/commands/triggerchargers:commandsТяло: { messageType: "BootNotification", "Heartbeat", "StatusNotification", or "MeterValues" }200 { status: string, connectorResults: { connectorId, status }[] }
POST /v2/admin/chargers/:chargerId/commands/unlockchargers:commandsТяло: { connectorId: positive integer }200 { status: string }
POST /v2/admin/chargers/:chargerId/commands/composite-schedulechargers:commandsТяло: { connectorId: nonnegative integer, durationSeconds?: integer[60,604800], chargingRateUnit?: "W" or "A" }200 { status: string, connectorId: number, compositeSchedule: CompositeSchedule or null }

Крайни точки за отчети

Метод и пътОбхватЗаявкаУспешен отговор
GET /v2/admin/reports/datareports:readЗаявка: ReportFilters, непрозрачен cursor?, limit?=50 (1..100)200 { items: ReportSession[], pageTotals, page { limit, nextCursor }, range { from, to, toExclusive: true } }
GET /v2/admin/reports/schedulereports:readТяло/заявка: няма200 { schedule: ReportSchedule or null }
PUT /v2/admin/reports/schedulereports:schedulesТяло: строго ReportScheduleInput200 { schedule: ReportSchedule }
POST /v2/admin/reports/sendreports:sendТяло: няма; заглавката Idempotency-Key е задължителна200 { sent: true, format: "csv" or "pdf", rowCount: number, range { from, to } }; липсата на запазен график връща 409 REPORT_SCHEDULE_REQUIRED
GET /v2/admin/reports/measurementsreports:readЗаявка: задължителен transactionLogId, непрозрачен cursor?, limit?=500 (1..1000)200 { transactionLogId, measurements: { name, unit, lines[] }[], page { limit, nextCursor, sampleValuesTruncated, sampleLimitPerMeterValue: 64 } }
GET /v2/admin/reports/exportreports:exportЗаявка: ReportFilters, format?="csv" or "pdf"200 двоичен CSV/PDF с име на прикачен файл, Cache-Control: private, no-store, X-Content-Type-Options: nosniff; над 2000 реда връща 422 REPORT_EXPORT_ROW_LIMIT

Крайни точки за тарифи

Метод и пътОбхватЗаявкаУспешен отговор
GET /v2/admin/tariffstariffs:readТяло/заявка: няма200 { items: Tariff[], lookups { currencies, biddingZones, currencyRates, componentTypes, seasons, tariffTypes } }
POST /v2/admin/tariffstariffs:createТяло: TariffInput201 { tariff: Tariff }
GET /v2/admin/tariffs/:tariffIdtariffs:readТяло/заявка: няма200 { tariff: Tariff, lookups }
PATCH /v2/admin/tariffs/:tariffIdtariffs:updateТяло: пълно TariffInput200 { tariff: Tariff }
PUT /v2/admin/tariffs/:tariffId/componentstariffs:componentsТяло: { components: TariffComponentInput[0..256] }200 { tariff: Tariff, components: TariffComponent[] }
DELETE /v2/admin/tariffs/:tariffIdtariffs:deleteТяло: няма204 empty; препратки към записи за зареждане връщат 409 TARIFF_CONFLICT
GET /v2/admin/tariffs/:tariffId/market-pricestariffs:readЗаявка: задължителен startsAt, неотрицателен Unix времеви отпечатък200 { items: { id, value, currencyId, startsAt, endsAt, startsAtIso, endsAtIso, intervalMinutes }[], truncated: boolean }; най-много 10 000 реда
GET /v2/admin/chargers/:chargerId/tariff-assignmentschargers:tariff-assignments + tariffs:readТяло/заявка: няма200 { items: TariffAssignment[], tariffs: Tariff[] }
POST /v2/admin/chargers/:chargerId/tariff-assignmentschargers:tariff-assignments + tariffs:assignТяло: TariffAssignmentCreateInput; пропуснато connectorId или connectorId=0 означава всички конектори201 { assignments: TariffAssignment[] }
PATCH /v2/admin/chargers/:chargerId/tariff-assignments/:assignmentIdchargers:tariff-assignments + tariffs:assignТяло: TariffAssignmentUpdateInput; конекторът е задължителен и не може да бъде 0200 { assignment: TariffAssignment }
DELETE /v2/admin/chargers/:chargerId/tariff-assignments/:assignmentIdchargers:tariff-assignments + tariffs:assignТяло: няма204 empty

TariffAssignment съдържа id, chargerId, connectorId, безопасно обобщение на тарифа/валута, createdAt и updatedAt.

Крайни точки за профили за зареждане

Метод и пътОбхватЗаявкаУспешен отговор
GET /v2/admin/charging-profileschargingProfiles:readТяло/заявка: няма200 { items: ChargingProfile[], lookups { locations, purposes, kinds, recurrencyKinds, rateUnits, allowedRateUnits } }
POST /v2/admin/charging-profileschargingProfiles:createТяло: ChargingProfileCreate201 { profile: ChargingProfile }
GET /v2/admin/charging-profiles/:profileIdchargingProfiles:readТяло/заявка: няма200 { profile: ChargingProfile, lookups, isEditBlocked: boolean, usage { simpleChargingSchedule, smartSchedule, chargePoolChargepoint, isUsed } }
PATCH /v2/admin/charging-profiles/:profileIdchargingProfiles:updateТяло: пълно ChargingProfileInput200 { profile: ChargingProfile, ocppSync: OcppCommandResult[] }
PUT /v2/admin/charging-profiles/:profileId/schedulechargingProfiles:updateТяло: ChargingScheduleInput200 { profile: ChargingProfile, schedule: SchedulePeriod[], ocppSync: OcppCommandResult[] }
DELETE /v2/admin/charging-profiles/:profileIdchargingProfiles:deleteТяло: няма204 empty само след като всички присвоени станции приемат изчистването и състоянието е проверено отново; иначе 409 и профилът остава
GET /v2/admin/chargers/:chargerId/profile-assignmentschargers:profile-assignments + chargingProfiles:readТяло/заявка: няма200 { items: ProfileAssignment[], profiles: ChargingProfile[] }
POST /v2/admin/chargers/:chargerId/profile-assignmentschargers:profile-assignments + chargingProfiles:assignТяло: ProfileAssignmentInput201 { assignment: ProfileAssignment, ocpp: OcppCommandResult }
PATCH /v2/admin/chargers/:chargerId/profile-assignments/:assignmentIdchargers:profile-assignments + chargingProfiles:assignТяло: ProfileAssignmentInput200 { assignment: ProfileAssignment, ocpp: OcppCommandResult }
DELETE /v2/admin/chargers/:chargerId/profile-assignments/:assignmentIdchargers:profile-assignments + chargingProfiles:assignТяло: няма204 empty след синхронизирано изчистване

ProfileAssignment съдържа ID на присвояването, ID на станция/конектор и безопасно обобщение на профила. OCPP резултатите разкриват стабилна информация за заявката/състоянието и никога данни за достъп.

Крайни точки за потребители, RFID, достъп, лимити и локални потребители

Метод и пътОбхватЗаявкаУспешен отговор
GET /v2/admin/usersusers:readЗаявка: cursor?, съответстващ на състоянието (members: положително число; invitations: удостоверен непрозрачен i2.*; all: числово продължение на стария поток от членове или удостоверен непрозрачен съставен a2.*), limit?=50 (1..100), status?="all", "members", or "invitations"; незадължителна заглавка X-Admin-User-Search (макс. 100)200 { items: User[], invitations: Invitation[], chargers: ChargerSummary[], page { nextCursor, memberNextCursor, invitationNextCursor, limit } }; поканите се странират и зареждат с един и същ нормализиран израз за имейл, така че стар регистър/интервали да не скриват редове; курсорите са обвързани с работното пространство и филтъра, не съдържат четим имейл и трябва да се връщат непроменени; курсорите all придвижват потоците от членове и покани независимо
POST /v2/admin/usersusers:createТяло: UserCreate; клиентът вече трябва да е регистриран201 { user: User }; непознат имейл връща тялото 404 RESOURCE_NOT_FOUND, което не разкрива съществуването на ресурси, и трябва да използва покани
POST /v2/admin/users/invitationsusers:invitations + users:access; плюс users:rfid, ако е подаден rfidТяло: InvitationInput200 or 201 { result }; резултатът при прикрепяне е { kind:"attached", user, accessChanged, rfidChanged }; чакащият резултат е { kind:"invited", email, name, maskedRfid, chargerIds, createdCount, emailSent, emailRetryReady, alreadyInvited }
POST /v2/admin/users/invitations/resendusers:invitationsТяло: { email: email }200 { result: { targetedChargers, emailSent, emailRetryReady } }; прилага се глобално изчакване за получателя
DELETE /v2/admin/users/invitationsusers:invitationsТяло: { email: email }204 empty
GET /v2/admin/users/:userIdusers:read + reports:readТяло/заявка: няма200 { user: UserDetail, sessions: UserSession[], totals { count, energyWh, durationSeconds }, window, limitTypes, chargers }; най-много 200 сесии за 90 дни
PATCH /v2/admin/users/:userIdusers:updateТяло: { name: string(1..255) }200 { user: User }
DELETE /v2/admin/users/:userIdusers:deleteТяло: няма204 empty
GET /v2/admin/users/:userId/vehiclesusers:readЗаявка: числово cursor?, limit?=50 (1..100)200 { items: Vehicle[], page { nextCursor, limit } }; DTO на автомобила включва безопасни полета за доставчик/състояние/модел/телеметрия
GET /v2/admin/users/:userId/rfidsusers:readТяло/заявка: няма200 { items: RFID[] }; UID са маскирани
POST /v2/admin/users/:userId/rfidsusers:rfidТяло: { uid: string(1..36), name?: string or null }201 { rfid: RFID }; необработеният UID не се връща
PATCH /v2/admin/users/:userId/rfids/:rfidIdusers:rfidТяло: { name: string or null }200 { rfid: RFID }
DELETE /v2/admin/users/:userId/rfids/:rfidIdusers:rfidТяло: няма204 empty
GET /v2/admin/users/:userId/accessusers:readТяло/заявка: няма200 { access: Access }
PUT /v2/admin/users/:userId/accessusers:accessТяло: AccessInput200 { access: Access }
DELETE /v2/admin/users/:userId/access/:accessIdusers:accessТяло: няма204 empty
GET /v2/admin/users/:userId/limitsusers:readТяло/заявка: няма200 { items: Limit[] }
POST /v2/admin/users/:userId/limitsusers:limitsТяло: LimitCreate201 { limit: Limit }
PATCH /v2/admin/users/:userId/limits/:limitIdusers:limitsТяло: LimitPatch, поне едно свойство200 { limit: Limit }
DELETE /v2/admin/users/:userId/limits/:limitIdusers:limitsТяло: няма204 empty
GET /v2/admin/chargers/:chargerId/local-userschargers:read + users:readТяло/заявка: няма200 { charger: ChargerSummary, items: LocalUser[], invitations: { email }[], availableMembers: [] }; API умишлено пропуска широкия указател на налични членове в портала
POST /v2/admin/chargers/:chargerId/local-userschargers:local-users + users:accessТяло: { customerId: positive integer, expiresAt?: RFC3339 or null }201 { localUser: LocalUserMutation }
POST /v2/admin/chargers/:chargerId/local-users/invitationschargers:local-users + users:invitations + users:accessТяло: { email: email }200 or 201 { result }; съществуващ клиент: { invited:false, localUser: LocalUserMutation }; покана: { invited:true, alreadyInvited, emailSent, emailRetryReady }
DELETE /v2/admin/chargers/:chargerId/local-users/invitationschargers:local-users + users:invitationsТяло: { email: email }204 empty
PATCH /v2/admin/chargers/:chargerId/local-users/:localUserIdchargers:local-users + users:accessТяло: { expiresAt: RFC3339 or null }200 { localUser: LocalUserUpdate }
DELETE /v2/admin/chargers/:chargerId/local-users/:localUserIdchargers:local-users + users:accessТяло: няма204 empty

Системният потребител Tagless е защитен от тези операции. Неуспешните имейл покани връщат безопасно състояние на доставяне, без да разкриват SMTP подробности; клиентите могат да опитат пак, когато emailRetryReady е true.

Двоични отговори

Две групи крайни точки не връщат JSON при успех:

Крайна точкаТип съдържаниеВажни заглавки
QR на станциятаimage/pngCache-Control: no-store, Content-Disposition: inline, X-Content-Type-Options: nosniff
Експорт на отчетtext/csv; charset=utf-8 или application/pdfCache-Control: private, no-store, Content-Disposition: attachment, X-Content-Type-Options: nosniff

Грешките от двоичните крайни точки все пак са JSON.