# Update a custom tariff

Rename or reprice a custom tariff created with `POST /tariffs`. To build a repricing body, paste the tariff's `GET /tariffs/{tariff_id}` response into the [tariff builder](/tools/tariff-builder).
**Who can update.** Only the owner of a tariff can change it: the organisation that created it, acting through the Client Credentials grant, or, for a tariff created by an application acting for a user, the user who created it. A user token cannot change its application's organisation's tariffs. Public tariffs can never be changed. A tariff you can see but do not own returns `403`; a tariff you cannot see returns `404`.
**Renaming.** `name` and `supplier_tariff_id` can be changed at any time and take effect immediately.
**Repricing.** Send a complete new `rate_periods` (and `public_holiday_rates`, if the tariff should have holiday rates) together with `effective_from`. The new rates replace the old ones from the start of `effective_from` in the tariff's timezone. Prices before that date, including today's, are never changed, so charging that has already happened, or is happening today, is not repriced.
- `effective_from`
 is required when
`rate_periods`
 is sent, and must be a date strictly after today and no more than two years after today, both in the tariff's timezone.
- `rate_periods`
 is a full replacement. Leaving out
`public_holiday_rates`
 removes holiday rates from
`effective_from`
 onwards.
- Sending
`effective_from`
 or
`public_holiday_rates`
 without
`rate_periods`
 returns
`422`
.
- The same validation rules as
`POST /tariffs`
 apply.

Until `effective_from` is reached, `rate_periods` in the response keeps showing the rates in force today. The new prices can be read in advance from `GET /tariffs/{tariff_id}/prices`.
**Fixed after creation.** `currency`, `timezone_name`, `region`, `supplier` and `user` cannot be changed. They are ignored if sent. To change them, create a new tariff and assign it to the user.

Endpoint: PATCH /tariffs/{tariff_id}
Version: 2.0
Security: oauth2

## Security:

  - `oauth2` (unknown)
    oauth2 scopes: tariff:write

## Path parameters:

  - `tariff_id` (string, required)
    The ID of the specific tariff to retrieve.

## Header parameters:

  - `EvEnergy-Version` (number)
    Specify the version of this endpoint to use.

## Request fields (application/json):

  - `name` (string)
    Example: EV Saver (2027)

  - `supplier_tariff_id` (string | null)
    Send `null` to clear it.
    Example: EVS-2027-01

  - `effective_from` (string)
    The first day the new rates apply, in the tariff's timezone. Must be strictly after today and no more than two years after today (the same calendar date two years ahead; 29 February maps to 28 February), both judged in that timezone.
    Example: 2026-11-01

  - `rate_periods` (array)
    The complete new weekly rate pattern. Replaces the existing pattern from `effective_from`.

  - `rate_periods.months` (array, required)
    Months this period applies to, where 1 is January and 12 is December.
    Example: [1,2,3,4,5,6,7,8,9,10,11,12]

  - `rate_periods.iso_weekdays` (array, required)
    ISO 8601 weekdays this period applies to, where 1 is Monday and 7 is Sunday.
    Example: [1,2,3,4,5]

  - `rate_periods.rates` (array, required)
    The rates for one day. Together they must cover all 24 hours with no gaps or overlaps.

  - `rate_periods.rates.start_time` (string, required)
    Local start time as `HH:MM`, on the hour or half hour.
    Example: 00:00

  - `rate_periods.rates.end_time` (string, required)
    Local end time as `HH:MM`, on the hour or half hour.
    Example: 07:00

  - `rate_periods.rates.price_minor_units_per_kwh` (string, required)
    Price per kWh in the smallest unit of the tariff's currency (for example pence for GBP or cents for USD), as a decimal string with up to 6 decimal places. Negative prices are allowed.
    Example: 7.5

  - `rate_periods.rates.is_off_peak` (boolean)
    Whether this rate is an off-peak rate. Off-peak rates are labelled as such in charging summaries and in the app.

  - `public_holiday_rates` (any)
    Holiday rates from `effective_from`. Leaving this out, or sending `null`, means the tariff has no holiday rates from that date.

  - `public_holiday_rates.country` (string, required)
    ISO 3166-1 alpha-2 country code whose public holidays apply.
    Example: GB

  - `public_holiday_rates.subdivision` (string | null)
    Optional country subdivision whose public holidays apply, for example `ENG` (England) for GB or `NY` for US. Omit or send `null` to use only the national holidays.
    Example: ENG

  - `public_holiday_rates.rates` (array, required)
    The rates for a public holiday. Together they must cover all 24 hours with no gaps or overlaps.

