Tap an RFID card

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

As a real charger's reader: the charger sends Authorize with id_tag and starts a transaction (StartTransaction) when the target accepts it and the EV is plugged in, in either order within the charger's ConnectionTimeOut (display.connection_timeout_s). The transaction's own card again stops it (StopTransaction reason Local); another card stops it only when the target answers the same parentIdTag, else nothing stops (outcome not_owner). The result (Accepted, Blocked, Expired, Invalid, ConcurrentTx, expiryDate, parentIdTag) and its outcome appear in display.authorization. The idTag is never stored or logged; this leaser's own signed-in reads show it in full; every other read (other members, API keys, staff) masked. Errors: 409 control_refused, 409 virtual_charger_ended, 503 bench_charger_unavailable. See Errors and statuses.

Path parameters

  • charger_idstringRequired

Request body

  • id_tagstringRequired
    The card's idTag: OCPP 1.6 CiString20, 1-20 of A-Z a-z 0-9 . _ : -. The target system authorizes it (Authorize, then StartTransaction once the EV is plugged in, in either order within the charger's ConnectionTimeOut). The same card while charging stops the transaction (StopTransaction reason Local); another card stops it only if the target answers the same parentIdTag. Shown in full only in this lease's own reads.
    Pattern ^[A-Za-z0-9._:-]{1,20}$
  • connector_idinteger
    The reader's connector; the bench chargers have one.
    Default 1

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}/rfid
curl --fail-with-body -X POST "https://api.ivoracharge.com/v1/virtual-chargers/charger_0123456789abcdef/rfid" \
  -H "Authorization: Bearer $IVORA_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
  "id_tag": "string"
}'
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.