Reference and AI

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

StatusGeneric codeWhen it happensOperation createdRetries and Idempotency-KeyWhat to do
400 Bad requestinvalid_requestThe request cannot be read as sent: malformed JSON or an Ivora-Version header naming no supported API version.No: refused before anything is recordedThe Idempotency-Key stays unused; send the corrected request with it.Correct the request. Omit Ivora-Version to use the key's pinned version.
401 UnauthenticatedunauthenticatedNo 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 recordedRetrying the same credential fails the same way.Fix the credential; never loop on 401.
402 Payment method requiredpayment_method_requiredThe 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 recordedChecked 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 ForbiddenforbiddenThe 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 recordedThe 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 foundnot_foundThe 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 ConflictconflictThe 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 recordedRetrying never succeeds.Ask for a new one.
413 Request too largerequest_too_largeThe body exceeds 64 KiB, or 1 MiB for an RFID token import (request_too_large).No: refused before anything is recordedThe Idempotency-Key stays unused.Send a smaller body; split bulk imports.
422 Unprocessableinvalid_requestThe 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 requestsrate_limitedThe 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 recordedWait 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 gatewayprovider_errorA 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 unavailabletemporarily_unavailableA 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

CodeStatusMeaningGuide
invalid_request400, 422The request is malformed or fails validation; the message names each field and rule. Correct the inputRetries, uncertain outcomes and units
invalid_api_version400The Ivora-Version header names no supported API version; details.supported_versions lists them. Omit the header to use your key's pinned versionAPI versions and changelog
unauthenticated401Missing, invalid or revoked credentials, or a key of another Ivora environmentAuthentication and tenant boundaries
forbidden403Scope, role or tenant access is insufficient: the operation's description names the scope it requiresAuthentication and tenant boundaries
not_found404Resource is absent or outside your tenantRetries, uncertain outcomes and units
conflict409State conflict without a more specific codeRetries, uncertain outcomes and units
request_too_large413The request body exceeds 64 KiB (1 MiB for an RFID token import)Retries, uncertain outcomes and units
rate_limited429Too many requests for the key or the caller: retry after the Retry-After delayRate limits
idempotency_key_invalid422Idempotency-Key must contain 8–128 printable ASCII charactersRetries, uncertain outcomes and units
idempotency_key_reused409The same key was used with different inputRetries, uncertain outcomes and units
request_in_progress409An identical request is still running; retry with the same key shortly (details.operation_id)Retries, uncertain outcomes and units
outcome_unknown503The upstream outcome is unknown; inspect the resource before retrying with a new key (details.operation_id)Retries, uncertain outcomes and units
external_reference_taken409Another resource in this tenant already carries the external_reference; details.resource_id names itExternal references instead of name matching

Stations, EVSEs and locations

CodeStatusMeaningGuide
station_not_found404Station is absent or belongs to another tenantRegister and manage chargers
location_not_found404Location is absent or belongs to another tenantRegister and manage chargers
connector_not_found404Connector resource ID is not on this stationRegister and manage chargers
evse_not_found404The EVSE number is not on this stationRegister and manage chargers
location_coordinates_required422The charging core requires a new location's latitude and longitudeRegister and manage chargers
station_name_taken409The OCPP connection name is registered or being registeredRegister and manage chargers
station_has_history409The station has charging history; its rows are retained and cannot be deletedRegister and manage chargers
station_connected409The charger has connected under its name, its OCPP identity; register a new station instead of renaming itEdit stations, EVSEs and connectors
station_last_evse409The station's only EVSE cannot be deleted; delete the station insteadEdit stations, EVSEs and connectors
evse_number_taken409The station already has an EVSE with this number, possibly a removed one that transactions keepEdit stations, EVSEs and connectors
evse_last_connector409An EVSE's only connector cannot be deleted; delete the EVSE insteadEdit stations, EVSEs and connectors
connector_has_history409A transaction used the connector; delete its EVSE instead, which keeps the historyEdit stations, EVSEs and connectors
display_configured409A display is maintained for the EVSE; delete the display firstEdit stations, EVSEs and connectors
location_in_use409Stations are at the location (details.station_ids); move or delete them firstRegister and manage chargers
project_urls_disabled409Per-project charger URLs are off for the project or not offered in this environment; register the station with a nameRegister and manage chargers
project_urls_unavailable409Ivora staff routes only; tenant applications never receive it. This environment does not serve per-project charger URLs yetRegister and manage chargers

