> ## 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.

# Retrieve a product



## OpenAPI

````yaml /api-reference/commerce-v1.openapi.json get /v1/commerce/products/{id}
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/{id}:
    get:
      tags:
        - Products
      summary: Retrieve a product
      operationId: commerce.products.retrieve
      parameters:
        - description: id public identifier.
          example: prod_A1b2C3d4
          in: path
          name: id
          required: true
          schema:
            example: prod_A1b2C3d4
            pattern: ^prod_[A-Za-z0-9]{8,32}$
            type: string
      responses:
        '200':
          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:
                      - approval_status
                      - attachments
                      - created_at
                      - denial_reason
                      - description
                      - has_net_price
                      - headline
                      - id
                      - images
                      - installment_sales_enabled
                      - internal_name
                      - name
                      - payment_plans
                      - phone_collection
                      - product_type
                      - product_url
                      - quantity
                      - quantity_selection_enabled
                      - refund_period_b2b_days
                      - refund_period_b2c_days
                      - requires_shipping
                      - status
                      - stock_level
                      - stock_level_settings_enabled
                      - tags
                      - tax_code
                      - tax_group
                      - trial_period_days
                      - updated_at
                    type: object
                required:
                  - data
                type: object
          description: Successful response
        '400':
          content:
            application/problem+json:
              examples:
                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
        '404':
          content:
            application/problem+json:
              schema:
                $ref: '#/components/schemas/PublicProblemDetail'
          description: Resource not found
      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

````