Quote a session's cost on a connector's tariff
Read-only: quotes the session profile exactly as POST /tariffs/{tariff_id}/quote does, on the tariff that applies to this connector now by the pricing order (its own, its location's default or the project's default; an archived assigned tariff can be quoted). The response's tariff_id says which. The tax of the station's own location applies (tax, and total_minor tax included), as a bill on this connector freezes it; the body takes no location_id (422 if sent). 409 connector_tariff_missing when no tariff applies. Nothing is stored and no charger is contacted. Needs stations:read and billing:read.
Path parameters
- tenant_idintegerRequired
- station_idintegerRequired
- connector_idintegerRequired
- evse_numberintegerRequiredThe EVSE's number on the station (evse_number in station reads).Minimum 1 · Maximum 99
Request body
- sessionSessionProfileRequiredA charging session to price. Energy is cumulative kWh: energy_kwh spreads evenly over duration_minutes, or energy_curve gives it at points (linear between them).
Child attributes
- start_atstringRequiredWhen charging starts, ISO 8601 with an offset.
- time_zonestring | nullIANA time zone for the tariff's local-time restrictions. Default: the tariff's time_zone, else start_at's offset.Up to 64 characters
- duration_minutesnumberCharging time in minutes (TIME is billed on it).Default
0· Minimum 0 · Maximum 10080 - energy_kwhnumber | nullTotal energy, kWh. Omit when energy_curve is given.Minimum 0 · Maximum 100000
- energy_curvearray of CurvePoint | nullCumulative kWh at minutes into charging, ascending.
Child attributes
- minutenumberRequiredMinutes after charging started.Minimum 0 · Maximum 10080
- kwhnumberRequiredCumulative energy charged by then, kWh.Minimum 0 · Maximum 100000
- idle_minutesnumberMinutes connected after charging ends (PARKING_TIME is billed on it).Default
0· Minimum 0 · Maximum 10080 - power_kwnumber | nullConstant charging power for power restrictions, kW. Default: the energy curve's slope.Minimum 0 · Maximum 10000
- current_anumber | nullCharging current for current restrictions, A. Unknown matches no current-restricted element.Minimum 0 · Maximum 10000
- reservation_minutesnumberMinutes reserved before charging starts (reservation elements price them).Default
0· Minimum 0 · Maximum 1440 - reservation_expiredbooleanThe reservation expired unused: no charging; RESERVATION_EXPIRES elements apply.Default
false - groupstring | nullMember or RFID group, for group discounts.Up to 128 characters
- id_tokenstring | nullRFID or app token, for group discounts that list tokens. Not stored.Up to 64 characters
- merchant_validationstring | nullA merchant validation code, for the merchant validation rule.Pattern
^[A-Za-z0-9][A-Za-z0-9_.:-]{0,63}$ - prepaid_balance_minorinteger | nullA prepaid balance, for the prepaid_limit report.Minimum 0 · Maximum 100000000
Returns · 200
- tariff_idinteger | nullThe stored tariff quoted; null for a simulation.
- currencystringRequired
- pricing_versionenumRequiredenergy-v1: a simple tariff (kWh × rate, unchanged); elements-v1: elements and rules.One of
energy-v1,elements-v1 - linesarray of QuoteLineRequired
Child attributes
- typeenumRequiredOne of
ENERGY,TIME,PARKING_TIME,FLAT - elementintegerRequiredIndex of the element that priced this line.
- reservationbooleanRequiredThe line prices a reservation.
- quantitystringRequiredDecimal quantity in unit (rounded to 6 places for display).
- unitenumRequiredOne of
kWh,h,session - price_minorstringRequiredMinor units per unit (decimal string).
- exact_minorstringRequiredUnrounded amount, minor units (decimal string, 6 places).
- amount_minorintegerRequiredAmount rounded half up to integer minor units, for display. total_minor rounds the exact sum once, so line amounts may differ from it by rounding.
- subtotal_minorintegerRequiredThe elements' exact sum rounded half up, before rules.
- exact_subtotal_minorstringRequired
- adjustmentsarray of QuoteAdjustmentRequired
Child attributes
- kindenumRequiredOne of
group_discount,merchant_validation,max_session_cost - rulestringRequiredThe group discount id, the validation code, or max_session_cost_minor.
- exact_minorstringRequired
- amount_minorintegerRequiredNegative: a reduction.
- total_minorintegerRequiredInteger minor units: the exact subtotal after rules, rounded half up once, plus the location's tax lines when they apply (tax). Bills finalize with this same calculation.
- prepaidobject | nullRequired
Child attributes
- balance_minorintegerRequired
- covered_minorintegerRequired
- shortfall_minorintegerRequired
- limit_reachedbooleanRequiredThe session's total reaches the balance: stop or top up.
- tariff_alt_textarray of AltTextThe tariff's driver-facing descriptions, for receipts.
Child attributes
- languagestringRequiredISO 639-1 language code.Pattern
^[a-z]{2}$ - textstringRequiredDriver-facing description of the tariff.1–512 characters
- idle_free_secondsinteger | nullWith idle_grace_minutes: the idle seconds that were free; absent otherwise.
- activityobject | nullBills on complex tariffs only: the charging and idle time the bill was priced over. Null on quotes, simulations and simple tariffs (which price kWh only).
Child attributes
- methodenumRequiredocpp201_charging_state: the charger's OCPP 2.x chargingState. ocpp16_status: OCPP 1.6 connector statuses (Charging; SuspendedEV, SuspendedEVSE and Finishing are idle). ocpp16_status_and_power: those statuses, plus idle wherever the meter shows almost no power for a while. meter_power: the meter alone. none: not enough data; the whole transaction is charging time, as before idle detection (unless it drew less than 1 Wh: see reason no_energy).One of
ocpp201_charging_state,ocpp16_status,ocpp16_status_and_power,meter_power,none - detectedbooleanRequiredFalse: method none, and reason says why. A session with less than 1 Wh is all waiting (reason no_energy), and detected is true then, also with method none.
- reasonstring | nullWhy nothing was detected (for example no_state_or_meter_data); no_energy: a session with less than 1 Wh is all waiting, billing neither TIME nor PARKING_TIME nor energy; else null.
- charging_secondsintegerRequired
- idle_secondsintegerRequired
- waiting_secondsintegerPlugged in before the first charging: neither TIME nor PARKING_TIME.Default
0 - intervalsarray of ActivityIntervalRequiredThe transaction from start to end, oldest first.
Child attributes
- startstringRequiredUTC, ISO 8601.
- endstringRequiredUTC, ISO 8601.
- stateenumRequiredwaiting: plugged in before the first charging, priced as neither TIME nor PARKING_TIME.One of
charging,idle,waiting
- taxobject | nullWith a location's tax lines (location_id on quotes, the station's location on bills): the tax lines, net and total. Absent without tax.
Child attributes
- price_modeenumRequiredOne of
tax_exclusive,tax_inclusive - linesarray of QuoteTaxLineRequired
Child attributes
- namestringRequired
- typeenumRequiredOne of
percent,per_kwh - ratestringRequired
- compoundbooleanRequired
- excluded_componentsarray of enumRequired
- registration_numberstring | nullRequiredPrinted on receipts.
- base_minorstring | nullRequiredpercent lines: the exact amount taxed, minor units (decimal string, 6 places); null for per_kwh.
- quantity_kwhstring | nullRequiredper_kwh lines: the kWh taxed; null for percent.
- exact_minorstringRequiredUnrounded tax, minor units (decimal string, 6 places).
- amount_minorintegerRequiredThe line's tax, rounded half up once.
- net_minorintegerRequiredThe price before tax: total_minor minus tax_minor.
- tax_minorintegerRequiredThe sum of the lines' amount_minor.
- total_minorintegerRequiredWhat the driver pays, tax included; the quote's and bill's total_minor.
curl --fail-with-body -X POST "https://api.ivoracharge.com/v1/tenants/1042/stations/1/evses/1/connectors/1/quote" \
-H "Authorization: Bearer $IVORA_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"session": {
"start_at": "2026-10-15T17:30:00-07:00"
}
}'{
"tariff_id": 42,
"currency": "usd",
"pricing_version": "energy-v1",
"lines": [
{
"type": "ENERGY",
"element": 1,
"reservation": false,
"quantity": "string",
"unit": "kWh",
"price_minor": "string",
"exact_minor": "string",
"amount_minor": 1250
}
],
"subtotal_minor": 1250,
"exact_subtotal_minor": "string",
"adjustments": [
{
"kind": "group_discount",
"rule": "string",
"exact_minor": "string",
"amount_minor": 1250
}
],
"total_minor": 1250,
"prepaid": {
"balance_minor": 1250,
"covered_minor": 1250,
"shortfall_minor": 1250,
"limit_reached": false
},
"tariff_alt_text": [
{
"language": "string",
"text": "string"
}
],
"idle_free_seconds": 1,
"activity": {
"method": "ocpp201_charging_state",
"detected": false,
"reason": "string",
"charging_seconds": 1,
"idle_seconds": 1,
"waiting_seconds": 0,
"intervals": [
{
"start": "string",
"end": "string",
"state": "charging"
}
]
},
"tax": {
"price_mode": "tax_exclusive",
"lines": [
{
"name": "bay-01",
"type": "percent",
"rate": "string",
"compound": false,
"excluded_components": [
"ENERGY"
],
"registration_number": "string",
"base_minor": "string",
"quantity_kwh": "string",
"exact_minor": "string",
"amount_minor": 1250
}
],
"net_minor": 1250,
"tax_minor": 1250,
"total_minor": 1250
}
}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.



