Edit an owned product subscription
Apply safe edits through the shared subscription update domain. The member credential fixes ownership; saved payment and address references are rechecked under write locks. Subscription country is immutable. Dates use the subscription’s timezone and existing schedule limits. Bundle points changes are atomic; co-submitted quantity and payment changes apply only to the target. This operation does not quote, charge or dispatch a renewal. Return refreshed detail and public resolved/changed subscription IDs, including an empty changed_ids array for no-op edits. Responses are no-store and never return 304.
curl --request PATCH \
--url https://api.fluid.app/api/member/v2026-10/subscriptions/{id} \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"quantity": 2,
"auto_apply_points": false
}
'import requests
url = "https://api.fluid.app/api/member/v2026-10/subscriptions/{id}"
payload = {
"quantity": 2,
"auto_apply_points": False
}
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({quantity: 2, auto_apply_points: false})
};
fetch('https://api.fluid.app/api/member/v2026-10/subscriptions/{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://api.fluid.app/api/member/v2026-10/subscriptions/{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([
'quantity' => 2,
'auto_apply_points' => false
]),
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/{id}"
payload := strings.NewReader("{\n \"quantity\": 2,\n \"auto_apply_points\": false\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://api.fluid.app/api/member/v2026-10/subscriptions/{id}")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"quantity\": 2,\n \"auto_apply_points\": false\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.fluid.app/api/member/v2026-10/subscriptions/{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 \"quantity\": 2,\n \"auto_apply_points\": false\n}"
response = http.request(request)
puts response.read_body{
"status": 200,
"data": {
"id": "019a23a4-9211-71bf-8fa5-a5f31a82a0de",
"status": "active",
"frequency": {
"interval": 1,
"unit": "month"
},
"next_billing_at": "2026-11-01T12:00:00Z",
"currency": "USD",
"next_total": null,
"items_count": 2,
"paused_until": null,
"created_at": "2026-10-01T12:00:00Z",
"items": [
{
"id": "019a23a4-9211-71bf-8fa5-a5f31a82a0e2",
"title": "Monthly wellness bundle",
"variant_title": "Standard",
"sku": "WELLNESS-01",
"quantity": 2,
"unit_price": "20.0",
"total": "40.0",
"image_url": null
}
],
"shipping_address": null,
"payment_method": null,
"discounts": [],
"next_order_preview": null,
"auto_apply_points": false
},
"meta": {
"request_uuid": "019a23a4-9211-71bf-8fa5-a5f31a82a0de",
"timestamp": "2026-10-01T12:00:00Z",
"bundle_pagination": {
"next_cursor": null
},
"subscription_update": {
"resolved_ids": [
"019a23a4-9211-71bf-8fa5-a5f31a82a0de"
],
"changed_ids": [
"019a23a4-9211-71bf-8fa5-a5f31a82a0de"
]
}
}
}{
"status": 123,
"error": {
"message": "<string>",
"details": {}
},
"meta": {
"request_uuid": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"timestamp": "2023-11-07T05:31:56Z"
}
}{
"status": 123,
"error": {
"message": "<string>",
"details": {}
},
"meta": {
"request_uuid": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"timestamp": "2023-11-07T05:31:56Z"
}
}{
"status": 123,
"error": {
"message": "<string>",
"details": {}
},
"meta": {
"request_uuid": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"timestamp": "2023-11-07T05:31:56Z"
}
}{
"status": 123,
"error": {
"message": "<string>",
"details": {}
},
"meta": {
"request_uuid": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"timestamp": "2023-11-07T05:31:56Z"
}
}{
"status": 123,
"error": {
"message": "<string>",
"details": {}
},
"meta": {
"request_uuid": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"timestamp": "2023-11-07T05:31:56Z"
}
}{
"status": 123,
"error": {
"message": "<string>",
"details": {}
},
"meta": {
"request_uuid": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"timestamp": "2023-11-07T05:31:56Z"
}
}{
"status": 123,
"error": {
"message": "<string>",
"details": {}
},
"meta": {
"request_uuid": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"timestamp": "2023-11-07T05:31:56Z"
}
}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.
Path Parameters
Public UUID of an owned subscription.
Body
One or more safe top-level subscription fields. Query parameters and unknown fields are rejected.
- Option 1
- Option 2
- Option 3
- Option 4
- Option 5
Safe subscription edits. Omitted fields retain their current values. References use public UUIDs.
A saved payment method owned by the member or available through their shared wallet. Isolated companies require a company-local owned method.
An owned saved address in the subscription's existing country. Country changes require cancellation and recreation.
Units per cycle, subject to the variant's subscription quantity cap.
1 <= x <= 2147483647A date strictly after today in the subscription's timezone. Preserves billing time of day and aligned shipping. Maximum two years for yearly plans, twelve months otherwise.
Opt in or out of automatically applying points on renewal. Requires an actual JSON boolean.
Apply the points flag to this subscription or atomically to its renewal bundle. Payment and quantity edits always affect only the target. Bundle scope forbids address and date edits.
subscription, bundle Response
Updated subscription detail and the public UUIDs covered and changed by the edit.
Refreshed detail plus public IDs covered and changed by the edit. No-op edits have an empty changed_ids array.
curl --request PATCH \
--url https://api.fluid.app/api/member/v2026-10/subscriptions/{id} \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"quantity": 2,
"auto_apply_points": false
}
'import requests
url = "https://api.fluid.app/api/member/v2026-10/subscriptions/{id}"
payload = {
"quantity": 2,
"auto_apply_points": False
}
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({quantity: 2, auto_apply_points: false})
};
fetch('https://api.fluid.app/api/member/v2026-10/subscriptions/{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://api.fluid.app/api/member/v2026-10/subscriptions/{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([
'quantity' => 2,
'auto_apply_points' => false
]),
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/{id}"
payload := strings.NewReader("{\n \"quantity\": 2,\n \"auto_apply_points\": false\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://api.fluid.app/api/member/v2026-10/subscriptions/{id}")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"quantity\": 2,\n \"auto_apply_points\": false\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.fluid.app/api/member/v2026-10/subscriptions/{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 \"quantity\": 2,\n \"auto_apply_points\": false\n}"
response = http.request(request)
puts response.read_body{
"status": 200,
"data": {
"id": "019a23a4-9211-71bf-8fa5-a5f31a82a0de",
"status": "active",
"frequency": {
"interval": 1,
"unit": "month"
},
"next_billing_at": "2026-11-01T12:00:00Z",
"currency": "USD",
"next_total": null,
"items_count": 2,
"paused_until": null,
"created_at": "2026-10-01T12:00:00Z",
"items": [
{
"id": "019a23a4-9211-71bf-8fa5-a5f31a82a0e2",
"title": "Monthly wellness bundle",
"variant_title": "Standard",
"sku": "WELLNESS-01",
"quantity": 2,
"unit_price": "20.0",
"total": "40.0",
"image_url": null
}
],
"shipping_address": null,
"payment_method": null,
"discounts": [],
"next_order_preview": null,
"auto_apply_points": false
},
"meta": {
"request_uuid": "019a23a4-9211-71bf-8fa5-a5f31a82a0de",
"timestamp": "2026-10-01T12:00:00Z",
"bundle_pagination": {
"next_cursor": null
},
"subscription_update": {
"resolved_ids": [
"019a23a4-9211-71bf-8fa5-a5f31a82a0de"
],
"changed_ids": [
"019a23a4-9211-71bf-8fa5-a5f31a82a0de"
]
}
}
}{
"status": 123,
"error": {
"message": "<string>",
"details": {}
},
"meta": {
"request_uuid": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"timestamp": "2023-11-07T05:31:56Z"
}
}{
"status": 123,
"error": {
"message": "<string>",
"details": {}
},
"meta": {
"request_uuid": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"timestamp": "2023-11-07T05:31:56Z"
}
}{
"status": 123,
"error": {
"message": "<string>",
"details": {}
},
"meta": {
"request_uuid": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"timestamp": "2023-11-07T05:31:56Z"
}
}{
"status": 123,
"error": {
"message": "<string>",
"details": {}
},
"meta": {
"request_uuid": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"timestamp": "2023-11-07T05:31:56Z"
}
}{
"status": 123,
"error": {
"message": "<string>",
"details": {}
},
"meta": {
"request_uuid": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"timestamp": "2023-11-07T05:31:56Z"
}
}{
"status": 123,
"error": {
"message": "<string>",
"details": {}
},
"meta": {
"request_uuid": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"timestamp": "2023-11-07T05:31:56Z"
}
}{
"status": 123,
"error": {
"message": "<string>",
"details": {}
},
"meta": {
"request_uuid": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"timestamp": "2023-11-07T05:31:56Z"
}
}