Antwoorden en fouten

Antwoord- en foutcontract van de beheer-API

Dit bestand vult het antwoordcontract aan voor elk eindpunt in Eindpuntreferentie. Lees de eindpuntrij voor de succesbody en de onderstaande tabellen voor elke gedeelde of eindpuntspecifieke body bij mislukking. Fouten gebruiken standaard meerdere compatibiliteitsstructuren; aanroepende toepassingen kunnen één universeel omhulsel kiezen.

Optioneel gestructureerd foutomhulsel

Stuur deze verzoekheader naar een willekeurig eindpunt:

X-Error-Format: envelope

Bij het vergelijken van waarden worden spaties aan het begin en einde genegeerd en wordt geen onderscheid gemaakt tussen hoofdletters en kleine letters. Met die exacte waarde wordt elk JSON-antwoord met status 400 of hoger omgezet naar:

ErrorEnvelope = {
  error: {
    code: string,
    message: string,
    details: Record<string, unknown>,
    requestId: string
  }
}

Voorbeeld van de conversie van een standaardvalidatiebody:

{
  "error": {
    "code": "VALIDATION_FAILED",
    "message": "Invalid request",
    "details": {
      "fields": {
        "name": ["String must contain at least 1 character(s)"]
      }
    },
    "requestId": "integration-42"
  }
}

De conversieregels zijn exact:

  • validationErrors wordt details.fields en code wordt VALIDATION_FAILED, ook als de standaardbody een domeincode bevatte.
  • Een standaardwaarde voor code op het hoogste niveau blijft behouden als er geen validatievelden zijn.
  • Andere eigenschappen op het hoogste niveau, behalve error, message, validationErrors en code, worden naar details verplaatst; limit van een rapportexport wordt bijvoorbeeld details.limit.
  • Een tekenreeks error op het hoogste niveau wordt message. Als die ontbreekt, wordt de standaardmelding voor de status gebruikt.
  • De terugvalcodes zijn AUTH_REQUIRED (401), PERMISSION_DENIED (403), RESOURCE_NOT_FOUND (404), CONFLICT (409), VALIDATION_FAILED (422 en andere niet-geclassificeerde 4xx), RATE_LIMITED (429), EXTERNAL_PROVIDER_FAILED (502) en INTERNAL_ERROR (andere 5xx, waaronder 503).
  • requestId is de exacte X-Request-Id-antwoordheader. Een door de aanroeper opgegeven verzoek-ID wordt alleen gebruikt als deze na het verwijderen van spaties aan het begin en einde voldoet aan [A-Za-z0-9._:-]{1,128}; anders genereert de server een UUID.

Deze omzetting verandert de status of headers die niet op de body betrekking hebben niet. Ze geldt ook voor idempotente herhalingen op basis van de X-Error-Format-header van het herhalingsverzoek. Binaire succesantwoorden blijven binair; hun JSON-fouten worden in een omhulsel geplaatst. De overige tabellen tonen de standaardbodies; toepassing van bovenstaande regels geeft voor elke rij de andere mogelijke antwoordbody.

Antwoordnotatie

ValidationError = {
  validationErrors: Record<string, string[]>,
  code?: string
}

CodedError = {
  error: string,
  code: string,
  // a route may add fields explicitly listed below
}

PlainError = { error: string }

error en de tekst van validatieberichten zijn beschrijvend en geen stabiele programmatische onderscheidingscriteria. Baseer beslissingen op code wanneer die aanwezig is. Verzoekvalidatie retourneert 422 ValidationError; validatie van een volledig object kan { "validationErrors": {} } opleveren als geen afzonderlijk veld wordt aangewezen. Ongeldige JSON en onverwachte fouten retourneren de hieronder getoonde globale 500 PlainError.

Alle JSON-voorbeelden tonen de exacte bodystructuur. Tekst die als <message> wordt weergegeven, is het geretourneerde validatie- of bewerkingsbericht en is een JSON-tekenreeks, geen letterlijke waarde tussen punthaken.

Verwerkingsvolgorde van verzoeken

Verzoeken worden in deze volgorde verwerkt:

  1. configuratie en authenticatie van werkruimtetokens;
  2. beleid van de aanbieder en verzoeklimieten voor token/werkruimte;
  3. filtering op huidige functierechten;
  4. voor elke mutatie: idempotentievalidatie en claim;
  5. scopecontroles van het eindpunt, verzoekvalidatie en de gevraagde bewerking.

