# Save a product with the given ID This endpoint both saves and updates a product. The product is identified by the id path parameter. If the product ID does not exist, then a new product with the corresponding ID will be created. Otherwise, the existing product will be modified. Endpoint: PUT /v3/products/{id} Version: 2026-01-08 Security: ZephrHmacHttp ## Path parameters: - `id` (string, required) Unique Product identifier. ## Request fields (application/json): - `label` (string, required) The product label. This is the human-readable name of the product. Example: "Gold Subscription" - `description` (string) The product description. This is a human-readable description of the product. Example: "The most premium subscription." - `entitlement` (object, required) - `entitlement.id` (string) Entitlement ID/slug. Example: "gold-bundle" - `entitlement.type` (string) Entitlement type (always "bundle"). Example: "bundle" - `entitlement.entitlementTenant` (string) Entitlement tenant ID. Example: "company" - `mapping` (object, required) Example: {"braintree_one_off":{"price_points":[{"id":"ten","label":"Ten Dollars","price":10}]}} - `mapping.braintree_recurring` (object) - `mapping.braintree_recurring.plan_id` (string) The Braintree plan ID. This is the unique identifier for the plan within the Braintree account. Example: "gold" - `mapping.braintree_recurring.archived` (boolean) Whether the product is archived. If true, the product will not be available for purchase. Example: true - `mapping.braintree_one_off` (object) Example: {"price_points":[{"id":"ten","label":"Ten Dollars","price":10}]} - `mapping.braintree_one_off.price_points` (array) Example: [{"id":"ten","label":"Ten Dollars","price":10}] - `mapping.braintree_one_off.price_points.id` (string, required) The unique identifier for the price point within the product. Example: "ten" - `mapping.braintree_one_off.price_points.label` (string, required) The human-readable name of the price point. Example: "Ten Dollars" - `mapping.braintree_one_off.price_points.price` (number, required) The price of the product in the currency of the payment provider account. Example: 10 - `mapping.braintree_one_off.price_points.archived` (boolean) Whether the price point is archived. If true, the price point will not be available for purchase. Example: true - `mapping.stripe_recurring` (object) - `mapping.stripe_recurring.stripe_plan_id` (string) The Stripe plan ID. This is the unique identifier for the plan within the Stripe account. Example: "gold" - `mapping.stripe_one_off` (object) - `mapping.rate_plans` (array) - `mapping.rate_plans.payment_provider` (string, required) The payment provider for which the rate plan is configured. - `mapping.rate_plans.rate_plan_id` (string, required) The unique identifier for the rate plan within the payment provider account. - `mapping.rate_plans.archived` (boolean) Whether the rate plan is archived. If true, the rate plan will not be available for purchase. - `mapping.rate_plans.archive_label` (string) The human-readable name of the rate plan. - `mapping.rate_plans.environment` (string, required) The environment for which the rate plan is configured. Example: "LIVE" - `mapping.jwt` (object) - `mapping.jwt.privateClaimValue` (string) - `sharingLimit` (number) The number of other users that the purchaser of this product can share the product with. Example: 5 ## Response 200 fields (application/json): - `message` (string) Example: "Product updated successfully" - `uri` (string) Example: "https://company.api.zephr.com/v3/products/gold" ## Response 201 fields (application/json): - `message` (string) Example: "Product created successfully" - `uri` (string) Example: "https://company.api.zephr.com/v3/products/gold" ## Response 400 fields ## Response 401 fields ## Response 409 fields