Update a product group’s name, description, rules, or product list.
POST /v1/actions/subscription-product-group/update-group
Authentication: API Key
Request Body
Field Type Required Description idstring Yes Group ID (UUID format) namestring No Updated group name descriptionstring No Updated description rulesobject No Updated rules ({ sharedTrial: boolean }) productIdsstring[] No Updated product list (PROD_xxx format). Replaces the entire list.
Example Request
SDK
TypeScript (fetch)
Java
Python
Go
Rust
C
C++
cURL
wget
const { group } = await client . subscriptionProductGroups . update ({
id: "d4e5f6a7-b8c9-0d1e-2f3a-4b5c6d7e8f9a" ,
name: "Updated Pricing Plans" ,
productIds: [
"PROD_3F7H2J5L8N1Q4S6U" ,
"PROD_8B4D6F9H2K5M7P1R" ,
],
});
// Uses callApi() helper from authentication.mdx
const result = await callApi ( "POST" , "/v1/actions/subscription-product-group/update-group" , {
id: "d4e5f6a7-b8c9-0d1e-2f3a-4b5c6d7e8f9a" ,
name: "Updated Pricing Plans" ,
productIds: [
"PROD_3F7H2J5L8N1Q4S6U" ,
"PROD_8B4D6F9H2K5M7P1R" ,
],
});
console . log ( result . data );
// Uses callApi() helper from authentication.mdx
String body = """
{"id":"d4e5f6a7-b8c9-0d1e-2f3a-4b5c6d7e8f9a","name":"Updated Pricing Plans","productIds":["PROD_3F7H2J5L8N1Q4S6U","PROD_8B4D6F9H2K5M7P1R"]}""" ;
String response = callApi ( "POST" , "/v1/actions/subscription-product-group/update-group" , body);
System . out . println (response);
# Uses call_api() helper from authentication.mdx
result = call_api( "POST" , "/v1/actions/subscription-product-group/update-group" , {
"id" : "d4e5f6a7-b8c9-0d1e-2f3a-4b5c6d7e8f9a" ,
"name" : "Updated Pricing Plans" ,
"productIds" : [
"PROD_3F7H2J5L8N1Q4S6U" ,
"PROD_8B4D6F9H2K5M7P1R" ,
],
})
print (result[ "data" ])
// Uses callAPI() helper from authentication.mdx
body := map [ string ] interface {}{
"id" : "d4e5f6a7-b8c9-0d1e-2f3a-4b5c6d7e8f9a" ,
"name" : "Updated Pricing Plans" ,
"productIds" : [] string {
"PROD_3F7H2J5L8N1Q4S6U" ,
"PROD_8B4D6F9H2K5M7P1R" ,
},
}
result , err := callAPI ( "POST" , "/v1/actions/subscription-product-group/update-group" , body )
if err != nil {
log . Fatal ( err )
}
fmt . Println ( string ( result ))
// Uses call_api() helper from authentication.mdx
let body = serde_json :: json! ({
"id" : "d4e5f6a7-b8c9-0d1e-2f3a-4b5c6d7e8f9a" ,
"name" : "Updated Pricing Plans" ,
"productIds" : [
"PROD_3F7H2J5L8N1Q4S6U" ,
"PROD_8B4D6F9H2K5M7P1R"
]
});
let result = call_api ( "POST" , "/v1/actions/subscription-product-group/update-group" , & body ) . await ? ;
println! ( "{}" , result );
/* Uses call_api() helper from authentication.mdx */
const char * body = "{ \" id \" : \" d4e5f6a7-b8c9-0d1e-2f3a-4b5c6d7e8f9a \" , \" name \" : \" Updated Pricing Plans \" , \" productIds \" :[ \" PROD_3F7H2J5L8N1Q4S6U \" , \" PROD_8B4D6F9H2K5M7P1R \" ]}" ;
char * response = call_api ( "POST" , "/v1/actions/subscription-product-group/update-group" , body);
printf ( " %s \n " , response);
free (response);
// Uses callApi() helper from authentication.mdx
std ::string body = R"({"id":"d4e5f6a7-b8c9-0d1e-2f3a-4b5c6d7e8f9a","name":"Updated Pricing Plans","productIds":["PROD_3F7H2J5L8N1Q4S6U","PROD_8B4D6F9H2K5M7P1R"]})" ;
std ::string response = callApi ( "POST" , "/v1/actions/subscription-product-group/update-group" , body);
std ::cout << response << std ::endl;
MERCHANT_ID = "MER_2aUyqjCzEIiEcYMKj7TZtw"
TIMESTAMP = $( date +%s )
BODY = '{
"id": "d4e5f6a7-b8c9-0d1e-2f3a-4b5c6d7e8f9a",
"name": "Updated Pricing Plans",
"productIds": [
"PROD_3F7H2J5L8N1Q4S6U",
"PROD_8B4D6F9H2K5M7P1R"
]
}'
BODY_HASH = $( echo -n " $BODY " | openssl dgst -sha256 -binary | base64 -w 0 )
CANONICAL_REQUEST = "POST
/v1/actions/subscription-product-group/update-group
$TIMESTAMP
$BODY_HASH "
SIGNATURE = $( echo -n " $CANONICAL_REQUEST " | openssl dgst -sha256 -sign private_key.pem | base64 -w 0 )
curl -X POST "https://api.waffo.ai/v1/actions/subscription-product-group/update-group" \
-H "Content-Type: application/json" \
-H "X-Merchant-Id: $MERCHANT_ID " \
-H "X-Timestamp: $TIMESTAMP " \
-H "X-Signature: $SIGNATURE " \
-d " $BODY "
MERCHANT_ID = "MER_2aUyqjCzEIiEcYMKj7TZtw"
TIMESTAMP = $( date +%s )
BODY = '{
"id": "d4e5f6a7-b8c9-0d1e-2f3a-4b5c6d7e8f9a",
"name": "Updated Pricing Plans",
"productIds": [
"PROD_3F7H2J5L8N1Q4S6U",
"PROD_8B4D6F9H2K5M7P1R"
]
}'
BODY_HASH = $( echo -n " $BODY " | openssl dgst -sha256 -binary | base64 -w 0 )
CANONICAL_REQUEST = "POST
/v1/actions/subscription-product-group/update-group
$TIMESTAMP
$BODY_HASH "
SIGNATURE = $( echo -n " $CANONICAL_REQUEST " | openssl dgst -sha256 -sign private_key.pem | base64 -w 0 )
wget -qO- "https://api.waffo.ai/v1/actions/subscription-product-group/update-group" \
--header= "Content-Type: application/json" \
--header= "X-Merchant-Id: $MERCHANT_ID " \
--header= "X-Timestamp: $TIMESTAMP " \
--header= "X-Signature: $SIGNATURE " \
--post-data= " $BODY "
The productIds field replaces the entire product list . To add a product, include all existing product IDs plus the new one. To remove a product, omit it from the list.
Errors
Retry policy: Never retry 4xx — fix the request and resubmit. Retry 5xx with exponential backoff (start 5s, max 3 attempts).
Status errors[0].messageWhat it means Recommended handling 400 Missing required field: idRequest body did not include id Add id, resubmit 400 Expected format: PROD_xxx, got "..."A productIds entry could not be decoded as a Short ID Fix the ID, resubmit 404 Group not foundNo group exists for the supplied id Verify the id belongs to your store 500 Internal server errorInternal error or transient downstream failure Retry with exponential backoff (start 5s, max 3 attempts)