> ## Documentation Index
> Fetch the complete documentation index at: https://studio.assembly.com/docs/llms.txt
> Use this file to discover all available pages before exploring further.

# Create a product

> Creates a product, optionally bundling one or more prices supplied in the request body.
Only the product name is required; status, portal, and price IDs are assigned by the server.



## OpenAPI

````yaml /api-reference/openapi.json post /v1/products
openapi: 3.0.0
info:
  contact: {}
  title: Assembly API
  version: 0.0.1
servers:
  - url: https://api.assembly.com
security: []
paths:
  /v1/products:
    post:
      tags:
        - Products
      summary: Create a product
      description: >-
        Creates a product, optionally bundling one or more prices supplied in
        the request body.

        Only the product name is required; status, portal, and price IDs are
        assigned by the server.
      operationId: create-a-product
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/product.CreateProductInput'
        description: Product to create
        required: true
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/product.Product'
          description: OK
        '400':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/dispatcher.Error'
          description: >-
            Product name already exists or a supplied price has an invalid
            billing period
        '401':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/dispatcher.Error'
          description: Missing or invalid API key
        '403':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/dispatcher.Error'
          description: API key lacks the payments permission
        '500':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/dispatcher.Error'
          description: Unexpected server error
      security:
        - APIKeyHeader: []
components:
  schemas:
    product.CreateProductInput:
      properties:
        description:
          description: Description is an optional product description.
          example: Access to all premium features
          type: string
        imageUrls:
          description: ImageUrls are URLs of product images.
          example:
            - https://assets.example.com/products/premium.png
          items:
            type: string
          type: array
        name:
          description: Name is the product's display name.
          example: Premium Plan
          type: string
        status:
          allOf:
            - $ref: '#/components/schemas/product.ProductStatusType'
          description: Status is the product lifecycle state.
          enum:
            - active
            - archived
          example: active
      required:
        - name
      type: object
    product.Product:
      properties:
        createdAt:
          type: string
        creatorId:
          type: string
        data:
          type: string
        description:
          description: Description is an optional free-text description of the product.
          example: Access to all premium features
          type: string
        id:
          type: string
        identityId:
          type: string
        imageUrls:
          description: ImageUrls holds the URLs of images associated with the product.
          example:
            - https://assets.example.com/products/premium.png
          items:
            type: string
          nullable: true
          type: array
        isUsed:
          description: >-
            IsUsed reports whether the product is referenced elsewhere and
            therefore cannot be deleted.
          example: false
          type: boolean
        name:
          description: >-
            Name is the human-readable product name. Required on create and must
            be unique within the portal.
          example: Premium Plan
          type: string
        object:
          type: string
        portalId:
          description: >-
            PortalID is the ID of the portal that owns the product. Assigned by
            the server.
          example: 550e8400-e29b-41d4-a716-446655440000
          format: uuid
          type: string
        previousAttributes:
          additionalProperties: true
          type: object
        price:
          allOf:
            - $ref: '#/components/schemas/price.Price'
          description: Price is only populated when the product has exactly one price.
        priceIds:
          description: PriceIDs holds the IDs of the prices belonging to this product.
          example:
            - price_1a2b3c
          items:
            type: string
          type: array
        prices:
          description: Prices holds the full price objects associated with the product.
          items:
            $ref: '#/components/schemas/price.Price'
          type: array
        ref:
          type: string
        status:
          allOf:
            - $ref: '#/components/schemas/product.ProductStatusType'
          description: >-
            Status indicates whether the product is active or archived. Assigned
            by the server on create.
          enum:
            - active
            - archived
          example: active
        taxPercentage:
          description: >-
            TaxPercentage is the tax rate applied to the product, expressed as a
            percentage.
          example: 8.5
          type: number
        updatedAt:
          type: string
      type: object
    dispatcher.Error:
      properties:
        code:
          type: string
        data: {}
        message:
          type: string
      type: object
    product.ProductStatusType:
      enum:
        - active
        - archived
      type: string
      x-enum-varnames:
        - ProductStatusTypeActive
        - ProductStatusTypeArchived
    price.Price:
      properties:
        amount:
          description: >-
            Amount is the price amount in the smallest currency unit (e.g.
            cents).
          example: 5000
          type: integer
        createdAt:
          type: string
        creatorId:
          type: string
        currency:
          default: usd
          description: >-
            Currency is the ISO-4217 currency code. Defaults to usd when
            omitted.
          example: usd
          type: string
        data:
          type: string
        id:
          type: string
        identityId:
          type: string
        interval:
          allOf:
            - $ref: '#/components/schemas/billingutils.BillingPeriodType'
          description: Interval is the recurring billing period. Omit for one-time prices.
          enum:
            - day
            - week
            - month
            - quarterly
            - biannually
            - year
            - semiannually
          example: month
        intervalCount:
          description: >-
            IntervalCount is the number of intervals between billings for a
            recurring price.
          example: 1
          nullable: true
          type: integer
        isUsed:
          description: >-
            IsUsed indicates whether the price is already referenced by a
            subscription or invoice and therefore cannot be deleted.
          example: false
          type: boolean
        object:
          type: string
        portalId:
          description: PortalID is the ID of the portal that owns this price.
          example: a1b2c3d4-e5f6-7890-abcd-ef1234567890
          type: string
        previousAttributes:
          additionalProperties: true
          type: object
        productId:
          description: ProductId is the ID of the product this price belongs to.
          example: d1f8c9e2-3b4a-4c5d-9e6f-7a8b9c0d1e2f
          format: uuid
          type: string
        ref:
          type: string
        type:
          allOf:
            - $ref: '#/components/schemas/price.PriceType'
          description: >-
            Type is a computed field and should not be used in any logic on BE
            or Webapp
          enum:
            - oneTime
            - recurring
          example: recurring
        updatedAt:
          type: string
      type: object
    billingutils.BillingPeriodType:
      enum:
        - day
        - week
        - month
        - quarterly
        - biannually
        - year
        - semiannually
      type: string
      x-enum-varnames:
        - BillingPeriodTypeDay
        - BillingPeriodTypeWeek
        - BillingPeriodTypeMonth
        - BillingPeriodTypeQuarter
        - BillingPeriodTypeBiannual
        - BillingPeriodTypeYear
        - BillingPeriodTypeSemiAnnually
    price.PriceType:
      enum:
        - oneTime
        - recurring
      type: string
      x-enum-varnames:
        - PriceTypeOneTime
        - PriceTypeRecurring
  securitySchemes:
    APIKeyHeader:
      in: header
      name: X-API-KEY
      type: apiKey

````