Αιτήματα και αποκρίσεις 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 | Πεδία |
|---|---|
Workspace | id, name, email, website, address { line1, line2, postalCode, city, state, countryId, countryCode, countryName }, createdAt, updatedAt |
Site | id, name, description, address, timezone { id, name }, latitude, longitude, chargerCount· οι λεπτομέρειες προσθέτουν κανονικοποιημένο chargers και κατάσταση υποδοχής |
GeocodeCandidate | placeId, displayName, latitude, longitude· διαπιστευτήρια και ειδικά μεταδεδομένα παρόχου δεν επιστρέφονται ποτέ |
MetricsWindow | from, to, όρια/πλήθη συνεδριών και totalsCapped όπου ισχύει |
Charger | id, name, identifier, cpoId, site, κανονικοποιημένο status, isPublic, σημαίες RFID/Smart/αυτοματισμού, provisioned, connection, evses, connectors, createdAt, updatedAt· οι λεπτομέρειες προσθέτουν κρυμμένο configuration, firmware και πλήθη |
Connector | portId, connectorId, ID αναφοράς υποδοχής, maxVoltage, maxAmperage, maxElectricPower |
ReportSession | id, φορτιστής/τοποθεσία, ID θύρας και υποδοχής, ελαχιστοποιημένος χρήστης, active, energyWh, έναρξη/λήξη/διάρκεια και καθαρό/φόρος/σύνολο ανά νόμισμα |
ReportSchedule | id, workspaceId, enabled, recipientEmail, format, UTC sendDay/sendTime, δημιουργία/ενημέρωση και ασφαλή μεταδεδομένα τελευταίας παράδοσης με πλήθος προσπαθειών |
Tariff | id, cpoId, name, αντικείμενα τύπου/τοποθεσίας/νομίσματος/ζώνης προσφορών, tax, fallbackPrice, ενεργό price, components, assignmentCount |
ChargingProfile | id, cpoId, label, description, stackLevel, αντικείμενα θέσης/σκοπού/είδους/επανάληψης/μονάδας ρυθμού, ισχύς, πρόγραμμα, assignmentCount, χρονικές σημάνσεις |
User | id, membershipId, name, email, καλυμμένο rfids, access φορτιστή, limitCount· οι λεπτομέρειες προσθέτουν phone, createdAt και limits. Διαπιστευτήρια εξουσιοδότησης OCPP όπως contractId δεν επιστρέφονται ποτέ. |
RFID | id, maskedUid, name, type, valid· ακατέργαστο UID δεν επιστρέφεται ποτέ |
Access | allChargers, ταξινομημένο chargerIds και items με μεταδεδομένα δικαιώματος/φορτιστή/τοποθεσίας/λήξης |
Limit | id, limitTypeId, label, energyValue, timeValue |
LocalUser | DTO λίστας: id, customerId, name, email, expiresAt, systemManaged. Οι μεταβολές τοπικών χρηστών χρησιμοποιούν χωριστές δομές LocalUserMutation/LocalUserUpdate στα Σχήματα και παραδείγματα. |
Οι διαδρομές λίστας/λεπτομερειών επιστρέφουν αντικείμενα αναφοράς για εύρεση έγκυρων ID. Αντιμετωπίζετε άγνωστα πρόσθετα πεδία ως συμβατά με μελλοντικές εκδόσεις και διακλαδώστε μόνο σε τεκμηριωμένα σταθερά πεδία και κωδικούς σφαλμάτων.
Endpoints χώρου εργασίας
| Μέθοδος και διαδρομή | Πεδίο πρόσβασης | Αίτημα | Απόκριση επιτυχίας |
|---|---|---|---|
GET /v2/admin | workspaces:read | Σώμα: κανένα | 200 { workspace: Workspace } |
PATCH /v2/admin | workspaces:update | Σώμα: WorkspacePatch | 200 { workspace: Workspace } |
GET /v2/admin/dashboard | workspaces:read + reports:read | Σώμα/ερώτημα: κανένα | 200 { window, stats { chargerCount, onlineChargerCount, siteCount, userCount }, sessions: DashboardSession[], analytics }· όριο 1.000 συνεδριών σε 90 ημέρες |
Endpoints τοποθεσίας και διαχείρισης ισχύος
| Μέθοδος και διαδρομή | Πεδίο πρόσβασης | Αίτημα | Απόκριση επιτυχίας |
|---|---|---|---|
GET /v2/admin/sites | sites:read | Σώμα/ερώτημα: κανένα | 200 { items: Site[], metricsWindow: MetricsWindow, lookups { countries, timezones } } |
GET /v2/admin/sites/geocode | sites: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/sites | sites:create | Σώμα: SiteInput | 201 { site: Site } |
GET /v2/admin/sites/:siteId | sites:read + reports:read | Σώμα/ερώτημα: κανένα | 200 { site: SiteDetail, recentSessions: SiteSession[], totals, metricsWindow } |
PATCH /v2/admin/sites/:siteId | sites:update | Σώμα: πλήρες SiteInput | 200 { site: Site } |
DELETE /v2/admin/sites/:siteId | sites:delete | Σώμα: κανένα | 204 empty· μη κενή τοποθεσία επιστρέφει 409 SITE_NOT_EMPTY |
GET /v2/admin/sites/:siteId/power-management | sites:power-management | Σώμα/ερώτημα: κανένα | 200 { configuration: PowerConfiguration } με ιδιόκτητη τοποθεσία, φορτιστές/υποδοχές, ομάδες, πηγές μετρητών, αναθέσεις και κατάσταση συμβατότητας |
PUT /v2/admin/sites/:siteId/power-management | sites:power-management | Σώμα: PowerConfigurationInput | 200 { configuration: PowerConfiguration }· άρνηση OCPP, λήξη χρόνου ή ταυτόχρονη αλλαγή επιστρέφει 409 POWER_MANAGEMENT_CONFLICT χωρίς εφαρμογή αντικατάστασης |
Endpoints φορτιστών
| Μέθοδος και διαδρομή | Πεδίο πρόσβασης | Αίτημα | Απόκριση επιτυχίας |
|---|---|---|---|
GET /v2/admin/chargers | chargers:read | Σώμα/ερώτημα: κανένα | 200 { items: Charger[], metricsWindow: MetricsWindow, connectorLookups { formats, types, powerTypes } } |
POST /v2/admin/chargers | chargers:create | Σώμα: ChargerCreate· το αναγνωριστικό γίνεται κεφαλαία | 201 { charger: Charger }· ο κωδικός δεν επιστρέφεται ποτέ |
GET /v2/admin/chargers/:chargerId | chargers:read | Σώμα/ερώτημα: κανένα | 200 { charger: ChargerDetail } |
PATCH /v2/admin/chargers/:chargerId | chargers:update | Σώμα: ChargerPatch | 200 { charger: ChargerDetail } |
DELETE /v2/admin/chargers/:chargerId | chargers:delete | Σώμα: κανένα | 204 empty |
PATCH /v2/admin/chargers/:chargerId/credentials | chargers:credentials | Σώμα: { password: string(0..40) } | 200 { success: true } |
PATCH /v2/admin/chargers/:chargerId/connectors/:portId | chargers:connector-settings | Σώμα: ConnectorPatch | 200 { connector: Connector } |
PATCH /v2/admin/chargers/:chargerId/public-listing | chargers:public | Σώμα: { isPublic: boolean } | 200 { isPublic: boolean }· ανεπαρκής ετοιμότητα επιστρέφει 409 CHARGER_CONFLICT |
GET /v2/admin/chargers/:chargerId/public-readiness | chargers:read | Σώμα/ερώτημα: κανένα | 200 { readiness: { ready, missingRequirements, connectorIds, missingTariffConnectorIds, ...commercialState } } |
GET /v2/admin/chargers/:chargerId/logs | chargers:read | Ερώτημα: cursor?, limit?=50 (1..200), from?, to?, action?, direction?, levelId? | 200 { items: RedactedOcppLog[], nextCursor: number or null } |
GET /v2/admin/chargers/:chargerId/sessions | chargers: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/qr | chargers:read | Ερώτημα: connector?: integer[0,255] | 200 image/png δυαδικό, 300 px, Content-Disposition: inline, Cache-Control: no-store |
GET /v2/admin/chargers/:chargerId/composite-schedules | chargers:read | Ερώτημα: cursor?, limit?=20 (1..50), connectorId? | 200 { items: CompositeSchedule[], nextCursor: number or null } |
GET /v2/admin/chargers/:chargerId/configuration | chargers:read | Σώμα/ερώτημα: κανένα | 200 { items: ChargerConfiguration[] }· οι τιμές που μοιάζουν με μυστικά είναι [REDACTED] |
PATCH /v2/admin/chargers/:chargerId/configuration | chargers:configuration | Σώμα: { key: string(1..50), value: string(0..500) } | 200 { status: string } όπου κατάσταση είναι το αποτέλεσμα φορτιστή/OCPP |
POST /v2/admin/chargers/:chargerId/configuration/reload | chargers:configuration | Σώμα: κανένα | 200 { status: string } |
GET /v2/admin/chargers/:chargerId/firmware | chargers:read | Σώμα/ερώτημα: κανένα | 200 { firmware: { status, notifiedAt, currentVersion, bootNotifiedAt } } |
POST /v2/admin/chargers/:chargerId/firmware | chargers:firmware | Σώμα: { url: HTTP-or-HTTPS URL, max 2048 characters } | 202 { status: string } |
POST /v2/admin/chargers/:chargerId/commands/reset | chargers:commands | Σώμα: { resetType: "Soft" or "Hard" } | 200 { status: string } |
POST /v2/admin/chargers/:chargerId/commands/availability | chargers:commands | Σώμα: { availabilityType: "Operative" or "Inoperative" } | 200 { status: string } |
POST /v2/admin/chargers/:chargerId/commands/trigger | chargers:commands | Σώμα: { messageType: "BootNotification", "Heartbeat", "StatusNotification", or "MeterValues" } | 200 { status: string, connectorResults: { connectorId, status }[] } |
POST /v2/admin/chargers/:chargerId/commands/unlock | chargers:commands | Σώμα: { connectorId: positive integer } | 200 { status: string } |
POST /v2/admin/chargers/:chargerId/commands/composite-schedule | chargers: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/data | reports:read | Ερώτημα: ReportFilters, αδιαφανές cursor?, limit?=50 (1..100) | 200 { items: ReportSession[], pageTotals, page { limit, nextCursor }, range { from, to, toExclusive: true } } |
GET /v2/admin/reports/schedule | reports:read | Σώμα/ερώτημα: κανένα | 200 { schedule: ReportSchedule or null } |
PUT /v2/admin/reports/schedule | reports:schedules | Σώμα: αυστηρό ReportScheduleInput | 200 { schedule: ReportSchedule } |
POST /v2/admin/reports/send | reports:send | Σώμα: κανένα· η κεφαλίδα Idempotency-Key είναι υποχρεωτική | 200 { sent: true, format: "csv" or "pdf", rowCount: number, range { from, to } }· απουσία αποθηκευμένου προγράμματος επιστρέφει 409 REPORT_SCHEDULE_REQUIRED |
GET /v2/admin/reports/measurements | reports:read | Ερώτημα: απαιτούμενο transactionLogId, αδιαφανές cursor?, limit?=500 (1..1000) | 200 { transactionLogId, measurements: { name, unit, lines[] }[], page { limit, nextCursor, sampleValuesTruncated, sampleLimitPerMeterValue: 64 } } |
GET /v2/admin/reports/export | reports: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/tariffs | tariffs:read | Σώμα/ερώτημα: κανένα | 200 { items: Tariff[], lookups { currencies, biddingZones, currencyRates, componentTypes, seasons, tariffTypes } } |
POST /v2/admin/tariffs | tariffs:create | Σώμα: TariffInput | 201 { tariff: Tariff } |
GET /v2/admin/tariffs/:tariffId | tariffs:read | Σώμα/ερώτημα: κανένα | 200 { tariff: Tariff, lookups } |
PATCH /v2/admin/tariffs/:tariffId | tariffs:update | Σώμα: πλήρες TariffInput | 200 { tariff: Tariff } |
PUT /v2/admin/tariffs/:tariffId/components | tariffs:components | Σώμα: { components: TariffComponentInput[0..256] } | 200 { tariff: Tariff, components: TariffComponent[] } |
DELETE /v2/admin/tariffs/:tariffId | tariffs:delete | Σώμα: κανένα | 204 empty· αναφορές σε εγγραφές φόρτισης επιστρέφουν 409 TARIFF_CONFLICT |
GET /v2/admin/tariffs/:tariffId/market-prices | tariffs:read | Ερώτημα: απαιτούμενο startsAt, μη αρνητική χρονική σήμανση Unix | 200 { items: { id, value, currencyId, startsAt, endsAt, startsAtIso, endsAtIso, intervalMinutes }[], truncated: boolean }· έως 10.000 γραμμές |
GET /v2/admin/chargers/:chargerId/tariff-assignments | chargers:tariff-assignments + tariffs:read | Σώμα/ερώτημα: κανένα | 200 { items: TariffAssignment[], tariffs: Tariff[] } |
POST /v2/admin/chargers/:chargerId/tariff-assignments | chargers:tariff-assignments + tariffs:assign | Σώμα: TariffAssignmentCreateInput· παράλειψη connectorId ή connectorId=0 σημαίνει όλες τις υποδοχές | 201 { assignments: TariffAssignment[] } |
PATCH /v2/admin/chargers/:chargerId/tariff-assignments/:assignmentId | chargers:tariff-assignments + tariffs:assign | Σώμα: TariffAssignmentUpdateInput· η υποδοχή απαιτείται και δεν μπορεί να είναι 0 | 200 { assignment: TariffAssignment } |
DELETE /v2/admin/chargers/:chargerId/tariff-assignments/:assignmentId | chargers:tariff-assignments + tariffs:assign | Σώμα: κανένα | 204 empty |
Το TariffAssignment περιέχει id, chargerId, connectorId, ασφαλή σύνοψη τιμολογίου/νομίσματος, createdAt και updatedAt.
Endpoints προφίλ φόρτισης
| Μέθοδος και διαδρομή | Πεδίο πρόσβασης | Αίτημα | Απόκριση επιτυχίας |
|---|---|---|---|
GET /v2/admin/charging-profiles | chargingProfiles:read | Σώμα/ερώτημα: κανένα | 200 { items: ChargingProfile[], lookups { locations, purposes, kinds, recurrencyKinds, rateUnits, allowedRateUnits } } |
POST /v2/admin/charging-profiles | chargingProfiles:create | Σώμα: ChargingProfileCreate | 201 { profile: ChargingProfile } |
GET /v2/admin/charging-profiles/:profileId | chargingProfiles:read | Σώμα/ερώτημα: κανένα | 200 { profile: ChargingProfile, lookups, isEditBlocked: boolean, usage { simpleChargingSchedule, smartSchedule, chargePoolChargepoint, isUsed } } |
PATCH /v2/admin/charging-profiles/:profileId | chargingProfiles:update | Σώμα: πλήρες ChargingProfileInput | 200 { profile: ChargingProfile, ocppSync: OcppCommandResult[] } |
PUT /v2/admin/charging-profiles/:profileId/schedule | chargingProfiles:update | Σώμα: ChargingScheduleInput | 200 { profile: ChargingProfile, schedule: SchedulePeriod[], ocppSync: OcppCommandResult[] } |
DELETE /v2/admin/charging-profiles/:profileId | chargingProfiles:delete | Σώμα: κανένα | 204 empty μόνο αφού όλοι οι ανατεθειμένοι φορτιστές δεχτούν εκκαθάριση και επανεπικυρωθεί η κατάσταση· αλλιώς 409 και το προφίλ μένει |
GET /v2/admin/chargers/:chargerId/profile-assignments | chargers:profile-assignments + chargingProfiles:read | Σώμα/ερώτημα: κανένα | 200 { items: ProfileAssignment[], profiles: ChargingProfile[] } |
POST /v2/admin/chargers/:chargerId/profile-assignments | chargers:profile-assignments + chargingProfiles:assign | Σώμα: ProfileAssignmentInput | 201 { assignment: ProfileAssignment, ocpp: OcppCommandResult } |
PATCH /v2/admin/chargers/:chargerId/profile-assignments/:assignmentId | chargers:profile-assignments + chargingProfiles:assign | Σώμα: ProfileAssignmentInput | 200 { assignment: ProfileAssignment, ocpp: OcppCommandResult } |
DELETE /v2/admin/chargers/:chargerId/profile-assignments/:assignmentId | chargers:profile-assignments + chargingProfiles:assign | Σώμα: κανένα | 204 empty μετά συγχρονισμένη εκκαθάριση |
Το ProfileAssignment περιέχει ID ανάθεσης, ID φορτιστή/υποδοχής και ασφαλή σύνοψη προφίλ. Τα αποτελέσματα OCPP εκθέτουν σταθερές πληροφορίες αιτήματος/κατάστασης και ποτέ διαπιστευτήρια.
Endpoints χρήστη, RFID, πρόσβασης, ορίων και τοπικού χρήστη
| Μέθοδος και διαδρομή | Πεδίο πρόσβασης | Αίτημα | Απόκριση επιτυχίας |
|---|---|---|---|
GET /v2/admin/users | users: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/users | users:create | Σώμα: UserCreate· ο πελάτης πρέπει να είναι ήδη εγγεγραμμένος | 201 { user: User }· άγνωστο email επιστρέφει μη αποκαλυπτικό σώμα 404 RESOURCE_NOT_FOUND και πρέπει να χρησιμοποιεί προσκλήσεις |
POST /v2/admin/users/invitations | users:invitations + users:access· επίσης users:rfid αν παρέχεται rfid | Σώμα: InvitationInput | 200 or 201 { result }· το αποτέλεσμα σύνδεσης είναι { kind:"attached", user, accessChanged, rfidChanged }· το εκκρεμές { kind:"invited", email, name, maskedRfid, chargerIds, createdCount, emailSent, emailRetryReady, alreadyInvited } |
POST /v2/admin/users/invitations/resend | users:invitations | Σώμα: { email: email } | 200 { result: { targetedChargers, emailSent, emailRetryReady } }· επιβάλλεται καθολικός χρόνος αναμονής παραλήπτη |
DELETE /v2/admin/users/invitations | users:invitations | Σώμα: { email: email } | 204 empty |
GET /v2/admin/users/:userId | users:read + reports:read | Σώμα/ερώτημα: κανένα | 200 { user: UserDetail, sessions: UserSession[], totals { count, energyWh, durationSeconds }, window, limitTypes, chargers }· έως 200 συνεδρίες σε 90 ημέρες |
PATCH /v2/admin/users/:userId | users:update | Σώμα: { name: string(1..255) } | 200 { user: User } |
DELETE /v2/admin/users/:userId | users:delete | Σώμα: κανένα | 204 empty |
GET /v2/admin/users/:userId/vehicles | users:read | Ερώτημα: αριθμητικό cursor?, limit?=50 (1..100) | 200 { items: Vehicle[], page { nextCursor, limit } }· το DTO οχήματος έχει ασφαλή πεδία παρόχου/κατάστασης/μοντέλου/τηλεμετρίας |
GET /v2/admin/users/:userId/rfids | users:read | Σώμα/ερώτημα: κανένα | 200 { items: RFID[] }· τα UID καλύπτονται |
POST /v2/admin/users/:userId/rfids | users:rfid | Σώμα: { uid: string(1..36), name?: string or null } | 201 { rfid: RFID }· το ακατέργαστο UID δεν επιστρέφεται |
PATCH /v2/admin/users/:userId/rfids/:rfidId | users:rfid | Σώμα: { name: string or null } | 200 { rfid: RFID } |
DELETE /v2/admin/users/:userId/rfids/:rfidId | users:rfid | Σώμα: κανένα | 204 empty |
GET /v2/admin/users/:userId/access | users:read | Σώμα/ερώτημα: κανένα | 200 { access: Access } |
PUT /v2/admin/users/:userId/access | users:access | Σώμα: AccessInput | 200 { access: Access } |
DELETE /v2/admin/users/:userId/access/:accessId | users:access | Σώμα: κανένα | 204 empty |
GET /v2/admin/users/:userId/limits | users:read | Σώμα/ερώτημα: κανένα | 200 { items: Limit[] } |
POST /v2/admin/users/:userId/limits | users:limits | Σώμα: LimitCreate | 201 { limit: Limit } |
PATCH /v2/admin/users/:userId/limits/:limitId | users:limits | Σώμα: LimitPatch, τουλάχιστον μία ιδιότητα | 200 { limit: Limit } |
DELETE /v2/admin/users/:userId/limits/:limitId | users:limits | Σώμα: κανένα | 204 empty |
GET /v2/admin/chargers/:chargerId/local-users | chargers:read + users:read | Σώμα/ερώτημα: κανένα | 200 { charger: ChargerSummary, items: LocalUser[], invitations: { email }[], availableMembers: [] }· το API σκόπιμα παραλείπει τον ευρύ κατάλογο διαθέσιμων μελών πύλης |
POST /v2/admin/chargers/:chargerId/local-users | chargers:local-users + users:access | Σώμα: { customerId: positive integer, expiresAt?: RFC3339 or null } | 201 { localUser: LocalUserMutation } |
POST /v2/admin/chargers/:chargerId/local-users/invitations | chargers: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/invitations | chargers:local-users + users:invitations | Σώμα: { email: email } | 204 empty |
PATCH /v2/admin/chargers/:chargerId/local-users/:localUserId | chargers:local-users + users:access | Σώμα: { expiresAt: RFC3339 or null } | 200 { localUser: LocalUserUpdate } |
DELETE /v2/admin/chargers/:chargerId/local-users/:localUserId | chargers:local-users + users:access | Σώμα: κανένα | 204 empty |
Ο χρήστης συστήματος Tagless προστατεύεται από αυτές τις λειτουργίες. Αποτυχίες email πρόσκλησης επιστρέφουν ασφαλή κατάσταση παράδοσης χωρίς λεπτομέρειες SMTP· οι καλούντες επαναλαμβάνουν όταν το emailRetryReady είναι true.
Δυαδικές αποκρίσεις
Δύο ομάδες endpoints δεν επιστρέφουν JSON στην επιτυχία:
| Endpoint | Τύπος περιεχομένου | Σημαντικές κεφαλίδες |
|---|---|---|
| QR φορτιστή | image/png | Cache-Control: no-store, Content-Disposition: inline, X-Content-Type-Options: nosniff |
| Εξαγωγή αναφοράς | text/csv; charset=utf-8 ή application/pdf | Cache-Control: private, no-store, Content-Disposition: attachment, X-Content-Type-Options: nosniff |
Τα σφάλματα δυαδικών endpoints παραμένουν JSON.