Errors and statuses
Every operation's description in the API reference ends with the
error codes specific to it, for example Errors: 402 payment_method_required,
409 station_online, 422. This page explains each status and code once: what it
means, whether an operation was created, how a retry with the same
Idempotency-Key behaves and what to do next. Then it explains the states an
operation and a charger's answer go through.
The error envelope
Every failure has the same shape:
{"error": {"code": "station_online", "message": "…", "details": {"…": "…"}}, "request_id": "req_…"}
code is stable and safe to branch on; message is for people and may change;
details carries identifiers and limits such as operation_id, resource_id,
field or retry_after_seconds when they exist. A rejected operation repeats the
same shape in result.error, with its HTTP status. Quote request_id when you
ask Ivora for help.
Refusals that need no charger or dependency (authentication, scopes, validation,
what the charger reported it cannot take, the usage-fee gate) answer at once:
nothing is recorded and the Idempotency-Key stays unused, so the corrected
request may reuse it. Checks that run inside a charger operation (the charger is
offline, the transaction ended) record the operation as rejected; a retry with
the same key returns that operation. See retries for
the idempotency rules.
HTTP statuses
| Status | Generic code | When it happens | Operation created | Retries and Idempotency-Key | What to do |
|---|---|---|---|---|---|
400 Bad request | invalid_request | The request cannot be read as sent: malformed JSON or an Ivora-Version header naming no supported API version. | No: refused before anything is recorded | The Idempotency-Key stays unused; send the corrected request with it. | Correct the request. Omit Ivora-Version to use the key's pinned version. |
401 Unauthenticated | unauthenticated | No bearer credential, or an API key or sign-in token that is invalid, revoked, expired or from another Ivora environment. | No: refused before anything is recorded | Retrying the same credential fails the same way. | Fix the credential; never loop on 401. |
402 Payment method required | payment_method_required | The usage-fee gate on new CSMS setup and control: creating stations, locations and CSMS keys, commands other than stop and unlock, setting or clearing charging profiles and session caps, and creating bills and external sessions. Reads, OCPP traffic, running charging, stops and continuing a bill or session that already exists are never refused. | No: refused before anything is recorded | Checked after the idempotency journal: a retry whose Idempotency-Key already has an operation replays that operation instead. | A signed-in team owner, admin or billing member adds the team's card; read the project's billing profile (details.billing_profile). |
403 Forbidden | forbidden | The key or user lacks the scope, team role or tenant the operation requires (forbidden), a connected charger's password push needs stations:admin (stations_admin_required), or a configuration key is sensitive, protected or read-only. | No: refused before anything is recorded | The same request fails until access changes; the Idempotency-Key stays unused. | Use a key or sign-in with the scope the operation names (Requires …), or change what the request touches. |
404 Not found | not_found | The resource is absent or belongs to another tenant; the two are indistinguishable by design. | Usually no; inside a charger operation the operation is rejected with the code in result.error. | A replay with the same key returns the same answer. | Correct the identifier; list the collection to find it. |
409 Conflict | conflict | The resource's state forbids the request now: the charger is online or offline (station_online, station_offline), reports no smart charging (smart_charging_unsupported), the resource is in use or final, or the Idempotency-Key was used with different input (idempotency_key_reused) or its first request is still running (request_in_progress). | No for refusals before dispatch; a charger operation checked while running is recorded as rejected with the code in result.error. | idempotency_key_reused: resend the original input, or use a new key for a new intent. request_in_progress: retry with the same key shortly. Otherwise a replay with the same key returns the same answer. | Resolve the state the code names (disconnect, stop, delete dependents, release a lease), then send a new request. |
410 Gone | — | The resource expired, such as a team invite after 14 days (invite_expired). | No: refused before anything is recorded | Retrying never succeeds. | Ask for a new one. |
413 Request too large | request_too_large | The body exceeds 64 KiB, or 1 MiB for an RFID token import (request_too_large). | No: refused before anything is recorded | The Idempotency-Key stays unused. | Send a smaller body; split bulk imports. |
422 Unprocessable | invalid_request | The input fails validation (invalid_request, with each field and rule in the message), names something the charger reported it cannot take (charging_profile_unsupported: details.field, details.supported), or breaks a rule of the resource (details.errors for tariffs and templates). | No for validation and capability refusals; a charging-core refusal inside a charger operation rejects it with the code in result.error. | The Idempotency-Key stays unused by a refusal before dispatch: send the corrected input with it or a new key. | Correct the input the code and details name. |
429 Too many requests | rate_limited | The per-minute request limit of the key or caller (rate_limited), a station's password changes in the last hour (credentials_rate_limited) or a bench limit. | No: refused before anything is recorded | Wait for Retry-After seconds (details.retry_after_seconds where given), then retry with the same key. | Back off; do not retry before Retry-After. |
502 Bad gateway | provider_error | A dependency or the charger answered with an error or did not confirm (provider_error, csms_request_failed, dispatch_unconfirmed, password_unconfirmed, password_not_stored). | Possibly: a charger operation may be recorded as unknown. | A replay with the same key returns the recorded outcome; never resend with a new key until the state is known. | Treat a write as uncertain: read the operation or the resource first. |
503 Service unavailable | temporarily_unavailable | A dependency is unreachable or the outcome is unknown (temporarily_unavailable, csms_unavailable, outcome_unknown with details.operation_id), or an environment lacks a service (stripe_not_configured, bench chargers offline). | Possibly: outcome_unknown names the operation whose outcome is unknown. | Retry with the same key and input; use a new key only after reading the resource shows nothing happened. | Read the operation or resource; retry later. |
Error codes
Every specific code the API returns, by area. A code without a status is only ever reported inside a record, such as a display's delivery.last_error.
Requests, access and retries
| Code | Status | Meaning | Guide |
|---|---|---|---|
invalid_request | 400, 422 | The request is malformed or fails validation; the message names each field and rule. Correct the input | Retries, uncertain outcomes and units |
invalid_api_version | 400 | The Ivora-Version header names no supported API version; details.supported_versions lists them. Omit the header to use your key's pinned version | API versions and changelog |
unauthenticated | 401 | Missing, invalid or revoked credentials, or a key of another Ivora environment | Authentication and tenant boundaries |
forbidden | 403 | Scope, role or tenant access is insufficient: the operation's description names the scope it requires | Authentication and tenant boundaries |
not_found | 404 | Resource is absent or outside your tenant | Retries, uncertain outcomes and units |
conflict | 409 | State conflict without a more specific code | Retries, uncertain outcomes and units |
request_too_large | 413 | The request body exceeds 64 KiB (1 MiB for an RFID token import) | Retries, uncertain outcomes and units |
rate_limited | 429 | Too many requests for the key or the caller: retry after the Retry-After delay | Rate limits |
idempotency_key_invalid | 422 | Idempotency-Key must contain 8–128 printable ASCII characters | Retries, uncertain outcomes and units |
idempotency_key_reused | 409 | The same key was used with different input | Retries, uncertain outcomes and units |
request_in_progress | 409 | An identical request is still running; retry with the same key shortly (details.operation_id) | Retries, uncertain outcomes and units |
outcome_unknown | 503 | The upstream outcome is unknown; inspect the resource before retrying with a new key (details.operation_id) | Retries, uncertain outcomes and units |
external_reference_taken | 409 | Another resource in this tenant already carries the external_reference; details.resource_id names it | External references instead of name matching |
Stations, EVSEs and locations
| Code | Status | Meaning | Guide |
|---|---|---|---|
station_not_found | 404 | Station is absent or belongs to another tenant | Register and manage chargers |
location_not_found | 404 | Location is absent or belongs to another tenant | Register and manage chargers |
connector_not_found | 404 | Connector resource ID is not on this station | Register and manage chargers |
evse_not_found | 404 | The EVSE number is not on this station | Register and manage chargers |
location_coordinates_required | 422 | The charging core requires a new location's latitude and longitude | Register and manage chargers |
station_name_taken | 409 | The OCPP connection name is registered or being registered | Register and manage chargers |
station_has_history | 409 | The station has charging history; its rows are retained and cannot be deleted | Register and manage chargers |
station_connected | 409 | The charger has connected under its name, its OCPP identity; register a new station instead of renaming it | Edit stations, EVSEs and connectors |
station_last_evse | 409 | The station's only EVSE cannot be deleted; delete the station instead | Edit stations, EVSEs and connectors |
evse_number_taken | 409 | The station already has an EVSE with this number, possibly a removed one that transactions keep | Edit stations, EVSEs and connectors |
evse_last_connector | 409 | An EVSE's only connector cannot be deleted; delete the EVSE instead | Edit stations, EVSEs and connectors |
connector_has_history | 409 | A transaction used the connector; delete its EVSE instead, which keeps the history | Edit stations, EVSEs and connectors |
display_configured | 409 | A display is maintained for the EVSE; delete the display first | Edit stations, EVSEs and connectors |
location_in_use | 409 | Stations are at the location (details.station_ids); move or delete them first | Register and manage chargers |
project_urls_disabled | 409 | Per-project charger URLs are off for the project or not offered in this environment; register the station with a name | Register and manage chargers |
project_urls_unavailable | 409 | Ivora staff routes only; tenant applications never receive it. This environment does not serve per-project charger URLs yet | Register and manage chargers |
Station credentials
| Code | Status | Meaning | Guide |
|---|---|---|---|
stations_admin_required | 403 | The charger is connected: pushing a new password to it needs stations:admin. Nothing was sent and no operation was created (details.applied not_sent, details.station_online true); set the password while the charger is offline, or use a stations:admin key or a team owner or admin sign-in | Credentials |
station_online | 409 | The requested change needs the charger disconnected, such as storing a password for an OCPP version the connected charger does not speak; disconnect it, then send the request again | Credentials |
password_rejected | 409 | The connected OCPP 1.6 charger refused the new password (details.applied: rejected or not_supported); the old password stays stored | Credentials |
password_unconfirmed | 502 | The connected OCPP 1.6 charger did not answer the new password in time; the old password stays stored. Repeat with the same password and a new Idempotency-Key | Credentials |
password_not_stored | 502 | The charger took the new password but the core did not store it; repeat with the same password and a new Idempotency-Key before it reconnects | Credentials |
credentials_rate_limited | 429 | Too many password changes for this station in the last hour (5); retry after Retry-After seconds (details.retry_after_seconds). A replay of an Idempotency-Key that already has an operation does not count | Credentials |
Charger commands and transactions
| Code | Status | Meaning | Guide |
|---|---|---|---|
station_offline | 409 | The charger is not connected; no command was attempted (in a rejected operation's result.error) | Charger commands and transaction state |
protocol_unsupported | 409 | The charger protocol has no command translation | Charger commands and transaction state |
command_unsupported | 409 | The charger's protocol has no such command, such as transaction_status on OCPP 1.6 | Charger maintenance commands |
transaction_not_found | 404 | Transaction is absent, in another tenant, or not on this station | Charger commands and transaction state |
transaction_ended | 409 | The transaction is no longer active | Charger commands and transaction state |
transaction_active | 409 | Wait for the transaction to complete. Also refuses a firmware update and a station, EVSE or connector deletion during charging | Charger maintenance commands |
transaction_not_addressable | 409 | The transaction's connector, EVSE or OCPP transactionId is not usable for a session profile | Smart charging |
dispatch_unconfirmed | 502 | The charger did not confirm the command; inspect state before retrying | Charger commands and transaction state |
Charger configuration and diagnostics
| Code | Status | Meaning | Guide |
|---|---|---|---|
configuration_key_sensitive | 403 | The key holds a secret; it is never changed through configuration (use the credentials route) | Charger configuration and trigger messages |
configuration_key_protected | 403 | Not a standard key every tenant key may change (it could disconnect the charger, weaken its security, or is a vendor key); needs stations:admin | Charger configuration and trigger messages |
configuration_key_read_only | 403 | The charger reports the key read-only | Charger configuration and trigger messages |
connection_change_unconfirmed | 422 | A connection key (where the charger connects, as whom or how securely) needs confirm_connection_change: true | Charger configuration and trigger messages |
configuration_address_invalid | 422 | Use key on OCPP 1.6 and component with variable on OCPP 2.x | Charger configuration and trigger messages |
configuration_value_too_long | 422 | The value exceeds the protocol's limit | Charger configuration and trigger messages |
trigger_unsupported | 422 | The charger's protocol has no such trigger message | Trigger a message |
time_range_invalid | 422 | since must be before until, and one OCPP message log request covers at most 7 days (details.max_days) | OCPP message log |
stats_range_too_large | 422 | The statistics period has more than 168 hour, 92 day or 24 month buckets (details.max_buckets) or 50,000 sessions (details.max_sessions); shorten it or use a larger bucket | Overview statistics |
Smart charging
| Code | Status | Meaning | Guide |
|---|---|---|---|
smart_charging_unsupported | 409 | The charger reports smart charging as unsupported or disabled; nothing was sent | Smart charging |
charging_profile_unsupported | 422 | The charger reported it cannot take this profile: details.field (unit, stack_level or periods) names what, and details.supported what it reported; or the protocol forbids it, such as a future valid_from on OCPP 2.x | Smart charging |
charging_profile_refused | 422 | The charging core refused the profile before sending it; the message gives its reason | Smart charging |
charging_profile_not_found | 404 | Charging profile is absent, on another station or in another tenant | Smart charging |
charging_limit_stack_full | 409 | The session's caps fill the charger's reported stack levels (details.stack_level, details.max_stack_level); remove the cap, then set it again | Smart charging |
charging_profile_inactive | 409 | The charging profile is no longer installed (cleared, replaced, ended or rejected) | Smart charging |
charger_rejected | In a record | Reported in a record, not as a response: the charger refused a charging profile (the profile's error, with charger_status), or the California Pricing RunningCost (a running cost session's last_error; nothing is sent until it reboots or the setting is written) | Smart charging |
RFID tokens
| Code | Status | Meaning | Guide |
|---|---|---|---|
token_not_found | 404 | Token is absent, belongs to another tenant or is a payment flow's charging token | RFID tokens |
token_exists | 409 | The tenant already has a token with this value, in any case or type | RFID tokens |
token_reserved | 422 | The value has the form of a payment flow's charging token (iv + 18 hex digits, remotestart-<n> or PAY_<n>), or is a roaming partner's token in this tenant | RFID tokens |
token_has_history | 409 | A transaction used the token; block it instead of deleting it | RFID tokens |
Charger displays and running cost
| Code | Status | Meaning | Guide |
|---|---|---|---|
display_not_configured | 404 | No display is maintained for this EVSE | Charger displays |
displays_disabled | 409 | Charger displays are switched off in this environment; reads, previews and drafts still work | Charger displays |
display_action_invalid | 422 | A display template cannot send this message on the charger's protocol; also reported in delivery.last_error | Charger displays |
template_render_failed | In a record | Reported in delivery.last_error, not as a response: the adapter template could not render this display; correct the input or ask Ivora | Charger displays |
transaction_id_invalid | 409 | The transaction has no OCPP 1.6 transactionId to address; also a running cost session's last_error | Running cost on the charger screen |
final_cost_rejected | In a record | Reported in a running cost session's last_error, not as a response: the charger refused this session's FinalCost, for example because the transaction had already stopped; later sessions still receive running cost | Running cost on the charger screen |
Tariffs and bills
| Code | Status | Meaning | Guide |
|---|---|---|---|
tariff_not_found | 404 | Tariff is absent or belongs to another tenant | Tariffs: price blocks, rules and quotes |
tariff_archived | 409 | The tariff is archived; it takes no edits and starts no new bill or display | Tariffs: price blocks, rules and quotes |
tariff_invalid | 422 | The tariff's elements, alt text, rules or time zone are invalid or ambiguous; details.errors lists each problem | Validation |
tariff_complex | 409 | The tariff has elements: change its elements, not rate_minor_per_kwh | Tariffs: price blocks, rules and quotes |
tariff_in_use | 409 | Stations, displays or the OCPP bench still use the tariff (details lists the connectors and displays); supply replacement_tariff_id | Tariffs |
bill_not_found | 404 | Bill is absent or outside your tenant | Tariffs: price blocks, rules and quotes |
bill_final | 409 | The bill is already final | Tariffs: price blocks, rules and quotes |
bill_open | 409 | The bill must be finalized first; also refuses an EVSE or connector deletion while an open bill names it | Tariffs: price blocks, rules and quotes |
transaction_mismatch | 409 | The transaction does not match the bill's station, connector and token | Tariffs: price blocks, rules and quotes |
usage_invalid | 409 | Usage or tariff data cannot be billed | Tariffs: price blocks, rules and quotes |
transaction_start_unknown | 409 | The transaction has no start time and the bill's tariff prices by time of day, date or duration; reconcile it before billing | Tariffs: price blocks, rules and quotes |
test_station_not_billable | 409 | The station is the OCPP bench's test station (virtual chargers): its sessions are test sessions, never billed or charged | Virtual chargers |
Charging sessions
| Code | Status | Meaning | Guide |
|---|---|---|---|
session_not_found | 404 | Charging session is absent or outside your tenant | Application-managed payments |
session_closed | 409 | The session is completed or canceled | Application-managed payments |
start_already_reserved | 409 | The session already reserved its single start operation | Application-managed payments |
stop_already_reserved | 409 | The session already reserved its single stop operation | Application-managed payments |
start_reserved | 409 | A start was reserved; cancel is no longer allowed, and payment release waits until the charging token expired without a transaction | Application-managed payments |
no_active_transaction | 409 | No matching active transaction was observed | Application-managed payments |
transactions_ambiguous | 409 | More than one transaction matches; operator reconciliation is required | Application-managed payments |
funding_released | 409 | A release was reported; the session cannot start | Application-managed payments |
settlement_conflict | 409 | The settlement report contradicts earlier reports or the bill | Optional settlement reports |
Payments
| Code | Status | Meaning | Guide |
|---|---|---|---|
payment_account_required | 409 | The tenant has no active payment account pin; onboard or ask Ivora to pin the account | Payment account |
payment_account_not_ready | 409 | The pinned payment account cannot take charges yet (charges_enabled is false) | Payment account |
payment_account_requires_staff_pin | 409 | An existing legacy payment account must be pinned by Ivora staff instead of onboarding a new one | Payment account |
bill_exceeds_hold | 409 | The final bill exceeds the authorization hold; operator settlement is required | Bills near or above the hold |
simulated_live_refused | 409 | Test charging never reaches live Stripe: only the OCPP bench's bills use the Stripe platform account, and never with live payments | Test sessions on the OCPP bench |
stripe_rejected | 409 | Stripe refused the request before creating anything; correct the input and retry with a new key | Payment account |
stripe_not_configured | 409, 503 | The payment provider has no Stripe key in this environment | Payment account |
checkout_expired_before_create | In a record | The hosted checkout would have expired before it was created; the payment was canceled and nothing was collected | Payment records |
Webhooks
| Code | Status | Meaning | Guide |
|---|---|---|---|
webhook_not_found | 404 | Webhook endpoint is absent or outside your tenant | Webhooks and events |
webhook_limit | 409 | The tenant has reached its webhook endpoint limit | Webhooks and events |
Platform billing
| Code | Status | Meaning | Guide |
|---|---|---|---|
payment_method_required | 402 | The project's billing team has no usable payment method for Ivora's CSMS usage fee and its grace period is over, or an invoice payment failed 14 days ago or more (details.past_due_since): add a card before creating stations, locations or CSMS keys, sending commands other than stop or unlock, setting or clearing charging profiles and session caps, or creating bills and external sessions. details.billing_profile names the profile to read and details.team_id the team | What needs a payment method |
billing_suspended | 402 | Ivora suspended new CSMS setup and control for the project's billing team; reads, stops and running charging are not affected (details.team_id) | What needs a payment method |
plan_changed | 409 | Ivora staff routes only; tenant applications never receive it. A re-run of a month's usage-fee invoices found a different plan than its dry run; run the dry run again and review it | Monthly invoices |
Teams and projects
| Code | Status | Meaning | Guide |
|---|---|---|---|
last_owner | 409 | A team keeps at least one owner; make another member owner first | Teams and team roles |
already_member | 409 | The person is already a member of the team | Teams and team roles |
invite_pending | 409 | The email already has a pending invite to the team; revoke it to invite again | Teams and team roles |
invite_closed | 409 | The invite was already accepted, declined or revoked, or its projects left the team | Teams and team roles |
invite_expired | 410 | The invite is past its 14 days; ask the team for a new one | Teams and team roles |
project_limit | 409 | The team already holds 50 projects; ask Ivora to raise the limit | Projects |
OCPI publishing
| Code | Status | Meaning | Guide |
|---|---|---|---|
ocpi_tenant_private | 409 | Ivora keeps the tenant private: it is never published over OCPI | Private tenants |
ocpi_party_in_use | 409 | Another tenant holds or is approved for this OCPI party | Parties |
ocpi_evse_id_party | 409 | An imported EVSE ID is not under the tenant's own_party approved by staff | Moving from another CSMS |
ocpi_evse_id_in_use | 409 | Another tenant publishes this imported EVSE ID | Moving from another CSMS |
Test sessions and virtual chargers
| Code | Status | Meaning | Guide |
|---|---|---|---|
bench_unavailable | 409 | This environment has no OCPP bench; workspace test sessions and virtual chargers are not available here | Test sessions on the OCPP bench |
pool_exhausted | 409 | Every OCPP bench charger is leased; retry after the Retry-After delay | Test sessions on the OCPP bench |
bench_offline | 503 | The free OCPP bench chargers are not connected; retry later | Test sessions on the OCPP bench |
bench_charger_unavailable | 503 | The bench charger's simulated EV did not respond; retry the same request or cancel the session | Test sessions on the OCPP bench |
lease_active | 409 | The workspace already holds a bench charger (details.session_id); end its test session or virtual charger first | Test sessions on the OCPP bench |
transaction_not_started | 409 | No charging transaction has started for this test session; cancel it instead | Test sessions on the OCPP bench |
target_unavailable | 409 | The connection target is not available now: no bench relay here, project URLs off, or the domain is not ready | Connecting through your project's address |
target_not_found | 404 | The project has no such connection target (another project's domain is never one) | Connecting through your project's address |
target_url_refused | 422 | The custom URL breaks a rule: ws:// or wss://, port 80, 443 or 8000-9999, no user name or password, at most 512 characters, a public host | Connecting through your project's address |
target_unresolved | 409, 422 | The target host does not resolve to an IPv4 address | Connecting through your project's address |
target_address_refused | 409, 422 | The target resolves to a non-public address or to this Ivora host; the bench connects to public addresses only | Connecting through your project's address |
custom_url_lease_active | 409 | You already hold a custom-URL test session; end it first | Connecting through your project's address |
relay_unavailable | 503 | The bench relay did not take the connection target; the charger stays on its default address | Connecting through your project's address |
connection_session | 409 | A connection session's charging is driven from the target system; cancel ends it | Connecting through your project's address |
bench_station_conflict | 409 | The project has a station named p<project>-ivora-bench the bench did not create; the bench never uses it | Connecting through your project's address |
bench_station_missing | 409 | The bench's station in this project was removed or renamed; Ivora staff restore it | Connecting through your project's address |
bench_station_in_use | 409 | Another test session uses the project's bench station; retry once it ends | Connecting through your project's address |
bench_station_online | 409 | The project's bench station is still connected from an earlier lease; retry shortly | Connecting through your project's address |
virtual_charger_not_found | 404 | No such virtual charger in this workspace | Virtual chargers |
virtual_charger_active | 409 | You already hold a virtual charger; release it first | Virtual chargers |
virtual_charger_ended | 409 | The virtual charger's lease has ended; lease a new one | Virtual chargers |
power_invalid | 422 | max_power_kw needs 6-32 A per phase on the chosen phases: 3.7-22 kW, 1 phase up to 7.3 kW | Virtual chargers |
control_refused | 409 | The charger's state does not allow that control now (details.reason has the charger's answer) | Virtual chargers |
Ivora staff only
| Code | Status | Meaning | Guide |
|---|---|---|---|
station_assigned | 409 | Ivora staff routes only; tenant applications never receive it. The station already belongs to a tenant (details.tenant_id); only unassigned stations can be assigned | Fleet administration (Ivora staff) |
tenant_not_found | 404 | Ivora staff routes only; tenant applications never receive it. The receiving tenant does not exist | Fleet administration (Ivora staff) |
platform_settings_unavailable | 409 | Ivora staff routes only; tenant applications never receive it. The charging core has no platform settings (it does not push meter sampling defaults on boot) | Fleet administration (Ivora staff) |
ocpi_party_not_requested | 409 | Ivora staff routes only; tenant applications never receive it. Approve or reject only the own_party the tenant requested | Parties |
ocpi_push_not_dead | 409 | Ivora staff routes only; tenant applications never receive it. Resync only an OCPI push that is dead (details.status is its status) | — |
ocpi_cdr_not_found | 404 | Ivora staff routes only; tenant applications never receive it. No OCPI charge detail record has this ID | — |
ocpi_cdr_credited | 409 | Ivora staff routes only; tenant applications never receive it. An OCPI charge detail record is corrected once; correct its replacement instead | — |
ocpi_cdr_credit | 409 | Ivora staff routes only; tenant applications never receive it. A credit charge detail record is not corrected | — |
ocpi_session_not_completed | 409 | Ivora staff routes only; tenant applications never receive it. The charging core no longer shows the OCPI session completed; the record was not corrected | — |
ocpi_session_not_found | 404 | Ivora staff routes only; tenant applications never receive it. No roaming OCPI session has this ID | — |
ocpi_session_not_held | 409 | Ivora staff routes only; tenant applications never receive it. This OCPI session's charge detail record is not held for a staff decision | — |
ocpi_cdr_held | 409 | Ivora staff routes only; tenant applications never receive it. The OCPI charge detail record still cannot be issued; the response names why | — |
ocpi_decision_required | 422 | Ivora staff routes only; tenant applications never receive it. The OCPI session has no price: name a tariff_id or set no_charge | — |
ocpi_tariff_complex | 422 | Ivora staff routes only; tenant applications never receive it. The tariff has price blocks or restrictions, which OCPI charge detail records do not price yet: name a simple tariff or set no_charge | — |
ocpi_tenant_unknown | 409 | Ivora staff routes only; tenant applications never receive it. The OCPI session's tenant has no OCPI settings | — |
template_not_found | 404 | Ivora staff routes only; tenant applications never receive it. Display adapter template is absent | — |
template_invalid | 422 | Ivora staff routes only; tenant applications never receive it. The display adapter template failed validation; see details.errors | — |
template_name_reserved | 422 | Ivora staff routes only; tenant applications never receive it. Names starting with builtin- are reserved for Ivora's templates | — |
template_not_draft | 409 | Ivora staff routes only; tenant applications never receive it. Only a draft template can be published | — |
template_not_published | 409 | Ivora staff routes only; tenant applications never receive it. The template has no published version | — |
template_builtin | 409 | Ivora staff routes only; tenant applications never receive it. Built-in templates cannot be changed | — |
Dependencies
| Code | Status | Meaning | Guide |
|---|---|---|---|
csms_unavailable | 503 | The charging core could not be reached; treat a write as uncertain and read its operation or resource | Retries, uncertain outcomes and units |
csms_request_failed | 502 | The charging core rejected the request | Retries, uncertain outcomes and units |
provider_error | 502 | A dependency returned an error | Retries, uncertain outcomes and units |
temporarily_unavailable | 503 | A dependency is unavailable; retry later | Retries, uncertain outcomes and units |
Operation statuses
Charger-bound writes (commands, configuration, triggers, credentials, smart
charging) return 202 with an operation. Synchronous writes (locations, stations,
tariffs) return the resource but are journaled the same way.
status | Meaning | What to do |
|---|---|---|
dispatching | The request is being sent; its outcome is not known yet | Poll the operation; never resend with a new key |
succeeded | The charging core or adapter accepted and sent the message. It does not mean the charger agreed or that charging started | Read result.charger_status and the station or transaction state |
rejected | Refused before or while sending; result.error holds the code and status from the tables above | Correct the cause the code names, then send a new request with a new key |
unknown | The dispatch outcome could not be confirmed | Reconcile: read the station, transaction or resource before issuing another command |
Read an operation with GET /v1/tenants/{tenant_id}/operations/{operation_id}
or subscribe to the operation.completed webhook.
Resources keep their own states as well, such as a charging profile's pending,
accepted, rejected, unknown, no_reply, cleared, replaced and ended
(smart charging), a display's delivery.state
(charger displays) and a payment's status
(managed payments).
Charger answers
A succeeded operation that sends an OCPP message carries the charger's own
answer in result.charger_status:
charger_status | Meaning |
|---|---|
Accepted | The charger took the request |
Rejected | The charger refused it |
RebootRequired | Accepted; it applies after a reset of the station |
NotSupported, NotImplemented | The charger does not support the request or message |
UnknownComponent, UnknownVariable | OCPP 2.x: the charger has no such component or variable |
EmptyResultSet | OCPP 2.x: a configuration report with nothing to report |
Unknown | Clearing a charging profile the charger did not hold; Ivora treats it as cleared |
CallError | The charger could not process the message at all |
null | The answer has not arrived yet |
Each route lists the answers its message can return: configuration and triggers, maintenance commands, smart charging and station credentials.
How charger answers arrive
The API waits a few seconds for the answer before it responds. If the answer has
not arrived, result.charger_status is null and Ivora fills it in once the
charging core records it. The message is never resent.
- Poll
GET /v1/tenants/{tenant_id}/operations/{operation_id}untilcharger_statusis set. - Or subscribe to the resource's webhooks:
charging_profile.accepted,.rejectedand.clearedfor smart charging,station.configuration_changedfor configuration andstation.credentials_changedfor passwords.operation.completedfires at dispatch, so it can carrycharger_status: null.