## Request examples:

  - `Rename` (unknown)

  - `Reprice from a future date` (unknown)

## Response 200:

  - `200` (unknown)
    Tariff updated. The response is the tariff as returned by `GET /tariffs/{tariff_id}`.

## Response 200 fields (application/json):

  - `current_price` (integer | null)
    The price of the tariff at the current time, given in the smallest unit of the currency of the tariff. For example, 10 means 10 pence. `null` for licensed tariffs without the tariff:prices:read scope.
    Example: 10

  - `supplier_tariff_id` (string | null)
    The supplier's own identifier for this tariff, if one was provided.
    Example: ABC-1

  - `prices` (any)
    Link to prices endpoint by default. When expanded with ?expand=prices, returns all of the tariff's prices, newest first. Use `GET /tariffs/{tariff_id}/prices` to page through a time range. Price amounts on licensed tariffs are `null` without the tariff:prices:read scope.

  - `prices.started_at` (string, required)
    When this price interval began (ISO 8601 datetime).
    Example: 2024-01-15T10:00:00Z

  - `prices.interval_seconds` (integer, required)
    The duration of this price interval in seconds.
    Example: 1800

  - `prices.price_minor_units` (integer | null, required)
    The price in minor currency units (e.g., pence for GBP), truncated toward zero to a whole unit (e.g., 7.5p is given as `7`). Use `price_minor_units_decimal` for the exact price. Whether it includes VAT is given by the tariff's `prices_include_vat`. `null` for licensed tariffs without the tariff:prices:read scope.
    Example: 24

  - `prices.price_excluding_vat_minor_units` (integer | null, required)
    The price excluding VAT in minor currency units (e.g., pence for GBP), truncated toward zero to a whole unit. Use `price_excluding_vat_minor_units_decimal` for the exact price. `null` if the tariff's price source does not provide it, or for licensed tariffs without the tariff:prices:read scope.
    Example: 23

  - `prices.price_minor_units_decimal` (string | null, required)
    The exact price in minor currency units (e.g., pence for GBP) as a decimal string, without trailing zeros or exponent notation. Whether it includes VAT is given by the tariff's `prices_include_vat`. `null` for licensed tariffs without the tariff:prices:read scope.
    Example: 24.57

  - `prices.price_excluding_vat_minor_units_decimal` (string | null, required)
    The exact price excluding VAT in minor currency units (e.g., pence for GBP) as a decimal string, without trailing zeros or exponent notation. `null` if the tariff's price source does not provide it, or for licensed tariffs without the tariff:prices:read scope.
    Example: 23.4

  - `prices.is_internal_forecast` (boolean, required)
    `true` when price is forecasted using past data and tariff type. Generally, forecast data is only used as a temporary measure for creating schedules in advance while real price data has not been published yet.
    Example: false

  - `rate_periods` (array | null)
    The weekly rate pattern in force today, in the tariff's timezone, in the same format used by `POST /tariffs`. A repricing scheduled with `PATCH /tariffs/{tariff_id}` is not shown here until its `effective_from` date.
`null` when the tariff's rates cannot be described this way, for example tariffs with dynamic prices or with rates for specific dates. Use `GET /tariffs/{tariff_id}/prices` for the actual prices of any tariff. `null` for licensed tariffs without the tariff:prices:read scope.

  - `rate_periods.months` (array, required)
    Months this period applies to, where 1 is January and 12 is December.
    Example: [1,2,3,4,5,6,7,8,9,10,11,12]

  - `rate_periods.iso_weekdays` (array, required)
    ISO 8601 weekdays this period applies to, where 1 is Monday and 7 is Sunday.
    Example: [1,2,3,4,5]

  - `rate_periods.rates` (array, required)
    The rates for one day. Together they must cover all 24 hours with no gaps or overlaps.

  - `rate_periods.rates.start_time` (string, required)
    Local start time as `HH:MM`, on the hour or half hour.
    Example: 00:00

  - `rate_periods.rates.end_time` (string, required)
    Local end time as `HH:MM`, on the hour or half hour.
    Example: 07:00

  - `rate_periods.rates.price_minor_units_per_kwh` (string, required)
    Price per kWh in the smallest unit of the tariff's currency (for example pence for GBP or cents for USD), as a decimal string with up to 6 decimal places. Negative prices are allowed.
    Example: 7.5

  - `rate_periods.rates.is_off_peak` (boolean)
    Whether this rate is an off-peak rate. Off-peak rates are labelled as such in charging summaries and in the app.

  - `public_holiday_rates` (any)
    The rates that replace the normal rates on public holidays, as in force today. `null` if the tariff has no holiday rates, or if `rate_periods` is `null`.

  - `public_holiday_rates.country` (string, required)
    ISO 3166-1 alpha-2 country code whose public holidays apply.
    Example: GB

  - `public_holiday_rates.subdivision` (string | null)
    Optional country subdivision whose public holidays apply, for example `ENG` (England) for GB or `NY` for US. Omit or send `null` to use only the national holidays.
    Example: ENG

  - `public_holiday_rates.rates` (array, required)
    The rates for a public holiday. Together they must cover all 24 hours with no gaps or overlaps.

