Endpoints

Αιτήματα και αποκρίσεις endpoints Admin API χώρου εργασίας

Αυτή είναι η αναφορά αιτημάτων/αποκρίσεων για κάθε endpoint /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 πρέπει να είναι μεγαλύτερο από μηδέν κατά τη δημιουργία ορίου. Τα email περικόπτονται και γίνονται πεζά. Τα UID RFID γίνονται δεκτά μόνο σε εγγραφές και καλύπτονται στις αποκρίσεις ανάγνωσης.

Σύνοψη DTO απόκρισης

Οι πίνακες endpoints δείχνουν κάθε φάκελο απόκρισης ανώτατου επιπέδου. Αυτά είναι τα κύρια επαναχρησιμοποιήσιμα 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. Αντιμετωπίζετε άγνωστα πρόσθετα πεδία ως συμβατά με μελλοντικές εκδόσεις και διακλαδώστε μόνο σε τεκμηριωμένα σταθερά πεδία και κωδικούς σφαλμάτων.

Endpoints χώρου εργασίας

Μέθοδος και διαδρομήΠεδίο πρόσβασηςΑίτημαΑπόκριση επιτυχίας
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 }· όριο 1.000 συνεδριών σε 90 ημέρες

Endpoints τοποθεσίας και διαχείρισης ισχύος

Μέθοδος και διαδρομήΠεδίο πρόσβασηςΑίτημαΑπόκριση επιτυχίας
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 χωρίς εφαρμογή αντικατάστασης

Endpoints φορτιστών

Μέθοδος και διαδρομήΠεδίο πρόσβασηςΑίτημαΑπόκριση επιτυχίας
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 }

Endpoints αναφορών

Μέθοδος και διαδρομήΠεδίο πρόσβασηςΑίτημαΑπόκριση επιτυχίας
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· πάνω από 2.000 γραμμές επιστρέφουν 422 REPORT_EXPORT_ROW_LIMIT

Endpoints τιμολογίων

Μέθοδος και διαδρομήΠεδίο πρόσβασηςΑίτημαΑπόκριση επιτυχίας
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, μη αρνητική χρονική σήμανση Unix200 { 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.

Endpoints προφίλ φόρτισης

Μέθοδος και διαδρομήΠεδίο πρόσβασηςΑίτημαΑπόκριση επιτυχίας
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 εκθέτουν σταθερές πληροφορίες αιτήματος/κατάστασης και ποτέ διαπιστευτήρια.

Endpoints χρήστη, 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 } }· οι προσκλήσεις σελιδοποιούνται και συμπληρώνονται με ίδια κανονικοποιημένη έκφραση email ώστε παλιές διαφορές πεζών/κενών να μην κρύβουν γραμμές· οι δρομείς συνδέονται με χώρο και φίλτρο, δεν περιέχουν αναγνώσιμο email και επιστρέφονται αμετάβλητοι· οι δρομείς all προωθούν ανεξάρτητα τα ρεύματα μελών και προσκλήσεων
POST /v2/admin/usersusers:createΣώμα: UserCreate· ο πελάτης πρέπει να είναι ήδη εγγεγραμμένος201 { user: User }· άγνωστο email επιστρέφει μη αποκαλυπτικό σώμα 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 προστατεύεται από αυτές τις λειτουργίες. Αποτυχίες email πρόσκλησης επιστρέφουν ασφαλή κατάσταση παράδοσης χωρίς λεπτομέρειες SMTP· οι καλούντες επαναλαμβάνουν όταν το emailRetryReady είναι true.

Δυαδικές αποκρίσεις

Δύο ομάδες endpoints δεν επιστρέφουν JSON στην επιτυχία:

EndpointΤύπος περιεχομένουΣημαντικές κεφαλίδες
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

Τα σφάλματα δυαδικών endpoints παραμένουν JSON.