Preview a tenure publication
Counts what publishing the proposed tiers and scope would move, without writing anything. moves_up are subscriptions that would get a higher tier or a first tier. moves_down would get a lower tier or lose theirs, and keep the old tier until their next renewal. stays is everyone else in scope. stacking_examples show the total percent off when each percentage tier stacks with another 10% discount. Needs the tenure pricing gate open, like creating a program. A tier that breaks a ladder rule is 422 invalid_tier, with the tier’s 0-based index in error.details.index when one tier is at fault. A scope naming another company’s plan or product, or more than 500 ids, is 422 invalid. An archived program is 409 archived.
curl --request POST \
--url https://api.fluid.app/api/subscription_pro/tenure_programs/{id}/versions/preview \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"tiers": [
{
"from": 3,
"label": "Silver",
"percentage_value": "10"
},
{
"from": 6,
"label": "Gold",
"flat_value": "5.50"
}
],
"scope": "all",
"scope_ids": [],
"apply_to_volume": true
}
'import requests
url = "https://api.fluid.app/api/subscription_pro/tenure_programs/{id}/versions/preview"
payload = {
"tiers": [
{
"from": 3,
"label": "Silver",
"percentage_value": "10"
},
{
"from": 6,
"label": "Gold",
"flat_value": "5.50"
}
],
"scope": "all",
"scope_ids": [],
"apply_to_volume": True
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
tiers: [
{from: 3, label: 'Silver', percentage_value: '10'},
{from: 6, label: 'Gold', flat_value: '5.50'}
],
scope: 'all',
scope_ids: [],
apply_to_volume: true
})
};
fetch('https://api.fluid.app/api/subscription_pro/tenure_programs/{id}/versions/preview', 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://api.fluid.app/api/subscription_pro/tenure_programs/{id}/versions/preview",
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([
'tiers' => [
[
'from' => 3,
'label' => 'Silver',
'percentage_value' => '10'
],
[
'from' => 6,
'label' => 'Gold',
'flat_value' => '5.50'
]
],
'scope' => 'all',
'scope_ids' => [
],
'apply_to_volume' => true
]),
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://api.fluid.app/api/subscription_pro/tenure_programs/{id}/versions/preview"
payload := strings.NewReader("{\n \"tiers\": [\n {\n \"from\": 3,\n \"label\": \"Silver\",\n \"percentage_value\": \"10\"\n },\n {\n \"from\": 6,\n \"label\": \"Gold\",\n \"flat_value\": \"5.50\"\n }\n ],\n \"scope\": \"all\",\n \"scope_ids\": [],\n \"apply_to_volume\": true\n}")
req, _ := http.NewRequest("POST", 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.post("https://api.fluid.app/api/subscription_pro/tenure_programs/{id}/versions/preview")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"tiers\": [\n {\n \"from\": 3,\n \"label\": \"Silver\",\n \"percentage_value\": \"10\"\n },\n {\n \"from\": 6,\n \"label\": \"Gold\",\n \"flat_value\": \"5.50\"\n }\n ],\n \"scope\": \"all\",\n \"scope_ids\": [],\n \"apply_to_volume\": true\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.fluid.app/api/subscription_pro/tenure_programs/{id}/versions/preview")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"tiers\": [\n {\n \"from\": 3,\n \"label\": \"Silver\",\n \"percentage_value\": \"10\"\n },\n {\n \"from\": 6,\n \"label\": \"Gold\",\n \"flat_value\": \"5.50\"\n }\n ],\n \"scope\": \"all\",\n \"scope_ids\": [],\n \"apply_to_volume\": true\n}"
response = http.request(request)
puts response.read_body{
"tenure_program_preview": {
"current_version_id": null,
"moves_up": 12,
"moves_down": 0,
"stays": 40,
"stacking_examples": [
{
"from": 3,
"percentage_value": "10.0",
"with_percentage_value": "10.0",
"effective_percentage_value": "19.0"
}
]
},
"status": 200,
"meta": {
"request_id": "7d2f4c1a-9b3e-4f6d-8a21-3c5e0b9f1d42",
"timestamp": "2026-10-10T14:05:31Z"
}
}{
"message": "<string>",
"error": "<string>",
"error_message": "<string>",
"errors": "<string>",
"meta": {
"request_id": "<string>",
"timestamp": "2023-11-07T05:31:56Z"
}
}{
"message": "<string>",
"error": "<string>",
"error_message": "<string>",
"errors": "<string>",
"meta": {
"request_id": "<string>",
"timestamp": "2023-11-07T05:31:56Z"
}
}{
"message": "<string>",
"error": "<string>",
"error_message": "<string>",
"errors": "<string>",
"meta": {
"request_id": "<string>",
"timestamp": "2023-11-07T05:31:56Z"
}
}{
"message": "<string>",
"error": "<string>",
"error_message": "<string>",
"errors": "<string>",
"meta": {
"request_id": "<string>",
"timestamp": "2023-11-07T05:31:56Z"
}
}{
"message": "<string>",
"error": "<string>",
"error_message": "<string>",
"errors": "<string>",
"meta": {
"request_id": "<string>",
"timestamp": "2023-11-07T05:31:56Z"
}
}Authorizations
Bearer token authentication
Path Parameters
The tenure program's id.
Body
The ladder, ascending by from.
1 - 10 elementsShow child attributes
Show child attributes
Which subscriptions the program covers once published.
all, plans, products Empty for all, otherwise the company's plan or product ids.
500Whether the tier discounts reduce volume as well as price.
curl --request POST \
--url https://api.fluid.app/api/subscription_pro/tenure_programs/{id}/versions/preview \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"tiers": [
{
"from": 3,
"label": "Silver",
"percentage_value": "10"
},
{
"from": 6,
"label": "Gold",
"flat_value": "5.50"
}
],
"scope": "all",
"scope_ids": [],
"apply_to_volume": true
}
'import requests
url = "https://api.fluid.app/api/subscription_pro/tenure_programs/{id}/versions/preview"
payload = {
"tiers": [
{
"from": 3,
"label": "Silver",
"percentage_value": "10"
},
{
"from": 6,
"label": "Gold",
"flat_value": "5.50"
}
],
"scope": "all",
"scope_ids": [],
"apply_to_volume": True
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
tiers: [
{from: 3, label: 'Silver', percentage_value: '10'},
{from: 6, label: 'Gold', flat_value: '5.50'}
],
scope: 'all',
scope_ids: [],
apply_to_volume: true
})
};
fetch('https://api.fluid.app/api/subscription_pro/tenure_programs/{id}/versions/preview', 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://api.fluid.app/api/subscription_pro/tenure_programs/{id}/versions/preview",
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([
'tiers' => [
[
'from' => 3,
'label' => 'Silver',
'percentage_value' => '10'
],
[
'from' => 6,
'label' => 'Gold',
'flat_value' => '5.50'
]
],
'scope' => 'all',
'scope_ids' => [
],
'apply_to_volume' => true
]),
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://api.fluid.app/api/subscription_pro/tenure_programs/{id}/versions/preview"
payload := strings.NewReader("{\n \"tiers\": [\n {\n \"from\": 3,\n \"label\": \"Silver\",\n \"percentage_value\": \"10\"\n },\n {\n \"from\": 6,\n \"label\": \"Gold\",\n \"flat_value\": \"5.50\"\n }\n ],\n \"scope\": \"all\",\n \"scope_ids\": [],\n \"apply_to_volume\": true\n}")
req, _ := http.NewRequest("POST", 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.post("https://api.fluid.app/api/subscription_pro/tenure_programs/{id}/versions/preview")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"tiers\": [\n {\n \"from\": 3,\n \"label\": \"Silver\",\n \"percentage_value\": \"10\"\n },\n {\n \"from\": 6,\n \"label\": \"Gold\",\n \"flat_value\": \"5.50\"\n }\n ],\n \"scope\": \"all\",\n \"scope_ids\": [],\n \"apply_to_volume\": true\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.fluid.app/api/subscription_pro/tenure_programs/{id}/versions/preview")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"tiers\": [\n {\n \"from\": 3,\n \"label\": \"Silver\",\n \"percentage_value\": \"10\"\n },\n {\n \"from\": 6,\n \"label\": \"Gold\",\n \"flat_value\": \"5.50\"\n }\n ],\n \"scope\": \"all\",\n \"scope_ids\": [],\n \"apply_to_volume\": true\n}"
response = http.request(request)
puts response.read_body{
"tenure_program_preview": {
"current_version_id": null,
"moves_up": 12,
"moves_down": 0,
"stays": 40,
"stacking_examples": [
{
"from": 3,
"percentage_value": "10.0",
"with_percentage_value": "10.0",
"effective_percentage_value": "19.0"
}
]
},
"status": 200,
"meta": {
"request_id": "7d2f4c1a-9b3e-4f6d-8a21-3c5e0b9f1d42",
"timestamp": "2026-10-10T14:05:31Z"
}
}{
"message": "<string>",
"error": "<string>",
"error_message": "<string>",
"errors": "<string>",
"meta": {
"request_id": "<string>",
"timestamp": "2023-11-07T05:31:56Z"
}
}{
"message": "<string>",
"error": "<string>",
"error_message": "<string>",
"errors": "<string>",
"meta": {
"request_id": "<string>",
"timestamp": "2023-11-07T05:31:56Z"
}
}{
"message": "<string>",
"error": "<string>",
"error_message": "<string>",
"errors": "<string>",
"meta": {
"request_id": "<string>",
"timestamp": "2023-11-07T05:31:56Z"
}
}{
"message": "<string>",
"error": "<string>",
"error_message": "<string>",
"errors": "<string>",
"meta": {
"request_id": "<string>",
"timestamp": "2023-11-07T05:31:56Z"
}
}{
"message": "<string>",
"error": "<string>",
"error_message": "<string>",
"errors": "<string>",
"meta": {
"request_id": "<string>",
"timestamp": "2023-11-07T05:31:56Z"
}
}