## Response 200 headers (application/json):

  - `EvEnergy-Version` (number)
    Indicates the version of the API that generated this response. If EvEnergy-Version was not specified in the request, this will be your OAuth application's default version.
    Enum: "2"

  - `X-RateLimit-Limit` (number)
    The maximum number of requests that can be made to this endpoint per hour. Defaults to 1000 but may vary per client.

  - `X-RateLimit-Remaining` (number)
    The number of requests remaining until this client's rate limit is reached.

  - `RetryAfter` (number)
    The number of seconds until this client's requests will not be rate limited.

## Response 400:

  - `400` (unknown)
    A problem with the request's parameters prevented it being fulfilled.

## Response 400 fields (application/problem+json):

  - `type` (string)
    Example: https://api.ev.energy/v2/problems/example-problem/

  - `status` (number)
    Example: 400

  - `title` (string, required)
    Example: Short description

  - `detail` (string, required)
    Example: Long, more specific description.

  - `instance` (string)
    Example: https://api.ev.energy/v2/users/user01HN2P75GBNFRJPCZJXEFVXH5E

  - `notification` (object)
    Something that the user should be informed about.

  - `notification.id` (string, required)
    Unique identifier for the Notification
    Example: notf67O36PLTFDB57M0E5L33JZLGM0

  - `notification.url` (string, required)
    Example: https://api.ev.energy/notifications/notf67O36PLTFDB57M0E5L33JZLGM0

  - `notification.message_id` (string, required)
    Internal identifier for this notification type. E.g. 'ERR0023'

  - `notification.category` (string, required)
    Category of this notification type
    Enum: "ACTIONABLE", "SERVICE", "RETRY", "MARKETING", "INTERNAL"

  - `notification.event_time` (string, required)
    The timestamp of the event described by this notification

  - `notification.short_text_title` (string, required)
    Short title for the notification

  - `notification.short_text_body` (string, required)
    Short description of the event being notified

  - `notification.detail_page_title` (string, required)
    Title of a help page giving more information about this notification

  - `notification.detail_page_body` (string, required)
    Text of a help page giving more information about this notification

  - `notification.external_link` (string | null, required)
    URL of a web page giving further information about this notification

  - `notification.external_button_label` (string, required)
    Text to be displayed on a button leading to the external_link location

  - `notification.read_at` (string)
    When the user examined the contents of this notification

  - `notification.resolved_at` (string)
    When the problem associated with this notification was resolved

## Response 400 headers (application/problem+json):

  - `EvEnergy-Version` (number)
    Indicates the version of the API that generated this response. If EvEnergy-Version was not specified in the request, this will be your OAuth application's default version.
    Enum: "2"

  - `X-RateLimit-Limit` (number)
    The maximum number of requests that can be made to this endpoint per hour. Defaults to 1000 but may vary per client.

  - `X-RateLimit-Remaining` (number)
    The number of requests remaining until this client's rate limit is reached.

## Response 401:

  - `401` (unknown)
    You need to authorise requests to access this resource.

## Response 401 fields (application/problem+json):

  - `status` (number)
    Example: 401

  - `title` (string, required)
    Example: Unauthorized

  - `detail` (string, required)
    Example: Authentication credentials were not provided.

## Response 401 headers (application/problem+json):

  - `EvEnergy-Version` (number)
    Indicates the version of the API that generated this response. If EvEnergy-Version was not specified in the request, this will be your OAuth application's default version.
    Enum: "2"

  - `X-RateLimit-Limit` (number)
    The maximum number of requests that can be made to this endpoint per hour. Defaults to 1000 but may vary per client.

  - `X-RateLimit-Remaining` (number)
    The number of requests remaining until this client's rate limit is reached.

  - `RetryAfter` (number)
    The number of seconds until this client's requests will not be rate limited.