Station credentials

CodeStatusMeaningGuide
stations_admin_required403The 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-inCredentials
station_online409The 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 againCredentials
password_rejected409The connected OCPP 1.6 charger refused the new password (details.applied: rejected or not_supported); the old password stays storedCredentials
password_unconfirmed502The 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-KeyCredentials
password_not_stored502The charger took the new password but the core did not store it; repeat with the same password and a new Idempotency-Key before it reconnectsCredentials
credentials_rate_limited429Too 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 countCredentials

Charger commands and transactions

CodeStatusMeaningGuide
station_offline409The charger is not connected; no command was attempted (in a rejected operation's result.error)Charger commands and transaction state
protocol_unsupported409The charger protocol has no command translationCharger commands and transaction state
command_unsupported409The charger's protocol has no such command, such as transaction_status on OCPP 1.6Charger maintenance commands
transaction_not_found404Transaction is absent, in another tenant, or not on this stationCharger commands and transaction state
transaction_ended409The transaction is no longer activeCharger commands and transaction state
transaction_active409Wait for the transaction to complete. Also refuses a firmware update and a station, EVSE or connector deletion during chargingCharger maintenance commands
transaction_not_addressable409The transaction's connector, EVSE or OCPP transactionId is not usable for a session profileSmart charging
dispatch_unconfirmed502The charger did not confirm the command; inspect state before retryingCharger commands and transaction state

Charger configuration and diagnostics

CodeStatusMeaningGuide
configuration_key_sensitive403The key holds a secret; it is never changed through configuration (use the credentials route)Charger configuration and trigger messages
configuration_key_protected403Not a standard key every tenant key may change (it could disconnect the charger, weaken its security, or is a vendor key); needs stations:adminCharger configuration and trigger messages
configuration_key_read_only403The charger reports the key read-onlyCharger configuration and trigger messages
connection_change_unconfirmed422A connection key (where the charger connects, as whom or how securely) needs confirm_connection_change: trueCharger configuration and trigger messages
configuration_address_invalid422Use key on OCPP 1.6 and component with variable on OCPP 2.xCharger configuration and trigger messages
configuration_value_too_long422The value exceeds the protocol's limitCharger configuration and trigger messages
trigger_unsupported422The charger's protocol has no such trigger messageTrigger a message
time_range_invalid422since must be before until, and one OCPP message log request covers at most 7 days (details.max_days)OCPP message log
stats_range_too_large422The 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 bucketOverview statistics

Smart charging

CodeStatusMeaningGuide
smart_charging_unsupported409The charger reports smart charging as unsupported or disabled; nothing was sentSmart charging
charging_profile_unsupported422The 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.xSmart charging
charging_profile_refused422The charging core refused the profile before sending it; the message gives its reasonSmart charging
charging_profile_not_found404Charging profile is absent, on another station or in another tenantSmart charging
charging_limit_stack_full409The session's caps fill the charger's reported stack levels (details.stack_level, details.max_stack_level); remove the cap, then set it againSmart charging
charging_profile_inactive409The charging profile is no longer installed (cleared, replaced, ended or rejected)Smart charging
charger_rejectedIn a recordReported 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

CodeStatusMeaningGuide
token_not_found404Token is absent, belongs to another tenant or is a payment flow's charging tokenRFID tokens
token_exists409The tenant already has a token with this value, in any case or typeRFID tokens
token_reserved422The 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 tenantRFID tokens
token_has_history409A transaction used the token; block it instead of deleting itRFID tokens

Charger displays and running cost

CodeStatusMeaningGuide
display_not_configured404No display is maintained for this EVSECharger displays
displays_disabled409Charger displays are switched off in this environment; reads, previews and drafts still workCharger displays
display_action_invalid422A display template cannot send this message on the charger's protocol; also reported in delivery.last_errorCharger displays
template_render_failedIn a recordReported in delivery.last_error, not as a response: the adapter template could not render this display; correct the input or ask IvoraCharger displays
transaction_id_invalid409The transaction has no OCPP 1.6 transactionId to address; also a running cost session's last_errorRunning cost on the charger screen
final_cost_rejectedIn a recordReported 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 costRunning cost on the charger screen

Tariffs and bills

CodeStatusMeaningGuide
tariff_not_found404Tariff is absent or belongs to another tenantTariffs: price blocks, rules and quotes
tariff_archived409The tariff is archived; it takes no edits and starts no new bill or displayTariffs: price blocks, rules and quotes
tariff_invalid422The tariff's elements, alt text, rules or time zone are invalid or ambiguous; details.errors lists each problemValidation
tariff_complex409The tariff has elements: change its elements, not rate_minor_per_kwhTariffs: price blocks, rules and quotes
tariff_in_use409Stations, displays or the OCPP bench still use the tariff (details lists the connectors and displays); supply replacement_tariff_idTariffs
bill_not_found404Bill is absent or outside your tenantTariffs: price blocks, rules and quotes
bill_final409The bill is already finalTariffs: price blocks, rules and quotes
bill_open409The bill must be finalized first; also refuses an EVSE or connector deletion while an open bill names itTariffs: price blocks, rules and quotes
transaction_mismatch409The transaction does not match the bill's station, connector and tokenTariffs: price blocks, rules and quotes
usage_invalid409Usage or tariff data cannot be billedTariffs: price blocks, rules and quotes
transaction_start_unknown409The transaction has no start time and the bill's tariff prices by time of day, date or duration; reconcile it before billingTariffs: price blocks, rules and quotes
test_station_not_billable409The station is the OCPP bench's test station (virtual chargers): its sessions are test sessions, never billed or chargedVirtual chargers

Charging sessions

CodeStatusMeaningGuide
session_not_found404Charging session is absent or outside your tenantApplication-managed payments
session_closed409The session is completed or canceledApplication-managed payments
start_already_reserved409The session already reserved its single start operationApplication-managed payments
stop_already_reserved409The session already reserved its single stop operationApplication-managed payments
start_reserved409A start was reserved; cancel is no longer allowed, and payment release waits until the charging token expired without a transactionApplication-managed payments
no_active_transaction409No matching active transaction was observedApplication-managed payments
transactions_ambiguous409More than one transaction matches; operator reconciliation is requiredApplication-managed payments
funding_released409A release was reported; the session cannot startApplication-managed payments
settlement_conflict409The settlement report contradicts earlier reports or the billOptional settlement reports

Payments

CodeStatusMeaningGuide
payment_account_required409The tenant has no active payment account pin; onboard or ask Ivora to pin the accountPayment account
payment_account_not_ready409The pinned payment account cannot take charges yet (charges_enabled is false)Payment account
payment_account_requires_staff_pin409An existing legacy payment account must be pinned by Ivora staff instead of onboarding a new onePayment account
bill_exceeds_hold409The final bill exceeds the authorization hold; operator settlement is requiredBills near or above the hold
simulated_live_refused409Test charging never reaches live Stripe: only the OCPP bench's bills use the Stripe platform account, and never with live paymentsTest sessions on the OCPP bench
stripe_rejected409Stripe refused the request before creating anything; correct the input and retry with a new keyPayment account
stripe_not_configured409, 503The payment provider has no Stripe key in this environmentPayment account
checkout_expired_before_createIn a recordThe hosted checkout would have expired before it was created; the payment was canceled and nothing was collectedPayment records

Webhooks

CodeStatusMeaningGuide
webhook_not_found404Webhook endpoint is absent or outside your tenantWebhooks and events
webhook_limit409The tenant has reached its webhook endpoint limitWebhooks and events

Platform billing

CodeStatusMeaningGuide
payment_method_required402The 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 teamWhat needs a payment method
billing_suspended402Ivora 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_changed409Ivora 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 itMonthly invoices

Teams and projects

CodeStatusMeaningGuide
last_owner409A team keeps at least one owner; make another member owner firstTeams and team roles
already_member409The person is already a member of the teamTeams and team roles
invite_pending409The email already has a pending invite to the team; revoke it to invite againTeams and team roles
invite_closed409The invite was already accepted, declined or revoked, or its projects left the teamTeams and team roles
invite_expired410The invite is past its 14 days; ask the team for a new oneTeams and team roles
project_limit409The team already holds 50 projects; ask Ivora to raise the limitProjects

OCPI publishing

CodeStatusMeaningGuide
ocpi_tenant_private409Ivora keeps the tenant private: it is never published over OCPIPrivate tenants
ocpi_party_in_use409Another tenant holds or is approved for this OCPI partyParties
ocpi_evse_id_party409An imported EVSE ID is not under the tenant's own_party approved by staffMoving from another CSMS
ocpi_evse_id_in_use409Another tenant publishes this imported EVSE IDMoving from another CSMS

Test sessions and virtual chargers

CodeStatusMeaningGuide
bench_unavailable409This environment has no OCPP bench; workspace test sessions and virtual chargers are not available hereTest sessions on the OCPP bench
pool_exhausted409Every OCPP bench charger is leased; retry after the Retry-After delayTest sessions on the OCPP bench
bench_offline503The free OCPP bench chargers are not connected; retry laterTest sessions on the OCPP bench
bench_charger_unavailable503The bench charger's simulated EV did not respond; retry the same request or cancel the sessionTest sessions on the OCPP bench
lease_active409The workspace already holds a bench charger (details.session_id); end its test session or virtual charger firstTest sessions on the OCPP bench
transaction_not_started409No charging transaction has started for this test session; cancel it insteadTest sessions on the OCPP bench
target_unavailable409The connection target is not available now: no bench relay here, project URLs off, or the domain is not readyConnecting through your project's address
target_not_found404The project has no such connection target (another project's domain is never one)Connecting through your project's address
target_url_refused422The 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 hostConnecting through your project's address
target_unresolved409, 422The target host does not resolve to an IPv4 addressConnecting through your project's address
target_address_refused409, 422The target resolves to a non-public address or to this Ivora host; the bench connects to public addresses onlyConnecting through your project's address
custom_url_lease_active409You already hold a custom-URL test session; end it firstConnecting through your project's address
relay_unavailable503The bench relay did not take the connection target; the charger stays on its default addressConnecting through your project's address
connection_session409A connection session's charging is driven from the target system; cancel ends itConnecting through your project's address
bench_station_conflict409The project has a station named p<project>-ivora-bench the bench did not create; the bench never uses itConnecting through your project's address
bench_station_missing409The bench's station in this project was removed or renamed; Ivora staff restore itConnecting through your project's address
bench_station_in_use409Another test session uses the project's bench station; retry once it endsConnecting through your project's address
bench_station_online409The project's bench station is still connected from an earlier lease; retry shortlyConnecting through your project's address
virtual_charger_not_found404No such virtual charger in this workspaceVirtual chargers
virtual_charger_active409You already hold a virtual charger; release it firstVirtual chargers
virtual_charger_ended409The virtual charger's lease has ended; lease a new oneVirtual chargers
power_invalid422max_power_kw needs 6-32 A per phase on the chosen phases: 3.7-22 kW, 1 phase up to 7.3 kWVirtual chargers
control_refused409The charger's state does not allow that control now (details.reason has the charger's answer)Virtual chargers

Ivora staff only

CodeStatusMeaningGuide
station_assigned409Ivora staff routes only; tenant applications never receive it. The station already belongs to a tenant (details.tenant_id); only unassigned stations can be assignedFleet administration (Ivora staff)
tenant_not_found404Ivora staff routes only; tenant applications never receive it. The receiving tenant does not existFleet administration (Ivora staff)
platform_settings_unavailable409Ivora 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_requested409Ivora staff routes only; tenant applications never receive it. Approve or reject only the own_party the tenant requestedParties
ocpi_push_not_dead409Ivora staff routes only; tenant applications never receive it. Resync only an OCPI push that is dead (details.status is its status)—
ocpi_cdr_not_found404Ivora staff routes only; tenant applications never receive it. No OCPI charge detail record has this ID—
ocpi_cdr_credited409Ivora staff routes only; tenant applications never receive it. An OCPI charge detail record is corrected once; correct its replacement instead—
ocpi_cdr_credit409Ivora staff routes only; tenant applications never receive it. A credit charge detail record is not corrected—
ocpi_session_not_completed409Ivora 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_found404Ivora staff routes only; tenant applications never receive it. No roaming OCPI session has this ID—
ocpi_session_not_held409Ivora staff routes only; tenant applications never receive it. This OCPI session's charge detail record is not held for a staff decision—
ocpi_cdr_held409Ivora staff routes only; tenant applications never receive it. The OCPI charge detail record still cannot be issued; the response names why—
ocpi_decision_required422Ivora staff routes only; tenant applications never receive it. The OCPI session has no price: name a tariff_id or set no_charge—
ocpi_tariff_complex422Ivora 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_unknown409Ivora staff routes only; tenant applications never receive it. The OCPI session's tenant has no OCPI settings—
template_not_found404Ivora staff routes only; tenant applications never receive it. Display adapter template is absent—
template_invalid422Ivora staff routes only; tenant applications never receive it. The display adapter template failed validation; see details.errors—
template_name_reserved422Ivora staff routes only; tenant applications never receive it. Names starting with builtin- are reserved for Ivora's templates—
template_not_draft409Ivora staff routes only; tenant applications never receive it. Only a draft template can be published—
template_not_published409Ivora staff routes only; tenant applications never receive it. The template has no published version—
template_builtin409Ivora staff routes only; tenant applications never receive it. Built-in templates cannot be changed—

Dependencies

CodeStatusMeaningGuide
csms_unavailable503The charging core could not be reached; treat a write as uncertain and read its operation or resourceRetries, uncertain outcomes and units
csms_request_failed502The charging core rejected the requestRetries, uncertain outcomes and units
provider_error502A dependency returned an errorRetries, uncertain outcomes and units
temporarily_unavailable503A dependency is unavailable; retry laterRetries, 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.

statusMeaningWhat to do
dispatchingThe request is being sent; its outcome is not known yetPoll the operation; never resend with a new key
succeededThe charging core or adapter accepted and sent the message. It does not mean the charger agreed or that charging startedRead result.charger_status and the station or transaction state
rejectedRefused before or while sending; result.error holds the code and status from the tables aboveCorrect the cause the code names, then send a new request with a new key
unknownThe dispatch outcome could not be confirmedReconcile: 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_statusMeaning
AcceptedThe charger took the request
RejectedThe charger refused it
RebootRequiredAccepted; it applies after a reset of the station
NotSupported, NotImplementedThe charger does not support the request or message
UnknownComponent, UnknownVariableOCPP 2.x: the charger has no such component or variable
EmptyResultSetOCPP 2.x: a configuration report with nothing to report
UnknownClearing a charging profile the charger did not hold; Ivora treats it as cleared
CallErrorThe charger could not process the message at all
nullThe 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.

  1. Poll GET /v1/tenants/{tenant_id}/operations/{operation_id} until charger_status is set.
  2. Or subscribe to the resource's webhooks: charging_profile.accepted, .rejected and .cleared for smart charging, station.configuration_changed for configuration and station.credentials_changed for passwords. operation.completed fires at dispatch, so it can carry charger_status: null.