Een mutatie met een geldig token dat onvoldoende scopes heeft, moet dus nog steeds Idempotency-Key versturen. Een voltooid 403-, 404-, 409- of 422-mutatieantwoord kan met dezelfde sleutel en hetzelfde verzoek worden herhaald.

Antwoorden voor authenticatie, beleid en verzoeklimieten

Deze antwoorden kunnen bij elk geregistreerd /v2/admin-eindpunt optreden vóór de eindpuntspecifieke verwerking.

StatusWanneerExacte bodyRelevante headers
401Ontbrekend, dubbel, met komma's samengevoegd, niet-Bearer, onjuist gevormd, onbekend, verlopen, ingetrokken of anderszins ongeldig werkruimtetoken{ "error": "Unauthorized", "code": "INVALID_WORKSPACE_TOKEN" }WWW-Authenticate: Bearer, Cache-Control: no-store
404Het token is geldig, maar de aanbieder van de werkruimte heeft geen adminApiEnabled{ "error": "Not Found" }Cache-Control: no-store
429Het verzoekbudget per token of per werkruimte is uitgeput{ "error": "Too many attempts. Please try again later." }Retry-After: <seconds>
503Authenticatie met werkruimtetoken is tijdelijk niet beschikbaar{ "error": "Admin API workspace-token configuration is unavailable", "code": "WORKSPACE_API_CONFIG_UNAVAILABLE" }—
503Het opvragen van aanbiederbeleid of de autorisatie van huidige functierechten mislukt{ "error": "Workspace authorization is temporarily unavailable", "code": "WORKSPACE_AUTHORIZATION_UNAVAILABLE" }—

API-toegang is inbegrepen in elk abonnement. Als de instelling adminApiEnabled van de werkruimteaanbieder wordt uitgeschakeld, volgt 404; als een aanvullend functierecht vervalt, verdwijnen alleen de bijbehorende scopes. De resulterende scopeweigering gebruikt het onderstaande antwoord, geen tokenvernieuwingsprocedure.

Fouten in scope, idempotentie, parsing, eigendom en onverwachte fouten

Van toepassing opStatusExacte bodyHeaders/opmerkingen
Elke route na authenticatie403{ "error": "Insufficient workspace-token scope", "code": "INSUFFICIENT_SCOPE" }Wordt geretourneerd als een vereiste scope ontbreekt.
Elke mutatie400{ "error": "Idempotency-Key is required for this operation", "code": "IDEMPOTENCY_KEY_REQUIRED" }Geen sleutel opgegeven.
Elke mutatie400{ "error": "Exactly one Idempotency-Key is required", "code": "INVALID_IDEMPOTENCY_KEY" }Dubbele header of met komma's samengevoegde header.
Elke mutatie400{ "error": "Idempotency-Key must contain 1 to 255 visible characters", "code": "INVALID_IDEMPOTENCY_KEY" }Leeg, te lang of bevat een besturingsteken.
Elke mutatie409{ "error": "Idempotency-Key was already used with a different request", "code": "IDEMPOTENCY_CONFLICT" }Hetzelfde token/dezelfde methode/hetzelfde pad/dezelfde sleutel, maar een andere URL of body.
Elke mutatie409{ "error": "Request is already processing", "code": "IDEMPOTENT_REQUEST_PROCESSING" }Retry-After: 5.
Elke mutatie409{ "error": "Previous request outcome is unknown; verify its effects before attempting the operation again", "code": "IDEMPOTENCY_OUTCOME_UNKNOWN" }De vorige verwerkingsreservering is verlopen, de verbinding is gesloten of het verzoek is voltooid met een 5xx.
Elke mutatie503{ "error": "Idempotency storage unavailable", "code": "IDEMPOTENCY_UNAVAILABLE" }De API kan het idempotentierecord niet controleren of opslaan.
Elk eindpunt met een ongeldig query-, body- of padschema422{ "validationErrors": { "<field>": ["<message>"] } }Er kunnen meerdere velden/berichten aanwezig zijn. Aanroepende toepassingen kunnen geen cpoId opgeven; de werkruimte komt altijd uit het token.
Elke ontbrekende geneste werkruimteresource of ID uit een andere werkruimte404{ "error": "Workspace resource not found", "code": "RESOURCE_NOT_FOUND" }Wordt consequent gebruikt, tenzij een onderstaande tabel anders vermeldt.
Elk eindpunt met een onverwachte fout500{ "error": "Something went wrong" }Bij mutaties levert een latere herhaling met dezelfde sleutel 409 IDEMPOTENCY_OUTCOME_UNKNOWN op.