## Response 403:

  - `403` (unknown)
    You do not have permission to perform this action.

## Response 403 fields (application/problem+json):

  - `status` (number)
    Example: 403

  - `title` (string, required)
    Example: Forbidden

  - `detail` (string, required)
    Example: You do not have permission to perform this action.

## Response 403 headers (application/problem+json):

  - `EvEnergy-Version` (number)
    Indicates the version of the API that generated this response. If EvEnergy-Version was not specified in the request, this will be your OAuth application's default version.
    Enum: "2"

  - `X-RateLimit-Limit` (number)
    The maximum number of requests that can be made to this endpoint per hour. Defaults to 1000 but may vary per client.

  - `X-RateLimit-Remaining` (number)
    The number of requests remaining until this client's rate limit is reached.

  - `RetryAfter` (number)
    The number of seconds until this client's requests will not be rate limited.

## Response 404:

  - `404` (unknown)
    This resource either does not exist or the client is not authorized to access it.

## Response 404 fields (application/problem+json):

  - `status` (number)
    Example: 404

  - `title` (string, required)
    Example: Not found

  - `detail` (string, required)
    Example: Resource does not exist or cannot be accessed.

## Response 404 headers (application/problem+json):

  - `EvEnergy-Version` (number)
    Indicates the version of the API that generated this response. If EvEnergy-Version was not specified in the request, this will be your OAuth application's default version.
    Enum: "2"

  - `X-RateLimit-Limit` (number)
    The maximum number of requests that can be made to this endpoint per hour. Defaults to 1000 but may vary per client.

  - `X-RateLimit-Remaining` (number)
    The number of requests remaining until this client's rate limit is reached.

  - `RetryAfter` (number)
    The number of seconds until this client's requests will not be rate limited.

## Response 406:

  - `406` (unknown)
    Could not satisfy the request Accept header.

## Response 406 fields (application/problem+json):

  - `status` (number)
    Example: 406

  - `title` (string, required)
    Example: Not Acceptable

  - `detail` (string, required)
    Example: Could not satisfy the request Accept header.

## Response 406 headers (application/problem+json):

  - `EvEnergy-Version` (number)
    Indicates the version of the API that generated this response. If EvEnergy-Version was not specified in the request, this will be your OAuth application's default version.
    Enum: "2"

  - `X-RateLimit-Limit` (number)
    The maximum number of requests that can be made to this endpoint per hour. Defaults to 1000 but may vary per client.

  - `X-RateLimit-Remaining` (number)
    The number of requests remaining until this client's rate limit is reached.

  - `RetryAfter` (number)
    The number of seconds until this client's requests will not be rate limited.

## Response 422:

  - `422` (unknown)
    The request body failed validation (problem type `validation-failed-tariff`). Each invalid field is listed under `field_errors`. The rules are:
- Every combination of month (1–12) and ISO weekday (1–7) must be covered by exactly one entry in
`rate_periods`
.
- Each day's
`rates`
 must cover all 24 hours with no gaps or overlaps, and every time must be on the hour or half hour. A single rate whose
`start_time`
 equals its
`end_time`
 is a flat rate for the whole day.
- `public_holiday_rates.country`
 and
`subdivision`
 must be a known country and subdivision.
- `region`
,
`supplier`
 and
`user`
 must exist and be visible to you.
- `region`
,
`currency`
 and
`timezone_name`
 are required when
`user`
 is not sent.
- `timezone_name`
 must be a timezone whose offset from UTC is always a whole or half hour.
- On update,
`effective_from`
 must be strictly after today and no more than two years after today in the tariff's timezone, and must be sent together with
`rate_periods`
.

