Release the virtual charger

post/v1/virtual-chargers/{charger_id}/release
Requires an API key

Restores the bench charger: the EV unplugs (ending a running transaction at the target), the route is removed and, after a project or custom target, the charger is factory reset; status releasing until that is done, then ended. Idle (15 minutes without a request) and maximum-age expiry do the same. Idempotent.

Path parameters

  • charger_idstringRequired

Returns · 200

  • idstringRequired
  • workspace_idstringRequired
  • statusenumRequired
    connecting, then online; refused while the target refuses the charger (it keeps retrying); connect_failed when it never connected within 2 minutes; releasing while the charger is restored (EV unplugged, route removed, factory reset after a routed lease); ended.
    One of connecting, online, refused, connect_failed, releasing, ended
  • chargerVirtualChargerHardwareRequired
    Child attributes
    • idstringRequired
      The bench charger leased (bench-<n>).
    • evseinteger | nullRequired
    • connectorsintegerRequired
    • ocpp_identitystring | nullRequired
      The identity it connects as: ivora-bench-<n> (global), p<project>-ivora-bench (project URL, domain) or the caller's, masked (custom URL).
  • leaseLeaseRecordRequired
    Child attributes
    • statusenumRequired
      releasing: the simulated EV is being unplugged before the charger is freed.
      One of active, releasing, released
    • idle_expires_atstring | nullRequired
      While active: when the idle sweep ends the session unless it is read or changed before.
    • expires_atstring | null
      While active: the lease's maximum age (30 minutes by default), after which the sweep stops, settles and releases however active the session is.
    • released_atstring | nullRequired
    • release_reasonstring | nullRequired
      settled, canceled, idle, max_age, operator, payment_canceled or stop_timeout.
  • targetTargetRecordRequired
    Child attributes
    • idstringRequired
      global, project_url, domain:<id> or custom_url.
    • kindenumRequired
      One of global, project_url, domain, custom_url
    • tenant_idinteger | nullRequired
      The project whose address was used (null for global).
    • urlstring | nullRequired
      The address used, without credentials; a custom URL's identity is masked.
    • hoststring | nullRequired
    • resolved_ipstring | nullRequired
      The address the connection was pinned to.
    • portinteger | nullRequired
    • station_idinteger | nullRequired
      project_url and domain: the bench's station in the project (p<project>-ivora-bench).
    • identitystring | nullRequired
      The OCPP identity used, masked for custom URLs.
    • passwordstring | nullRequired
      Always masked (••••••••) when one was supplied; null otherwise.
    • statusenum | nullRequired
      connecting until the charger connected at the target; failed with error; resetting while the charger is factory reset after the lease; restored once it is back on its default.
      One of default, connecting, connected, failed, resetting, restored
    • errorstring | nullRequired
      Why the connection failed: tcp, tls, http <status> or target_timeout.
    • connected_atstring | nullRequired
    • warningstring | null
      A custom ws:// URL: the identity and password travel unencrypted.
  • powerVirtualPowerRecordRequired
    Child attributes
    • max_power_kwstringRequired
      Decimal kW as requested (one decimal).
    • phasesenumRequired
      One of 1, 3
    • ampsnumberRequired
      The simulated EV's maximum current per phase.
    • voltage_vintegerRequired
      Nominal phase voltage of the simulation.
    • applied_asstringRequired
      EVerest's car simulator draws at most this current; the charger's own limit and any charging profile the target system sets can lower it.
  • displayobject | nullRequired
    What the charger's screen shows; null once the lease ended.
    Child attributes
    • connectionScreenConnectionRequired
      Child attributes
      • stateenumRequired
        connecting until the target accepted the charger; refused with reason (http 401, tls..., target_timeout) while the charger retries; offline when the charger cannot be read; released once the lease ended (reason: why).
        One of connecting, online, refused, offline, released
      • reasonstring | nullRequired
      • charger_ocppstring | nullRequired
        The charger's own OCPP connection status (EVerest), e.g. connected.
    • connectorsarray of ScreenConnectorRequired
      Child attributes
      • connector_idintegerRequired
      • statusstring | nullRequired
        The OCPP 1.6 status: the charger's last StatusNotification (status_source status_notification, read by the relay), else the one its EVSE state implies (status_source evse_state).
      • status_sourceenum | nullRequired
        One of status_notification, evse_state
      • error_codestring | nullRequired
      • evse_statestring | nullRequired
        EVerest's EVSE state: Unplugged, AuthRequired, Charging, Finished...
      • pluggedboolean | nullRequired
      • faultedbooleanRequired
    • transactionobject | nullRequired
      From the relay's reading of StartTransaction / StopTransaction; null without a relay.
      Child attributes
      • idintegerRequired
        The transactionId the target system gave in StartTransaction.conf.
      • activebooleanRequired
      • started_atstring | nullRequired
      • stopped_atstring | nullRequired
      • stop_reasonstring | nullRequired
        The StopTransaction reason the charger sent: Local (stop button), EVDisconnected (unplug), Remote...
      • id_tag_statusstring | nullRequired
        idTagInfo.status the target answered (Accepted, Invalid...).
      • id_tagstring | null
        The card that started it: in full when this lease's user typed it, else its last 4 characters behind ****.
      • parent_id_tagstring | null
        The parentIdTag the target answered in StartTransaction.conf, masked.
      • started_byenum | null
        remote_start: the target's RemoteStartTransaction for the same card; local: a card at the reader.
        One of local, remote_start
      • stop_id_tagstring | null
        The card in the StopTransaction (a card tapped to stop it), shown as id_tag.
      • stopped_byenum | null
        Which card stopped it: the same card again, or another one with the same parentIdTag.
        One of same_tag, parent_id_tag
      • meter_start_whinteger | nullRequired
      • meter_stop_whinteger | nullRequired
    • authorizationobject | null
      The latest card result, as the charger's screen shows it.
      Child attributes
      • atstringRequired
      • sourceenumRequired
        The message the result came in: Authorize (a card at the reader, or a remote start with AuthorizeRemoteTxRequests), StartTransaction.conf, or a StopTransaction by the transaction's own card.
        One of Authorize, StartTransaction, StopTransaction
      • connector_idinteger | nullRequired
      • id_tagstring | nullRequired
        In full when this lease's user typed the card, else its last 4 characters behind ****.
      • typedbooleanRequired
        The card is one this lease's user typed (POST .../rfid).
      • statusstring | nullRequired
        idTagInfo.status: Accepted, Blocked, Expired, Invalid or ConcurrentTx (CallError: the target answered an error); null for a stop by the transaction's own card (a charger asks nothing).
      • expiry_datestring | nullRequired
      • parent_id_tagstring | nullRequired
        idTagInfo.parentIdTag, masked.
      • outcomeenum | nullRequired
        awaiting_plug_in: Accepted before the EV was plugged in (plug in before plug_in_by); plug_in_timed_out; started; stopping / stopped: a card with the transaction's parentIdTag, or the same card, stops it; not_owner: Accepted, but another card's transaction is running and the parentIdTag differs, so nothing stops; refused: not Accepted.
        One of awaiting_plug_in, plug_in_timed_out, started, stopping, stopped, not_owner, refused
      • plug_in_bystring | nullRequired
        For awaiting_plug_in: the end of the charger's ConnectionTimeOut.
    • authorizationsarray of ScreenAuthorization
      The lease's card results, newest last (at most 10).
      Default []
      Child attributes
      • atstringRequired
      • sourceenumRequired
        The message the result came in: Authorize (a card at the reader, or a remote start with AuthorizeRemoteTxRequests), StartTransaction.conf, or a StopTransaction by the transaction's own card.
        One of Authorize, StartTransaction, StopTransaction
      • connector_idinteger | nullRequired
      • id_tagstring | nullRequired
        In full when this lease's user typed the card, else its last 4 characters behind ****.
      • typedbooleanRequired
        The card is one this lease's user typed (POST .../rfid).
      • statusstring | nullRequired
        idTagInfo.status: Accepted, Blocked, Expired, Invalid or ConcurrentTx (CallError: the target answered an error); null for a stop by the transaction's own card (a charger asks nothing).
      • expiry_datestring | nullRequired
      • parent_id_tagstring | nullRequired
        idTagInfo.parentIdTag, masked.
      • outcomeenum | nullRequired
        awaiting_plug_in: Accepted before the EV was plugged in (plug in before plug_in_by); plug_in_timed_out; started; stopping / stopped: a card with the transaction's parentIdTag, or the same card, stops it; not_owner: Accepted, but another card's transaction is running and the parentIdTag differs, so nothing stops; refused: not Accepted.
        One of awaiting_plug_in, plug_in_timed_out, started, stopping, stopped, not_owner, refused
      • plug_in_bystring | nullRequired
        For awaiting_plug_in: the end of the charger's ConnectionTimeOut.
    • auth_configobject
      The charger's authorization keys as it reported or accepted them (GetConfiguration, ChangeConfiguration): ConnectionTimeOut, AuthorizeRemoteTxRequests, LocalPreAuthorize, LocalAuthorizeOffline, StopTransactionOnInvalidId, AllowOfflineTxForUnknownId.
      Default {}
    • connection_timeout_sinteger
      The ConnectionTimeOut the screen assumes for a card tapped before the EV: the charger's reported value, else the bench image's 30 s.
      Default 30
    • power_winteger | nullRequired
    • power_kwstring | nullRequired
    • energy_whinteger | nullRequired
      The session's energy in Wh, from the charger (an OCPP 1.6 register unit).
    • energy_kwhstring | nullRequired
      energy_wh / 1000 as decimal text.
    • elapsed_secondsinteger | nullRequired
    • running_costobject | nullRequired
      The running cost the target pushed by OCA California Pricing (RunningCost/FinalCost), as EVerest decoded and displays it.
      Child attributes
      • displayedbooleanRequired
        False until the charger shows a RunningCost or FinalCost stamped after this session's transaction started.
      • statusstring | null
        Running, or Finished after FinalCost.
      • coststring | null
        Major currency units as the charger stores them (it truncates to its decimals).
      • cost_minorinteger | null
        The same amount in units of 10^-cost_decimals.
      • cost_decimalsinteger | null
      • meter_whinteger | null
        The meter reading of the cost message, in Wh (an OCPP 1.6 register).
      • timestampstring | null
      • messagesarray of any | null
    • running_cost_labelstring | null
      Shown with a running cost: a test session's, never charged by Ivora (Ivora targets), or a neutral label for a custom URL, whose system decides (see billing).
    • qrobject | nullRequired
      Child attributes
      • urlstringRequired
        The QR / checkout URL the target pushed (credential-looking query values redacted).
      • evse_idstring | integer | number | nullRequired
      • pricestring | integer | number | nullRequired
      • unitstring | integer | number | nullRequired
      • connector_idstring | integer | number | nullRequired
      • sourceenumRequired
        One of DataTransfer, ChangeConfiguration
      • vendor_idstring | nullRequired
      • message_idstring | nullRequired
      • charger_answerstring | nullRequired
        What the charger answered: Accepted, UnknownVendorId, UnknownMessageId, Rejected... (EVerest accepts the OCA California Pricing messages; other vendors' display messages are answered as unknown, as a charger without that adapter would).
      • atstringRequired
    • priceobject | nullRequired
      Child attributes
      • textstringRequired
      • pricestring | integer | number | nullRequired
      • unitstring | integer | number | nullRequired
      • sourcestringRequired
      • atstringRequired
    • messagesarray of objectRequired
      The latest display frames the target sent (newest last), redacted: at, action (DataTransfer, ChangeConfiguration of display keys, RemoteStartTransaction, RemoteStopTransaction), vendor_id, message_id, key, data/value, status (the charger's answer), id_tag (RemoteStartTransaction; as authorizations show it). Never another configuration key.
    • observedenumRequired
      relay: frames are read; unavailable: no relay on this bench (only the charger's own state and running cost); compressed: the connection is compressed.
      One of relay, unavailable, compressed
    • charger_readablebooleanRequired
    • charger_errorstring | nullRequired
    • read_atstring | nullRequired
  • billingVirtualBillingRequired
    Child attributes
    • testbooleanRequired
      Ivora targets: the station and its transactions are test (the bench's own station), so they are never billed. false for a custom URL: Ivora cannot mark anything in a third party's system.
    • ivora_billsboolean
      The bench creates no bill, payment authorization or payment-provider call, ever.
      Default false
    • noticestringRequired
      What to show the user about billing.
    • warningstring | nullRequired
      Custom URL: that system may bill these sessions; Ivora cannot prevent it.
  • controlsarray of enumRequired
    The controls available now (a refused one answers 409 control_refused with the charger's reason).
  • last_errorstring | nullRequired
  • created_atstringRequired
  • ended_atstring | nullRequired
POST /v1/virtual-chargers/{charger_id}/release
curl --fail-with-body -X POST "https://api.ivoracharge.com/v1/virtual-chargers/charger_0123456789abcdef/release" \
  -H "Authorization: Bearer $IVORA_API_KEY"
Response · 200
{
  "id": "id_0123456789abcdef",
  "workspace_id": "workspace_0123456789abcdef",
  "status": "connecting",
  "charger": {
    "id": "id_0123456789abcdef",
    "evse": 1,
    "connectors": 1,
    "ocpp_identity": "string"
  },
  "lease": {
    "status": "active",
    "idle_expires_at": "2026-09-30T17:00:00Z",
    "expires_at": "2026-09-30T17:00:00Z",
    "released_at": "2026-09-30T17:00:00Z",
    "release_reason": "string"
  },
  "target": {
    "id": "id_0123456789abcdef",
    "kind": "global",
    "tenant_id": 1042,
    "url": "https://app.example.com/ivora/webhooks",
    "host": "string",
    "resolved_ip": "string",
    "port": 1,
    "station_id": 1,
    "identity": "string",
    "password": "string",
    "status": "default",
    "error": "string",
    "connected_at": "2026-09-30T17:00:00Z",
    "warning": "string"
  },
  "power": {
    "max_power_kw": "string",
    "phases": 1,
    "amps": 1.5,
    "voltage_v": 1,
    "applied_as": "ev_max_current"
  },
  "display": {
    "connection": {
      "state": "connecting",
      "reason": "string",
      "charger_ocpp": "string"
    },
    "connectors": [
      {
        "connector_id": 1,
        "status": "string",
        "status_source": "status_notification",
        "error_code": "string",
        "evse_state": "string",
        "plugged": false,
        "faulted": false
      }
    ],
    "transaction": {
      "id": 1,
      "active": false,
      "started_at": "2026-09-30T17:00:00Z",
      "stopped_at": "2026-09-30T17:00:00Z",
      "stop_reason": "string",
      "id_tag_status": "string",
      "id_tag": "string",
      "parent_id_tag": "string",
      "started_by": "local",
      "stop_id_tag": "string",
      "stopped_by": "same_tag",
      "meter_start_wh": 7500,
      "meter_stop_wh": 7500
    },
    "authorization": {
      "at": "string",
      "source": "Authorize",
      "connector_id": 1,
      "id_tag": "string",
      "typed": false,
      "status": "string",
      "expiry_date": "string",
      "parent_id_tag": "string",
      "outcome": "awaiting_plug_in",
      "plug_in_by": "string"
    },
    "authorizations": [],
    "auth_config": {},
    "connection_timeout_s": 30,
    "power_w": 1,
    "power_kw": "string",
    "energy_wh": 7500,
    "energy_kwh": "string",
    "elapsed_seconds": 1,
    "running_cost": {
      "displayed": false,
      "status": "string",
      "cost": "string",
      "cost_minor": 1250,
      "cost_decimals": 1,
      "meter_wh": 7500,
      "timestamp": "string",
      "messages": [
        null
      ]
    },
    "running_cost_label": "string",
    "qr": {
      "url": "https://app.example.com/ivora/webhooks",
      "evse_id": "evse_0123456789abcdef",
      "price": "string",
      "unit": "string",
      "connector_id": 1,
      "source": "DataTransfer",
      "vendor_id": "vendor_0123456789abcdef",
      "message_id": "message_0123456789abcdef",
      "charger_answer": "string",
      "at": "string"
    },
    "price": {
      "text": "string",
      "price": "string",
      "unit": "string",
      "source": "string",
      "at": "string"
    },
    "messages": [
      {}
    ],
    "observed": "relay",
    "charger_readable": false,
    "charger_error": "string",
    "read_at": "2026-09-30T17:00:00Z"
  },
  "billing": {
    "test": false,
    "ivora_bills": false,
    "notice": "string",
    "warning": "string"
  },
  "controls": [
    "plug"
  ],
  "last_error": "string",
  "created_at": "2026-09-30T17:00:00Z",
  "ended_at": "2026-09-30T17:00:00Z"
}
Try itproduction · api.ivoracharge.com

Paste a production api key (iv_live_…). Create keys in Developer tools. The key stays in this page's memory, is sent only to https://api.ivoracharge.com and clears when you reload. Test keys are refused.

POST is a write: you confirm the method, path and project before it is sent, with a generated Idempotency-Key.