curl --request POST \
--url https://public-api.stora.co/2025-09/price_adjustments/{price_adjustment_id}/schedule \
--header 'Authorization: Bearer <token>'import requests
url = "https://public-api.stora.co/2025-09/price_adjustments/{price_adjustment_id}/schedule"
headers = {"Authorization": "Bearer <token>"}
response = requests.post(url, headers=headers)
print(response.text)const options = {method: 'POST', headers: {Authorization: 'Bearer <token>'}};
fetch('https://public-api.stora.co/2025-09/price_adjustments/{price_adjustment_id}/schedule', 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}/schedule",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://public-api.stora.co/2025-09/price_adjustments/{price_adjustment_id}/schedule"
req, _ := http.NewRequest("POST", url, nil)
req.Header.Add("Authorization", "Bearer <token>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://public-api.stora.co/2025-09/price_adjustments/{price_adjustment_id}/schedule")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://public-api.stora.co/2025-09/price_adjustments/{price_adjustment_id}/schedule")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
response = http.request(request)
puts response.read_body{
"price_adjustment": {
"id": "pradj_195h6kfm9ro15lof",
"adjust_on": "2025-04-03",
"adjustment": null,
"applies_to": {
"products": false,
"protection_levels": true,
"unit_types": true
},
"created_at": "2025-02-22T14:41:00Z",
"estimation": {
"post_amount": {
"amount": 47666,
"currency": "GBP",
"formatted": "£476.66"
},
"pre_amount": {
"amount": 43333,
"currency": "GBP",
"formatted": "£433.33"
}
},
"invoice": null,
"notification": {
"notice_period": 30,
"scheduled_at": "2025-03-04",
"sent_at": null
},
"percentage": 10,
"status": "pending",
"subscription": {
"id": "sub_f7d4fea53ccdefe0"
},
"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": "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.",
"request_id": "01563646-58c1-4607-8fe0-cae3e92c4477",
"type": "invalid_request_error"
}
}{
"error": {
"code": "invalid_content",
"details": [
{
"message": "Estimated post adjustment amount must be greater than 0",
"pointer": "estimated_post_adjustment_amount"
}
],
"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": "The request body content is not valid.",
"request_id": "01563646-58c1-4607-8fe0-cae3e92c4477",
"type": "invalid_request_error"
}
}Schedule a Price Adjustment
Schedule a draft price adjustment, moving it to pending so that it is applied on its adjust_on date.
Only a draft can be scheduled. A 409 is returned when the request conflicts with the price
adjustment’s current state: it has already been scheduled; it can no longer be scheduled, such as
a cancelled or failed adjustment; its adjust_on date has passed or is today, since an adjustment
cannot take effect the same day, in which case it stays a draft, to be deleted or replaced; or
another price adjustment is already scheduled for the same subscription on that adjust_on date.
A subscription can hold only one scheduled price adjustment at a time. Promoting a draft while the
subscription already has one is a 409, and the draft is left untouched. Delete the existing adjustment
first, or wait until it has been applied. Drafts hold no slot, so any number of them can be staged
against the same subscription.
A 409 is also returned when the subscription is no longer eligible for price adjustments: it has
not been billed through Stripe (stripe_subscription_id is null), is not active, is archived, or
is scheduled to end. A draft can be created against a subscription that is later cancelled, so this is
checked again as the draft is scheduled rather than only at creation.
Scheduling sends the customer notification. Where the draft’s notice period no longer fits before
adjust_on, the notice is sent today and notification.notice_period reads back as send_immediately.
A draft whose notification.notice_period is null skips customer notification through Stora
entirely, so scheduling it requires the public.price_adjustment:skip_notifications scope. A draft
notifies nobody until it is scheduled, which is why the scope is checked here as well as at creation.
estimation is recalculated from the subscription’s current prices as the draft is scheduled, so a
draft that has been sitting is scheduled against what the subscription is billed today rather than
what it was billed when the draft was created. A subscription with nothing left to adjust is a 422.
Required authorization scope: public.price_adjustment:write
curl --request POST \
--url https://public-api.stora.co/2025-09/price_adjustments/{price_adjustment_id}/schedule \
--header 'Authorization: Bearer <token>'import requests
url = "https://public-api.stora.co/2025-09/price_adjustments/{price_adjustment_id}/schedule"
headers = {"Authorization": "Bearer <token>"}
response = requests.post(url, headers=headers)
print(response.text)const options = {method: 'POST', headers: {Authorization: 'Bearer <token>'}};
fetch('https://public-api.stora.co/2025-09/price_adjustments/{price_adjustment_id}/schedule', 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}/schedule",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://public-api.stora.co/2025-09/price_adjustments/{price_adjustment_id}/schedule"
req, _ := http.NewRequest("POST", url, nil)
req.Header.Add("Authorization", "Bearer <token>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://public-api.stora.co/2025-09/price_adjustments/{price_adjustment_id}/schedule")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://public-api.stora.co/2025-09/price_adjustments/{price_adjustment_id}/schedule")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
response = http.request(request)
puts response.read_body{
"price_adjustment": {
"id": "pradj_195h6kfm9ro15lof",
"adjust_on": "2025-04-03",
"adjustment": null,
"applies_to": {
"products": false,
"protection_levels": true,
"unit_types": true
},
"created_at": "2025-02-22T14:41:00Z",
"estimation": {
"post_amount": {
"amount": 47666,
"currency": "GBP",
"formatted": "£476.66"
},
"pre_amount": {
"amount": 43333,
"currency": "GBP",
"formatted": "£433.33"
}
},
"invoice": null,
"notification": {
"notice_period": 30,
"scheduled_at": "2025-03-04",
"sent_at": null
},
"percentage": 10,
"status": "pending",
"subscription": {
"id": "sub_f7d4fea53ccdefe0"
},
"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": "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.",
"request_id": "01563646-58c1-4607-8fe0-cae3e92c4477",
"type": "invalid_request_error"
}
}{
"error": {
"code": "invalid_content",
"details": [
{
"message": "Estimated post adjustment amount must be greater than 0",
"pointer": "estimated_post_adjustment_amount"
}
],
"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": "The request body content is not valid.",
"request_id": "01563646-58c1-4607-8fe0-cae3e92c4477",
"type": "invalid_request_error"
}
}Authorizations
Bearer Token necessary to use API
Path Parameters
The ID of the draft price adjustment to schedule
^pradj_Query Parameters
This endpoint supports expandable responses. For more, see the documentation page.
Was this page helpful?