curl --request POST \
--url https://app.flowglad.com/api/v1/subscriptions/{id}/adjust \
--header 'Authorization: <api-key>' \
--header 'Content-Type: application/json' \
--data '
{
"adjustment": {
"timing": "<string>",
"newSubscriptionItems": [
{
"subscriptionId": "<string>",
"addedDate": 0,
"unitPrice": 4503599627370495,
"quantity": 4503599627370495,
"type": "<string>",
"name": "<string>",
"priceId": "<string>",
"metadata": {},
"externalId": "<string>",
"expiredAt": 0,
"manuallyCreated": true
}
],
"prorateCurrentBillingPeriod": true
}
}
'import requests
url = "https://app.flowglad.com/api/v1/subscriptions/{id}/adjust"
payload = { "adjustment": {
"timing": "<string>",
"newSubscriptionItems": [
{
"subscriptionId": "<string>",
"addedDate": 0,
"unitPrice": 4503599627370495,
"quantity": 4503599627370495,
"type": "<string>",
"name": "<string>",
"priceId": "<string>",
"metadata": {},
"externalId": "<string>",
"expiredAt": 0,
"manuallyCreated": True
}
],
"prorateCurrentBillingPeriod": True
} }
headers = {
"Authorization": "<api-key>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: '<api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({
adjustment: {
timing: '<string>',
newSubscriptionItems: [
{
subscriptionId: '<string>',
addedDate: 0,
unitPrice: 4503599627370495,
quantity: 4503599627370495,
type: '<string>',
name: '<string>',
priceId: '<string>',
metadata: {},
externalId: '<string>',
expiredAt: 0,
manuallyCreated: true
}
],
prorateCurrentBillingPeriod: true
}
})
};
fetch('https://app.flowglad.com/api/v1/subscriptions/{id}/adjust', 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://app.flowglad.com/api/v1/subscriptions/{id}/adjust",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'adjustment' => [
'timing' => '<string>',
'newSubscriptionItems' => [
[
'subscriptionId' => '<string>',
'addedDate' => 0,
'unitPrice' => 4503599627370495,
'quantity' => 4503599627370495,
'type' => '<string>',
'name' => '<string>',
'priceId' => '<string>',
'metadata' => [
],
'externalId' => '<string>',
'expiredAt' => 0,
'manuallyCreated' => true
]
],
'prorateCurrentBillingPeriod' => true
]
]),
CURLOPT_HTTPHEADER => [
"Authorization: <api-key>",
"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://app.flowglad.com/api/v1/subscriptions/{id}/adjust"
payload := strings.NewReader("{\n \"adjustment\": {\n \"timing\": \"<string>\",\n \"newSubscriptionItems\": [\n {\n \"subscriptionId\": \"<string>\",\n \"addedDate\": 0,\n \"unitPrice\": 4503599627370495,\n \"quantity\": 4503599627370495,\n \"type\": \"<string>\",\n \"name\": \"<string>\",\n \"priceId\": \"<string>\",\n \"metadata\": {},\n \"externalId\": \"<string>\",\n \"expiredAt\": 0,\n \"manuallyCreated\": true\n }\n ],\n \"prorateCurrentBillingPeriod\": true\n }\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "<api-key>")
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.post("https://app.flowglad.com/api/v1/subscriptions/{id}/adjust")
.header("Authorization", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"adjustment\": {\n \"timing\": \"<string>\",\n \"newSubscriptionItems\": [\n {\n \"subscriptionId\": \"<string>\",\n \"addedDate\": 0,\n \"unitPrice\": 4503599627370495,\n \"quantity\": 4503599627370495,\n \"type\": \"<string>\",\n \"name\": \"<string>\",\n \"priceId\": \"<string>\",\n \"metadata\": {},\n \"externalId\": \"<string>\",\n \"expiredAt\": 0,\n \"manuallyCreated\": true\n }\n ],\n \"prorateCurrentBillingPeriod\": true\n }\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://app.flowglad.com/api/v1/subscriptions/{id}/adjust")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = '<api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"adjustment\": {\n \"timing\": \"<string>\",\n \"newSubscriptionItems\": [\n {\n \"subscriptionId\": \"<string>\",\n \"addedDate\": 0,\n \"unitPrice\": 4503599627370495,\n \"quantity\": 4503599627370495,\n \"type\": \"<string>\",\n \"name\": \"<string>\",\n \"priceId\": \"<string>\",\n \"metadata\": {},\n \"externalId\": \"<string>\",\n \"expiredAt\": 0,\n \"manuallyCreated\": true\n }\n ],\n \"prorateCurrentBillingPeriod\": true\n }\n}"
response = http.request(request)
puts response.read_body{
"subscription": {
"id": "<string>",
"createdAt": 0,
"updatedAt": 0,
"livemode": true,
"startDate": 0,
"customerId": "<string>",
"organizationId": "<string>",
"defaultPaymentMethodId": "<string>",
"backupPaymentMethodId": "<string>",
"cancellationReason": "<string>",
"replacedBySubscriptionId": "<string>",
"isFreePlan": true,
"doNotCharge": true,
"priceId": "<string>",
"runBillingAtPeriodStart": true,
"intervalCount": 123,
"name": "<string>",
"renews": true,
"pricingModelId": "<string>",
"current": true,
"trialEnd": 0,
"currentBillingPeriodStart": 0,
"currentBillingPeriodEnd": 0,
"metadata": {},
"canceledAt": 0,
"cancelScheduledAt": 0,
"billingCycleAnchorDate": 0,
"scheduledAdjustmentAt": 0
},
"subscriptionItems": [
{
"id": "<string>",
"createdAt": 0,
"updatedAt": 0,
"livemode": true,
"subscriptionId": "<string>",
"name": "<string>",
"addedDate": 0,
"priceId": "<string>",
"unitPrice": 4503599627370495,
"quantity": 4503599627370495,
"type": "<string>",
"externalId": "<string>",
"manuallyCreated": true,
"pricingModelId": "<string>",
"metadata": {},
"expiredAt": 0
}
],
"isUpgrade": true
}{
"code": "BAD_REQUEST",
"message": "Invalid input data",
"issues": []
}{
"code": "UNAUTHORIZED",
"message": "Authorization not provided",
"issues": []
}{
"code": "FORBIDDEN",
"message": "Insufficient access",
"issues": []
}{
"code": "INTERNAL_SERVER_ERROR",
"message": "Internal server error",
"issues": []
}Adjust Subscription
Adjust an active subscription by changing its plan or quantity. Supports immediate adjustments with proration, end-of-billing-period adjustments for downgrades, and auto timing that automatically chooses based on whether it’s an upgrade or downgrade. Also supports priceSlug for referencing prices by slug instead of id. For immediate adjustments with proration, this endpoint waits for the billing run to complete before returning, ensuring the subscription is fully updated.
curl --request POST \
--url https://app.flowglad.com/api/v1/subscriptions/{id}/adjust \
--header 'Authorization: <api-key>' \
--header 'Content-Type: application/json' \
--data '
{
"adjustment": {
"timing": "<string>",
"newSubscriptionItems": [
{
"subscriptionId": "<string>",
"addedDate": 0,
"unitPrice": 4503599627370495,
"quantity": 4503599627370495,
"type": "<string>",
"name": "<string>",
"priceId": "<string>",
"metadata": {},
"externalId": "<string>",
"expiredAt": 0,
"manuallyCreated": true
}
],
"prorateCurrentBillingPeriod": true
}
}
'import requests
url = "https://app.flowglad.com/api/v1/subscriptions/{id}/adjust"
payload = { "adjustment": {
"timing": "<string>",
"newSubscriptionItems": [
{
"subscriptionId": "<string>",
"addedDate": 0,
"unitPrice": 4503599627370495,
"quantity": 4503599627370495,
"type": "<string>",
"name": "<string>",
"priceId": "<string>",
"metadata": {},
"externalId": "<string>",
"expiredAt": 0,
"manuallyCreated": True
}
],
"prorateCurrentBillingPeriod": True
} }
headers = {
"Authorization": "<api-key>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: '<api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({
adjustment: {
timing: '<string>',
newSubscriptionItems: [
{
subscriptionId: '<string>',
addedDate: 0,
unitPrice: 4503599627370495,
quantity: 4503599627370495,
type: '<string>',
name: '<string>',
priceId: '<string>',
metadata: {},
externalId: '<string>',
expiredAt: 0,
manuallyCreated: true
}
],
prorateCurrentBillingPeriod: true
}
})
};
fetch('https://app.flowglad.com/api/v1/subscriptions/{id}/adjust', 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://app.flowglad.com/api/v1/subscriptions/{id}/adjust",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'adjustment' => [
'timing' => '<string>',
'newSubscriptionItems' => [
[
'subscriptionId' => '<string>',
'addedDate' => 0,
'unitPrice' => 4503599627370495,
'quantity' => 4503599627370495,
'type' => '<string>',
'name' => '<string>',
'priceId' => '<string>',
'metadata' => [
],
'externalId' => '<string>',
'expiredAt' => 0,
'manuallyCreated' => true
]
],
'prorateCurrentBillingPeriod' => true
]
]),
CURLOPT_HTTPHEADER => [
"Authorization: <api-key>",
"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://app.flowglad.com/api/v1/subscriptions/{id}/adjust"
payload := strings.NewReader("{\n \"adjustment\": {\n \"timing\": \"<string>\",\n \"newSubscriptionItems\": [\n {\n \"subscriptionId\": \"<string>\",\n \"addedDate\": 0,\n \"unitPrice\": 4503599627370495,\n \"quantity\": 4503599627370495,\n \"type\": \"<string>\",\n \"name\": \"<string>\",\n \"priceId\": \"<string>\",\n \"metadata\": {},\n \"externalId\": \"<string>\",\n \"expiredAt\": 0,\n \"manuallyCreated\": true\n }\n ],\n \"prorateCurrentBillingPeriod\": true\n }\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "<api-key>")
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.post("https://app.flowglad.com/api/v1/subscriptions/{id}/adjust")
.header("Authorization", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"adjustment\": {\n \"timing\": \"<string>\",\n \"newSubscriptionItems\": [\n {\n \"subscriptionId\": \"<string>\",\n \"addedDate\": 0,\n \"unitPrice\": 4503599627370495,\n \"quantity\": 4503599627370495,\n \"type\": \"<string>\",\n \"name\": \"<string>\",\n \"priceId\": \"<string>\",\n \"metadata\": {},\n \"externalId\": \"<string>\",\n \"expiredAt\": 0,\n \"manuallyCreated\": true\n }\n ],\n \"prorateCurrentBillingPeriod\": true\n }\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://app.flowglad.com/api/v1/subscriptions/{id}/adjust")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = '<api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"adjustment\": {\n \"timing\": \"<string>\",\n \"newSubscriptionItems\": [\n {\n \"subscriptionId\": \"<string>\",\n \"addedDate\": 0,\n \"unitPrice\": 4503599627370495,\n \"quantity\": 4503599627370495,\n \"type\": \"<string>\",\n \"name\": \"<string>\",\n \"priceId\": \"<string>\",\n \"metadata\": {},\n \"externalId\": \"<string>\",\n \"expiredAt\": 0,\n \"manuallyCreated\": true\n }\n ],\n \"prorateCurrentBillingPeriod\": true\n }\n}"
response = http.request(request)
puts response.read_body{
"subscription": {
"id": "<string>",
"createdAt": 0,
"updatedAt": 0,
"livemode": true,
"startDate": 0,
"customerId": "<string>",
"organizationId": "<string>",
"defaultPaymentMethodId": "<string>",
"backupPaymentMethodId": "<string>",
"cancellationReason": "<string>",
"replacedBySubscriptionId": "<string>",
"isFreePlan": true,
"doNotCharge": true,
"priceId": "<string>",
"runBillingAtPeriodStart": true,
"intervalCount": 123,
"name": "<string>",
"renews": true,
"pricingModelId": "<string>",
"current": true,
"trialEnd": 0,
"currentBillingPeriodStart": 0,
"currentBillingPeriodEnd": 0,
"metadata": {},
"canceledAt": 0,
"cancelScheduledAt": 0,
"billingCycleAnchorDate": 0,
"scheduledAdjustmentAt": 0
},
"subscriptionItems": [
{
"id": "<string>",
"createdAt": 0,
"updatedAt": 0,
"livemode": true,
"subscriptionId": "<string>",
"name": "<string>",
"addedDate": 0,
"priceId": "<string>",
"unitPrice": 4503599627370495,
"quantity": 4503599627370495,
"type": "<string>",
"externalId": "<string>",
"manuallyCreated": true,
"pricingModelId": "<string>",
"metadata": {},
"expiredAt": 0
}
],
"isUpgrade": true
}{
"code": "BAD_REQUEST",
"message": "Invalid input data",
"issues": []
}{
"code": "UNAUTHORIZED",
"message": "Authorization not provided",
"issues": []
}{
"code": "FORBIDDEN",
"message": "Insufficient access",
"issues": []
}{
"code": "INTERNAL_SERVER_ERROR",
"message": "Internal server error",
"issues": []
}Authorizations
Path Parameters
Body
- Option 1
- Option 2
- Option 3
Show child attributes
Show child attributes
Response
Successful response
- Option 1
- Option 2
Show child attributes
Show child attributes
Show child attributes
Show child attributes
The actual timing applied. When 'auto' timing is requested, this indicates whether the adjustment was applied immediately (for upgrades) or at the end of the billing period (for downgrades).
immediately, at_end_of_current_billing_period Whether this adjustment is an upgrade (true) or downgrade/lateral move (false). An upgrade means the new plan total is greater than the old plan total.
Was this page helpful?