Tap an RFID card
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_tagstringRequiredThe 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_idintegerThe reader's connector; the bench chargers have one.Default
1
Returns · 200
- idstringRequired
- workspace_idstringRequired
- statusenumRequiredconnecting, 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
- idstringRequiredThe bench charger leased (bench-<n>).
- evseinteger | nullRequired
- connectorsintegerRequired
- ocpp_identitystring | nullRequiredThe 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
- statusenumRequiredreleasing: the simulated EV is being unplugged before the charger is freed.One of
active,releasing,released - idle_expires_atstring | nullRequiredWhile active: when the idle sweep ends the session unless it is read or changed before.
- expires_atstring | nullWhile 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 | nullRequiredsettled, canceled, idle, max_age, operator, payment_canceled or stop_timeout.
- targetTargetRecordRequired
Child attributes
- idstringRequiredglobal, project_url, domain:<id> or custom_url.
- kindenumRequiredOne of
global,project_url,domain,custom_url - tenant_idinteger | nullRequiredThe project whose address was used (null for global).
- urlstring | nullRequiredThe address used, without credentials; a custom URL's identity is masked.
- hoststring | nullRequired
- resolved_ipstring | nullRequiredThe address the connection was pinned to.
- portinteger | nullRequired
- station_idinteger | nullRequiredproject_url and domain: the bench's station in the project (p<project>-ivora-bench).
- identitystring | nullRequiredThe OCPP identity used, masked for custom URLs.
- passwordstring | nullRequiredAlways masked (••••••••) when one was supplied; null otherwise.
- statusenum | nullRequiredconnecting 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 | nullRequiredWhy the connection failed: tcp, tls, http <status> or target_timeout.
- connected_atstring | nullRequired
- warningstring | nullA custom ws:// URL: the identity and password travel unencrypted.
- powerVirtualPowerRecordRequired
Child attributes
- max_power_kwstringRequiredDecimal kW as requested (one decimal).
- phasesenumRequiredOne of
1,3 - ampsnumberRequiredThe simulated EV's maximum current per phase.
- voltage_vintegerRequiredNominal phase voltage of the simulation.
- applied_asstringRequiredEVerest'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 | nullRequiredWhat the charger's screen shows; null once the lease ended.
Child attributes
- connectionScreenConnectionRequired
Child attributes
- stateenumRequiredconnecting 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 | nullRequiredThe charger's own OCPP connection status (EVerest), e.g. connected.
- connectorsarray of ScreenConnectorRequired
Child attributes
- connector_idintegerRequired
- statusstring | nullRequiredThe 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 | nullRequiredOne of
status_notification,evse_state - error_codestring | nullRequired
- evse_statestring | nullRequiredEVerest's EVSE state: Unplugged, AuthRequired, Charging, Finished...
- pluggedboolean | nullRequired
- faultedbooleanRequired
- transactionobject | nullRequiredFrom the relay's reading of StartTransaction / StopTransaction; null without a relay.
Child attributes
- idintegerRequiredThe transactionId the target system gave in StartTransaction.conf.
- activebooleanRequired
- started_atstring | nullRequired
- stopped_atstring | nullRequired
- stop_reasonstring | nullRequiredThe StopTransaction reason the charger sent: Local (stop button), EVDisconnected (unplug), Remote...
- id_tag_statusstring | nullRequiredidTagInfo.status the target answered (Accepted, Invalid...).
- id_tagstring | nullThe card that started it: in full when this lease's user typed it, else its last 4 characters behind ****.
- parent_id_tagstring | nullThe parentIdTag the target answered in StartTransaction.conf, masked.
- started_byenum | nullremote_start: the target's RemoteStartTransaction for the same card; local: a card at the reader.One of
local,remote_start - stop_id_tagstring | nullThe card in the StopTransaction (a card tapped to stop it), shown as id_tag.
- stopped_byenum | nullWhich 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 | nullThe latest card result, as the charger's screen shows it.
Child attributes
- atstringRequired
- sourceenumRequiredThe 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 | nullRequiredIn full when this lease's user typed the card, else its last 4 characters behind ****.
- typedbooleanRequiredThe card is one this lease's user typed (POST .../rfid).
- statusstring | nullRequiredidTagInfo.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 | nullRequiredidTagInfo.parentIdTag, masked.
- outcomeenum | nullRequiredawaiting_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 | nullRequiredFor awaiting_plug_in: the end of the charger's ConnectionTimeOut.
- authorizationsarray of ScreenAuthorizationThe lease's card results, newest last (at most 10).Default
[]Child attributes
- atstringRequired
- sourceenumRequiredThe 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 | nullRequiredIn full when this lease's user typed the card, else its last 4 characters behind ****.
- typedbooleanRequiredThe card is one this lease's user typed (POST .../rfid).
- statusstring | nullRequiredidTagInfo.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 | nullRequiredidTagInfo.parentIdTag, masked.
- outcomeenum | nullRequiredawaiting_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 | nullRequiredFor awaiting_plug_in: the end of the charger's ConnectionTimeOut.
- auth_configobjectThe charger's authorization keys as it reported or accepted them (GetConfiguration, ChangeConfiguration): ConnectionTimeOut, AuthorizeRemoteTxRequests, LocalPreAuthorize, LocalAuthorizeOffline, StopTransactionOnInvalidId, AllowOfflineTxForUnknownId.Default
{} - connection_timeout_sintegerThe 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 | nullRequiredThe session's energy in Wh, from the charger (an OCPP 1.6 register unit).
- energy_kwhstring | nullRequiredenergy_wh / 1000 as decimal text.
- elapsed_secondsinteger | nullRequired
- running_costobject | nullRequiredThe running cost the target pushed by OCA California Pricing (RunningCost/FinalCost), as EVerest decoded and displays it.
Child attributes
- displayedbooleanRequiredFalse until the charger shows a RunningCost or FinalCost stamped after this session's transaction started.
- statusstring | nullRunning, or Finished after FinalCost.
- coststring | nullMajor currency units as the charger stores them (it truncates to its decimals).
- cost_minorinteger | nullThe same amount in units of 10^-cost_decimals.
- cost_decimalsinteger | null
- meter_whinteger | nullThe meter reading of the cost message, in Wh (an OCPP 1.6 register).
- timestampstring | null
- messagesarray of any | null
- running_cost_labelstring | nullShown 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
- urlstringRequiredThe 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
- sourceenumRequiredOne of
DataTransfer,ChangeConfiguration - vendor_idstring | nullRequired
- message_idstring | nullRequired
- charger_answerstring | nullRequiredWhat 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 objectRequiredThe 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.
- observedenumRequiredrelay: 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
- testbooleanRequiredIvora 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_billsbooleanThe bench creates no bill, payment authorization or payment-provider call, ever.Default
false - noticestringRequiredWhat to show the user about billing.
- warningstring | nullRequiredCustom URL: that system may bill these sessions; Ivora cannot prevent it.
- controlsarray of enumRequiredThe controls available now (a refused one answers 409 control_refused with the charger's reason).
- last_errorstring | nullRequired
- created_atstringRequired
- ended_atstring | nullRequired
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"
}'{
"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.