Svar och fel

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:

  • validationErrors blir details.fields och code blir VALIDATION_FAILED även när standardkroppen också hade en domänkod.
  • Ett code på ö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, validationErrors och code, flyttas till details; vid rapportexport blir exempelvis limit till details.limit.
  • Ett error av typen sträng på översta nivån blir message. Om det saknas används statuskodens reservtext.
  • Reservkoderna är AUTH_REQUIRED (401), PERMISSION_DENIED (403), RESOURCE_NOT_FOUND (404), CONFLICT (409), VALIDATION_FAILED (422 och andra oklassificerade 4xx), RATE_LIMITED (429), EXTERNAL_PROVIDER_FAILED (502) och INTERNAL_ERROR (övriga 5xx, inklusive 503).
  • requestId är den exakta X-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:

  1. konfiguration och autentisering av arbetsytetoken;
  2. värdpolicy och anropsgränser för token/arbetsyta;
  3. filtrering efter aktuella rättigheter;
  4. idempotensvalidering och reservation för varje ändringsåtgärd;
  5. 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.

StatusNärExakt kroppRelevanta headrar
401Saknad, 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
404Token är giltig men arbetsytans värd saknar adminApiEnabled{ "error": "Not Found" }Cache-Control: no-store
429Anropskvoten för token eller arbetsytan är förbrukad{ "error": "Too many attempts. Please try again later." }Retry-After: <seconds>
503Autentisering av arbetsytetoken är tillfälligt otillgänglig{ "error": "Admin API workspace-token configuration is unavailable", "code": "WORKSPACE_API_CONFIG_UNAVAILABLE" }—
503Uppslagning 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ällerStatusExakt kroppHeadrar/anmärkningar
Varje rutt efter autentisering403{ "error": "Insufficient workspace-token scope", "code": "INSUFFICIENT_SCOPE" }Returneras när ett obligatoriskt behörighetsområde saknas.
Varje ändringsåtgärd400{ "error": "Idempotency-Key is required for this operation", "code": "IDEMPOTENCY_KEY_REQUIRED" }Ingen nyckel angiven.
Varje ändringsåtgärd400{ "error": "Exactly one Idempotency-Key is required", "code": "INVALID_IDEMPOTENCY_KEY" }Duplicerad eller kommaseparerad header.
Varje ändringsåtgärd400{ "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ärd409{ "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ärd409{ "error": "Request is already processing", "code": "IDEMPOTENT_REQUEST_PROCESSING" }Retry-After: 5.
Varje ändringsåtgärd409{ "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ärd503{ "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äg422{ "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 arbetsyta404{ "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 fel500{ "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

EndpointsStatusExakt kropp
Skapa/uppdatera plats; validering av arbetsytefält422{ "validationErrors": { "<field>": ["<message>"] } }
DELETE /v2/admin/sites/:siteId när platsen har beroenden409{ "error": "<message>", "code": "SITE_NOT_EMPTY" }
GET /v2/admin/sites/geocode ogiltig normaliserad sökning400{ "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 geokodningsfel502{ "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änkonfiguration422{ "error": "<message>", "code": "INVALID_POWER_MANAGEMENT_CONFIGURATION" }
Samma samt OCPP-avslag/timeout, samtidighets- eller avstämningskonflikt409{ "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.

EndpointsStatusExakt kropp
Varje åtgärd ovan med ett domänvalideringsfel422{ "validationErrors": { "<field>": ["<message>"] } }
Varje åtgärd ovan med konflikt kring tillstånd, unikhet, offline/OCPP, fakturering, Tagless, kontakt eller beredskap409{ "error": "<message>", "code": "CHARGER_CONFLICT" }
GET /chargers/:chargerId/sessions, ogiltigt standard- eller uttryckligt tidsintervall422{ "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

EndpointsStatusExakt kropp
Data-/exportintervall där from >= to422{ "validationErrors": { "range": ["from must be earlier than to"] } }
Data-/exportintervall över 90 dagar422{ "validationErrors": { "range": ["Report ranges cannot exceed 90 days"] } }
Ogiltig ogenomskinlig markör för data/mätningar422{ "validationErrors": { "cursor": ["<message>"] } }
GET /reports/export, resultatet överstiger 2 000 rader422{ "error": "<message>", "code": "REPORT_EXPORT_ROW_LIMIT", "limit": 2000 }
POST /reports/send, inget sparat schema409{ "error": "A workspace report schedule must be saved before sending", "code": "REPORT_SCHEDULE_REQUIRED" }
Samma samt avslag eller fel från e-posttjänsten502{ "error": "Report delivery failed", "code": "REPORT_DELIVERY_FAILED" }
Ägd resurs för schema/mätningar saknas404gemensam RESOURCE_NOT_FOUND-kropp

En lyckad export är binär; alla exportfel förblir JSON.

Tarifffel

EndpointsStatusExakt kropp
Domänvalidering för skapande/uppdatering/komponenter/marknadspris/tilldelning422{ "validationErrors": { "<field>": ["<message>"] } }
Konflikt vid tariffborttagning eller tilldelningens tillstånd, beroende eller unikhet409{ "error": "<message>", "code": "TARIFF_CONFLICT" }
Bristande ägarskap för tariff, elområde, laddare, kontakt, tarifftilldelning eller annan underordnad resurs404gemensam RESOURCE_NOT_FOUND-kropp

Fel för laddprofiler

EndpointsStatusExakt kropp
Domänvalidering för skapande/uppdatering/schema/tilldelning422{ "validationErrors": { "<field>": ["<message>"] } }
Profilen refereras av en skyddad användning409{ "error": "<message>", "code": "CHARGING_PROFILE_IN_USE" }
Konflikt kring OCPP-synkronisering, tilldelning, samtidighet eller annan profilkonflikt409{ "error": "<message>", "code": "CHARGING_PROFILE_CONFLICT" }
Bristande ägarskap för profil, laddare, kontakt, tilldelning eller annan underordnad resurs404gemensam 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.

StatusKod(er)Kropp
400INVALID_USER_CURSOR{ "validationErrors": { "cursor": ["The user-list cursor is invalid for the selected status"] }, "code": "INVALID_USER_CURSOR" }
409USER_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>" }
422INVALID_EMAIL, INVALID_RFID, INVALID_LIMIT_TYPE, INVALID_LIMIT_VALUE{ "validationErrors": { "<field>": ["<message>"] }, "code": "<listed code>" }
422NO_CHARGERS_AVAILABLE{ "error": "No chargers are available", "code": "NO_CHARGERS_AVAILABLE" }
429INVITATION_RESEND_THROTTLED{ "error": "Invitation resend is temporarily unavailable", "code": "INVITATION_RESEND_THROTTLED" }; innehåller Retry-After
503USER_CURSOR_UNAVAILABLE{ "error": "User pagination is temporarily unavailable", "code": "USER_CURSOR_UNAVAILABLE" }
404RESOURCE_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:

EndpointgruppAnvändardomänkoder utöver 404 och gemensamma svar
GET /usersINVALID_USER_CURSOR (400), USER_CURSOR_UNAVAILABLE (503)
POST /usersUSER_ALREADY_EXISTS, TAGLESS_USER_PROTECTED (409)
PATCH /users/:userIdTAGLESS_USER_PROTECTED (409)
DELETE /users/:userIdTAGLESS_USER_PROTECTED, PROTECTED_WORKSPACE_USER, USER_RELATED_DATA (409)
Läsning av användaruppgifter, fordon, RFID/åtkomst/gränseringen domänkod utöver 404
Skapa RFIDCUSTOMER_CONTRACT_MISSING, RFID_ALREADY_EXISTS, TAGLESS_USER_PROTECTED (409); INVALID_RFID (422)
Uppdatera/ta bort RFIDTAGLESS_USER_PROTECTED (409)
Ersättning av åtkomstTAGLESS_USER_PROTECTED (409); NO_CHARGERS_AVAILABLE (422)
Återkallelse av åtkomstTAGLESS_USER_PROTECTED (409)
Skapa/uppdatera gränsTAGLESS_USER_PROTECTED, LIMIT_ALREADY_EXISTS (409); INVALID_LIMIT_TYPE, INVALID_LIMIT_VALUE (422)
Ta bort gränsTAGLESS_USER_PROTECTED (409)
Skapa arbetsyteinbjudanCUSTOMER_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 arbetsyteinbjudanINVALID_EMAIL (422), INVITATION_RESEND_THROTTLED (429)
Avbryt arbetsyteinbjudanINVALID_EMAIL (422)
Skapande av lokal laddaranvändare för befintlig kundLOCAL_USER_ALREADY_EXISTS, TAGLESS_USER_PROTECTED (409)
Inbjudan till lokal laddaranvändareLOCAL_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ändareINVALID_EMAIL (422)
Uppdatera/ta bort lokal användareTAGLESS_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.