Change a tariff's prices
Synchronous. Changes only the supplied fields, with the rules of tariff creation, and records a tariff.updated event with each change and the actor. The simple fields are kWh-only: a non-zero rate_minor_per_minute or session_fee_minor returns 422; 0 stores 0. elements replace every element and update the base rate; rate_minor_per_kwh alone on a complex tariff returns 409 tariff_complex. Changing the prices of a tariff whose tariff_alt_text you supplied needs tariff_alt_text (or null for the generated text) in the same request, so drivers never read a stale price. Bills snapshot their tariff when they are created: an open or final bill, and the running cost of a session already billed, keep the old price; new bills and charger displays use the new one. An archived tariff returns 409 tariff_archived. Replays with the same Idempotency-Key return the current tariff.
Path parameters
- tenant_idintegerRequired
- tariff_idintegerRequired
Headers
- idempotency-keystringRequired
Request body
- currencystring | nullPattern
^[A-Z]{3}$ - rate_minor_per_kwhinteger | nullInteger minor units per kWh (USD cents). A complex tariff refuses it (409 tariff_complex) unless elements are sent too: change its elements.Minimum 0 · Maximum 100000
- authorization_minorinteger | nullInteger minor units held before charging.Minimum 0 · Maximum 100000
- rate_minor_per_minuteinteger | nullInteger minor units per minute. The simple fields are kWh-only: a simple tariff bills rate_minor_per_kwh × kWh and no time or session fee, so only 0 is accepted (and stored as 0); a non-zero value returns 422. Price charging time, idle time or a session fee with elements (TIME, PARKING_TIME, FLAT). Tariffs created elsewhere may still carry one, which is returned unchanged and not billed.Minimum 0 · Maximum 100000
- session_fee_minorinteger | nullInteger minor units per session. The simple fields are kWh-only: a simple tariff bills rate_minor_per_kwh × kWh and no time or session fee, so only 0 is accepted (and stored as 0); a non-zero value returns 422. Price charging time, idle time or a session fee with elements (TIME, PARKING_TIME, FLAT). Tariffs created elsewhere may still carry one, which is returned unchanged and not billed.Minimum 0 · Maximum 100000
- elementsarray of TariffElement | nullReplaces every element. OCPI 2.2.1 TariffElements, the native tariff format. For each moment of a session the first element that prices a dimension and whose restrictions all hold applies. Overlapping time windows must nest (narrower first) and an element may not hide a later one.
Child attributes
- price_componentsarray of PriceComponentRequired
Child attributes
- typeenumRequiredENERGY: price per kWh. TIME: price per hour while charging. PARKING_TIME: price per hour idle (connected, not charging). FLAT: a fee per session (per reservation in a reservation element). Bills tell charging from idle time from the charger's reports and charge TIME and PARKING_TIME accordingly; when a session has too little data, all of it is charging time.One of
ENERGY,TIME,PARKING_TIME,FLAT - pricenumberRequiredMajor units excluding tax, at most 4 decimal places (OCPI): 0.35 is $0.35 per kWh.Minimum 0 · Maximum 10000
- step_sizeintegerOCPI step size: ENERGY in Wh, TIME and PARKING_TIME in seconds; the dimension's total rounds up to a multiple of the last billed element's step. 1 bills the metered quantity exactly. Ignored for FLAT.Default
1· Minimum 1 · Maximum 86400
- restrictionsobject | nullOCPI 2.2.1 TariffRestrictions, evaluated in the tariff's local time. All given restrictions must hold. min values are inclusive, max values and end times/dates exclusive; an end_time before its start_time wraps midnight.
Child attributes
- start_timestring | nullLocal time of day (HH:MM) from which the element applies.Pattern
^([01][0-9]|2[0-3]):[0-5][0-9]$ - end_timestring | nullLocal time of day (HH:MM) until which the element applies (exclusive).Pattern
^([01][0-9]|2[0-3]):[0-5][0-9]$ - start_datestring | nullLocal date (YYYY-MM-DD) from which the element applies.Pattern
^[0-9]{4}-(0[1-9]|1[0-2])-(0[1-9]|[12][0-9]|3[01])$ - end_datestring | nullLocal date (YYYY-MM-DD) until which the element applies (exclusive).Pattern
^[0-9]{4}-(0[1-9]|1[0-2])-(0[1-9]|[12][0-9]|3[01])$ - min_kwhnumber | nullEnergy already charged in the session, kWh (inclusive).Minimum 0 · Maximum 100000
- max_kwhnumber | nullEnergy already charged in the session, kWh (exclusive).Minimum 0 · Maximum 100000
- min_currentnumber | nullCharging current, A (inclusive). An element restricting current never applies when the current is unknown.Minimum 0 · Maximum 10000
- max_currentnumber | nullCharging current, A (exclusive).Minimum 0 · Maximum 10000
- min_powernumber | nullCharging power, kW (inclusive). Unknown power matches no power-restricted element.Minimum 0 · Maximum 10000
- max_powernumber | nullCharging power, kW (exclusive).Minimum 0 · Maximum 10000
- min_durationinteger | nullSession duration so far, seconds (inclusive).Minimum 0 · Maximum 604800
- max_durationinteger | nullSession duration so far, seconds (exclusive).Minimum 0 · Maximum 604800
- day_of_weekarray of enum | nullLocal days on which the element applies.
- reservationenum | nullPrices a reservation (TIME: reserved time, FLAT: reservation fee) instead of charging; RESERVATION_EXPIRES only when the reservation expires unused.One of
RESERVATION,RESERVATION_EXPIRES
- tariff_alt_textarray of AltText | nullDriver-facing descriptions (OCPI tariff_alt_text), at most one per language. Omit to have Ivora generate an English one from the elements; a tariff too complex to describe in 512 characters is refused unless you supply it. Send null to return to the generated text.
Child attributes
- languagestringRequiredISO 639-1 language code.Pattern
^[a-z]{2}$ - textstringRequiredDriver-facing description of the tariff.1–512 characters
- rulesobject | nullReplaces the billing rules; send {} or null to remove them.
Child attributes
- group_discountsarray of GroupDiscountMember/RFID group discounts: the largest matching one applies; they never stack.
Child attributes
- idstringRequiredYour name for this discount; shown on quote and bill adjustments.Pattern
^[A-Za-z0-9][A-Za-z0-9_.:-]{0,63}$ - groupsarray of stringMember or RFID groups (the session's group) the discount applies to.
- id_tokensarray of stringRFID or app tokens (the session's id_token) the discount applies to.
- percent_offintegerRequiredMinimum 1 · Maximum 100
- merchant_validationobject | nullA discount when the session carries a merchant validation code.
Child attributes
- percent_offinteger | nullMinimum 1 · Maximum 100
- amount_off_minorinteger | nullInteger minor units off, never below 0.Minimum 1 · Maximum 10000000
- codesarray of stringAccepted validation codes; empty accepts any code the session carries.
- max_session_cost_minorinteger | nullCap on a session's total, integer minor units.Minimum 1 · Maximum 100000000
- prepaid_limitbooleanReport, on quotes for sessions with prepaid_balance_minor, how much the balance covers and whether the session reaches it. It never changes the total; your application stops or tops up.Default
false
- time_zonestring | nullIANA time zone of the restrictions' local times. Omit to use the station location's time zone when billing (UTC without one). Send null to remove it.Up to 64 characters
Returns · 200
- idintegerRequired
- tenant_idintegerRequired
- currencystringRequired
- rate_minor_per_kwhinteger | numberRequiredInteger minor units per kWh. Tariffs created elsewhere with sub-cent rates return a decimal number.
- authorization_minorinteger | numberRequired
- rate_minor_per_minuteinteger | number | nullMinor units per minute, or null. The simple fields are kWh-only: a simple tariff bills rate_minor_per_kwh × kWh and no time or session fee, so only 0 is accepted (and stored as 0); a non-zero value returns 422. Price charging time, idle time or a session fee with elements (TIME, PARKING_TIME, FLAT). Tariffs created elsewhere may still carry one, which is returned unchanged and not billed.
- session_fee_minorinteger | number | nullMinor units per session, or null. The simple fields are kWh-only: a simple tariff bills rate_minor_per_kwh × kWh and no time or session fee, so only 0 is accepted (and stored as 0); a non-zero value returns 422. Price charging time, idle time or a session fee with elements (TIME, PARKING_TIME, FLAT). Tariffs created elsewhere may still carry one, which is returned unchanged and not billed.
- archivedbooleanArchived tariffs keep their ID for bills that snapshot them, cannot be edited and start no new bill or display.Default
false - archived_atstring | null
- external_referencestring | null
- is_complexbooleanBilling differs from rate_minor_per_kwh × kWh: the tariff has restricted or several elements, time, idle or session prices, a step size, or billing rules. rate_minor_per_kwh is then its base rate only.Default
false - pricing_summarystring | nullDriver-facing description: the English tariff_alt_text.
- elementsarray of TariffElement | nullAPI version 2026-10-15 and later: the OCPI 2.2.1-aligned blocks billing uses; a simple tariff shows its one ENERGY block.
Child attributes
- price_componentsarray of PriceComponentRequired
Child attributes
- typeenumRequiredENERGY: price per kWh. TIME: price per hour while charging. PARKING_TIME: price per hour idle (connected, not charging). FLAT: a fee per session (per reservation in a reservation element). Bills tell charging from idle time from the charger's reports and charge TIME and PARKING_TIME accordingly; when a session has too little data, all of it is charging time.One of
ENERGY,TIME,PARKING_TIME,FLAT - pricenumberRequiredMajor units excluding tax, at most 4 decimal places (OCPI): 0.35 is $0.35 per kWh.Minimum 0 · Maximum 10000
- step_sizeintegerOCPI step size: ENERGY in Wh, TIME and PARKING_TIME in seconds; the dimension's total rounds up to a multiple of the last billed element's step. 1 bills the metered quantity exactly. Ignored for FLAT.Default
1· Minimum 1 · Maximum 86400
- restrictionsobject | nullOCPI 2.2.1 TariffRestrictions, evaluated in the tariff's local time. All given restrictions must hold. min values are inclusive, max values and end times/dates exclusive; an end_time before its start_time wraps midnight.
Child attributes
- start_timestring | nullLocal time of day (HH:MM) from which the element applies.Pattern
^([01][0-9]|2[0-3]):[0-5][0-9]$ - end_timestring | nullLocal time of day (HH:MM) until which the element applies (exclusive).Pattern
^([01][0-9]|2[0-3]):[0-5][0-9]$ - start_datestring | nullLocal date (YYYY-MM-DD) from which the element applies.Pattern
^[0-9]{4}-(0[1-9]|1[0-2])-(0[1-9]|[12][0-9]|3[01])$ - end_datestring | nullLocal date (YYYY-MM-DD) until which the element applies (exclusive).Pattern
^[0-9]{4}-(0[1-9]|1[0-2])-(0[1-9]|[12][0-9]|3[01])$ - min_kwhnumber | nullEnergy already charged in the session, kWh (inclusive).Minimum 0 · Maximum 100000
- max_kwhnumber | nullEnergy already charged in the session, kWh (exclusive).Minimum 0 · Maximum 100000
- min_currentnumber | nullCharging current, A (inclusive). An element restricting current never applies when the current is unknown.Minimum 0 · Maximum 10000
- max_currentnumber | nullCharging current, A (exclusive).Minimum 0 · Maximum 10000
- min_powernumber | nullCharging power, kW (inclusive). Unknown power matches no power-restricted element.Minimum 0 · Maximum 10000
- max_powernumber | nullCharging power, kW (exclusive).Minimum 0 · Maximum 10000
- min_durationinteger | nullSession duration so far, seconds (inclusive).Minimum 0 · Maximum 604800
- max_durationinteger | nullSession duration so far, seconds (exclusive).Minimum 0 · Maximum 604800
- day_of_weekarray of enum | nullLocal days on which the element applies.
- reservationenum | nullPrices a reservation (TIME: reserved time, FLAT: reservation fee) instead of charging; RESERVATION_EXPIRES only when the reservation expires unused.One of
RESERVATION,RESERVATION_EXPIRES
- tariff_alt_textarray of AltText | nullAPI version 2026-10-15 and later: the driver-facing descriptions, supplied or generated.
Child attributes
- languagestringRequiredISO 639-1 language code.Pattern
^[a-z]{2}$ - textstringRequiredDriver-facing description of the tariff.1–512 characters
- rulesobject | nullAPI version 2026-10-15 and later: the Ivora billing rules, {} without any.
Child attributes
- group_discountsarray of GroupDiscountMember/RFID group discounts: the largest matching one applies; they never stack.
Child attributes
- idstringRequiredYour name for this discount; shown on quote and bill adjustments.Pattern
^[A-Za-z0-9][A-Za-z0-9_.:-]{0,63}$ - groupsarray of stringMember or RFID groups (the session's group) the discount applies to.
- id_tokensarray of stringRFID or app tokens (the session's id_token) the discount applies to.
- percent_offintegerRequiredMinimum 1 · Maximum 100
- merchant_validationobject | nullA discount when the session carries a merchant validation code.
Child attributes
- percent_offinteger | nullMinimum 1 · Maximum 100
- amount_off_minorinteger | nullInteger minor units off, never below 0.Minimum 1 · Maximum 10000000
- codesarray of stringAccepted validation codes; empty accepts any code the session carries.
- max_session_cost_minorinteger | nullCap on a session's total, integer minor units.Minimum 1 · Maximum 100000000
- prepaid_limitbooleanReport, on quotes for sessions with prepaid_balance_minor, how much the balance covers and whether the session reaches it. It never changes the total; your application stops or tops up.Default
false
- time_zonestring | nullAPI version 2026-10-15 and later: the restrictions' IANA time zone, or null.
curl --fail-with-body -X PATCH "https://api.ivoracharge.com/v1/tenants/1042/tariffs/42" \
-H "Authorization: Bearer $IVORA_API_KEY" \
-H "Idempotency-Key: order-2026-09-30-0001" \
-H "Content-Type: application/json" \
-d '{}'{
"id": 1,
"tenant_id": 1042,
"currency": "usd",
"rate_minor_per_kwh": 1,
"authorization_minor": 1250,
"rate_minor_per_minute": 1,
"session_fee_minor": 1250,
"archived": false,
"archived_at": "2026-09-30T17:00:00Z",
"external_reference": "property:1001",
"is_complex": false,
"pricing_summary": "string",
"elements": [
{
"price_components": [
{
"type": "ENERGY",
"price": 0,
"step_size": 1
}
],
"restrictions": {
"start_time": "16:00",
"end_time": "21:00",
"start_date": "string",
"end_date": "string",
"min_kwh": 0,
"max_kwh": 0,
"min_current": 0,
"max_current": 0,
"min_power": 0,
"max_power": 0,
"min_duration": 0,
"max_duration": 0,
"day_of_week": [
"MONDAY"
],
"reservation": "RESERVATION"
}
}
],
"tariff_alt_text": [
{
"language": "string",
"text": "string"
}
],
"rules": {
"group_discounts": [
{
"id": "id_0123456789abcdef",
"groups": [
"string"
],
"id_tokens": [
"string"
],
"percent_off": 1
}
],
"merchant_validation": {
"percent_off": 1,
"amount_off_minor": 1250,
"codes": [
"string"
]
},
"max_session_cost_minor": 1250,
"prepaid_limit": false
},
"time_zone": "America/Los_Angeles"
}https://api.ivoracharge.com is public. Use the code samples from your application server; Ivora grants production access. Keys are created in Developer tools.