API de administrare a spațiului de lucru
API-ul de administrare a spațiului de lucru permite integrărilor server-la-server să administreze un singur spațiu de lucru EVCharge. Documentația este destinată administratorilor spațiilor de lucru și integratorilor API externi. Folosește tokenuri de acces revocabile, legate de spațiul de lucru, și domenii de acces detaliate; tokenurile de autentificare ale clienților și sesiunile de browser nu sunt acceptate.
Acest director este referința canonică pentru dezvoltatori a API-ului /v2/admin implementat de app-api. Nu documentează rutele pentru clienți/mobile sau rutele HTTP proprii ale portalului de administrare.
- Cererile și răspunsurile endpointurilor enumeră toate cele 87 de endpointuri înregistrate, domeniile de acces, parametrii, corpurile cererilor și corpurile de succes.
- Scheme și exemple definește tipurile reutilizabile de cereri/răspunsuri și corpurile JSON reprezentative.
- Contractul de răspunsuri și erori definește fiecare corp de nereușită comun și specific endpointurilor.
URL de bază și limita resurselor
Toate rutele sunt relative la originea implementată app-api:
https://api.evcharge.mobi/v2/admin/...
ID-ul spațiului de lucru nu este acceptat în URL, șirul de interogare sau corpul cererii. Fiecare token de acces este legat de exact un spațiu de lucru, iar API-ul derivă cpoId din identitatea tokenului autentificat. Dacă o locație, stație, utilizator, tarif, profil, atribuire sau tranzacție imbricată nu aparține acelui spațiu de lucru, API-ul returnează același răspuns 404 RESOURCE_NOT_FOUND care nu permite enumerarea resurselor.
Obținerea unui token de acces
Un administrator uman al spațiului de lucru creează tokenuri în Setările spațiului de lucru, la Acces API. Gestionarea tokenurilor nu este expusă intenționat tokenurilor spațiului de lucru.
- Accesul API este inclus în fiecare plan, inclusiv Free. Administratorul trebuie să aibă permisiunea de editare a spațiului de lucru.
- Gazda spațiului de lucru trebuie să activeze API-ul de administrare prin
adminApiEnabled; altfel, un token valid primește un404care nu permite enumerarea de laapp-api. - Administratorul poate acorda doar domenii de acces permise de propriile permisiuni curente și drepturile spațiului de lucru.
- Tokenurile noi pot să nu expire (setarea implicită din Setările spațiului de lucru) sau pot avea o durată în zile întregi aleasă de administrator, între 1 și 365 de zile; serverul calculează momente absolute finite de expirare. Tokenurile fără expirare rămân valide până la revocare.
- Un spațiu de lucru poate avea cel mult 50 de tokenuri active.
- Credențialul în clar este afișat o singură dată. Stochează-l imediat într-un manager de secrete.
- Numele, domeniile de acces și expirarea sunt imuabile. Pentru rotație, creează un înlocuitor, implementează-l, verifică-l și revocă tokenul vechi.
- Revocarea este imediată; rândurile revocate rămân vizibile ca istoric imuabil și redactat al spațiului de lucru și nu există endpoint de introspecție a tokenurilor bearer sau de ștergere definitivă.
app-api nu are un endpoint care emite, reîmprospătează, listează sau revocă aceste credențiale. Obținerea tokenului este, așadar, o condiție prealabilă realizată prin portalul uman de administrare, nu un alt endpoint din această referință.
Nu pune niciodată tokenul în controlul versiunilor, URL-uri, șiruri de interogare, cookie-uri, jurnale, analize sau rapoarte de eroare.
Autentificare
Trimite exact un antet în stil RFC 6750 la fiecare cerere:
Authorization: Bearer evc_ws_<selector>.<secret>
Credențialul opac exact este evc_ws_ urmat de un selector base64url canonic de 16 caractere, . și un secret base64url canonic de 43 de caractere. Trimite credențialul complet exact cum este; nu îl codifica din nou în base64.
API-ul respinge antetele de autorizare duplicate, valorile unite prin virgule, alte scheme, valorile bearer goale, JWT-urile clienților și datele de autentificare furnizate în altă parte decât în acest antet.
Tokenurile malformate, necunoscute, expirate, revocate sau nevalide din alte motive primesc toate același răspuns:
HTTP/1.1 401 Unauthorized
WWW-Authenticate: Bearer
Cache-Control: no-store
Content-Type: application/json
{
"error": "Unauthorized",
"code": "INVALID_WORKSPACE_TOKEN"
}
Serviciul verifică starea tokenului și drepturile curente ale spațiului de lucru la fiecare cerere. Eliminarea unui drept poate, așadar, dezactiva domeniile afectate înainte de expirarea tokenului.
Tokenurile spațiului de lucru sunt credențiale opace, nu JWT-uri. Nu au token de reîmprospătare și nu există endpoint de reîmprospătare. Un token finit nu mai autentifică la momentul absolut expiresAt; un token fără expirare rămâne valid până la revocare. Rotația înseamnă crearea unui credențial înlocuitor în portal, implementarea lui în client și revocarea celui vechi.
Convenții pentru cereri
- Folosește
Content-Type: application/jsonpentru cereri cu corp JSON. - Spațiile de la capetele valorilor opționale de cerere
X-Request-Idsunt eliminate, iar valorile sunt acceptate doar dacă au 1–128 de caractere dinA-Z,a-z,0-9,.,_,:sau-; altfel serverul generează un UUID. Fiecare răspuns returnează valoarea aleasă caX-Request-Id. - Opțiunea
X-Error-Format: envelopeconvertește fiecare răspuns de eroare JSON în anvelopa structurată documentată în Contractul de răspunsuri și erori. Orice altă valoare păstrează corpul implicit de compatibilitate. - ID-urile din parametrii căii sunt numere întregi pozitive. ID-urile tokenurilor de acces returnate de portal sunt șiruri zecimale deoarece reprezintă valori de bază de date pe 64 de biți fără semn.
- Valorile de dată și oră sunt șiruri RFC 3339 cu un decalaj explicit, de exemplu
2026-08-13T12:30:00Z. - Ștergerile reușite returnează de obicei
204 No Content. - Operațiunile de creare returnează de obicei
201 Created. - O activitate OCPP care a fost doar pusă în coadă poate returna
202 Accepted; nu interpreta acest lucru ca pe o confirmare a stației, decât dacă răspunsul o spune explicit. - Răspunsurile autentificate folosesc
Cache-Control: no-store. Endpointurile QR și de export al rapoartelor returnează corpuri binare cu antete explicite de conținut. - Originile de browser permise pot citi
X-Request-Id,Idempotency-Replayed,Retry-AfterșiContent-Dispositionprin CORS. Astfel, clienții de browser pot corela cereri, detecta reluări idempotente, respecta intervalele de reîncercare și păstra numele fișierelor descărcate alese de server.
Idempotență
Toate cererile administrative POST, PUT, PATCH și DELETE trebuie să includă un antet Idempotency-Key. Cheile conțin 1–255 de caractere vizibile și sunt limitate la token, metodă și cale.
Idempotency-Key: provisioning-2026-08-13-site-42
Reutilizarea unei chei finalizate cu URL și corp identice reia răspunsul stocat și adaugă:
Idempotency-Replayed: true
Reutilizarea unei chei cu o cerere diferită returnează 409 IDEMPOTENCY_CONFLICT. O cerere încă în curs de procesare returnează 409 IDEMPOTENT_REQUEST_PROCESSING cu Retry-After: 5.
Răspunsurile finalizate și rezultatele terminale sunt păstrate pentru reluare sau reconciliere timp de șapte zile de la ultima actualizare. După această perioadă, aceeași cheie poate fi tratată ca o comandă nouă, deci clienții trebuie să folosească chei unice global și să nu le reutilizeze intenționat.
Dacă expiră o rezervare de procesare, conexiunea se închide după începerea execuției sau operațiunea returnează o eroare de server, API-ul nu poate demonstra în siguranță dacă s-a produs un efect extern. În intervalul de păstrare de șapte zile, cheia este definitiv nedeterminată și returnează 409 IDEMPOTENCY_OUTCOME_UNKNOWN; nu este recuperată și nu este executată din nou automat. Verifică efectele operațiunii înainte de o recuperare manuală și nu trimite aceeași operațiune cu o cheie nouă până când reconcilierea nu este încheiată.
Toate endpointurile administrative care modifică date, inclusiv POST /reports/send, necesită Idempotency-Key.
Limite de rată
Limitele se aplică atât tokenului individual, cât și spațiului său de lucru. Valorile implicite din cod sunt:
| Limită | Implicit |
|---|---|
| Interval | 60 de secunde |
| Per token | 300 de cereri |
| Per spațiu de lucru | 1.000 de cereri |
O cerere limitată returnează 429 Too Many Requests și un antet Retry-After. Implementările pot suprascrie aceste valori.
Erori
Erorile JSON folosesc un code stabil când apelantul trebuie să distingă între cazuri:
{
"error": "Insufficient workspace-token scope",
"code": "INSUFFICIENT_SCOPE"
}
Erorile de validare folosesc tablouri de câmpuri:
{
"validationErrors": {
"name": ["String must contain at least 1 character(s)"]
}
}
Stările frecvente sunt:
| Stare | Semnificație |
|---|---|
400 | Contract nevalid de idempotență/cursor utilizator/geocodificare; erorile de schemă pentru cale/corp/interogare sunt de obicei 422 |
401 | Token nevalid al spațiului de lucru |
403 | Token valid fără domeniul de acces efectiv sau dreptul necesar |
404 | Spațiul de lucru sau resursa imbricată nu este vizibilă acestui token |
409 | Conflict de stare a resursei, dependență, concurență sau idempotență |
422 | Eroare de validare a câmpului, intervalului limitat sau limitei de export |
429 | Limita de rată a tokenului sau spațiului de lucru a fost depășită |
502 | O operațiune ulterioară, precum livrarea raportului, a eșuat |
503 | Stocarea autorizării sau idempotenței este temporar indisponibilă |
Catalogul domeniilor de acces
Catalogul de domenii de acces de mai jos este folosit când un administrator creează un token. Un domeniu de scriere sau cu impact mare poate implica domeniul de citire corespunzător, dar domeniile de citire nu acordă niciodată scriere. Domeniile disponibile depind de permisiunile administratorului și de funcțiile activate ale spațiului de lucru.
| Domeniu | Domenii de acces pentru citire | Domenii de acces pentru scriere și cu impact mare | Drept suplimentar, unde este cazul |
|---|---|---|---|
| Spațiu de lucru | workspaces:read | workspaces:update | — |
| Locații | sites:read | sites:create, sites:update, sites:delete, sites:power-management | dlmPowerManagement pentru gestionarea puterii |
| Stații de încărcare | chargers:read | chargers:create, chargers:update, chargers:delete, chargers:credentials, chargers:configuration, chargers:firmware, chargers:commands, chargers:public, chargers:connector-settings, chargers:local-users, chargers:tariff-assignments, chargers:profile-assignments | firmwareOperations, publicCharging, tariffs sau smartCharging pentru capacitatea corespunzătoare |
| Utilizatori | users:read | users:create, users:update, users:delete, users:invitations, users:rfid, users:access, users:limits | — |
| Profiluri de încărcare | chargingProfiles:read | chargingProfiles:create, chargingProfiles:update, chargingProfiles:delete, chargingProfiles:assign | smartCharging |
| Tarife | tariffs:read | tariffs:create, tariffs:update, tariffs:delete, tariffs:components, tariffs:assign | tariffs |
| Rapoarte | reports:read | reports:export, reports:schedules, reports:send | scheduledReports pentru programe și trimitere imediată |
Accesul API în sine este inclus în fiecare plan și este controlat de setarea adminApiEnabled a gazdei. Drepturile suplimentare la funcțiile de mai sus se aplică în continuare; accesul API nu acordă funcții din afara planului spațiului de lucru.
Referința endpointurilor
Tabelele de mai jos enumeră toate cele 87 de rute de administrare a spațiului de lucru. Toate domeniile de acces dintr-o celulă cu mai multe sunt obligatorii.
Spațiu de lucru
| Metodă | Cale | Domeniu de acces obligatoriu | Scop |
|---|---|---|---|
GET | /v2/admin | workspaces:read | Citește metadate sigure și date de referință ale spațiului de lucru. |
PATCH | /v2/admin | workspaces:update | Actualizează unul sau mai multe câmpuri de metadate ale spațiului de lucru. |
GET | /v2/admin/dashboard | workspaces:read + reports:read | Citește numărători limitate ale spațiului de lucru și agregate operaționale pe 90 de zile. |
Câmpuri de actualizare parțială a spațiului de lucru: name, email, website, addressLine1, addressLine2, postalCode, city, state și countryId. Este necesar cel puțin un câmp. Șirurile goale care pot fi null sunt normalizate la null.
Locații și gestionarea puterii
| Metodă | Cale | Domeniu de acces obligatoriu | Scop |
|---|---|---|---|
GET | /v2/admin/sites | sites:read | Listează locațiile cu rezumate limitate la 90 de zile și date de referință pentru locații. |
GET | /v2/admin/sites/geocode | sites:read | Caută adrese candidate normalizate ale locației prin serviciul comun de geocodificare, cu limitare și cache. |
POST | /v2/admin/sites | sites:create | Creează o locație. |
GET | /v2/admin/sites/:siteId | sites:read + reports:read | Citește detaliile locației, sesiunile recente, totalurile și agregatele operaționale. |
PATCH | /v2/admin/sites/:siteId | sites:update | Înlocuiește documentul editabil al locației. |
DELETE | /v2/admin/sites/:siteId | sites:delete | Șterge o locație goală; dependențele returnează un conflict. |
GET | /v2/admin/sites/:siteId/power-management | sites:power-management | Citește arborele de management dinamic al sarcinii al locației. |
PUT | /v2/admin/sites/:siteId/power-management | sites:power-management | Înlocuiește atomic configurația de gestionare a puterii locației. |
Corpurile de creare și actualizare parțială ale locațiilor folosesc:
{
"name": "Main depot",
"description": null,
"addressLine1": "1 Example Street",
"addressLine2": null,
"postalCode": "LV-1001",
"city": "Riga",
"state": null,
"countryId": 1,
"timezoneId": 1,
"latitude": 56.9496,
"longitude": 24.1052
}
Geocodificarea locațiilor acceptă câmpurile opționale de interogare street, city, state, country și countryCode din două litere, plus antetul de cerere Accept-Language. Căutarea combinată de stradă/oraș/stat trebuie să conțină cel puțin două caractere. Răspunsurile conțin doar placeId, displayName, latitude și longitude; nu sunt expuse datele de autentificare și metadatele specifice furnizorului. Serverul aplică coada comună a furnizorului de o cerere pe secundă, limita de timp de opt secunde, cache-ul limitat de 24 de ore și limitele globale de rată ale tokenurilor spațiului de lucru.
Gestionarea puterii acceptă { "pools": [...] }. Un grup are id, name, limit, opțional meterSources și children recursiv. Un element copil de tip stație are chargepointId și priority. API-ul limitează dimensiunea arborelui și numărul contoarelor și efectuează ștergere/revalidare OCPP în două faze când înlocuiește starea instalată. O modificare refuzată, expirată sau afectată de concurență returnează 409 POWER_MANAGEMENT_CONFLICT, păstrând configurația precedentă.
Stații de încărcare
| Metodă | Cale | Domeniu de acces obligatoriu | Scop sau date de intrare |
|---|---|---|---|
GET | /v2/admin/chargers | chargers:read | Listează stațiile cu stare și rezumate limitate de energie/cost. |
POST | /v2/admin/chargers | chargers:create | Creează din name, identifier și siteId; password este opțional. |
GET | /v2/admin/chargers/:chargerId | chargers:read | Citește date despre stație, EVSE, conector, referințe și stare. |
PATCH | /v2/admin/chargers/:chargerId | chargers:update | Actualizează name, siteId, invertedRfid, smartMode sau automationDisabled. |
DELETE | /v2/admin/chargers/:chargerId | chargers:delete | Șterge o stație conform regulilor de dependență și facturare. |
PATCH | /v2/admin/chargers/:chargerId/credentials | chargers:credentials | Înlocuiește parola stației cu { "password": "..." }. |
PATCH | /v2/admin/chargers/:chargerId/connectors/:portId | chargers:connector-settings | Actualizează formatul/tipul conectorului, tipul de putere, tensiunea, amperajul și limitele de putere. |
PATCH | /v2/admin/chargers/:chargerId/public-listing | chargers:public | Setează `{ "isPublic": true |
GET | /v2/admin/chargers/:chargerId/public-readiness | chargers:read | Citește starea de pregătire pentru încărcarea publică și cerințele lipsă. |
GET | /v2/admin/chargers/:chargerId/logs | chargers:read | Citește jurnale OCPP redactate și paginate prin cursor. |
GET | /v2/admin/chargers/:chargerId/sessions | chargers:read + reports:read | Citește sesiuni de încărcare paginate și totaluri. |
GET | /v2/admin/chargers/:chargerId/qr | chargers:read | Generează un QR PNG de 300 de pixeli; opțional connector=0..255. |
GET | /v2/admin/chargers/:chargerId/composite-schedules | chargers:read | Citește istoricul persistent al programului compozit. |
GET | /v2/admin/chargers/:chargerId/configuration | chargers:read | Citește configurația OCPP cu valorile sensibile redactate. |
PATCH | /v2/admin/chargers/:chargerId/configuration | chargers:configuration | Trimite o modificare de configurație cu key și value. |
POST | /v2/admin/chargers/:chargerId/configuration/reload | chargers:configuration | Solicită o configurație nouă a stației. |
GET | /v2/admin/chargers/:chargerId/firmware | chargers:read | Citește firmware-ul curent și starea actualizării. |
POST | /v2/admin/chargers/:chargerId/firmware | chargers:firmware | Pune în coadă o actualizare de la un { "url": "..." } HTTP(S). |
POST | /v2/admin/chargers/:chargerId/commands/reset | chargers:commands | Trimite `{ "resetType": "Soft" |
POST | /v2/admin/chargers/:chargerId/commands/availability | chargers:commands | Trimite `{ "availabilityType": "Operative" |
POST | /v2/admin/chargers/:chargerId/commands/trigger | chargers:commands | Declanșează BootNotification, Heartbeat, StatusNotification sau MeterValues. |
POST | /v2/admin/chargers/:chargerId/commands/unlock | chargers:commands | Deblochează un connectorId pozitiv. |
POST | /v2/admin/chargers/:chargerId/commands/composite-schedule | chargers:commands | Solicită un program compozit pentru connectorId, durationSeconds și chargingRateUnit. |
Parametrii de interogare ai jurnalelor stației sunt cursor, limit (implicit 50, maximum 200), from, to, action, direction și levelId. Parametrii sesiunilor sunt page, limit (implicit 25, maximum 100), from, to și customerId (un ID pozitiv sau unknown). Istoricul programului compozit folosește cursor, limit (implicit 20, maximum 50) și opțional connectorId.
Rapoarte
| Metodă | Cale | Domeniu de acces obligatoriu | Scop |
|---|---|---|---|
GET | /v2/admin/reports/data | reports:read | Citește date filtrate ale rapoartelor sesiunilor de încărcare, paginate prin cursor. |
GET | /v2/admin/reports/measurements | reports:read | Citește valori limitate de contor pentru o tranzacție deținută. |
GET | /v2/admin/reports/export | reports:export | Descarcă un export CSV sau PDF. |
GET | /v2/admin/reports/schedule | reports:read | Citește programul de export deținut de spațiul de lucru sau null. |
PUT | /v2/admin/reports/schedule | reports:schedules | Creează sau înlocuiește programul de export deținut de spațiul de lucru. |
POST | /v2/admin/reports/send | reports:send | Trimite prin email exportul salvat al lunii calendaristice UTC precedente; este necesară cheia de idempotență. |
Filtrele pentru datele rapoartelor și export sunt from, to, siteId, chargerId, userId, anonymous și active. from/to au implicit ultimul interval de 90 de zile și nu pot depăși 90 de zile. userId nu poate fi combinat cu anonymous=true.
- Paginarea datelor:
cursoropac, implicitlimit=50, maximum 100. - Măsurători:
transactionLogIdobligatoriu,cursoropac, implicitlimit=500, maximum 1.000. - Export:
format=csv|pdf, implicitcsv, limită strictă de 2.000 de rânduri. - Răspunsurile de export folosesc
Content-Disposition: attachment,Cache-Control: private, no-storeșiX-Content-Type-Options: nosniff.
Corpul programului:
{
"enabled": true,
"recipientEmail": "reports@example.com",
"format": "csv",
"sendDay": 5,
"sendTime": "08:30"
}
sendDay este între 1 și 28, iar sendTime este interpretat în UTC. Planificatorul recuperează o minută programată ratată în luna curentă de livrare. Generările eșuate înainte de predare sunt reîncercate după 5 și 10 minute, o revendicare building întreruptă poate fi recuperată după 30 de minute, iar livrarea automată se oprește după trei încercări. Planificatorul persistă indeterminate imediat înainte de predarea către SMTP; atât indeterminate, cât și starea veche sending sunt terminale, deoarece reîncercarea automată a oricăreia ar putea trimite un atașament duplicat. Operatorii trebuie să reconcilieze manual aceste rezultate înainte de a modifica starea programului. Fiecare execuție selectează cel mult zece programe, nu mai începe activități după un buget de 45 de secunde și folosește limite de timp SMTP stricte. Sarcina este dezactivată implicit și trebuie activată explicit după validarea SMTP și a capacității. Programul API este deținut de spațiul de lucru, nu folosește identitatea persoanei care a creat tokenul.
Tarife
| Metodă | Cale | Domeniu de acces obligatoriu | Scop |
|---|---|---|---|
GET | /v2/admin/tariffs | tariffs:read | Listează tarifele și datele de referință. |
POST | /v2/admin/tariffs | tariffs:create | Creează un tarif. |
GET | /v2/admin/tariffs/:tariffId | tariffs:read | Citește un tarif deținut și componentele acestuia. |
PATCH | /v2/admin/tariffs/:tariffId | tariffs:update | Actualizează definiția tarifului. |
PUT | /v2/admin/tariffs/:tariffId/components | tariffs:components | Înlocuiește atomic până la 256 de componente. |
DELETE | /v2/admin/tariffs/:tariffId | tariffs:delete | Șterge un tarif neutilizat. |
GET | /v2/admin/tariffs/:tariffId/market-prices | tariffs:read | Citește prețurile pentru zona de ofertare deținută de tarif de la startsAt numeric. |
GET | /v2/admin/chargers/:chargerId/tariff-assignments | chargers:tariff-assignments + tariffs:read | Listează atribuirile tarifelor stației. |
POST | /v2/admin/chargers/:chargerId/tariff-assignments | chargers:tariff-assignments + tariffs:assign | Atribuie un tarif. |
PATCH | /v2/admin/chargers/:chargerId/tariff-assignments/:assignmentId | chargers:tariff-assignments + tariffs:assign | Înlocuiește ținta unei atribuiri. |
DELETE | /v2/admin/chargers/:chargerId/tariff-assignments/:assignmentId | chargers:tariff-assignments + tariffs:assign | Elimină o atribuire. |
Corpul unui tarif conține name, exact unul dintre currencyId, currencyCode sau currency, opțional biddingZoneId și tax. Corpul unei atribuiri este:
{ "tariffId": 17, "connectorId": 0 }
La crearea unei atribuiri, tariful se aplică tuturor conectorilor fizici dacă connectorId este omis sau setat explicit la 0. Actualizările de atribuire vizează o singură atribuire persistentă și necesită, prin urmare, un connectorId fizic pozitiv explicit; 0 este respins.
O componentă conține typeId, seasonId, câmpul opțional priority, câmpul obligatoriu price și limite opționale de valabilitate pentru lună, ziua săptămânii și oră.
Profiluri de încărcare
| Metodă | Cale | Domeniu de acces obligatoriu | Scop |
|---|---|---|---|
GET | /v2/admin/charging-profiles | chargingProfiles:read | Listează profilurile și datele de referință deținute. |
POST | /v2/admin/charging-profiles | chargingProfiles:create | Creează un profil cu un program opțional. |
GET | /v2/admin/charging-profiles/:profileId | chargingProfiles:read | Citește un profil deținut. |
PATCH | /v2/admin/charging-profiles/:profileId | chargingProfiles:update | Înlocuiește metadatele profilului. |
PUT | /v2/admin/charging-profiles/:profileId/schedule | chargingProfiles:update | Înlocuiește programul cu 1–256 de perioade. |
DELETE | /v2/admin/charging-profiles/:profileId | chargingProfiles:delete | Șterge atribuirile instalate și elimină doar după rezultate OCPP acceptate și revalidare. |
GET | /v2/admin/chargers/:chargerId/profile-assignments | chargers:profile-assignments + chargingProfiles:read | Listează atribuirile profilurilor stației. |
POST | /v2/admin/chargers/:chargerId/profile-assignments | chargers:profile-assignments + chargingProfiles:assign | Atribuie și sincronizează un profil. |
PATCH | /v2/admin/chargers/:chargerId/profile-assignments/:assignmentId | chargers:profile-assignments + chargingProfiles:assign | Înlocuiește și sincronizează o atribuire. |
DELETE | /v2/admin/chargers/:chargerId/profile-assignments/:assignmentId | chargers:profile-assignments + chargingProfiles:assign | Șterge de pe stație și elimină o atribuire. |
Câmpurile de metadate ale profilului sunt label, locationId, stackLevel, purposeId, kindId, opțional recurrencyKindId, validFrom, validTo, startSchedule, rateUnitId și opțional minChargingRate. O perioadă de program conține startPeriod, limit și opțional numberOfPhases. Corpul unei atribuiri conține profileId și connectorId (implicit 0).
Ștergerea profilurilor și înlocuirea gestionării puterii pot aștepta confirmarea stației. Un refuz, o expirare sau o modificare concurentă a stării returnează un conflict și păstrează configurația bazei de date, fără a pretinde că stația a fost golită.
Utilizatori, invitații, RFID, acces și limite
| Metodă | Cale | Domeniu de acces obligatoriu | Scop |
|---|---|---|---|
GET | /v2/admin/users | users:read | Listează membrii și invitațiile. |
POST | /v2/admin/users | users:create | Asociază un client deja înregistrat prin email și name al spațiului de lucru. |
POST | /v2/admin/users/invitations | users:invitations + users:access; și users:rfid când este furnizat RFID | Invită o adresă de email necunoscută sau asociază un client existent. |
POST | /v2/admin/users/invitations/resend | users:invitations | Retrimite folosind { "email": "..." }, cu respectarea intervalului de așteptare al destinatarului. |
DELETE | /v2/admin/users/invitations | users:invitations | Anulează o invitație; adresa de email rămâne în corpul JSON. |
GET | /v2/admin/users/:userId | users:read + reports:read | Citește detaliile utilizatorului și totaluri limitate ale sesiunilor. |
PATCH | /v2/admin/users/:userId | users:update | Setează name de afișare specific spațiului de lucru. |
DELETE | /v2/admin/users/:userId | users:delete | Elimină membrul și accesul asociat la spațiul de lucru, sub rezerva conflictelor. |
GET | /v2/admin/users/:userId/vehicles | users:read | Listează vehiculele deținute. |
GET | /v2/admin/users/:userId/rfids | users:read | Listează metadatele RFID cu UID-uri mascate. |
POST | /v2/admin/users/:userId/rfids | users:rfid | Adaugă uid și, opțional, name; răspunsurile expun doar UID-ul mascat. |
PATCH | /v2/admin/users/:userId/rfids/:rfidId | users:rfid | Actualizează eticheta RFID. |
DELETE | /v2/admin/users/:userId/rfids/:rfidId | users:rfid | Șterge un RFID și sincronizează stațiile afectate. |
GET | /v2/admin/users/:userId/access | users:read | Citește permisiunile de acces la stații. |
PUT | /v2/admin/users/:userId/access | users:access | Înlocuiește accesul folosind allChargers și chargerIds unic. |
DELETE | /v2/admin/users/:userId/access/:accessId | users:access | Revocă un rând de acces. |
GET | /v2/admin/users/:userId/limits | users:read | Listează limitele de încărcare. |
POST | /v2/admin/users/:userId/limits | users:limits | Creează limitTypeId, energyValue și/sau timeValue. |
PATCH | /v2/admin/users/:userId/limits/:limitId | users:limits | Actualizează unul sau mai multe câmpuri de limită. |
DELETE | /v2/admin/users/:userId/limits/:limitId | users:limits | Șterge o limită. |
GET | /v2/admin/chargers/:chargerId/local-users | chargers:read + users:read | Listează utilizatorii locali ai stației și invitațiile în așteptare. |
POST | /v2/admin/chargers/:chargerId/local-users | chargers:local-users + users:access | Adaugă un customerId existent cu expiresAt opțional. |
POST | /v2/admin/chargers/:chargerId/local-users/invitations | chargers:local-users + users:invitations + users:access | Adaugă sau invită prin email. |
DELETE | /v2/admin/chargers/:chargerId/local-users/invitations | chargers:local-users + users:invitations | Anulează o invitație de utilizator local prin email. |
PATCH | /v2/admin/chargers/:chargerId/local-users/:localUserId | chargers:local-users + users:access | Setează expiresAt, care poate fi null. |
DELETE | /v2/admin/chargers/:chargerId/local-users/:localUserId | chargers:local-users + users:access | Elimină accesul local și sincronizează starea OCPP. |
Paginarea vehiculelor și paginarea utilizatorilor status=members folosesc un cursor numeric pozitiv. Paginile invitațiilor folosesc un cursor opac i2.*, iar status=all folosește un cursor compozit opac a2.* după prima pagină (un cursor numeric rămâne valid doar ca o continuare veche a fluxului de membri). Căutarea utilizatorilor este furnizată în antetul de cerere X-Admin-User-Search, astfel încât adresele de email să nu apară în URL-uri sau jurnale de acces. limit are implicit 50 și este limitat la 100; listarea utilizatorilor acceptă status=all|members|invitations. Tratează toate cursoarele returnate ca opace și returnează-le nemodificate.
Crearea directă a unui utilizator nu creează parolă, identitate de autentificare sau sesiune. Ea doar asociază un client deja înregistrat. Folosește endpointul de invitații pentru o adresă de email necunoscută. Utilizatorul de sistem Tagless protejat nu poate fi modificat prin aceste rute.
Exemple
Setează valorile în shell fără a afișa tokenul:
export ADMIN_API_BASE_URL="https://api.example.com"
export WORKSPACE_TOKEN="<read from secret manager>"
Listează locațiile:
curl --fail-with-body \
-H "Authorization: Bearer ${WORKSPACE_TOKEN}" \
"${ADMIN_API_BASE_URL}/v2/admin/sites"
Creează o locație în siguranță:
curl --fail-with-body \
-X POST \
-H "Authorization: Bearer ${WORKSPACE_TOKEN}" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: site-main-depot-v1" \
--data '{
"name":"Main depot",
"description":null,
"addressLine1":"1 Example Street",
"addressLine2":null,
"postalCode":"LV-1001",
"city":"Riga",
"state":null,
"countryId":1,
"timezoneId":1,
"latitude":56.9496,
"longitude":24.1052
}' \
"${ADMIN_API_BASE_URL}/v2/admin/sites"
Descarcă un raport CSV pentru un interval UTC explicit:
curl --fail-with-body \
-H "Authorization: Bearer ${WORKSPACE_TOKEN}" \
-o report.csv \
"${ADMIN_API_BASE_URL}/v2/admin/reports/export?format=csv&from=2026-07-01T00%3A00%3A00Z&to=2026-08-01T00%3A00%3A00Z"
Excluderi deliberate
API-ul tokenurilor de spațiu de lucru nu expune operațiuni care necesită o identitate umană sau o autoritate mai largă. Acestea includ:
- crearea, afișarea, rotirea sau revocarea tokenurilor folosind alt token;
- autentificare, resetarea parolei, sesiuni, delegarea rolurilor sau privilegiilor umane și schimbarea proprietarului spațiului de lucru;
- crearea/ștergerea spațiilor de lucru și apartenența la contul de facturare;
- setări de plată, înregistrarea Stripe, planuri, facturi și facturarea gazdei;
- operațiuni de asistență la nivel de gazdă și webhookuri ale furnizorilor;
- notificări pentru oameni, redirecționări de navigare, resurse de marcă și rute de dezvoltare/test.