Quote a session's cost under a stored tariff
post/v1/tenants/{tenant_id}/tariffs/{tariff_id}/quote
Requires an API key
Read-only: prices a session profile (start, charging minutes, total kWh or a kWh curve, idle minutes, power, current, reservation, group or token, merchant validation code, prepaid balance) with the same function bills finalize with, and returns the itemised lines, the rule adjustments and total_minor. Archived tariffs can be quoted. Nothing is stored and no charger is contacted. A real bill for a session with less than 1 Wh bills no TIME or PARKING_TIME; quote prices the profile as given.
Path parameters
- tenant_idintegerRequired
- tariff_idintegerRequired
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. 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
- 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
POST /v1/tenants/{tenant_id}/tariffs/{tariff_id}/quote
curl --fail-with-body -X POST "https://api.ivoracharge.com/v1/tenants/1042/tariffs/42/quote" \
-H "Authorization: Bearer $IVORA_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"session": {
"start_at": "2026-10-15T17:30:00-07:00"
}
}'Response · 200
{
"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"
}
],
"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"
}
]
}
}Try it is not available here yetRequests from this page are off until the production API at
https://api.ivoracharge.com is public. Use the code samples from your application server; Ivora grants production access. Keys are created in Developer tools.