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

# Create a product



## OpenAPI

````yaml /api-reference/commerce-v1.openapi.json post /v1/commerce/products
openapi: 3.0.3
info:
  description: >-
    Public REST API for COPE vendor integrations. Authenticate with a COPE API
    key or Clerk bearer token and call the endpoints described below.
  title: COPE Public API
  version: v1
servers:
  - description: Production
    url: https://api.cope.com
security:
  - cope_sk: []
paths:
  /v1/commerce/products:
    post:
      tags:
        - Products
      summary: Create a product
      operationId: commerce.products.create
      requestBody:
        content:
          application/json:
            examples:
              digital_product_one_time:
                summary: >-
                  One-time digital product — the seven members a create cannot
                  do without
                value:
                  product:
                    description: >-
                      A 96-page playbook for launching a product to an audience
                      you do not have yet: the positioning worksheet, the
                      two-week pre-launch sequence, the pricing page teardown,
                      and the follow-up emails that recover a stalled launch.
                      Written for solo founders and small teams, with one worked
                      example throughout.
                    name: The Quiet Launch Playbook
                    payment_methods:
                      - card
                    payment_plans_attributes:
                      - first_payment_amount_cents: 4900
                        plan_type: one_time
                        position: 1
                    product_type: digital_product
                    tax_code: DB031013
                    tax_group: digital_products
              digital_service_subscription:
                summary: >-
                  Monthly membership — a subscription plan, and the fields that
                  sell the product
                value:
                  product:
                    description: >-
                      Live monthly reviews of your launch plan, a private forum
                      with the other members, and the full playbook library —
                      new teardowns every month. Cancel whenever you like; the
                      membership runs until you do, and you keep access to
                      everything published while it was active.
                    headline: Live monthly reviews and a private forum
                    name: Quiet Launch Membership
                    payment_methods:
                      - card
                    payment_plans_attributes:
                      - display_name: Monthly
                        first_payment_amount_cents: 3900
                        interval: month
                        interval_count: 1
                        next_payments_amount_cents: 3900
                        plan_type: subscription
                        position: 1
                    product_type: digital_service
                    product_url: https://example.com/quiet-launch-membership
                    refund_period_b2b_days: 14
                    refund_period_b2c_days: 14
                    tax_code: ST087651
                    tax_group: digital_services
              digital_product_installment:
                summary: >-
                  Instalment plan — 499.00 as four monthly charges. Instalment
                  selling is enabled per seller; a seller without it is refused
                  422
                value:
                  product:
                    description: >-
                      Six recorded modules on taking a product from an idea to a
                      paid launch, with the worksheets, the email templates and
                      two hours of teardown footage. Lifetime access, updated
                      whenever the material changes, and every module
                      downloadable so it stays yours after the course ends.
                    name: Quiet Launch Course
                    payment_methods:
                      - card
                    payment_plans_attributes:
                      - display_name: Four monthly payments
                        first_payment_amount_cents: 12475
                        interval: month
                        interval_count: 1
                        next_payments_amount_cents: 12475
                        next_payments_count: 3
                        plan_type: installment
                        position: 1
                    product_type: digital_product
                    tax_code: DO010000
                    tax_group: digital_products
            schema:
              properties:
                product:
                  properties:
                    description:
                      type: string
                    has_net_price:
                      type: boolean
                    headline:
                      type: string
                    internal_name:
                      type: string
                    name:
                      type: string
                    payment_methods:
                      description: >-
                        Payment methods this product may be bought with — at
                        least one. `card` is available to every seller; every
                        other method has to be enabled for the seller first, and
                        one that is not is refused with 422 `validation_failed`
                        naming it. A method outside this list is refused the
                        same way.
                      items:
                        enum:
                          - card
                          - card_present
                          - interac_present
                          - kr_card
                          - klarna
                          - affirm
                          - afterpay_clearpay
                          - alma
                          - billie
                          - scalapay
                          - sequra
                          - sunbit
                          - zip
                          - sepa_debit
                          - us_bank_account
                          - acss_debit
                          - au_becs_debit
                          - bacs_debit
                          - nz_bank_account
                          - payto
                          - ideal
                          - bancontact
                          - eps
                          - fpx
                          - giropay
                          - p24
                          - sofort
                          - pay_by_bank
                          - link
                          - amazon_pay
                          - cashapp
                          - alipay
                          - wechat_pay
                          - grabpay
                          - revolut_pay
                          - mobilepay
                          - twint
                          - satispay
                          - bizum
                          - mb_way
                          - kakao_pay
                          - naver_pay
                          - payco
                          - samsung_pay
                          - paypay
                          - swish
                          - blik
                          - paynow
                          - pix
                          - promptpay
                          - upi
                          - boleto
                          - konbini
                          - multibanco
                          - oxxo
                          - crypto
                          - customer_balance
                          - stripe_balance
                          - custom
                          - sepa
                          - ach
                          - terminal
                          - paypal
                        type: string
                      minItems: 1
                      type: array
                    payment_plans_attributes:
                      items:
                        properties:
                          display_name:
                            type: string
                          first_payment_amount_cents:
                            type: integer
                          interval:
                            type: string
                          interval_count:
                            type: integer
                          next_payments_amount_cents:
                            type: integer
                          next_payments_count:
                            type: integer
                          plan_type:
                            type: string
                          position:
                            type: integer
                        required:
                          - plan_type
                          - first_payment_amount_cents
                          - position
                        type: object
                      type: array
                    product_type:
                      type: string
                    product_url:
                      type: string
                    refund_period_b2b_days:
                      type: integer
                    refund_period_b2c_days:
                      type: integer
                    tax_code:
                      description: >-
                        Avalara tax code for what is being sold, from the
                        catalogue COPE accepts (the values below). Each code
                        belongs to exactly one `tax_group` and one
                        `product_type`: send the pair the code belongs to, or
                        the write is refused with 400 `invalid_request` naming
                        the member that disagrees. The product form in the COPE
                        dashboard offers the same catalogue, grouped by
                        category.
                      enum:
                        - DG010300
                        - DG010200
                        - DM030201
                        - DV010200
                        - DM040200
                        - DA040100
                        - DN010000
                        - DB031013
                        - DM030200
                        - DI010000
                        - DD020000
                        - DO010000
                        - DC010300
                        - SD020904
                        - SC120100
                        - SW055000
                        - SC117314
                        - SW050300
                        - SW050400
                        - DB010000
                        - DD040000
                        - DV010201
                        - DL020000
                        - DA010000
                        - DV021008
                        - DA051011
                        - DG010302
                        - DM020200
                        - SA030200
                        - SW057242
                        - SM146802
                        - SB010200
                        - SB010300
                        - SB016682
                        - SR087010
                        - SI086690
                        - SI046674
                        - ST160000
                        - ST080010
                        - ST087640
                        - ST087651
                        - ST080030
                        - SY010200
                        - ST087634
                        - SC160000
                        - SD086570
                        - SP156226
                        - SC161100
                        - SC160500
                        - SC160900
                        - SC161000
                        - ST087632
                        - ST087650
                        - SA038000
                        - SA036298
                        - SD086571
                        - SL060200
                        - PB0010000
                        - PC080110
                        - PC070601
                        - PB308786
                        - PO200101
                        - PO100000
                        - PP030000
                        - PA100000
                        - PP198874
                        - PA050500
                        - PN050814
                        - PB100817
                        - PM030108
                        - PM039393
                        - PM039394
                        - PM039396
                        - PB100000
                        - PG050715
                        - PG050000
                        - PC100003
                        - PC100000
                        - PH400930
                        - PH400954
                        - PH050529
                        - PH400825
                        - PH401010
                        - PH401019
                        - PH409601
                        - PH050527
                        - PH404225
                        - PH400924
                        - SB046004
                        - PP030100
                        - DV010100
                        - PP030113
                        - SG046826
                        - SM076818
                        - SP036858
                        - SS227026
                        - S0000000
                        - SP060000
                        - SD036434
                        - SD016410
                        - ST080000
                        - SM050200
                        - SB046010
                        - SB030000
                        - SP140000
                        - SL060100
                        - SC150157
                        - ST050100
                      type: string
                    tax_group:
                      enum:
                        - digital_products
                        - digital_services
                        - physical_products
                        - physical_services
                      type: string
                  required:
                    - name
                    - description
                    - tax_group
                    - tax_code
                    - product_type
                    - payment_methods
                    - payment_plans_attributes
                  type: object
              required:
                - product
              type: object
      responses:
        '201':
          content:
            application/json:
              schema:
                additionalProperties: false
                properties:
                  data:
                    additionalProperties: false
                    properties:
                      approval_status:
                        enum:
                          - review
                          - approved
                          - denied
                          - approved_changed
                          - denied_changed
                        type: string
                      attachments:
                        items:
                          additionalProperties: false
                          properties:
                            access_pending:
                              type: boolean
                            access_trial:
                              type: boolean
                            byte_size:
                              nullable: true
                              type: integer
                            content_type:
                              nullable: true
                              type: string
                            filename:
                              type: string
                            id:
                              example: att_A1b2C3d4E5f6G7h8
                              pattern: ^att_[A-Za-z0-9]{8,32}$
                              type: string
                            kind:
                              type: string
                            url:
                              nullable: true
                              type: string
                          required:
                            - id
                            - kind
                            - filename
                            - content_type
                            - byte_size
                            - url
                            - access_trial
                            - access_pending
                          type: object
                        type: array
                      created_at:
                        type: string
                      denial_reason:
                        nullable: true
                        type: string
                      description:
                        type: string
                      has_net_price:
                        type: boolean
                      headline:
                        nullable: true
                        type: string
                      id:
                        example: prod_A1b2C3d4
                        pattern: ^prod_[A-Za-z0-9]{8,32}$
                        type: string
                      images:
                        items:
                          additionalProperties: false
                          properties:
                            byte_size:
                              nullable: true
                              type: integer
                            content_type:
                              nullable: true
                              type: string
                            filename:
                              type: string
                            id:
                              example: img_A1b2C3d4E5f6G7h8
                              pattern: ^img_[A-Za-z0-9]{8,32}$
                              type: string
                            kind:
                              type: string
                            thumbnail_url:
                              nullable: true
                              type: string
                            url:
                              nullable: true
                              type: string
                          required:
                            - id
                            - kind
                            - filename
                            - content_type
                            - byte_size
                            - url
                            - thumbnail_url
                          type: object
                        type: array
                      installment_sales_enabled:
                        type: boolean
                      internal_name:
                        nullable: true
                        type: string
                      name:
                        type: string
                      payment_plans:
                        items:
                          additionalProperties: false
                          properties:
                            currency:
                              type: string
                            display_name:
                              nullable: true
                              type: string
                            first_payment_amount_cents:
                              type: integer
                            id:
                              example: plan_A1b2C3d4
                              pattern: ^plan_[A-Za-z0-9]{8,32}$
                              type: string
                            interval:
                              nullable: true
                              type: string
                            interval_count:
                              description: >-
                                For recurring plans, interval x interval_count
                                is the billing period and may not exceed 2
                                years. Configurations over the cap are rejected
                                with code interval_exceeds_max. Null for
                                one-time plans.
                              nullable: true
                              type: integer
                            next_payments_amount_cents:
                              nullable: true
                              type: integer
                            next_payments_count:
                              nullable: true
                              type: integer
                            plan_type:
                              type: string
                            position:
                              type: integer
                            shipping_price_cents:
                              type: integer
                          required:
                            - id
                            - currency
                            - display_name
                            - first_payment_amount_cents
                            - interval
                            - interval_count
                            - next_payments_amount_cents
                            - next_payments_count
                            - plan_type
                            - position
                            - shipping_price_cents
                          type: object
                        type: array
                      phone_collection:
                        enum:
                          - 'off'
                          - optional
                          - required
                        type: string
                      product_type:
                        type: string
                      product_url:
                        nullable: true
                        type: string
                      quantity:
                        type: integer
                      quantity_selection_enabled:
                        type: boolean
                      refund_period_b2b_days:
                        type: integer
                      refund_period_b2c_days:
                        type: integer
                      requires_shipping:
                        type: boolean
                      status:
                        enum:
                          - active
                          - inactive
                          - archived
                        type: string
                      stock_level:
                        additionalProperties: false
                        nullable: true
                        properties:
                          available_stock:
                            type: integer
                          visibility:
                            type: string
                        required:
                          - available_stock
                          - visibility
                        type: object
                      stock_level_settings_enabled:
                        type: boolean
                      tags:
                        items:
                          type: string
                        type: array
                      tax_code:
                        type: string
                      tax_group:
                        enum:
                          - digital_products
                          - digital_services
                          - physical_products
                          - physical_services
                        type: string
                      trial_period_days:
                        type: integer
                      updated_at:
                        type: string
                    required:
                      - attachments
                      - created_at
                      - description
                      - headline
                      - denial_reason
                      - has_net_price
                      - id
                      - images
                      - internal_name
                      - refund_period_b2b_days
                      - refund_period_b2c_days
                      - tax_code
                      - tax_group
                      - installment_sales_enabled
                      - phone_collection
                      - name
                      - payment_plans
                      - product_type
                      - product_url
                      - quantity
                      - quantity_selection_enabled
                      - requires_shipping
                      - status
                      - approval_status
                      - stock_level
                      - stock_level_settings_enabled
                      - tags
                      - trial_period_days
                      - updated_at
                    type: object
                required:
                  - data
                type: object
          description: Successful response
        '400':
          content:
            application/problem+json:
              examples:
                invalid_request:
                  summary: Invalid request
                  value:
                    code: invalid_request
                    detail: null
                    errors:
                      - code: unsupported
                        detail: funnel_id is not supported by this public endpoint
                        param: funnel_id
                    request_id: req_123
                    status: 400
                    title: Invalid Request
                    type: https://docs.cope.com/errors/invalid_request
                unparsable_request:
                  summary: Unparsable request
                  value:
                    code: invalid_request
                    detail: >-
                      The request could not be parsed. Check the query string
                      and the request body.
                    request_id: req_123
                    status: 400
                    title: Invalid Request
                    type: https://docs.cope.com/errors/invalid_request
              schema:
                $ref: '#/components/schemas/PublicProblemDetail'
          description: Invalid request
        '401':
          content:
            application/problem+json:
              schema:
                $ref: '#/components/schemas/PublicProblemDetail'
          description: Missing or invalid bearer token
        '403':
          content:
            application/problem+json:
              schema:
                $ref: '#/components/schemas/PublicProblemDetail'
          description: Bearer token is not authorized for this route
        '422':
          content:
            application/problem+json:
              examples:
                validation_failed:
                  summary: Validation failed
                  value:
                    code: validation_failed
                    detail: null
                    errors:
                      - code: blank
                        detail: Name can't be blank
                        param: name
                    request_id: req_123
                    status: 422
                    title: Validation Failed
                    type: https://docs.cope.com/errors/validation_failed
              schema:
                $ref: '#/components/schemas/PublicProblemDetail'
          description: Public commerce validation problem
      security:
        - cope_sk: []
components:
  schemas:
    PublicProblemDetail:
      additionalProperties: false
      properties:
        code:
          type: string
        detail:
          nullable: true
          type: string
        errors:
          items:
            additionalProperties: false
            properties:
              code:
                type: string
              detail:
                type: string
              param:
                type: string
            required:
              - code
              - detail
            type: object
          type: array
        request_id:
          type: string
        status:
          type: integer
        title:
          type: string
        type:
          type: string
      required:
        - type
        - title
        - status
        - code
        - request_id
      type: object
  securitySchemes:
    cope_sk:
      description: >-
        Bearer credential for the public API. Vendor integrations should send a
        live COPE API key (`ck_live_*`; keys issued earlier as `cope_sk_live_*`
        keep working). Clerk bearer tokens are also accepted when paired with
        `X-Cope-Business-Id`.
      scheme: bearer
      type: http

````