Kontrakt för svar och fel i Admin API
Den här filen kompletterar svarskontraktet för varje endpoint i Endpointreferens. Läs endpointraden för den lyckade svarskroppen och tabellerna nedan för varje gemensam eller endpointspecifik kropp vid fel. Som standard använder fel flera kompatibilitetsstrukturer; klienter kan välja en universell omslutning.
Valfri strukturerad felomslutning
Skicka den här anropsheadern till valfri endpoint:
X-Error-Format: envelope
Vid värdejämförelse tas omgivande blanksteg bort och ingen skillnad görs mellan gemener och versaler. Med exakt detta värde konverteras varje JSON-svar med status 400 eller högre till:
ErrorEnvelope = {
error: {
code: string,
message: string,
details: Record<string, unknown>,
requestId: string
}
}
Exempel på konvertering av en standardvalideringskropp:
{
"error": {
"code": "VALIDATION_FAILED",
"message": "Invalid request",
"details": {
"fields": {
"name": ["String must contain at least 1 character(s)"]
}
},
"requestId": "integration-42"
}
}
Konverteringsreglerna är exakta:
validationErrorsblirdetails.fieldsochcodeblirVALIDATION_FAILEDäven när standardkroppen också hade en domänkod.- Ett
codepå översta nivån i standardsvaret behålls när det inte finns några valideringsfält. - Andra egenskaper på översta nivån, utom
error,message,validationErrorsochcode, flyttas tilldetails; vid rapportexport blir exempelvislimittilldetails.limit. - Ett
errorav typen sträng på översta nivån blirmessage. Om det saknas används statuskodens reservtext. - Reservkoderna är
AUTH_REQUIRED(401),PERMISSION_DENIED(403),RESOURCE_NOT_FOUND(404),CONFLICT(409),VALIDATION_FAILED(422och andra oklassificerade4xx),RATE_LIMITED(429),EXTERNAL_PROVIDER_FAILED(502) ochINTERNAL_ERROR(övriga5xx, inklusive503). requestIdär den exaktaX-Request-Id-svarsheadern. Ett anrops-ID från klienten används bara när det matchar[A-Za-z0-9._:-]{1,128}efter att omgivande blanksteg har tagits bort; annars skapar servern ett UUID.
Omvandlingen ändrar inte status eller headrar utanför svarskroppen. Den gäller också idempotenta upprepningar enligt upprepningsanropets X-Error-Format-header. Binära framgångssvar förblir binära; deras JSON-fel omsluts. Övriga tabeller visar standardkropparna; reglerna ovan ger den andra möjliga svarskroppen för varje rad.
Svarsnotation
ValidationError = {
validationErrors: Record<string, string[]>,
code?: string
}
CodedError = {
error: string,
code: string,
// a route may add fields explicitly listed below
}
PlainError = { error: string }
error och valideringsmeddelanden är beskrivande text, inte en stabil programmatisk avskiljare. Basera logiken på code när den finns. Anropsvalidering returnerar 422 ValidationError; validering av ett helt objekt kan ge { "validationErrors": {} } när inget enskilt fält identifieras. Ogiltig JSON och oväntade fel returnerar det globala 500 PlainError som visas nedan.
Alla JSON-exempel visar exakta kroppsstrukturer. Text som visas som <message> är det returnerade validerings- eller åtgärdsmeddelandet och är en JSON-sträng, inte ett bokstavligt värde med vinkelparenteser.
Ordning för anropsbehandling
Anrop behandlas i den här ordningen:
- konfiguration och autentisering av arbetsytetoken;
- värdpolicy och anropsgränser för token/arbetsyta;
- filtrering efter aktuella rättigheter;
- idempotensvalidering och reservation för varje ändringsåtgärd;
- kontroll av endpointbehörigheter, anropsvalidering och den begärda åtgärden.
En ändringsbegäran med en giltig token men otillräckliga behörighetsområden måste därför fortfarande skicka Idempotency-Key. Ett slutfört ändringssvar med 403, 404, 409 eller 422 kan upprepas för samma nyckel och anrop.
Svar för autentisering, policy och anropsbegränsning
Dessa svar kan förekomma på varje registrerad /v2/admin-endpoint före endpointspecifik behandling.
| Status | När | Exakt kropp | Relevanta headrar |
|---|---|---|---|
401 | Saknad, duplicerad, kommaseparerad, icke-Bearer, felaktigt formaterad, okänd, utgången, återkallad eller på annat sätt ogiltig arbetsytetoken | { "error": "Unauthorized", "code": "INVALID_WORKSPACE_TOKEN" } | WWW-Authenticate: Bearer, Cache-Control: no-store |
404 | Token är giltig men arbetsytans värd saknar adminApiEnabled | { "error": "Not Found" } | Cache-Control: no-store |
429 | Anropskvoten för token eller arbetsytan är förbrukad | { "error": "Too many attempts. Please try again later." } | Retry-After: <seconds> |
503 | Autentisering av arbetsytetoken är tillfälligt otillgänglig | { "error": "Admin API workspace-token configuration is unavailable", "code": "WORKSPACE_API_CONFIG_UNAVAILABLE" } | — |
503 | Uppslagning av värdpolicy eller auktorisering av aktuella rättigheter misslyckas | { "error": "Workspace authorization is temporarily unavailable", "code": "WORKSPACE_AUTHORIZATION_UNAVAILABLE" } | — |
API-åtkomst ingår i alla planer. Om arbetsytans värd stänger av inställningen adminApiEnabled returneras 404; om en ytterligare funktionsrättighet försvinner tas endast berörda behörighetsområden bort. Den följande nekade behörigheten använder svaret nedan, inte ett flöde för att förnya token.
Fel i behörighetsområden, idempotens, tolkning, ägarskap och oväntade fel
| Gäller | Status | Exakt kropp | Headrar/anmärkningar |
|---|---|---|---|
| Varje rutt efter autentisering | 403 | { "error": "Insufficient workspace-token scope", "code": "INSUFFICIENT_SCOPE" } | Returneras när ett obligatoriskt behörighetsområde saknas. |
| Varje ändringsåtgärd | 400 | { "error": "Idempotency-Key is required for this operation", "code": "IDEMPOTENCY_KEY_REQUIRED" } | Ingen nyckel angiven. |
| Varje ändringsåtgärd | 400 | { "error": "Exactly one Idempotency-Key is required", "code": "INVALID_IDEMPOTENCY_KEY" } | Duplicerad eller kommaseparerad header. |
| Varje ändringsåtgärd | 400 | { "error": "Idempotency-Key must contain 1 to 255 visible characters", "code": "INVALID_IDEMPOTENCY_KEY" } | Tom, för lång eller innehåller ett kontrolltecken. |
| Varje ändringsåtgärd | 409 | { "error": "Idempotency-Key was already used with a different request", "code": "IDEMPOTENCY_CONFLICT" } | Samma token, metod, sökväg och nyckel men annan URL eller kropp. |
| Varje ändringsåtgärd | 409 | { "error": "Request is already processing", "code": "IDEMPOTENT_REQUEST_PROCESSING" } | Retry-After: 5. |
| Varje ändringsåtgärd | 409 | { "error": "Previous request outcome is unknown; verify its effects before attempting the operation again", "code": "IDEMPOTENCY_OUTCOME_UNKNOWN" } | Föregående behandlingsreservation löpte ut, anslutningen stängdes eller anropet avslutades med 5xx. |
| Varje ändringsåtgärd | 503 | { "error": "Idempotency storage unavailable", "code": "IDEMPOTENCY_UNAVAILABLE" } | API:et kan inte kontrollera eller spara idempotensposten. |
| Varje endpoint med ett ogiltigt schema för frågeparametrar, kropp eller sökväg | 422 | { "validationErrors": { "<field>": ["<message>"] } } | Flera fält eller meddelanden kan förekomma. Klienter får inte ange cpoId; arbetsytan kommer alltid från token. |
| Varje saknad underordnad arbetsyteresurs eller ID från en annan arbetsyta | 404 | { "error": "Workspace resource not found", "code": "RESOURCE_NOT_FOUND" } | Används konsekvent om inte en tabell nedan anger annat. |
| Varje endpoint med ett oväntat fel | 500 | { "error": "Something went wrong" } | Vid ändringsåtgärder ger ett senare nytt försök med samma nyckel 409 IDEMPOTENCY_OUTCOME_UNKNOWN. |
Resurs-ID:n i sökvägen måste vara positiva tal. Ett icke-positivt eller icke-numeriskt :siteId, :chargerId, :portId, :tariffId, :profileId, :assignmentId, :userId, :rfidId, :accessId, :limitId eller :localUserId returnerar 422 ValidationError, inte 400.
Fel för platser och effektstyrning
| Endpoints | Status | Exakt kropp |
|---|---|---|
| Skapa/uppdatera plats; validering av arbetsytefält | 422 | { "validationErrors": { "<field>": ["<message>"] } } |
DELETE /v2/admin/sites/:siteId när platsen har beroenden | 409 | { "error": "<message>", "code": "SITE_NOT_EMPTY" } |
GET /v2/admin/sites/geocode ogiltig normaliserad sökning | 400 | { "error": "<message>", "code": "INVALID_GEOCODE_QUERY" } |
| Samma samt full begränsad leverantörskö | 429 | { "error": "<message>", "code": "GEOCODING_BUSY" }; innehåller Retry-After när geokodaren anger den |
| Samma samt leverantörstimeout/fel eller oväntat geokodningsfel | 502 | { "error": "<message>", "code": "GEOCODING_UNAVAILABLE" }; ett oväntat fel använder Address search is temporarily unavailable |
PUT /v2/admin/sites/:siteId/power-management ogiltig topologi-/domänkonfiguration | 422 | { "error": "<message>", "code": "INVALID_POWER_MANAGEMENT_CONFIGURATION" } |
| Samma samt OCPP-avslag/timeout, samtidighets- eller avstämningskonflikt | 409 | { "error": "<message>", "code": "POWER_MANAGEMENT_CONFLICT" } |
Laddarfel
mapChargerErrors() används vid skapande/uppdatering av laddare, autentiseringsuppgifter, kontaktinställningar, publik listning, upplösning av QR-data, ändring/omläsning av konfiguration, firmwarestart, alla fyra grundkommandon och begäran om sammansatt schema.
| Endpoints | Status | Exakt kropp |
|---|---|---|
| Varje åtgärd ovan med ett domänvalideringsfel | 422 | { "validationErrors": { "<field>": ["<message>"] } } |
| Varje åtgärd ovan med konflikt kring tillstånd, unikhet, offline/OCPP, fakturering, Tagless, kontakt eller beredskap | 409 | { "error": "<message>", "code": "CHARGER_CONFLICT" } |
GET /chargers/:chargerId/sessions, ogiltigt standard- eller uttryckligt tidsintervall | 422 | { "validationErrors": { "from": ["from must be before or equal to to"] } } eller { "validationErrors": { "from": ["Session range cannot exceed 90 days"] } } |
Vanliga läsåtgärder returnerar endast de gemensamma svaren 401/403/404/429/500/503 samt 422 för validering av fråga och sökväg. Borttagning av en laddare kan returnera det gemensamma 500 PlainError om borttagningen misslyckas utan ett mer specifikt felsvar.
Rapportfel
| Endpoints | Status | Exakt kropp |
|---|---|---|
Data-/exportintervall där from >= to | 422 | { "validationErrors": { "range": ["from must be earlier than to"] } } |
| Data-/exportintervall över 90 dagar | 422 | { "validationErrors": { "range": ["Report ranges cannot exceed 90 days"] } } |
| Ogiltig ogenomskinlig markör för data/mätningar | 422 | { "validationErrors": { "cursor": ["<message>"] } } |
GET /reports/export, resultatet överstiger 2 000 rader | 422 | { "error": "<message>", "code": "REPORT_EXPORT_ROW_LIMIT", "limit": 2000 } |
POST /reports/send, inget sparat schema | 409 | { "error": "A workspace report schedule must be saved before sending", "code": "REPORT_SCHEDULE_REQUIRED" } |
| Samma samt avslag eller fel från e-posttjänsten | 502 | { "error": "Report delivery failed", "code": "REPORT_DELIVERY_FAILED" } |
| Ägd resurs för schema/mätningar saknas | 404 | gemensam RESOURCE_NOT_FOUND-kropp |
En lyckad export är binär; alla exportfel förblir JSON.
Tarifffel
| Endpoints | Status | Exakt kropp |
|---|---|---|
| Domänvalidering för skapande/uppdatering/komponenter/marknadspris/tilldelning | 422 | { "validationErrors": { "<field>": ["<message>"] } } |
| Konflikt vid tariffborttagning eller tilldelningens tillstånd, beroende eller unikhet | 409 | { "error": "<message>", "code": "TARIFF_CONFLICT" } |
| Bristande ägarskap för tariff, elområde, laddare, kontakt, tarifftilldelning eller annan underordnad resurs | 404 | gemensam RESOURCE_NOT_FOUND-kropp |
Fel för laddprofiler
| Endpoints | Status | Exakt kropp |
|---|---|---|
| Domänvalidering för skapande/uppdatering/schema/tilldelning | 422 | { "validationErrors": { "<field>": ["<message>"] } } |
| Profilen refereras av en skyddad användning | 409 | { "error": "<message>", "code": "CHARGING_PROFILE_IN_USE" } |
| Konflikt kring OCPP-synkronisering, tilldelning, samtidighet eller annan profilkonflikt | 409 | { "error": "<message>", "code": "CHARGING_PROFILE_CONFLICT" } |
| Bristande ägarskap för profil, laddare, kontakt, tilldelning eller annan underordnad resurs | 404 | gemensam RESOURCE_NOT_FOUND-kropp |
Användardomänfel
Användarvalideringsfel som identifierar ett fält använder ValidationError tillsammans med code; övriga användarfel använder CodedError. Alla fall av saknad resurs använder det gemensamma RESOURCE_NOT_FOUND-svaret som inte avslöjar resursens existens.
| Status | Kod(er) | Kropp |
|---|---|---|
400 | INVALID_USER_CURSOR | { "validationErrors": { "cursor": ["The user-list cursor is invalid for the selected status"] }, "code": "INVALID_USER_CURSOR" } |
409 | USER_ALREADY_EXISTS, CUSTOMER_CONTRACT_MISSING, INVITATION_EMAIL_IN_USE, RFID_ALREADY_EXISTS, ACCESS_ALREADY_EXISTS, ACCESS_ALL_ALREADY_EXISTS, LIMIT_ALREADY_EXISTS, LOCAL_USER_ALREADY_EXISTS, PROTECTED_WORKSPACE_USER, TAGLESS_USER_PROTECTED, USER_RELATED_DATA | { "error": "<message>", "code": "<listed code>" } |
422 | INVALID_EMAIL, INVALID_RFID, INVALID_LIMIT_TYPE, INVALID_LIMIT_VALUE | { "validationErrors": { "<field>": ["<message>"] }, "code": "<listed code>" } |
422 | NO_CHARGERS_AVAILABLE | { "error": "No chargers are available", "code": "NO_CHARGERS_AVAILABLE" } |
429 | INVITATION_RESEND_THROTTLED | { "error": "Invitation resend is temporarily unavailable", "code": "INVITATION_RESEND_THROTTLED" }; innehåller Retry-After |
503 | USER_CURSOR_UNAVAILABLE | { "error": "User pagination is temporarily unavailable", "code": "USER_CURSOR_UNAVAILABLE" } |
404 | RESOURCE_NOT_FOUND | { "error": "Workspace resource not found", "code": "RESOURCE_NOT_FOUND" } |
POST /users/invitations kan också returnera det gemensamma 403 INSUFFICIENT_SCOPE efter kroppstolkning om users:access saknas, eller om RFID angavs och users:rfid saknas. Endpoints för lokala användare listar alla obligatoriska behörighetsområden i Endpointreferens.
Användarfelkoderna gäller enligt följande:
| Endpointgrupp | Användardomänkoder utöver 404 och gemensamma svar |
|---|---|
GET /users | INVALID_USER_CURSOR (400), USER_CURSOR_UNAVAILABLE (503) |
POST /users | USER_ALREADY_EXISTS, TAGLESS_USER_PROTECTED (409) |
PATCH /users/:userId | TAGLESS_USER_PROTECTED (409) |
DELETE /users/:userId | TAGLESS_USER_PROTECTED, PROTECTED_WORKSPACE_USER, USER_RELATED_DATA (409) |
| Läsning av användaruppgifter, fordon, RFID/åtkomst/gränser | ingen domänkod utöver 404 |
| Skapa RFID | CUSTOMER_CONTRACT_MISSING, RFID_ALREADY_EXISTS, TAGLESS_USER_PROTECTED (409); INVALID_RFID (422) |
| Uppdatera/ta bort RFID | TAGLESS_USER_PROTECTED (409) |
| Ersättning av åtkomst | TAGLESS_USER_PROTECTED (409); NO_CHARGERS_AVAILABLE (422) |
| Återkallelse av åtkomst | TAGLESS_USER_PROTECTED (409) |
| Skapa/uppdatera gräns | TAGLESS_USER_PROTECTED, LIMIT_ALREADY_EXISTS (409); INVALID_LIMIT_TYPE, INVALID_LIMIT_VALUE (422) |
| Ta bort gräns | TAGLESS_USER_PROTECTED (409) |
| Skapa arbetsyteinbjudan | CUSTOMER_CONTRACT_MISSING, INVITATION_EMAIL_IN_USE, RFID_ALREADY_EXISTS, TAGLESS_USER_PROTECTED (409); INVALID_EMAIL/INVALID_RFID (422); INVITATION_RESEND_THROTTLED (429) när leveransväntetid gäller |
| Skicka om arbetsyteinbjudan | INVALID_EMAIL (422), INVITATION_RESEND_THROTTLED (429) |
| Avbryt arbetsyteinbjudan | INVALID_EMAIL (422) |
| Skapande av lokal laddaranvändare för befintlig kund | LOCAL_USER_ALREADY_EXISTS, TAGLESS_USER_PROTECTED (409) |
| Inbjudan till lokal laddaranvändare | LOCAL_USER_ALREADY_EXISTS, INVITATION_EMAIL_IN_USE, TAGLESS_USER_PROTECTED (409); INVALID_EMAIL (422); INVITATION_RESEND_THROTTLED (429) när leveransväntetid gäller |
| Avbryt inbjudan till lokal användare | INVALID_EMAIL (422) |
| Uppdatera/ta bort lokal användare | TAGLESS_USER_PROTECTED (409) |
Alla utfall för ägarskap och saknade resurser i dessa grupper, även en oregistrerad e-postadress i POST /users, använder den gemensamma svarskroppen 404 RESOURCE_NOT_FOUND.
Svar utan kropp och upprepade svar
Ett lyckat 204-svar saknar svarskropp. Det gäller varje dokumenterad borttagning som anger 204 empty. En slutförd idempotent upprepning sätter Idempotency-Replayed: true och använder sparad status och svarskropp; för 204 förblir HTTP-svaret utan kropp. API:et returnerar aldrig ett JSON-objekt för en lyckad dokumenterad 204-åtgärd.