Align selected product subscriptions atomically
Requires a writable member credential; legacy URL-carried JWTs are read-only. All responses use Cache-Control: private, no-store. Align two to one hundred distinct subscriptions owned by the authenticated member onto one bill date and, for physical subscriptions, one owned address. The company must enable subscription bundling. Existing currency, country, digital/physical, date-cap and billing-cycle rules apply. All selected writes and audit notes roll back together on failure. Omitted rep selection preserves existing attribution; subscriptions with mixed, unavailable or ambiguous reps are refused. Rep changes are not supported by this endpoint. The selected subscriptions must already share a rep or all be unassigned. A shared existing timezone takes precedence over the requested timezone, matching the bundle lifecycle. The response confirms only the selected subscriptions; it is not a complete runtime bundle listing and introduces no persisted bundle identifier. No other subscription is modified. Alignment saves schedule fields and any requested address while preserving subscription status, matching the existing bundle writer. A cancelled selection remains cancelled and cannot renew; this operation does not reactivate it.
curl --request POST \
--url https://api.fluid.app/api/member/v2026-10/subscriptions/bundle \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"subscription_ids": [
"019a23a4-9211-71bf-8fa5-a5f31a82a0d1",
"019a23a4-9211-71bf-8fa5-a5f31a82a0d2"
],
"next_bill_date": "2026-10-15",
"address_id": "019a23a4-9211-71bf-8fa5-a5f31a82a0d3",
"timezone": "America/Los_Angeles"
}
'import requests
url = "https://api.fluid.app/api/member/v2026-10/subscriptions/bundle"
payload = {
"subscription_ids": ["019a23a4-9211-71bf-8fa5-a5f31a82a0d1", "019a23a4-9211-71bf-8fa5-a5f31a82a0d2"],
"next_bill_date": "2026-10-15",
"address_id": "019a23a4-9211-71bf-8fa5-a5f31a82a0d3",
"timezone": "America/Los_Angeles"
}
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({
subscription_ids: ['019a23a4-9211-71bf-8fa5-a5f31a82a0d1', '019a23a4-9211-71bf-8fa5-a5f31a82a0d2'],
next_bill_date: '2026-10-15',
address_id: '019a23a4-9211-71bf-8fa5-a5f31a82a0d3',
timezone: 'America/Los_Angeles'
})
};
fetch('https://api.fluid.app/api/member/v2026-10/subscriptions/bundle', 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/member/v2026-10/subscriptions/bundle",
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([
'subscription_ids' => [
'019a23a4-9211-71bf-8fa5-a5f31a82a0d1',
'019a23a4-9211-71bf-8fa5-a5f31a82a0d2'
],
'next_bill_date' => '2026-10-15',
'address_id' => '019a23a4-9211-71bf-8fa5-a5f31a82a0d3',
'timezone' => 'America/Los_Angeles'
]),
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/member/v2026-10/subscriptions/bundle"
payload := strings.NewReader("{\n \"subscription_ids\": [\n \"019a23a4-9211-71bf-8fa5-a5f31a82a0d1\",\n \"019a23a4-9211-71bf-8fa5-a5f31a82a0d2\"\n ],\n \"next_bill_date\": \"2026-10-15\",\n \"address_id\": \"019a23a4-9211-71bf-8fa5-a5f31a82a0d3\",\n \"timezone\": \"America/Los_Angeles\"\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/member/v2026-10/subscriptions/bundle")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"subscription_ids\": [\n \"019a23a4-9211-71bf-8fa5-a5f31a82a0d1\",\n \"019a23a4-9211-71bf-8fa5-a5f31a82a0d2\"\n ],\n \"next_bill_date\": \"2026-10-15\",\n \"address_id\": \"019a23a4-9211-71bf-8fa5-a5f31a82a0d3\",\n \"timezone\": \"America/Los_Angeles\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.fluid.app/api/member/v2026-10/subscriptions/bundle")
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 \"subscription_ids\": [\n \"019a23a4-9211-71bf-8fa5-a5f31a82a0d1\",\n \"019a23a4-9211-71bf-8fa5-a5f31a82a0d2\"\n ],\n \"next_bill_date\": \"2026-10-15\",\n \"address_id\": \"019a23a4-9211-71bf-8fa5-a5f31a82a0d3\",\n \"timezone\": \"America/Los_Angeles\"\n}"
response = http.request(request)
puts response.read_body{
"status": 200,
"data": [
{
"id": "019a23a4-9211-71bf-8fa5-a5f31a82a0d1",
"next_billing_at": "2026-10-15T19:00:00Z"
},
{
"id": "019a23a4-9211-71bf-8fa5-a5f31a82a0d2",
"next_billing_at": "2026-10-15T19:00:00Z"
}
],
"meta": {
"request_uuid": "019a23a4-9211-71bf-8fa5-a5f31a82a0de",
"timestamp": "2026-10-01T12:00:00Z"
}
}{
"status": 401,
"error": {
"message": "A member credential is required",
"details": {
"error": "unauthorized"
}
},
"meta": {
"request_uuid": "019a23a4-9211-71bf-8fa5-a5f31a82a0de",
"timestamp": "2026-10-01T12:00:00Z"
}
}{
"status": 403,
"error": {
"message": "This credential cannot make changes",
"details": {
"error": "forbidden"
}
},
"meta": {
"request_uuid": "019a23a4-9211-71bf-8fa5-a5f31a82a0de",
"timestamp": "2026-10-01T12:00:00Z"
}
}{
"status": 404,
"error": {
"message": "The requested resource could not be found",
"details": {
"error": "not_found"
}
},
"meta": {
"request_uuid": "019a23a4-9211-71bf-8fa5-a5f31a82a0de",
"timestamp": "2026-10-01T12:00:00Z"
}
}{
"status": 409,
"error": {
"message": "Subscription reference ownership changed; try again",
"details": {}
},
"meta": {
"request_uuid": "019a23a4-9211-71bf-8fa5-a5f31a82a0de",
"timestamp": "2026-10-01T12:00:00Z"
}
}{
"status": 422,
"error": {
"message": "Selected subscriptions must already share the same volume rep",
"details": {
"subscription_ids": [
"Selected subscriptions must already share the same volume rep"
]
}
},
"meta": {
"request_uuid": "019a23a4-9211-71bf-8fa5-a5f31a82a0de",
"timestamp": "2026-10-01T12:00:00Z"
}
}Authorizations
A member credential in the Authorization: Bearer header: a member
session JWT, a portal JWT whose login is linked to a membership in
that company, or an opaque member token. The credential alone
identifies the member and company.
Body
Distinct public UUIDs of the member's selected subscriptions. UUID comparison ignores case.
2 - 100 elementsCalendar bill date in the resolved bundle timezone; cannot be in the past.
^\d{4}-\d{2}-\d{2}$Public UUID of an owned address. Required for physical subscriptions; omit for digital subscriptions.
IANA timezone used when the selected subscriptions do not already share one.
255"America/Los_Angeles"
Response
Every selected subscription was aligned successfully. Only the selected subscriptions are returned.
curl --request POST \
--url https://api.fluid.app/api/member/v2026-10/subscriptions/bundle \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"subscription_ids": [
"019a23a4-9211-71bf-8fa5-a5f31a82a0d1",
"019a23a4-9211-71bf-8fa5-a5f31a82a0d2"
],
"next_bill_date": "2026-10-15",
"address_id": "019a23a4-9211-71bf-8fa5-a5f31a82a0d3",
"timezone": "America/Los_Angeles"
}
'import requests
url = "https://api.fluid.app/api/member/v2026-10/subscriptions/bundle"
payload = {
"subscription_ids": ["019a23a4-9211-71bf-8fa5-a5f31a82a0d1", "019a23a4-9211-71bf-8fa5-a5f31a82a0d2"],
"next_bill_date": "2026-10-15",
"address_id": "019a23a4-9211-71bf-8fa5-a5f31a82a0d3",
"timezone": "America/Los_Angeles"
}
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({
subscription_ids: ['019a23a4-9211-71bf-8fa5-a5f31a82a0d1', '019a23a4-9211-71bf-8fa5-a5f31a82a0d2'],
next_bill_date: '2026-10-15',
address_id: '019a23a4-9211-71bf-8fa5-a5f31a82a0d3',
timezone: 'America/Los_Angeles'
})
};
fetch('https://api.fluid.app/api/member/v2026-10/subscriptions/bundle', 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/member/v2026-10/subscriptions/bundle",
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([
'subscription_ids' => [
'019a23a4-9211-71bf-8fa5-a5f31a82a0d1',
'019a23a4-9211-71bf-8fa5-a5f31a82a0d2'
],
'next_bill_date' => '2026-10-15',
'address_id' => '019a23a4-9211-71bf-8fa5-a5f31a82a0d3',
'timezone' => 'America/Los_Angeles'
]),
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/member/v2026-10/subscriptions/bundle"
payload := strings.NewReader("{\n \"subscription_ids\": [\n \"019a23a4-9211-71bf-8fa5-a5f31a82a0d1\",\n \"019a23a4-9211-71bf-8fa5-a5f31a82a0d2\"\n ],\n \"next_bill_date\": \"2026-10-15\",\n \"address_id\": \"019a23a4-9211-71bf-8fa5-a5f31a82a0d3\",\n \"timezone\": \"America/Los_Angeles\"\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/member/v2026-10/subscriptions/bundle")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"subscription_ids\": [\n \"019a23a4-9211-71bf-8fa5-a5f31a82a0d1\",\n \"019a23a4-9211-71bf-8fa5-a5f31a82a0d2\"\n ],\n \"next_bill_date\": \"2026-10-15\",\n \"address_id\": \"019a23a4-9211-71bf-8fa5-a5f31a82a0d3\",\n \"timezone\": \"America/Los_Angeles\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.fluid.app/api/member/v2026-10/subscriptions/bundle")
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 \"subscription_ids\": [\n \"019a23a4-9211-71bf-8fa5-a5f31a82a0d1\",\n \"019a23a4-9211-71bf-8fa5-a5f31a82a0d2\"\n ],\n \"next_bill_date\": \"2026-10-15\",\n \"address_id\": \"019a23a4-9211-71bf-8fa5-a5f31a82a0d3\",\n \"timezone\": \"America/Los_Angeles\"\n}"
response = http.request(request)
puts response.read_body{
"status": 200,
"data": [
{
"id": "019a23a4-9211-71bf-8fa5-a5f31a82a0d1",
"next_billing_at": "2026-10-15T19:00:00Z"
},
{
"id": "019a23a4-9211-71bf-8fa5-a5f31a82a0d2",
"next_billing_at": "2026-10-15T19:00:00Z"
}
],
"meta": {
"request_uuid": "019a23a4-9211-71bf-8fa5-a5f31a82a0de",
"timestamp": "2026-10-01T12:00:00Z"
}
}{
"status": 401,
"error": {
"message": "A member credential is required",
"details": {
"error": "unauthorized"
}
},
"meta": {
"request_uuid": "019a23a4-9211-71bf-8fa5-a5f31a82a0de",
"timestamp": "2026-10-01T12:00:00Z"
}
}{
"status": 403,
"error": {
"message": "This credential cannot make changes",
"details": {
"error": "forbidden"
}
},
"meta": {
"request_uuid": "019a23a4-9211-71bf-8fa5-a5f31a82a0de",
"timestamp": "2026-10-01T12:00:00Z"
}
}{
"status": 404,
"error": {
"message": "The requested resource could not be found",
"details": {
"error": "not_found"
}
},
"meta": {
"request_uuid": "019a23a4-9211-71bf-8fa5-a5f31a82a0de",
"timestamp": "2026-10-01T12:00:00Z"
}
}{
"status": 409,
"error": {
"message": "Subscription reference ownership changed; try again",
"details": {}
},
"meta": {
"request_uuid": "019a23a4-9211-71bf-8fa5-a5f31a82a0de",
"timestamp": "2026-10-01T12:00:00Z"
}
}{
"status": 422,
"error": {
"message": "Selected subscriptions must already share the same volume rep",
"details": {
"subscription_ids": [
"Selected subscriptions must already share the same volume rep"
]
}
},
"meta": {
"request_uuid": "019a23a4-9211-71bf-8fa5-a5f31a82a0de",
"timestamp": "2026-10-01T12:00:00Z"
}
}