Resourcepad-ID's moeten positieve getallen zijn. Een niet-positieve of niet-numerieke :siteId, :chargerId, :portId, :tariffId, :profileId, :assignmentId, :userId, :rfidId, :accessId, :limitId of :localUserId retourneert 422 ValidationError, niet 400.

Fouten voor locaties en vermogensbeheer

EindpuntenStatusExacte body
Locatie aanmaken/bijwerken; veldvalidatie van de werkruimte422{ "validationErrors": { "<field>": ["<message>"] } }
DELETE /v2/admin/sites/:siteId wanneer de locatie afhankelijkheden heeft409{ "error": "<message>", "code": "SITE_NOT_EMPTY" }
GET /v2/admin/sites/geocode ongeldige genormaliseerde zoekopdracht400{ "error": "<message>", "code": "INVALID_GEOCODE_QUERY" }
Hetzelfde, begrensde wachtrij van de provider is vol429{ "error": "<message>", "code": "GEOCODING_BUSY" }; bevat Retry-After als de geocoder deze levert
Hetzelfde, time-out/storing van provider of onverwachte geocoderfout502{ "error": "<message>", "code": "GEOCODING_UNAVAILABLE" }; een onverwachte fout gebruikt Address search is temporarily unavailable
PUT /v2/admin/sites/:siteId/power-management ongeldige topologie-/domeinconfiguratie422{ "error": "<message>", "code": "INVALID_POWER_MANAGEMENT_CONFIGURATION" }
Hetzelfde, OCPP-weigering/time-out, gelijktijdige wijziging of afstemmingsconflict409{ "error": "<message>", "code": "POWER_MANAGEMENT_CONFLICT" }

Laderfouten

mapChargerErrors() wordt gebruikt bij laderaanmaak/-update, referenties, connectorinstellingen, openbare vermelding, het oplossen van QR-inhoud, configuratiewijziging/-herlading, firmwarestart, alle vier basisopdrachten en het opvragen van een samengesteld schema.

EindpuntenStatusExacte body
Elke bovenstaande bewerking met een domeinvalidatiefout422{ "validationErrors": { "<field>": ["<message>"] } }
Elke bovenstaande bewerking met een conflict rond status, uniciteit, offline/OCPP, facturatie, laden zonder tag, connector of gereedheid409{ "error": "<message>", "code": "CHARGER_CONFLICT" }
GET /chargers/:chargerId/sessions, ongeldig standaard of expliciet tijdsbereik422{ "validationErrors": { "from": ["from must be before or equal to to"] } } of { "validationErrors": { "from": ["Session range cannot exceed 90 days"] } }

Gewone leesbewerkingen retourneren alleen de gedeelde 401/403/404/429/500/503-antwoorden plus 422 voor query-/padvalidatie. Het verwijderen van een lader kan de gedeelde 500 PlainError retourneren als het verwijderen mislukt zonder een specifieker foutantwoord.

Rapportfouten

EindpuntenStatusExacte body
Gegevens-/exportbereik waarbij from >= to422{ "validationErrors": { "range": ["from must be earlier than to"] } }
Gegevens-/exportbereik van meer dan 90 dagen422{ "validationErrors": { "range": ["Report ranges cannot exceed 90 days"] } }
Ongeldige ondoorzichtige cursor voor gegevens/metingen422{ "validationErrors": { "cursor": ["<message>"] } }
GET /reports/export, resultaat bevat meer dan 2.000 rijen422{ "error": "<message>", "code": "REPORT_EXPORT_ROW_LIMIT", "limit": 2000 }
POST /reports/send, geen opgeslagen schema409{ "error": "A workspace report schedule must be saved before sending", "code": "REPORT_SCHEDULE_REQUIRED" }
Hetzelfde, mailsysteem weigert of faalt502{ "error": "Report delivery failed", "code": "REPORT_DELIVERY_FAILED" }
Bijbehorende resource voor schema/meting ontbreekt404gedeelde RESOURCE_NOT_FOUND-body

De geslaagde export is binair; alle exportfouten blijven JSON.

Tarieffouten

EindpuntenStatusExacte body
Domeinvalidatie voor aanmaken/bijwerken/componenten/marktprijs/toewijzing422{ "validationErrors": { "<field>": ["<message>"] } }
Conflict bij tariefverwijdering of bij status/afhankelijkheden/uniciteit van een toewijzing409{ "error": "<message>", "code": "TARIFF_CONFLICT" }
Ontbrekend tarief, biedzone, lader, connector, tarieftoewijzing of andere geneste resource binnen de werkruimte404gedeelde RESOURCE_NOT_FOUND-body

