curl --request PATCH \
--url https://public-api.stora.co/2025-09/price_adjustments/{price_adjustment_id} \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"percentage": 15,
"effective_from": "2025-03-15",
"applies_to": {
"unit_types": true,
"protection_levels": true
},
"notification": {
"notice_period": 14
}
}
'import requests
url = "https://public-api.stora.co/2025-09/price_adjustments/{price_adjustment_id}"
payload = {
"percentage": 15,
"effective_from": "2025-03-15",
"applies_to": {
"unit_types": True,
"protection_levels": True
},
"notification": { "notice_period": 14 }
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.patch(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'PATCH',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
percentage: 15,
effective_from: '2025-03-15',
applies_to: {unit_types: true, protection_levels: true},
notification: {notice_period: 14}
})
};
fetch('https://public-api.stora.co/2025-09/price_adjustments/{price_adjustment_id}', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://public-api.stora.co/2025-09/price_adjustments/{price_adjustment_id}",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "PATCH",
CURLOPT_POSTFIELDS => json_encode([
'percentage' => 15,
'effective_from' => '2025-03-15',
'applies_to' => [
'unit_types' => true,
'protection_levels' => true
],
'notification' => [
'notice_period' => 14
]
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://public-api.stora.co/2025-09/price_adjustments/{price_adjustment_id}"
payload := strings.NewReader("{\n \"percentage\": 15,\n \"effective_from\": \"2025-03-15\",\n \"applies_to\": {\n \"unit_types\": true,\n \"protection_levels\": true\n },\n \"notification\": {\n \"notice_period\": 14\n }\n}")
req, _ := http.NewRequest("PATCH", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.patch("https://public-api.stora.co/2025-09/price_adjustments/{price_adjustment_id}")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"percentage\": 15,\n \"effective_from\": \"2025-03-15\",\n \"applies_to\": {\n \"unit_types\": true,\n \"protection_levels\": true\n },\n \"notification\": {\n \"notice_period\": 14\n }\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://public-api.stora.co/2025-09/price_adjustments/{price_adjustment_id}")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Patch.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"percentage\": 15,\n \"effective_from\": \"2025-03-15\",\n \"applies_to\": {\n \"unit_types\": true,\n \"protection_levels\": true\n },\n \"notification\": {\n \"notice_period\": 14\n }\n}"
response = http.request(request)
puts response.read_body{
"price_adjustment": {
"id": "pradj_295h6kfm9ro15lo",
"adjust_on": "2025-04-14",
"adjustment": null,
"applies_to": {
"products": false,
"protection_levels": true,
"unit_types": true
},
"created_at": "2025-02-22T14:41:00Z",
"estimation": {
"post_amount": {
"amount": 49833,
"currency": "GBP",
"formatted": "£498.33"
},
"pre_amount": {
"amount": 43333,
"currency": "GBP",
"formatted": "£433.33"
}
},
"invoice": null,
"notification": {
"notice_period": 14,
"scheduled_at": "2025-03-31",
"sent_at": null
},
"percentage": 15,
"status": "draft",
"subscription": {
"id": "sub_0c957d38b021758e"
},
"updated_at": "2025-02-22T14:41:00Z"
},
"meta": {
"request_id": "01563646-58c1-4607-8fe0-cae3e92c4477",
"curies": [
{
"name": "bo",
"href": "https://app.stora.test{rel}",
"templated": true,
"title": "Backoffice"
},
{
"name": "sf",
"href": "https://acme.stora.test{rel}",
"templated": true,
"title": "Storefront"
}
]
}
}{
"error": {
"code": "forbidden",
"details": [],
"links": [
{
"kind": "open_api",
"name": "OpenAPI specification",
"url": "https://docs.stora.test/2025-09/openapi.json"
},
{
"kind": "documentation",
"name": "Errors",
"url": "https://docs.stora.test/2025-09/guides/errors"
}
],
"message": "Used API token does not have the required scope. Access to this resource requires scope \"public.price_adjustment:skip_notifications\".",
"request_id": "01563646-58c1-4607-8fe0-cae3e92c4477",
"type": "invalid_request_error"
}
}{
"error": {
"code": "adjustment_already_scheduled",
"details": [],
"links": [
{
"kind": "open_api",
"name": "OpenAPI specification",
"url": "https://docs.stora.test/2025-09/openapi.json"
},
{
"kind": "documentation",
"name": "Errors",
"url": "https://docs.stora.test/2025-09/guides/errors"
}
],
"message": "This price adjustment has already been scheduled and is pending. Delete it and create a new one to change it.",
"request_id": "01563646-58c1-4607-8fe0-cae3e92c4477",
"type": "invalid_request_error"
}
}{
"error": {
"code": "invalid_notice_period",
"details": [],
"links": [
{
"kind": "open_api",
"name": "OpenAPI specification",
"url": "https://docs.stora.test/2025-09/openapi.json"
},
{
"kind": "documentation",
"name": "Errors",
"url": "https://docs.stora.test/2025-09/guides/errors"
}
],
"message": "A notification.notice_period of 400 days would notify the customer in the past for the adjustment date 2025-03-14.",
"request_id": "01563646-58c1-4607-8fe0-cae3e92c4477",
"type": "invalid_request_error"
}
}Update a Price Adjustment
Update a draft price adjustment. Omitted fields are left unchanged.
Only a draft can be updated. Updating a scheduled (pending) adjustment is a 409: delete it and
create a new one instead. The subscription cannot be changed; estimates, line items and the resolved
adjust_on are all derived from it, so re-pointing one is a different adjustment.
When effective_from is given, the adjustment date is re-resolved to the subscription’s first renewal
date on or after it and returned as adjust_on. The estimated amounts are recomputed on every update.
When the notification object is omitted, the notice period is unchanged. If adjust_on moves and the
existing notice period no longer fits before it, notification.notice_period reads back as
send_immediately. A notice_period of null skips customer notification through Stora and requires
the public.price_adjustment:skip_notifications scope, as does updating a draft that already skips it.
Required authorization scope: public.price_adjustment:write
curl --request PATCH \
--url https://public-api.stora.co/2025-09/price_adjustments/{price_adjustment_id} \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"percentage": 15,
"effective_from": "2025-03-15",
"applies_to": {
"unit_types": true,
"protection_levels": true
},
"notification": {
"notice_period": 14
}
}
'import requests
url = "https://public-api.stora.co/2025-09/price_adjustments/{price_adjustment_id}"
payload = {
"percentage": 15,
"effective_from": "2025-03-15",
"applies_to": {
"unit_types": True,
"protection_levels": True
},
"notification": { "notice_period": 14 }
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.patch(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'PATCH',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
percentage: 15,
effective_from: '2025-03-15',
applies_to: {unit_types: true, protection_levels: true},
notification: {notice_period: 14}
})
};
fetch('https://public-api.stora.co/2025-09/price_adjustments/{price_adjustment_id}', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://public-api.stora.co/2025-09/price_adjustments/{price_adjustment_id}",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "PATCH",
CURLOPT_POSTFIELDS => json_encode([
'percentage' => 15,
'effective_from' => '2025-03-15',
'applies_to' => [
'unit_types' => true,
'protection_levels' => true
],
'notification' => [
'notice_period' => 14
]
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://public-api.stora.co/2025-09/price_adjustments/{price_adjustment_id}"
payload := strings.NewReader("{\n \"percentage\": 15,\n \"effective_from\": \"2025-03-15\",\n \"applies_to\": {\n \"unit_types\": true,\n \"protection_levels\": true\n },\n \"notification\": {\n \"notice_period\": 14\n }\n}")
req, _ := http.NewRequest("PATCH", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.patch("https://public-api.stora.co/2025-09/price_adjustments/{price_adjustment_id}")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"percentage\": 15,\n \"effective_from\": \"2025-03-15\",\n \"applies_to\": {\n \"unit_types\": true,\n \"protection_levels\": true\n },\n \"notification\": {\n \"notice_period\": 14\n }\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://public-api.stora.co/2025-09/price_adjustments/{price_adjustment_id}")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Patch.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"percentage\": 15,\n \"effective_from\": \"2025-03-15\",\n \"applies_to\": {\n \"unit_types\": true,\n \"protection_levels\": true\n },\n \"notification\": {\n \"notice_period\": 14\n }\n}"
response = http.request(request)
puts response.read_body{
"price_adjustment": {
"id": "pradj_295h6kfm9ro15lo",
"adjust_on": "2025-04-14",
"adjustment": null,
"applies_to": {
"products": false,
"protection_levels": true,
"unit_types": true
},
"created_at": "2025-02-22T14:41:00Z",
"estimation": {
"post_amount": {
"amount": 49833,
"currency": "GBP",
"formatted": "£498.33"
},
"pre_amount": {
"amount": 43333,
"currency": "GBP",
"formatted": "£433.33"
}
},
"invoice": null,
"notification": {
"notice_period": 14,
"scheduled_at": "2025-03-31",
"sent_at": null
},
"percentage": 15,
"status": "draft",
"subscription": {
"id": "sub_0c957d38b021758e"
},
"updated_at": "2025-02-22T14:41:00Z"
},
"meta": {
"request_id": "01563646-58c1-4607-8fe0-cae3e92c4477",
"curies": [
{
"name": "bo",
"href": "https://app.stora.test{rel}",
"templated": true,
"title": "Backoffice"
},
{
"name": "sf",
"href": "https://acme.stora.test{rel}",
"templated": true,
"title": "Storefront"
}
]
}
}{
"error": {
"code": "forbidden",
"details": [],
"links": [
{
"kind": "open_api",
"name": "OpenAPI specification",
"url": "https://docs.stora.test/2025-09/openapi.json"
},
{
"kind": "documentation",
"name": "Errors",
"url": "https://docs.stora.test/2025-09/guides/errors"
}
],
"message": "Used API token does not have the required scope. Access to this resource requires scope \"public.price_adjustment:skip_notifications\".",
"request_id": "01563646-58c1-4607-8fe0-cae3e92c4477",
"type": "invalid_request_error"
}
}{
"error": {
"code": "adjustment_already_scheduled",
"details": [],
"links": [
{
"kind": "open_api",
"name": "OpenAPI specification",
"url": "https://docs.stora.test/2025-09/openapi.json"
},
{
"kind": "documentation",
"name": "Errors",
"url": "https://docs.stora.test/2025-09/guides/errors"
}
],
"message": "This price adjustment has already been scheduled and is pending. Delete it and create a new one to change it.",
"request_id": "01563646-58c1-4607-8fe0-cae3e92c4477",
"type": "invalid_request_error"
}
}{
"error": {
"code": "invalid_notice_period",
"details": [],
"links": [
{
"kind": "open_api",
"name": "OpenAPI specification",
"url": "https://docs.stora.test/2025-09/openapi.json"
},
{
"kind": "documentation",
"name": "Errors",
"url": "https://docs.stora.test/2025-09/guides/errors"
}
],
"message": "A notification.notice_period of 400 days would notify the customer in the past for the adjustment date 2025-03-14.",
"request_id": "01563646-58c1-4607-8fe0-cae3e92c4477",
"type": "invalid_request_error"
}
}Authorizations
Bearer Token necessary to use API
Path Parameters
The ID of the price adjustment
Body
Update Price Adjustment Request
Percentage change applied to the subscription's prices. Negative values are a decrease. Must be non-zero and greater than -100.
Date to re-resolve the adjustment date from. The adjustment fires on the first renewal date on or after this date. A calendar date in the operator's timezone. Use next_billing_period for the next renewal date.
Which of the subscription's line item kinds the adjustment applies to. Omitted options are unchanged. At least one must be true to schedule the adjustment.
Show child attributes
Show child attributes
How the customer is notified of the price adjustment before it is applied. When omitted, the notice period is unchanged.
- Option 1
- Option 2
- Option 3
Show child attributes
Show child attributes
Was this page helpful?