---
title: "Save a product"
method: POST
path: "/v3/products"
tags: ["Products"]
---

# Save a product

`POST /v3/products`

This endpoint saves a product with the given details specified in the body of the request. The product ID is randomyly generated and provided as part of the URI path parameter response returned on success.

## Request body

- ProductRequest
  - `label` string, required — The product label. This is the human-readable name of the product.
  - `description` string — The product description. This is a human-readable description of the product.
  - `entitlement` ProductEntitlement, required
    - `id` string — Entitlement ID/slug.
    - `type` string — Entitlement type (always "bundle").
    - `entitlementTenant` string — Entitlement tenant ID.
  - `mapping` ProductMapping, required
    - `braintree_recurring` object
      - `plan_id` string — The Braintree plan ID. This is the unique identifier for the plan within the Braintree account.
      - `archived` boolean — Whether the product is archived. If true, the product will not be available for purchase.
    - `braintree_one_off` object
      - `price_points` ProductMappingPricePoint[]
        - `id` string, required — The unique identifier for the price point within the product.
        - `label` string, required — The human-readable name of the price point.
        - `price` number, required — The price of the product in the currency of the payment provider account.
        - `archived` boolean — Whether the price point is archived. If true, the price point will not be available for purchase.
    - `stripe_recurring` object
      - `stripe_plan_id` string — The Stripe plan ID. This is the unique identifier for the plan within the Stripe account.
    - `stripe_one_off` object
      - `price_points` ProductMappingPricePoint[]
        - `id` string, required — The unique identifier for the price point within the product.
        - `label` string, required — The human-readable name of the price point.
        - `price` number, required — The price of the product in the currency of the payment provider account.
        - `archived` boolean — Whether the price point is archived. If true, the price point will not be available for purchase.
    - `rate_plans` ProductMappingRatePlan[]
      - `payment_provider` string, required — The payment provider for which the rate plan is configured.
      - `rate_plan_id` string, required — The unique identifier for the rate plan within the payment provider account.
      - `archived` boolean — Whether the rate plan is archived. If true, the rate plan will not be available for purchase.
      - `archive_label` string — The human-readable name of the rate plan.
      - `environment` string, required — The environment for which the rate plan is configured.
    - `jwt` ProductMappingJwt
      - `privateClaimValue` string
  - `sharingLimit` number — The number of other users that the purchaser of this product can share the product with.

## Response `201`

Created. The product was created.

- object
  - `message` string
  - `uri` string

## Other responses

- `400` — Bad Request. Returned if the request body is invalid.
- `401` — Unauthorized. Returned if no valid authentication was provided.
- `409` — Conflict. Returned when missing a reference to the entitlement.

---

[API](https://skmtc.net/zuora/apis/admin-api-reference.md) · [All operations](https://skmtc.net/zuora/apis/admin-api-reference/llms.txt) · [OpenAPI document](https://skmtc-service-staging.skmtc.workers.dev/v1/apis/zuora/admin-api-reference/revisions/789812d35ac8/schema)
