Change a tariff's prices

patch/v1/tenants/{tenant_id}/tariffs/{tariff_id}
Requires an API key

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 | null
    Pattern ^[A-Z]{3}$
  • rate_minor_per_kwhinteger | null
    Integer 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 | null
    Integer minor units held before charging.
    Minimum 0 · Maximum 100000
  • rate_minor_per_minuteinteger | null
    Integer 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 | null
    Integer 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 | null
    Replaces 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
      • typeenumRequired
        ENERGY: 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
      • pricenumberRequired
        Major units excluding tax, at most 4 decimal places (OCPI): 0.35 is $0.35 per kWh.
        Minimum 0 · Maximum 10000
      • step_sizeinteger
        OCPI 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 | null
      OCPI 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 | null
        Local time of day (HH:MM) from which the element applies.
        Pattern ^([01][0-9]|2[0-3]):[0-5][0-9]$
      • end_timestring | null
        Local time of day (HH:MM) until which the element applies (exclusive).
        Pattern ^([01][0-9]|2[0-3]):[0-5][0-9]$
      • start_datestring | null
        Local 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 | null
        Local 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 | null
        Energy already charged in the session, kWh (inclusive).
        Minimum 0 · Maximum 100000
      • max_kwhnumber | null
        Energy already charged in the session, kWh (exclusive).
        Minimum 0 · Maximum 100000
      • min_currentnumber | null
        Charging current, A (inclusive). An element restricting current never applies when the current is unknown.
        Minimum 0 · Maximum 10000
      • max_currentnumber | null
        Charging current, A (exclusive).
        Minimum 0 · Maximum 10000
      • min_powernumber | null
        Charging power, kW (inclusive). Unknown power matches no power-restricted element.
        Minimum 0 · Maximum 10000
      • max_powernumber | null
        Charging power, kW (exclusive).
        Minimum 0 · Maximum 10000
      • min_durationinteger | null
        Session duration so far, seconds (inclusive).
        Minimum 0 · Maximum 604800
      • max_durationinteger | null
        Session duration so far, seconds (exclusive).
        Minimum 0 · Maximum 604800
      • day_of_weekarray of enum | null
        Local days on which the element applies.
      • reservationenum | null
        Prices 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 | null
    Driver-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
    • languagestringRequired
      ISO 639-1 language code.
      Pattern ^[a-z]{2}$
    • textstringRequired
      Driver-facing description of the tariff.
      1–512 characters
  • rulesobject | null
    Replaces the billing rules; send {} or null to remove them.
    Child attributes
    • group_discountsarray of GroupDiscount
      Member/RFID group discounts: the largest matching one applies; they never stack.
      Child attributes
      • idstringRequired
        Your name for this discount; shown on quote and bill adjustments.
        Pattern ^[A-Za-z0-9][A-Za-z0-9_.:-]{0,63}$
      • groupsarray of string
        Member or RFID groups (the session's group) the discount applies to.
      • id_tokensarray of string
        RFID or app tokens (the session's id_token) the discount applies to.
      • percent_offintegerRequired
        Minimum 1 · Maximum 100
    • merchant_validationobject | null
      A discount when the session carries a merchant validation code.
      Child attributes
      • percent_offinteger | null
        Minimum 1 · Maximum 100
      • amount_off_minorinteger | null
        Integer minor units off, never below 0.
        Minimum 1 · Maximum 10000000
      • codesarray of string
        Accepted validation codes; empty accepts any code the session carries.
    • max_session_cost_minorinteger | null
      Cap on a session's total, integer minor units.
      Minimum 1 · Maximum 100000000
    • prepaid_limitboolean
      Report, 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 | null
    IANA 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 | numberRequired
    Integer minor units per kWh. Tariffs created elsewhere with sub-cent rates return a decimal number.
  • authorization_minorinteger | numberRequired
  • rate_minor_per_minuteinteger | number | null
    Minor 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 | null
    Minor 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.
  • archivedboolean
    Archived 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_complexboolean
    Billing 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 | null
    Driver-facing description: the English tariff_alt_text.
  • elementsarray of TariffElement | null
    API 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
      • typeenumRequired
        ENERGY: 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
      • pricenumberRequired
        Major units excluding tax, at most 4 decimal places (OCPI): 0.35 is $0.35 per kWh.
        Minimum 0 · Maximum 10000
      • step_sizeinteger
        OCPI 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 | null
      OCPI 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 | null
        Local time of day (HH:MM) from which the element applies.
        Pattern ^([01][0-9]|2[0-3]):[0-5][0-9]$
      • end_timestring | null
        Local time of day (HH:MM) until which the element applies (exclusive).
        Pattern ^([01][0-9]|2[0-3]):[0-5][0-9]$
      • start_datestring | null
        Local 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 | null
        Local 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 | null
        Energy already charged in the session, kWh (inclusive).
        Minimum 0 · Maximum 100000
      • max_kwhnumber | null
        Energy already charged in the session, kWh (exclusive).
        Minimum 0 · Maximum 100000
      • min_currentnumber | null
        Charging current, A (inclusive). An element restricting current never applies when the current is unknown.
        Minimum 0 · Maximum 10000
      • max_currentnumber | null
        Charging current, A (exclusive).
        Minimum 0 · Maximum 10000
      • min_powernumber | null
        Charging power, kW (inclusive). Unknown power matches no power-restricted element.
        Minimum 0 · Maximum 10000
      • max_powernumber | null
        Charging power, kW (exclusive).
        Minimum 0 · Maximum 10000
      • min_durationinteger | null
        Session duration so far, seconds (inclusive).
        Minimum 0 · Maximum 604800
      • max_durationinteger | null
        Session duration so far, seconds (exclusive).
        Minimum 0 · Maximum 604800
      • day_of_weekarray of enum | null
        Local days on which the element applies.
      • reservationenum | null
        Prices 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 | null
    API version 2026-10-15 and later: the driver-facing descriptions, supplied or generated.
    Child attributes
    • languagestringRequired
      ISO 639-1 language code.
      Pattern ^[a-z]{2}$
    • textstringRequired
      Driver-facing description of the tariff.
      1–512 characters
  • rulesobject | null
    API version 2026-10-15 and later: the Ivora billing rules, {} without any.
    Child attributes
    • group_discountsarray of GroupDiscount
      Member/RFID group discounts: the largest matching one applies; they never stack.
      Child attributes
      • idstringRequired
        Your name for this discount; shown on quote and bill adjustments.
        Pattern ^[A-Za-z0-9][A-Za-z0-9_.:-]{0,63}$
      • groupsarray of string
        Member or RFID groups (the session's group) the discount applies to.
      • id_tokensarray of string
        RFID or app tokens (the session's id_token) the discount applies to.
      • percent_offintegerRequired
        Minimum 1 · Maximum 100
    • merchant_validationobject | null
      A discount when the session carries a merchant validation code.
      Child attributes
      • percent_offinteger | null
        Minimum 1 · Maximum 100
      • amount_off_minorinteger | null
        Integer minor units off, never below 0.
        Minimum 1 · Maximum 10000000
      • codesarray of string
        Accepted validation codes; empty accepts any code the session carries.
    • max_session_cost_minorinteger | null
      Cap on a session's total, integer minor units.
      Minimum 1 · Maximum 100000000
    • prepaid_limitboolean
      Report, 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 | null
    API version 2026-10-15 and later: the restrictions' IANA time zone, or null.
PATCH /v1/tenants/{tenant_id}/tariffs/{tariff_id}
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 '{}'
Response · 200
{
  "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"
}
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.