Fouten in laadprofielen

EindpuntenStatusExacte body
Domeinvalidatie voor aanmaken/bijwerken/schema/toewijzing422{ "validationErrors": { "<field>": ["<message>"] } }
Het profiel wordt gebruikt door een beschermde toepassing409{ "error": "<message>", "code": "CHARGING_PROFILE_IN_USE" }
Conflict bij OCPP-synchronisatie, toewijzing, gelijktijdige wijzigingen of een ander profielconflict409{ "error": "<message>", "code": "CHARGING_PROFILE_CONFLICT" }
Ontbrekend profiel, lader, connector, toewijzing of andere geneste resource binnen de werkruimte404gedeelde RESOURCE_NOT_FOUND-body

Fouten in het gebruikersdomein

Gebruikersvalidatiefouten die een veld aangeven, gebruiken ValidationError plus code; andere gebruikersfouten gebruiken CodedError. Alle gevallen van ontbrekende resources gebruiken het gedeelde RESOURCE_NOT_FOUND-antwoord dat het bestaan van resources niet onthult.

StatusCode(s)Body
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" }; bevat 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 na het parsen van de body ook de gedeelde 403 INSUFFICIENT_SCOPE retourneren als users:access ontbreekt, of als RFID is opgegeven en users:rfid ontbreekt. Eindpunten voor lokale gebruikers vermelden elke vereiste scope in Eindpuntreferentie.

De gebruikersfoutcodes gelden als volgt:

EindpuntgroepNiet-404-codes van het gebruikersdomein naast gedeelde antwoorden
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)
Gebruikersgegevens, voertuigen en RFID-/toegangs-/limietleesbewerkingengeen domeincode anders dan 404
RFID aanmakenCUSTOMER_CONTRACT_MISSING, RFID_ALREADY_EXISTS, TAGLESS_USER_PROTECTED (409); INVALID_RFID (422)
RFID bijwerken/verwijderenTAGLESS_USER_PROTECTED (409)
Toegang vervangenTAGLESS_USER_PROTECTED (409); NO_CHARGERS_AVAILABLE (422)
Toegang intrekkenTAGLESS_USER_PROTECTED (409)
Limiet aanmaken/bijwerkenTAGLESS_USER_PROTECTED, LIMIT_ALREADY_EXISTS (409); INVALID_LIMIT_TYPE, INVALID_LIMIT_VALUE (422)
Limiet verwijderenTAGLESS_USER_PROTECTED (409)
Werkruimte-uitnodiging aanmakenCUSTOMER_CONTRACT_MISSING, INVITATION_EMAIL_IN_USE, RFID_ALREADY_EXISTS, TAGLESS_USER_PROTECTED (409); INVALID_EMAIL/INVALID_RFID (422); INVITATION_RESEND_THROTTLED (429) wanneer de bezorgwachttijd geldt
Werkruimte-uitnodiging opnieuw verzendenINVALID_EMAIL (422), INVITATION_RESEND_THROTTLED (429)
Werkruimte-uitnodiging annulerenINVALID_EMAIL (422)
Lokale ladergebruiker aanmaken voor een bestaande klantLOCAL_USER_ALREADY_EXISTS, TAGLESS_USER_PROTECTED (409)
Uitnodiging voor lokale ladergebruikerLOCAL_USER_ALREADY_EXISTS, INVITATION_EMAIL_IN_USE, TAGLESS_USER_PROTECTED (409); INVALID_EMAIL (422); INVITATION_RESEND_THROTTLED (429) wanneer de bezorgwachttijd geldt
Uitnodiging voor lokale gebruiker annulerenINVALID_EMAIL (422)
Lokale gebruiker bijwerken/verwijderenTAGLESS_USER_PROTECTED (409)

Alle resultaten voor eigendom en ontbrekende resources in die groepen, waaronder een niet-geregistreerd e-mailadres bij POST /users, gebruiken de gedeelde 404 RESOURCE_NOT_FOUND-body.

Antwoorden zonder body en herhalingsantwoorden

Een geslaagd 204-antwoord heeft geen body. Dit geldt voor elke gedocumenteerde verwijderactie waarvoor 204 empty staat vermeld. Een voltooide idempotente herhaling stelt Idempotency-Replayed: true in en gebruikt de opgeslagen status/body; bij 204 blijft het HTTP-antwoord zonder body. De API retourneert nooit een JSON-succesobject voor een gedocumenteerde 204-bewerking.