Схеми и примери на Admin API
Този файл определя преизползваемите JSON типове от Справочник за крайни точки. ? означава незадължително при вход; | null означава, че свойството присъства и допуска null при изход, освен ако крайната точка не посочва друго. DateTime е низ RFC 3339; датите и часовете в заявки трябва да включват часово отместване.
Примитивни и справочни типове
PositiveInt = integer > 0
NonnegativeInt = integer >= 0
DateTime = RFC3339 string, for example "2026-08-24T12:30:00Z"
NamedLookup = { id: PositiveInt, name: string }
SiteRef = { id: PositiveInt, name: string|null }
Cost = { currency: string, net: number, tax: number, total: number }
Непознатите бъдещи полета трябва да се игнорират. ID са JSON числа, освен непрозрачните курсори и ID на токени за достъп, управлявани от портала. API не връща необработени RFID UID, пароли на станции, токени на работни пространства, contractId, тайни на доставчици или нескрити конфигурационни стойности, подобни на тайни.
Преобразуване на типове в заявки и непознати свойства
API не прилага една глобална политика за числово преобразуване:
- Всеки ID в път на ресурс и числов параметър на заявка приема десетичен низ като
"12", ако той отговаря на документираните ограничения за цяло число/диапазон. countryIdна работното пространство;countryId/timezoneIdна обекта; числовите полета за обект/конектор на станция и команди; всяко числово поле на тарифа; и всяко числово поле на профил за зареждане също се преобразуват от числови JSON низове.- Географската ширина/дължина на обекта,
smartModeна станцията, всички числа за управление на мощността, числата за графици на отчети и ID и стойностите в телата за потребители/RFID/достъп/лимити/локални потребители изискват JSON числа и не се преобразуват. - Обектите в телата за тарифи, профили за зареждане, графици на отчети и потребители отхвърлят непознати свойства с
422. Обектите за работни пространства, обекти, управление на мощността, други станции/отчети и заявки игнорират непознатите свойства.
Тези подробности описват транспортното поведение, а не препоръка: клиентите трябва да изпращат JSON числа за числовите полета в тялото.
Типове работни пространства и обекти
Workspace = {
id: PositiveInt,
name: string,
email: string|null,
website: string|null,
address: {
line1: string|null, line2: string|null, postalCode: string|null,
city: string|null, state: string|null, countryId: PositiveInt,
countryCode: string, countryName: string
},
createdAt: DateTime,
updatedAt: DateTime
}
Site = {
id: PositiveInt,
name: string,
description: string|null,
address: {
line1: string|null, line2: string|null, postalCode: string|null,
city: string|null, state: string|null, countryId: PositiveInt,
countryCode: string, countryName: string
},
timezone: { id: PositiveInt, name: string },
latitude: number|null,
longitude: number|null,
chargerCount: integer
}
SiteSession = {
id: PositiveInt,
charger: { id: PositiveInt, name: string },
portId: PositiveInt,
connectorId: integer,
active: boolean,
startedAt: DateTime,
stoppedAt: DateTime|null,
durationSeconds: integer|null,
energyWh: number,
costs: Cost[]
}
MetricsWindow = {
from: DateTime, to: DateTime, sessionLimit: integer,
sessionsIncluded: integer, totalsCapped: boolean
}
GET /sites/:siteId връща { site, recentSessions, totals, metricsWindow }. Неговото site добавя състоянието на собствените станции/конектори към основната проекция на обекта; totals съдържа sessions, energyWh, energyKwh, durationSeconds и costs: Cost[].
Справочниците за обекти са { countries: {countryId, countryCode, name}[], timezones: {timezoneId, name}[] } с числови ID и текстови имена/кодове.
DashboardSession = {
id: PositiveInt, chargerId: PositiveInt, connectorId: PositiveInt,
userId: PositiveInt|null, userName: string|null, chargerName: string|null,
site: SiteRef|null, status: string|null, energyWh: number,
startedAt: DateTime|null, stoppedAt: DateTime|null,
costs: Array<{ currency: string|null, price: number, tax: number }>
}
Dashboard = {
window: { from: DateTime, to: DateTime, maxSessions: 1000 },
stats: { chargerCount: integer, onlineChargerCount: integer, siteCount: integer, userCount: integer },
sessions: DashboardSession[],
analytics: {
totals: { sessions: integer, energyWh: number, durationSeconds: integer, costs: Array<{currency:string, amount:number}> },
daily: Array<{ date:string, sessions:integer, energyWh:number, costs:Array<{currency:string, amount:number}> }>,
sites: Array<{ id:PositiveInt, name:string|null, sessions:integer, energyWh:number, costs:Array<{currency:string, amount:number}> }>,
chargers: Array<{ id:PositiveInt, name:string|null, siteId:PositiveInt|null, siteName:string|null, sessions:integer, energyWh:number, costs:Array<{currency:string, amount:number}> }>
}
}
SiteDetailCharger = {
id: PositiveInt, name: string|null, identifier: string|null, status: string,
connection: { lastSeenAt: DateTime|null, leaseExpiresAt: DateTime|null }|null,
connectors: Array<{ evseId:PositiveInt, evseNumber:integer, portId:PositiveInt, connectorId:integer, status:string|null }>,
sessionCount: integer,
totals: { sessions:integer, energyWh:number, energyKwh:number, durationSeconds:integer, costs:Cost[] }
}
Примерна частична промяна на работно пространство и отговор:
PATCH /v2/admin
Authorization: Bearer evc_ws_<selector>.<secret>
Idempotency-Key: workspace-contact-20260824
Content-Type: application/json
{"email":"ops@example.com","city":"Riga"}
{
"workspace": {
"id": 7,
"name": "Example CPO",
"email": "ops@example.com",
"website": null,
"address": {
"line1": "1 Example Street",
"line2": null,
"postalCode": "LV-1001",
"city": "Riga",
"state": null,
"countryId": 1,
"countryCode": "LV",
"countryName": "Latvia"
},
"createdAt": "2026-01-01T00:00:00.000Z",
"updatedAt": "2026-08-24T12:30:00.000Z"
}
}
Пример за създаване/актуализация на обект (полетата със стойности по подразбиране могат да се пропуснат):
{
"name": "Main depot",
"addressLine1": "1 Example Street",
"city": "Riga",
"countryId": 1,
"timezoneId": 1,
"latitude": 56.9496,
"longitude": 24.1052
}
Отговор за управление на мощността
PowerConfiguration = {
site: { id: PositiveInt, updatedAt: DateTime },
chargepoints: Array<{
id: PositiveInt, name: string|null,
compatible: boolean, compatibility: string, // values come from shared capability projection
...additional smart-charging capability flags
}>,
pools: Array<{
id: PositiveInt, parentId: PositiveInt|null, name: string|null,
limit: integer, defaultLimit: integer|null, mode: integer|string|null
}>,
assignments: Array<{
poolId: PositiveInt, chargepointId: PositiveInt, priority: integer,
chargingProfileId: PositiveInt|null,
chargingProfileSynced: integer|null,
limit: number|null
}>,
meterSources: Array<{
id: PositiveInt, poolId: PositiveInt, sourceId: PositiveInt,
provider: string, name: string|null, externalId: string,
measurementMode: string, valueMode: string,
reserveA: integer, offlineSafeA: integer, ttlSeconds: integer,
enabled: boolean, lastComputedLimitA: number|null,
lastComputedAt: DateTime|null, lastStatus: string|null,
lastSeenAt: DateTime|null, effectiveLimitA: number|null
}>,
connectors: Array<{
id: PositiveInt, connectorId: integer, chargepointId: PositiveInt,
status: string|null
}>
}
Точните имена на допълнителните полета за съвместимост се създават от smartChargingCompatibility(); типът на връщане на тази помощна функция няма изрично име в изходния код. Това е единственият фрагмент от отговор, чийто затворен списък с полета не може да се установи от експортиран тип, затова допълнителните полета умишлено са означени като неясни, вместо да се измислят.
Пример за замяна:
{
"pools": [
{
"name": "Depot supply",
"limit": 125,
"meterSources": [
{
"externalId": "meter-42",
"measurementMode": "available_headroom",
"enabled": true
}
],
"children": [
{"chargepointId": 11, "priority": 10},
{"name": "Secondary", "limit": 32, "children": []}
]
}
]
}
Типове станции
Charger = {
id: PositiveInt, name: string, identifier: string, cpoId: PositiveInt,
site: { id: PositiveInt, name: string }, status: string,
isPublic: boolean, invertedRfid: boolean, smartMode: integer,
automationDisabled: boolean, provisioned: boolean,
connection: {
protocol: string|null, lastSeenAt: DateTime|null, leaseExpiresAt: DateTime|null
} | null,
evses: Array<{ id: PositiveInt, number: integer, status: string|null }>,
connectors: Array<{
evseId: PositiveInt, evseNumber: integer, status: string|null,
id: PositiveInt, connectorId: integer, portNumber: integer,
format: { id: PositiveInt, name: string, description: string|null },
type: { id: PositiveInt, name: string, description: string|null },
powerType: { id: PositiveInt, name: string, description: string|null },
maxVoltage: number, maxAmperage: number, maxElectricPower: number,
maxPowerKw: number
}>,
createdAt: DateTime, updatedAt: DateTime
}
ChargerDetail = Charger & {
configuration: Array<{
chargepointConfigId: PositiveInt, key: string,
value: string|null, readonly: boolean|number, setByServer: boolean|number,
modified: DateTime
}>,
firmware: { status: string|null, statusAt: DateTime|null, version: string|null, bootAt: DateTime|null },
counts: { localUsers: integer, sessions: integer, tariffAssignments: integer, profileAssignments: integer }
}
Проекцията на списък добавя ограничени полета за показатели и връща metricsWindow; проекцията на детайл използва структурата по-горе. Конфигурационните стойности за чувствителни ключове са точно "[REDACTED]".
PublicReadiness = {
ready: boolean,
missingRequirements: Array<"site_coordinates"|"connector_tariffs"|"billing_plan"|"stripe_connect"|"legacy_payment_data">,
commercialGateEnabled: boolean, siteCoordinatesDefined: boolean,
allConnectorsHaveTariffs: boolean, connectorsMissingTariffs: integer[],
connectorCount: integer, paymentDataDefined: boolean,
billingAccountId: PositiveInt|null, planCode: string|null,
billingPlanEligible: boolean, stripeConnectReady: boolean,
stripeConnectState: "active"|"action_required"|"pending"|"not_configured",
connectorIds: integer[], missingTariffConnectorIds: integer[]
}
RedactedOcppLog = {
ocppServerLogId: PositiveInt, timestamp: DateTime, logLevelId: PositiveInt,
logAction: string|null, logDirection: string|null, logMessage: string|null,
messageId: string|null, transactionLogId: PositiveInt|null,
logLevel: { name:string }|null
}
CompositeSchedule = {
id: PositiveInt, chargepointId: PositiveInt, connectorId: integer,
evseId: PositiveInt|null, scheduleStart: DateTime, duration: integer,
minChargingRate: number|null, chargingRateUnitId: PositiveInt,
chargingRateUnit: string|null, chargingRateUnitDescription: string|null,
periods: Array<{ id:PositiveInt, startPeriod:number, limit:number, numberPhases:integer|null, phaseToUse:integer|null }>
}
Успешната частична промяна на конектор връща точно { portId, connectorId, ocpiConnectorFormatEnumId, ocpiConnectorTypeEnumId, ocpiPowerTypeEnumId, maxVoltage, maxAmperage, maxElectricPower }.
connectorLookups съдържа тези справочни структури: форматите използват { ocpiConnectorFormatEnumId, name, description }; типовете — { ocpiConnectorTypeEnumId, name, description, icon }; типовете захранване — { ocpiPowerTypeEnumId, name, shortDescr, description, numPhases }.
Примери за създаване и актуализация на конектор:
{"name":"Warehouse 1","identifier":"cp-warehouse-1","password":"initial-secret","siteId":3}
{
"connectorFormatId": 1,
"connectorTypeId": 2,
"powerTypeId": 1,
"maxVoltage": 400,
"maxAmperage": 32,
"maxElectricPower": 22000
}
Обектите за отговор на команди съдържат status: string. Trigger съдържа допълнително connectorResults: { connectorId: number, status: string }[]; съставният график съдържа допълнително connectorId и compositeSchedule (или null). Стойностите за състояние са запазени OCPP/последващи резултати и маршрутът не ги ограничава до затворено изброяване.
Типове отчети
ReportSession = {
id: PositiveInt,
charger: { id: PositiveInt, name: string, site: { id: PositiveInt, name: string }|null },
portId: PositiveInt, connectorId: integer,
user: { id: PositiveInt, name: string }|null,
active: boolean, energyWh: number,
startedAt: DateTime, stoppedAt: DateTime|null,
durationSeconds: integer|null, costs: Cost[]
}
ReportSchedule = {
id: PositiveInt, workspaceId: PositiveInt, enabled: boolean,
recipientEmail: string, format: "csv"|"pdf", sendDay: integer,
sendTime: string, createdAt: DateTime, updatedAt: DateTime,
lastDeliveryPeriod: string|null, lastDeliveryStatus: string|null,
lastDeliveryAttemptAt: DateTime|null, lastDeliveryAttemptCount: integer,
lastDeliveredPeriod: string|null, lastDeliveredAt: DateTime|null
}
ReportDataResponse = {
items: ReportSession[],
pageTotals: { sessions:integer, energyWh:number, durationSeconds:integer, costs:Cost[] },
page: { limit:integer, nextCursor:string|null },
range: { from:DateTime, to:DateTime, toExclusive:true }
}
MeasurementPoint = { meterValueId:PositiveInt, timestamp:DateTime, elapsedSeconds:integer, value:number }
Measurement = {
name:string,
unit:{ symbol:string|null, description:string|null },
lines:Array<{ phase:string, points:MeasurementPoint[] }>
}
MeasurementsResponse = {
transactionLogId:PositiveInt, measurements:Measurement[],
page:{ limit:integer, nextCursor:string|null, sampleValuesTruncated:boolean, sampleLimitPerMeterValue:64 }
}
Пример за заявка и отговор на график:
{"enabled":true,"recipientEmail":"reports@example.com","format":"csv","sendDay":5,"sendTime":"08:30"}
{
"schedule": {
"id": 4,
"workspaceId": 7,
"enabled": true,
"recipientEmail": "reports@example.com",
"format": "csv",
"sendDay": 5,
"sendTime": "08:30",
"createdAt": "2026-08-01T10:00:00.000Z",
"updatedAt": "2026-08-24T12:30:00.000Z",
"lastDeliveryPeriod": null,
"lastDeliveryStatus": null,
"lastDeliveryAttemptAt": null,
"lastDeliveryAttemptCount": 0,
"lastDeliveredPeriod": null,
"lastDeliveredAt": null
}
}
Типове тарифи
TariffComponent = {
id: PositiveInt,
type: NamedLookup, season: NamedLookup,
validFromMonth: number|null, validToMonth: number|null,
validFromWeekDay: number|null, validToWeekDay: number|null,
validFromHour: number|null, validToHour: number|null,
priority: number, price: number
}
Tariff = {
id: PositiveInt, cpoId: PositiveInt, name: string,
type: NamedLookup,
site: { id: PositiveInt, name: string, timezone: string|null }|null,
currency: { id: PositiveInt, code: string, sign: string },
biddingZone: { id: PositiveInt, code: string, name: string }|null,
tax: number, fallbackPrice: number|null, price: number|null,
components: TariffComponent[], assignmentCount: integer
}
TariffAssignment = {
id: PositiveInt, chargerId: PositiveInt, connectorId: integer,
tariff: { id: PositiveInt, name: string, currency: { code: string, sign: string } },
createdAt: DateTime, updatedAt: DateTime
}
MarketPrice = {
id: PositiveInt, value: number, currencyId: PositiveInt,
startsAt: integer, endsAt: integer,
startsAtIso: DateTime, endsAtIso: DateTime, intervalMinutes: number
}
TariffLookups = {
currencies:Array<{id:PositiveInt,code:string,sign:string,fractionalUnit:string,enabled:boolean,minimalValue:integer}>,
biddingZones:Array<{id:PositiveInt,code:string,name:string,currencyId:PositiveInt,enabled:boolean}>,
currencyRates:Array<{currencyId:PositiveInt,rate:number,updatedAt:DateTime}>,
componentTypes:NamedLookup[], seasons:NamedLookup[], tariffTypes:NamedLookup[]
}
Примери за тарифа и компоненти:
{"name":"Public AC","currencyCode":"EUR","biddingZoneId":1,"tax":21}
{
"components": [
{"typeId":1,"seasonId":1,"priority":0,"price":0.25,"validFromHour":0,"validToHour":24}
]
}
Типове профили за зареждане
SchedulePeriod = { id: PositiveInt, startPeriod: number, limit: number, numberOfPhases: integer|null }
ChargingProfile = {
id: PositiveInt, cpoId: PositiveInt, label: string, description: string|null,
stackLevel: number, location: NamedLookup, purpose: NamedLookup,
kind: NamedLookup, recurrency: NamedLookup|null,
validFrom: DateTime|null, validTo: DateTime|null,
startSchedule: DateTime|null, durationSeconds: number|null,
rateUnit: NamedLookup, minChargingRate: number|null,
schedule: SchedulePeriod[], assignmentCount: integer,
createdAt: DateTime, updatedAt: DateTime
}
ProfileAssignment = {
id: PositiveInt, chargerId: PositiveInt, connectorId: integer,
synced: boolean, syncCode: integer,
syncStatus: "accepted"|"rejected"|"unknown",
profile: { id: PositiveInt, label: string, stackLevel: number, purpose: string, kind: string|null },
createdAt: DateTime, updatedAt: DateTime
}
ChargingProfileLookups = {
locations:NamedLookup[], purposes:NamedLookup[], kinds:NamedLookup[],
recurrencyKinds:NamedLookup[],
rateUnits:Array<{id:PositiveInt,name:string,supported:boolean}>,
allowedRateUnits:string[]
}
Примери за създаване и график:
{
"label":"Depot cap","locationId":3,"stackLevel":1,"purposeId":1,"kindId":1,
"recurrencyKindId":null,"validFrom":null,"validTo":null,"startSchedule":null,
"rateUnitId":1,"minChargingRate":6,
"schedule":[{"startPeriod":0,"limit":32,"numberOfPhases":3}]
}
{"rateUnitId":1,"periods":[{"startPeriod":0,"limit":16,"numberOfPhases":3}]}
Типове потребители
RFID = { id: PositiveInt, maskedUid: string, name: string|null, type: string, valid: boolean }
AccessItem = { id: PositiveInt, chargerId: PositiveInt, chargerName: string, expiresAt: DateTime|null, site: SiteRef|null }
Access = { allChargers: boolean, chargerIds: PositiveInt[], items: AccessItem[] }
Limit = { id: PositiveInt, limitTypeId: PositiveInt, label: string, energyValue: integer, timeValue: integer }
User = {
id: PositiveInt, membershipId: PositiveInt, name: string, email: string,
rfids: RFID[], access: AccessItem[], limitCount: integer
}
UserDetail = User & {
phone: string|null, createdAt: DateTime|null, limits: Limit[]
}
Vehicle = {
id: PositiveInt, name: string|null, provider: string|null, status: string|null,
vin: string|null, identifier: string|null, model: string|null,
batteryCapacityWh: number|null, createdAt: DateTime,
telemetry: { soc: number|null, chargeLimitSoc: number|null, recordedAt: DateTime|null }|null
}
LocalUser = {
id: PositiveInt, customerId: PositiveInt, name: string, email: string,
expiresAt: DateTime|null, systemManaged: boolean
}
LocalUserMutation = {
chargepointLocalUserId: PositiveInt,
customerId: PositiveInt,
expiryDate: DateTime|null,
customer: {} // `contractId` is removed by the workspace-admin response boundary
}
LocalUserUpdate = { id:PositiveInt, customerId:PositiveInt, expiresAt:DateTime|null }
Invitation = {
email:string, name:string, chargerIds:PositiveInt[], rfids:string[]
}
UserListResponse = {
items:User[], invitations:Invitation[], chargers:Array<{id:PositiveInt,name:string,identifier:string|null,site:SiteRef|null}>,
page:{ nextCursor:number|string|null, memberNextCursor:number|null, invitationNextCursor:string|null, limit:integer }
}
UserSession = {
id:PositiveInt, chargerId:PositiveInt, chargerName:string|null,
connectorId:PositiveInt, site:SiteRef|null, energyWh:number,
startedAt:DateTime|null, stoppedAt:DateTime|null
}
Отговорът за промяна при POST /chargers/:chargerId/local-users и резултатът за съществуващ клиент при POST /chargers/:chargerId/local-users/invitations връщат LocalUserMutation; PATCH /chargers/:chargerId/local-users/:localUserId връща LocalUserUpdate. Крайната точка за списък използва LocalUser. Клиентите трябва да ги третират като умишлено различни типове отговори.
Примери за потребители/покани/RFID/достъп:
{"email":"driver@example.com","name":"Example Driver"}
{
"email":"new.driver@example.com",
"name":"New Driver",
"rfid":"04AABBCCDD",
"allChargers":false,
"chargerIds":[11,12]
}
{"uid":"04AABBCCDD","name":"Blue card"}
{"allChargers":false,"chargerIds":[11,12]}
Успешните записи никога не връщат необработения RFID UID. Например:
{"rfid":{"id":31,"maskedUid":"******CCDD","name":"Blue card","type":"RFID","valid":true}}
Празни и двоични успешни тела
204означава липса на тяло на отговора.- Успешният QR отговор за станция е PNG байтове, а не JSON.
- Успешният експорт на отчет е CSV или PDF байтове, а не JSON.
- Вижте Договор за отговори и грешки за JSON телата, връщани при грешка на която и да е двоична крайна точка.
Останали примери за тела на заявки за промени
Пътищата в тази таблица само с примери са относителни спрямо /v2/admin; пълните пътища са в Справочник за крайни точки. По-дългите примери по-горе обхващат работни пространства, обекти, управление на мощността, създаване на станции/настройки на конектори, графици за отчети, тарифи/компоненти, профили/графици за зареждане, потребители/покани, RFID и замяна на достъп. Всяка друга промяна с тяло използва една от тези точни примерни структури:
| Крайна точка | Примерно JSON тяло |
|---|---|
PATCH /chargers/:chargerId | {"name":"Warehouse east","siteId":4,"invertedRfid":false,"smartMode":1,"automationDisabled":false}; приема се всяко непразно подмножество |
PATCH /chargers/:chargerId/credentials | {"password":"replacement-secret"} |
PATCH /chargers/:chargerId/public-listing | {"isPublic":true} |
PATCH /chargers/:chargerId/configuration | {"key":"HeartbeatInterval","value":"60"} |
POST /chargers/:chargerId/firmware | {"url":"https://firmware.example.com/charger-v2.bin"} |
POST /chargers/:chargerId/commands/reset | {"resetType":"Soft"} |
POST /chargers/:chargerId/commands/availability | {"availabilityType":"Operative"} |
POST /chargers/:chargerId/commands/trigger | {"messageType":"StatusNotification"} |
POST /chargers/:chargerId/commands/unlock | {"connectorId":1} |
POST /chargers/:chargerId/commands/composite-schedule | {"connectorId":0,"durationSeconds":86400,"chargingRateUnit":"W"} |
POST /chargers/:chargerId/tariff-assignments | {"tariffId":17,"connectorId":0} |
PATCH /chargers/:chargerId/tariff-assignments/:assignmentId | {"tariffId":17,"connectorId":1} |
POST или PATCH /chargers/:chargerId/profile-assignments[...] | {"profileId":8,"connectorId":1} |
PATCH /users/:userId | {"name":"Updated Driver"} |
POST /users/invitations/resend или DELETE /users/invitations | {"email":"new.driver@example.com"} |
PATCH /users/:userId/rfids/:rfidId | {"name":"Replacement label"}; null изчиства етикета |
POST /users/:userId/limits | {"limitTypeId":1,"energyValue":20000,"timeValue":0} |
PATCH /users/:userId/limits/:limitId | {"energyValue":25000} |
POST /chargers/:chargerId/local-users | {"customerId":42,"expiresAt":"2026-12-31T23:59:59Z"} |
POST /chargers/:chargerId/local-users/invitations или съответният му DELETE | {"email":"driver@example.com"} |
PATCH /chargers/:chargerId/local-users/:localUserId | {"expiresAt":null} |
Всички останали промени нямат тяло на заявката. Те все пак изискват точно една заглавка Idempotency-Key.
Допълнителни примери за успешни отговори
Празните списъци са валидни и правят обвивките на най-горно ниво недвусмислени:
{"items":[],"metricsWindow":{"from":"2026-05-26T00:00:00.000Z","to":"2026-08-24T00:00:00.000Z","sessionLimit":10000,"sessionsIncluded":0,"totalsCapped":false},"connectorLookups":{"formats":[],"types":[],"powerTypes":[]}}
{"items":[],"pageTotals":{"sessions":0,"energyWh":0,"durationSeconds":0,"costs":[]},"page":{"limit":50,"nextCursor":null},"range":{"from":"2026-07-01T00:00:00.000Z","to":"2026-08-01T00:00:00.000Z","toExclusive":true}}
{"status":"Accepted"}
{"status":"Accepted","connectorResults":[{"connectorId":1,"status":"Accepted"}]}
{"sent":true,"format":"csv","rowCount":12,"range":{"from":"2026-07-01T00:00:00.000Z","to":"2026-08-01T00:00:00.000Z"}}
{"items":[],"invitations":[],"chargers":[],"page":{"nextCursor":null,"memberNextCursor":null,"invitationNextCursor":null,"limit":50}}
За отговори с обекти заместете точно посочения DTO от разделите по-горе в обвивката от Справочник за крайни точки; например създаването на тарифа е { "tariff": Tariff }, на профил — { "profile": ChargingProfile }, а на потребител — { "user": User }.