## Response 422 fields (application/problem+json):

  - `type` (string)
    Example: https://api.ev.energy/v2/problems/example-problem/

  - `status` (number)
    Example: 400

  - `title` (string, required)
    Example: Short description

  - `detail` (string, required)
    Example: Long, more specific description.

  - `instance` (string)
    Example: https://api.ev.energy/v2/users/user01HN2P75GBNFRJPCZJXEFVXH5E

  - `notification` (object)
    Something that the user should be informed about.

  - `notification.id` (string, required)
    Unique identifier for the Notification
    Example: notf67O36PLTFDB57M0E5L33JZLGM0

  - `notification.url` (string, required)
    Example: https://api.ev.energy/notifications/notf67O36PLTFDB57M0E5L33JZLGM0

  - `notification.message_id` (string, required)
    Internal identifier for this notification type. E.g. 'ERR0023'

  - `notification.category` (string, required)
    Category of this notification type
    Enum: "ACTIONABLE", "SERVICE", "RETRY", "MARKETING", "INTERNAL"

  - `notification.event_time` (string, required)
    The timestamp of the event described by this notification

  - `notification.short_text_title` (string, required)
    Short title for the notification

  - `notification.short_text_body` (string, required)
    Short description of the event being notified

  - `notification.detail_page_title` (string, required)
    Title of a help page giving more information about this notification

  - `notification.detail_page_body` (string, required)
    Text of a help page giving more information about this notification

  - `notification.external_link` (string | null, required)
    URL of a web page giving further information about this notification

  - `notification.external_button_label` (string, required)
    Text to be displayed on a button leading to the external_link location

  - `notification.read_at` (string)
    When the user examined the contents of this notification

  - `notification.resolved_at` (string)
    When the problem associated with this notification was resolved

## Response 422 headers (application/problem+json):

  - `EvEnergy-Version` (number)
    Indicates the version of the API that generated this response. If EvEnergy-Version was not specified in the request, this will be your OAuth application's default version.
    Enum: "2"

  - `X-RateLimit-Limit` (number)
    The maximum number of requests that can be made to this endpoint per hour. Defaults to 1000 but may vary per client.

  - `X-RateLimit-Remaining` (number)
    The number of requests remaining until this client's rate limit is reached.

## Response 429:

  - `429` (unknown)
    The client has exceeded its rate limit.

## Response 429 fields (application/problem+json):

  - `type` (string)
    Example: https://api.ev.energy/v2/problems/example-problem/

  - `status` (number)
    Example: 400

  - `title` (string, required)
    Example: Short description

  - `detail` (string, required)
    Example: Long, more specific description.

  - `instance` (string)
    Example: https://api.ev.energy/v2/users/user01HN2P75GBNFRJPCZJXEFVXH5E

  - `notification` (object)
    Something that the user should be informed about.

  - `notification.id` (string, required)
    Unique identifier for the Notification
    Example: notf67O36PLTFDB57M0E5L33JZLGM0

  - `notification.url` (string, required)
    Example: https://api.ev.energy/notifications/notf67O36PLTFDB57M0E5L33JZLGM0

  - `notification.message_id` (string, required)
    Internal identifier for this notification type. E.g. 'ERR0023'

  - `notification.category` (string, required)
    Category of this notification type
    Enum: "ACTIONABLE", "SERVICE", "RETRY", "MARKETING", "INTERNAL"

  - `notification.event_time` (string, required)
    The timestamp of the event described by this notification

  - `notification.short_text_title` (string, required)
    Short title for the notification

  - `notification.short_text_body` (string, required)
    Short description of the event being notified

  - `notification.detail_page_title` (string, required)
    Title of a help page giving more information about this notification

  - `notification.detail_page_body` (string, required)
    Text of a help page giving more information about this notification

  - `notification.external_link` (string | null, required)
    URL of a web page giving further information about this notification

  - `notification.external_button_label` (string, required)
    Text to be displayed on a button leading to the external_link location

  - `notification.read_at` (string)
    When the user examined the contents of this notification

  - `notification.resolved_at` (string)
    When the problem associated with this notification was resolved

## Response 429 headers (application/problem+json):

  - `EvEnergy-Version` (number)
    Indicates the version of the API that generated this response. If EvEnergy-Version was not specified in the request, this will be your OAuth application's default version.
    Enum: "2"

  - `Retry-After` (number)
    The number of seconds until this client's requests will not be rate limited.

  - `X-RateLimit-Limit` (number)
    The maximum number of requests that can be made to this endpoint per hour. Defaults to 1000 but may vary per client.

  - `X-RateLimit-Remaining` (number)
    The number of requests remaining until this client's rate limit is reached.

## Response 200 examples:

  - `A custom GB tariff with weekday, weekend and public holiday rates` (unknown)

## Response 400 examples:

  - `Unsupported Version` (unknown)

## Response 422 examples:

  - `Request failed validation` (unknown)

## Response 429 examples:

  - `Example 1` (unknown)

