Skip to main content
Update a subscription product’s content. If content has changed, a new immutable version is created automatically. If the content is identical to the current version, no new version is created.
POST /v1/actions/subscription-product/update-product
Authentication: API Key

Request Body

FieldTypeRequiredDescription
idstringYesProduct ID (PROD_xxx format)
namestringNoUpdated product name (max 64 chars)
billingPeriodstringNoweekly, monthly, quarterly, or yearly
pricesobjectNoUpdated multi-currency pricing
descriptionstring | nullNoUpdated description (pass null or "" to clear)
mediaarrayNoUpdated media
successUrlstring | nullNoUpdated redirect URL (max 512 chars, must be a valid http(s) URL; pass null or "" to clear)
metadataobjectNoUpdated metadata (may include trialDays)

Example Request

const { product } = await client.subscriptionProducts.update({
  id: "PROD_3F7H2J5L8N1Q4S6U",
  name: "Pro Plan v2",
  billingPeriod: BillingPeriod.Monthly,
  prices: {
    USD: { amount: "39.00", taxIncluded: false, taxCategory: TaxCategory.SaaS },
    EUR: { amount: "36.00", taxIncluded: false, taxCategory: TaxCategory.SaaS },
  },
  metadata: { trialDays: 7 },
});

Success Response (200)

{
  "data": {
    "product": {
      "id": "PROD_3F7H2J5L8N1Q4S6U",
      "storeId": "STO_2D5F8G3H1K4M6N9P",
      "name": "Pro Plan v2",
      "description": null,
      "billingPeriod": "monthly",
      "prices": {
        "USD": { "amount": "39.00", "taxCategory": "saas" },
        "EUR": { "amount": "36.00", "taxCategory": "saas" }
      },
      "media": [],
      "successUrl": null,
      "metadata": { "trialDays": 7 },
      "status": "active",
      "createdAt": "2026-03-30T10:30:00.000Z",
      "updatedAt": "2026-03-30T11:00:00.000Z"
    }
  }
}

Response Fields

Same as Create Subscription Product response.
Product updates create new immutable versions. Existing subscriptions retain their original version. New signups use the latest version. If the submitted content is identical to the current version, no new version is created.

Errors

Retry policy: Never retry 4xx — fix the request and resubmit. Retry 5xx with exponential backoff (start 5s, max 3 attempts).
Statuserrors[0].messageWhat it meansRecommended handling
400Missing header: x-context-merchant-idThe merchant context header was not forwardedFix your SDK configuration
400Missing or invalid header: x-context-environmentEnvironment header is missing or not test / prodSet X-Environment to test or prod
400Missing required field: idRequest body did not include idAdd id, resubmit
400Expected format: PROD_xxx, got "X"id is not a valid Short IDUse a PROD_ prefixed Short ID
400Field name must be a non-empty stringname was provided as an empty stringOmit name to keep current value, or provide a non-empty string
400Invalid billingPeriodbillingPeriod is not one of weekly / monthly / quarterly / yearlyUse one of the four allowed values
400Field prices must be a non-empty objectprices was provided but emptyOmit prices to keep current value, or include at least one currency
400Invalid currency code: "X". Must be 3 uppercase letters (e.g., "USD", "EUR", "JPY")A key in prices is not a valid ISO 4217 codeUse 3 uppercase letters
400Invalid amount for X: "Y". Must be a positive number string (e.g., "9.99", "1000")Amount string couldn’t be parsedUse a positive decimal string
400Message contains has no versionThe target environment (test or prod) has no version yetCreate a version in this environment first (publish from test, or create in test)
401UnauthorizedAuthentication failedVerify API key, timestamp, and signature
404Product not found / Current version not foundProduct ID does not exist (or current version missing)Verify the product ID
500Internal server errorTransient downstream failureRetry with exponential backoff (start 5s, max 3 attempts)