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:
validationErrorswordtdetails.fieldsencodewordtVALIDATION_FAILED, ook als de standaardbody een domeincode bevatte.- Een standaardwaarde voor
codeop het hoogste niveau blijft behouden als er geen validatievelden zijn. - Andere eigenschappen op het hoogste niveau, behalve
error,message,validationErrorsencode, worden naardetailsverplaatst;limitvan een rapportexport wordt bijvoorbeelddetails.limit. - Een tekenreeks
errorop het hoogste niveau wordtmessage. 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(422en andere niet-geclassificeerde4xx),RATE_LIMITED(429),EXTERNAL_PROVIDER_FAILED(502) enINTERNAL_ERROR(andere5xx, waaronder503). requestIdis de exacteX-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:
- configuratie en authenticatie van werkruimtetokens;
- beleid van de aanbieder en verzoeklimieten voor token/werkruimte;
- filtering op huidige functierechten;
- voor elke mutatie: idempotentievalidatie en claim;
- 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.
| Status | Wanneer | Exacte body | Relevante headers |
|---|---|---|---|
401 | Ontbrekend, 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 |
404 | Het token is geldig, maar de aanbieder van de werkruimte heeft geen adminApiEnabled | { "error": "Not Found" } | Cache-Control: no-store |
429 | Het verzoekbudget per token of per werkruimte is uitgeput | { "error": "Too many attempts. Please try again later." } | Retry-After: <seconds> |
503 | Authenticatie met werkruimtetoken is tijdelijk niet beschikbaar | { "error": "Admin API workspace-token configuration is unavailable", "code": "WORKSPACE_API_CONFIG_UNAVAILABLE" } | — |
503 | Het 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 op | Status | Exacte body | Headers/opmerkingen |
|---|---|---|---|
| Elke route na authenticatie | 403 | { "error": "Insufficient workspace-token scope", "code": "INSUFFICIENT_SCOPE" } | Wordt geretourneerd als een vereiste scope ontbreekt. |
| Elke mutatie | 400 | { "error": "Idempotency-Key is required for this operation", "code": "IDEMPOTENCY_KEY_REQUIRED" } | Geen sleutel opgegeven. |
| Elke mutatie | 400 | { "error": "Exactly one Idempotency-Key is required", "code": "INVALID_IDEMPOTENCY_KEY" } | Dubbele header of met komma's samengevoegde header. |
| Elke mutatie | 400 | { "error": "Idempotency-Key must contain 1 to 255 visible characters", "code": "INVALID_IDEMPOTENCY_KEY" } | Leeg, te lang of bevat een besturingsteken. |
| Elke mutatie | 409 | { "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 mutatie | 409 | { "error": "Request is already processing", "code": "IDEMPOTENT_REQUEST_PROCESSING" } | Retry-After: 5. |
| Elke mutatie | 409 | { "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 mutatie | 503 | { "error": "Idempotency storage unavailable", "code": "IDEMPOTENCY_UNAVAILABLE" } | De API kan het idempotentierecord niet controleren of opslaan. |
| Elk eindpunt met een ongeldig query-, body- of padschema | 422 | { "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 werkruimte | 404 | { "error": "Workspace resource not found", "code": "RESOURCE_NOT_FOUND" } | Wordt consequent gebruikt, tenzij een onderstaande tabel anders vermeldt. |
| Elk eindpunt met een onverwachte fout | 500 | { "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
| Eindpunten | Status | Exacte body |
|---|---|---|
| Locatie aanmaken/bijwerken; veldvalidatie van de werkruimte | 422 | { "validationErrors": { "<field>": ["<message>"] } } |
DELETE /v2/admin/sites/:siteId wanneer de locatie afhankelijkheden heeft | 409 | { "error": "<message>", "code": "SITE_NOT_EMPTY" } |
GET /v2/admin/sites/geocode ongeldige genormaliseerde zoekopdracht | 400 | { "error": "<message>", "code": "INVALID_GEOCODE_QUERY" } |
| Hetzelfde, begrensde wachtrij van de provider is vol | 429 | { "error": "<message>", "code": "GEOCODING_BUSY" }; bevat Retry-After als de geocoder deze levert |
| Hetzelfde, time-out/storing van provider of onverwachte geocoderfout | 502 | { "error": "<message>", "code": "GEOCODING_UNAVAILABLE" }; een onverwachte fout gebruikt Address search is temporarily unavailable |
PUT /v2/admin/sites/:siteId/power-management ongeldige topologie-/domeinconfiguratie | 422 | { "error": "<message>", "code": "INVALID_POWER_MANAGEMENT_CONFIGURATION" } |
| Hetzelfde, OCPP-weigering/time-out, gelijktijdige wijziging of afstemmingsconflict | 409 | { "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.
| Eindpunten | Status | Exacte body |
|---|---|---|
| Elke bovenstaande bewerking met een domeinvalidatiefout | 422 | { "validationErrors": { "<field>": ["<message>"] } } |
| Elke bovenstaande bewerking met een conflict rond status, uniciteit, offline/OCPP, facturatie, laden zonder tag, connector of gereedheid | 409 | { "error": "<message>", "code": "CHARGER_CONFLICT" } |
GET /chargers/:chargerId/sessions, ongeldig standaard of expliciet tijdsbereik | 422 | { "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
| Eindpunten | Status | Exacte body |
|---|---|---|
Gegevens-/exportbereik waarbij from >= to | 422 | { "validationErrors": { "range": ["from must be earlier than to"] } } |
| Gegevens-/exportbereik van meer dan 90 dagen | 422 | { "validationErrors": { "range": ["Report ranges cannot exceed 90 days"] } } |
| Ongeldige ondoorzichtige cursor voor gegevens/metingen | 422 | { "validationErrors": { "cursor": ["<message>"] } } |
GET /reports/export, resultaat bevat meer dan 2.000 rijen | 422 | { "error": "<message>", "code": "REPORT_EXPORT_ROW_LIMIT", "limit": 2000 } |
POST /reports/send, geen opgeslagen schema | 409 | { "error": "A workspace report schedule must be saved before sending", "code": "REPORT_SCHEDULE_REQUIRED" } |
| Hetzelfde, mailsysteem weigert of faalt | 502 | { "error": "Report delivery failed", "code": "REPORT_DELIVERY_FAILED" } |
| Bijbehorende resource voor schema/meting ontbreekt | 404 | gedeelde RESOURCE_NOT_FOUND-body |
De geslaagde export is binair; alle exportfouten blijven JSON.
Tarieffouten
| Eindpunten | Status | Exacte body |
|---|---|---|
| Domeinvalidatie voor aanmaken/bijwerken/componenten/marktprijs/toewijzing | 422 | { "validationErrors": { "<field>": ["<message>"] } } |
| Conflict bij tariefverwijdering of bij status/afhankelijkheden/uniciteit van een toewijzing | 409 | { "error": "<message>", "code": "TARIFF_CONFLICT" } |
| Ontbrekend tarief, biedzone, lader, connector, tarieftoewijzing of andere geneste resource binnen de werkruimte | 404 | gedeelde RESOURCE_NOT_FOUND-body |
Fouten in laadprofielen
| Eindpunten | Status | Exacte body |
|---|---|---|
| Domeinvalidatie voor aanmaken/bijwerken/schema/toewijzing | 422 | { "validationErrors": { "<field>": ["<message>"] } } |
| Het profiel wordt gebruikt door een beschermde toepassing | 409 | { "error": "<message>", "code": "CHARGING_PROFILE_IN_USE" } |
| Conflict bij OCPP-synchronisatie, toewijzing, gelijktijdige wijzigingen of een ander profielconflict | 409 | { "error": "<message>", "code": "CHARGING_PROFILE_CONFLICT" } |
| Ontbrekend profiel, lader, connector, toewijzing of andere geneste resource binnen de werkruimte | 404 | gedeelde 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.
| Status | Code(s) | Body |
|---|---|---|
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" }; bevat 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 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:
| Eindpuntgroep | Niet-404-codes van het gebruikersdomein naast gedeelde antwoorden |
|---|---|
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) |
| Gebruikersgegevens, voertuigen en RFID-/toegangs-/limietleesbewerkingen | geen domeincode anders dan 404 |
| RFID aanmaken | CUSTOMER_CONTRACT_MISSING, RFID_ALREADY_EXISTS, TAGLESS_USER_PROTECTED (409); INVALID_RFID (422) |
| RFID bijwerken/verwijderen | TAGLESS_USER_PROTECTED (409) |
| Toegang vervangen | TAGLESS_USER_PROTECTED (409); NO_CHARGERS_AVAILABLE (422) |
| Toegang intrekken | TAGLESS_USER_PROTECTED (409) |
| Limiet aanmaken/bijwerken | TAGLESS_USER_PROTECTED, LIMIT_ALREADY_EXISTS (409); INVALID_LIMIT_TYPE, INVALID_LIMIT_VALUE (422) |
| Limiet verwijderen | TAGLESS_USER_PROTECTED (409) |
| Werkruimte-uitnodiging aanmaken | CUSTOMER_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 verzenden | INVALID_EMAIL (422), INVITATION_RESEND_THROTTLED (429) |
| Werkruimte-uitnodiging annuleren | INVALID_EMAIL (422) |
| Lokale ladergebruiker aanmaken voor een bestaande klant | LOCAL_USER_ALREADY_EXISTS, TAGLESS_USER_PROTECTED (409) |
| Uitnodiging voor lokale ladergebruiker | LOCAL_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 annuleren | INVALID_EMAIL (422) |
| Lokale gebruiker bijwerken/verwijderen | TAGLESS_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.