Update an Enrollment Pack
Token-authenticated; requires storefront.update. Only the keys
sent are updated. Triggers fresh Lighthouse + compliance scans.
curl --request PATCH \
--url https://api.fluid.app/api/v202604/company/enrollment-packs/{id} \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"enrollment_pack": {
"status": "draft",
"country_isos": [
"US"
]
}
}
'import requests
url = "https://api.fluid.app/api/v202604/company/enrollment-packs/{id}"
payload = { "enrollment_pack": {
"status": "draft",
"country_isos": ["US"]
} }
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({enrollment_pack: {status: 'draft', country_isos: ['US']}})
};
fetch('https://api.fluid.app/api/v202604/company/enrollment-packs/{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/v202604/company/enrollment-packs/{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([
'enrollment_pack' => [
'status' => 'draft',
'country_isos' => [
'US'
]
]
]),
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/v202604/company/enrollment-packs/{id}"
payload := strings.NewReader("{\n \"enrollment_pack\": {\n \"status\": \"draft\",\n \"country_isos\": [\n \"US\"\n ]\n }\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/v202604/company/enrollment-packs/{id}")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"enrollment_pack\": {\n \"status\": \"draft\",\n \"country_isos\": [\n \"US\"\n ]\n }\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.fluid.app/api/v202604/company/enrollment-packs/{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 \"enrollment_pack\": {\n \"status\": \"draft\",\n \"country_isos\": [\n \"US\"\n ]\n }\n}"
response = http.request(request)
puts response.read_body{
"status": 200,
"meta": {
"request_id": "<string>",
"timestamp": "2023-11-07T05:31:56Z",
"pagination": {
"cursor": "<string>",
"limit": 25,
"prev_cursor": "<string>",
"next_cursor": "<string>"
}
},
"enrollment_pack": {
"id": 60311,
"slug": "primex-welcome-pack",
"title": "Primex Welcome Pack",
"description": "Everything a new Primex member needs to get started.",
"image_url": "https://cdn.fluid.app/enrollment_packs/60311.png",
"canonical_url": "https://acme.fluid.app/home/enrollments/primex-welcome-pack",
"images": {
"thumb": {
"url": "https://ik.imagekit.io/fluidapp/tr:w-600,c-at_max,f-auto,q-75/categories/4821.png",
"width": 600
},
"medium": {
"url": "https://ik.imagekit.io/fluidapp/tr:w-600,c-at_max,f-auto,q-75/categories/4821.png",
"width": 600
},
"large": {
"url": "https://ik.imagekit.io/fluidapp/tr:w-600,c-at_max,f-auto,q-75/categories/4821.png",
"width": 600
}
},
"active": true,
"status": "published",
"publish_at": null,
"seo": {
"title": "Summer Sale — Up to 40% Off",
"description": "Shop the July clearance event before it ends.",
"image_url": "https://ik.imagekit.io/fluidapp/tr:w-1200,h-630,c-maintain_ratio,fo-auto,f-auto,q-80/seo/9215.png",
"block_crawler": false,
"id": 9215
},
"metafields": [
{
"namespace": "custom",
"key": "material",
"value": "<unknown>",
"value_type": "single_line_text_field",
"description": "The primary material used in this product",
"created_at": "2026-05-01T12:00:00Z",
"updated_at": "2026-05-01T12:00:00Z",
"locked": false
}
],
"languages": [
"en",
"fr"
],
"enrollment_fee": "29.0",
"additional_volume": 100,
"membership_after_one_month": false,
"membership_optional": true,
"countries": [
"GB",
"US"
],
"member_enrollable_products": [
{
"id": 123,
"product_id": 123,
"variant_id": 123
}
],
"subscription_enrollable_products": [
{
"id": 123,
"product_id": 123,
"variant_id": 123,
"subscription_plan_id": 123
}
],
"enrollment_pack_agreements": [
{
"id": 123,
"agreement_id": 123,
"required": true,
"position": 123
}
]
}
}{
"message": "Invalid credentials."
}{
"error": "Not authorized."
}{
"error": {
"message": "<string>",
"details": {}
},
"status": 123,
"meta": {
"request_id": "<string>",
"timestamp": "2023-11-07T05:31:56Z",
"pagination": {
"cursor": "<string>",
"limit": 25,
"prev_cursor": "<string>",
"next_cursor": "<string>"
}
}
}{
"error": {
"message": "<string>",
"details": {}
},
"status": 123,
"meta": {
"request_id": "<string>",
"timestamp": "2023-11-07T05:31:56Z",
"pagination": {
"cursor": "<string>",
"limit": 25,
"prev_cursor": "<string>",
"next_cursor": "<string>"
}
}
}Authorizations
Bearer token authentication. Accepts company-admin tokens with
storefront.view for read operations and storefront.update
for writes and scan triggers (legacy per-resource grants like
categories.update / products.view / etc. are still accepted
during the migration), required on every company operation.
Storefront public operations under /api/v202604/{resource} and
/api/v202604/{resource}/{slug} are unauthenticated
(security: []).
Path Parameters
The unique identifier of the enrollment pack.
Query Parameters
Response locale. ISO code (e.g. fr, de). When omitted,
responds in the company's default locale. On the public
surface, falls back to en for any translated field missing
in the requested locale.
"fr"
Body
Show child attributes
Show child attributes
Response
The updated Enrollment Pack.
Shared success envelope for list / show / create / update
responses: the resource payload is returned alongside a top-level
integer status and meta. Composed onto each resource response
via allOf.
200
Response metadata included on every successful response body.
request_id and timestamp are always present; list endpoints
also add pagination.
Show child attributes
Show child attributes
Storefront Enrollment Pack. The first thirteen fields are the
canonical common top shared by every storefront resource in v202604.
Enrollment Packs are schedulable but have no archived state: status
derives from the active toggle + publish_at (active + future
publish_at → scheduled; active + null/past publish_at →
published; inactive → draft). The membership / subscription products
and agreements (member_enrollable_products,
subscription_enrollable_products, enrollment_pack_agreements)
are returned only on the SHOW response, not the catalog card.
Show child attributes
Show child attributes
curl --request PATCH \
--url https://api.fluid.app/api/v202604/company/enrollment-packs/{id} \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"enrollment_pack": {
"status": "draft",
"country_isos": [
"US"
]
}
}
'import requests
url = "https://api.fluid.app/api/v202604/company/enrollment-packs/{id}"
payload = { "enrollment_pack": {
"status": "draft",
"country_isos": ["US"]
} }
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({enrollment_pack: {status: 'draft', country_isos: ['US']}})
};
fetch('https://api.fluid.app/api/v202604/company/enrollment-packs/{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/v202604/company/enrollment-packs/{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([
'enrollment_pack' => [
'status' => 'draft',
'country_isos' => [
'US'
]
]
]),
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/v202604/company/enrollment-packs/{id}"
payload := strings.NewReader("{\n \"enrollment_pack\": {\n \"status\": \"draft\",\n \"country_isos\": [\n \"US\"\n ]\n }\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/v202604/company/enrollment-packs/{id}")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"enrollment_pack\": {\n \"status\": \"draft\",\n \"country_isos\": [\n \"US\"\n ]\n }\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.fluid.app/api/v202604/company/enrollment-packs/{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 \"enrollment_pack\": {\n \"status\": \"draft\",\n \"country_isos\": [\n \"US\"\n ]\n }\n}"
response = http.request(request)
puts response.read_body{
"status": 200,
"meta": {
"request_id": "<string>",
"timestamp": "2023-11-07T05:31:56Z",
"pagination": {
"cursor": "<string>",
"limit": 25,
"prev_cursor": "<string>",
"next_cursor": "<string>"
}
},
"enrollment_pack": {
"id": 60311,
"slug": "primex-welcome-pack",
"title": "Primex Welcome Pack",
"description": "Everything a new Primex member needs to get started.",
"image_url": "https://cdn.fluid.app/enrollment_packs/60311.png",
"canonical_url": "https://acme.fluid.app/home/enrollments/primex-welcome-pack",
"images": {
"thumb": {
"url": "https://ik.imagekit.io/fluidapp/tr:w-600,c-at_max,f-auto,q-75/categories/4821.png",
"width": 600
},
"medium": {
"url": "https://ik.imagekit.io/fluidapp/tr:w-600,c-at_max,f-auto,q-75/categories/4821.png",
"width": 600
},
"large": {
"url": "https://ik.imagekit.io/fluidapp/tr:w-600,c-at_max,f-auto,q-75/categories/4821.png",
"width": 600
}
},
"active": true,
"status": "published",
"publish_at": null,
"seo": {
"title": "Summer Sale — Up to 40% Off",
"description": "Shop the July clearance event before it ends.",
"image_url": "https://ik.imagekit.io/fluidapp/tr:w-1200,h-630,c-maintain_ratio,fo-auto,f-auto,q-80/seo/9215.png",
"block_crawler": false,
"id": 9215
},
"metafields": [
{
"namespace": "custom",
"key": "material",
"value": "<unknown>",
"value_type": "single_line_text_field",
"description": "The primary material used in this product",
"created_at": "2026-05-01T12:00:00Z",
"updated_at": "2026-05-01T12:00:00Z",
"locked": false
}
],
"languages": [
"en",
"fr"
],
"enrollment_fee": "29.0",
"additional_volume": 100,
"membership_after_one_month": false,
"membership_optional": true,
"countries": [
"GB",
"US"
],
"member_enrollable_products": [
{
"id": 123,
"product_id": 123,
"variant_id": 123
}
],
"subscription_enrollable_products": [
{
"id": 123,
"product_id": 123,
"variant_id": 123,
"subscription_plan_id": 123
}
],
"enrollment_pack_agreements": [
{
"id": 123,
"agreement_id": 123,
"required": true,
"position": 123
}
]
}
}{
"message": "Invalid credentials."
}{
"error": "Not authorized."
}{
"error": {
"message": "<string>",
"details": {}
},
"status": 123,
"meta": {
"request_id": "<string>",
"timestamp": "2023-11-07T05:31:56Z",
"pagination": {
"cursor": "<string>",
"limit": 25,
"prev_cursor": "<string>",
"next_cursor": "<string>"
}
}
}{
"error": {
"message": "<string>",
"details": {}
},
"status": 123,
"meta": {
"request_id": "<string>",
"timestamp": "2023-11-07T05:31:56Z",
"pagination": {
"cursor": "<string>",
"limit": 25,
"prev_cursor": "<string>",
"next_cursor": "<string>"
}
}
}