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

# Create and Enrich Product

> Queue a single-product create/enrich workflow for the authenticated organization. The request mirrors bulk product import for one product: `product` contains developer-supplied fields, arbitrary extra fields are preserved for enrichment context, SKU is the unique upsert identifier, externally hosted HTTP(S) images are mirrored to managed R2 storage, and the API returns a job ID to poll with GET /api/v1/jobs/{jobId}. `targetMarketplaces` and `targetCountries` are optional; product creation and enrichment can run without marketplace publishing targets.



## OpenAPI

````yaml /openapi.json post /api/v1/products
openapi: 3.1.0
info:
  title: OmniCommerce API
  version: 1.0.0
  license:
    name: Proprietary
    url: https://omnicommerce.sg/terms
  description: >-
    OmniCommerce API surface for agents and developer integrations. Includes
    public endpoints (merchant discovery, product search, compare, catalog, ACO
    retrieval) and authenticated endpoints (product management via API key
    Bearer tokens).
servers:
  - url: https://omnicommerce.sg
    description: Production
  - url: http://localhost:3000
    description: Local development
security: []
tags:
  - name: agentic-checkout
    description: Merchant-fulfilled agentic checkout
    x-group: Agentic Checkout
  - name: commerce
    description: Root commerce discovery
    x-group: Commerce
  - name: developer-platform
    description: Authenticated developer platform APIs
    x-group: Developer Platform
  - name: looks
    description: AI-styled product looks
    x-group: Looks
  - name: oauth
    description: OAuth token endpoints
    x-group: OAuth
  - name: orders
    description: Workspace and agentic orders
    x-group: Orders
  - name: organizations
    description: Organization management
    x-group: Organizations
  - name: price-books
    description: Marketplace list-price markup rules
    x-group: Price Books
  - name: products
    description: Product CRUD, bulk import, and publish
    x-group: Products
  - name: promotions
    description: Central promotions and marketplace sync
    x-group: Promotions
  - name: public-agent
    description: Public agent discovery and catalog APIs
    x-group: Public Agent
  - name: settlements
    description: settlements
    x-group: Settlements
  - name: ucp
    description: Universal Commerce Protocol
    x-group: UCP
paths:
  /api/v1/products:
    post:
      tags:
        - products
      summary: Create and Enrich Product
      description: >-
        Queue a single-product create/enrich workflow for the authenticated
        organization. The request mirrors bulk product import for one product:
        `product` contains developer-supplied fields, arbitrary extra fields are
        preserved for enrichment context, SKU is the unique upsert identifier,
        externally hosted HTTP(S) images are mirrored to managed R2 storage, and
        the API returns a job ID to poll with GET /api/v1/jobs/{jobId}.
        `targetMarketplaces` and `targetCountries` are optional; product
        creation and enrichment can run without marketplace publishing targets.
      operationId: post_v1_products
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              required:
                - product
              properties:
                product:
                  type: object
                  description: >-
                    Single product payload. `sku` and `title` are required for
                    create/upsert. Known fields are normalized; arbitrary extra
                    fields are preserved and passed to enrichment.
                  required:
                    - sku
                    - title
                  additionalProperties: true
                  properties:
                    id:
                      type: string
                      description: Optional external/source product ID.
                    sku:
                      type: string
                      description: Unique SKU used as the product upsert identifier.
                      maxLength: 200
                    title:
                      type: string
                      maxLength: 400
                    name:
                      type: string
                      description: Alias accepted for `title`.
                      maxLength: 400
                    brand:
                      type: string
                      maxLength: 160
                    description:
                      type: string
                      description: >-
                        Original product description or source evidence for
                        enrichment.
                    price:
                      oneOf:
                        - type: number
                        - type: string
                      description: Product selling price.
                    costPrice:
                      oneOf:
                        - type: number
                        - type: string
                      description: >-
                        Unit cost basis for COGS. Persisted as top-level
                        `product_data.costPrice`.
                    inventory:
                      oneOf:
                        - type: integer
                          minimum: 0
                        - type: string
                        - type: object
                          properties:
                            quantity:
                              type: integer
                              minimum: 0
                      description: >-
                        Inventory quantity. Objects with `quantity` are
                        accepted.
                    weight:
                      oneOf:
                        - type: number
                        - type: string
                      description: >-
                        Product weight in grams. No `weightUnit` field is
                        required.
                    dimensions:
                      oneOf:
                        - type: object
                          properties:
                            length:
                              type: number
                              minimum: 0
                            width:
                              type: number
                              minimum: 0
                            height:
                              type: number
                              minimum: 0
                        - type: string
                      description: >-
                        Product dimensions. Strings such as `Length 17cm x
                        Height 11cm x Width 9cm` are parsed when possible.
                    images:
                      oneOf:
                        - type: string
                        - type: array
                          items:
                            oneOf:
                              - type: string
                              - type: object
                                properties:
                                  url:
                                    type: string
                                    description: External HTTP(S) image URL.
                                  alt:
                                    type: string
                                  position:
                                    type: integer
                                required:
                                  - url
                      description: >-
                        External HTTP(S) image URLs. Pipe-delimited strings and
                        arrays are accepted. Images are mirrored to R2 before
                        storage; data URI/base64 images are not supported.
                    category:
                      type: string
                    categoryName:
                      type: string
                    category_name:
                      type: string
                    product_type:
                      type: string
                      description: Alias/source hint used for category name when present.
                    marketplaces:
                      type: object
                      additionalProperties: true
                      description: >-
                        Optional per-marketplace hints. Enabled marketplace keys
                        can be used to derive target marketplaces/countries when
                        top-level targets are omitted.
                variants:
                  type: array
                  description: >-
                    Optional variant rows to create under the root product.
                    Arbitrary variant fields are accepted; `variationAttributes`
                    or `attributes` are normalized when present.
                  items:
                    type: object
                    additionalProperties: true
                    properties:
                      sku:
                        type: string
                      price:
                        oneOf:
                          - type: number
                          - type: string
                      inventory:
                        oneOf:
                          - type: integer
                          - type: string
                      variationAttributes:
                        type: object
                        additionalProperties:
                          type: string
                      attributes:
                        type: object
                        additionalProperties: true
                variationSchema:
                  type: object
                  description: >-
                    Optional variation schema, e.g. `{ "color": ["BLUE",
                    "BLACK"] }`.
                  additionalProperties:
                    type: array
                    items:
                      type: string
                targetMarketplaces:
                  type: array
                  description: >-
                    Optional marketplace targets. Product creation/enrichment
                    works when omitted.
                  items:
                    type: string
                    enum:
                      - shopee
                      - lazada
                      - tiktok
                      - shopify
                      - zalora
                      - amazon
                targetCountries:
                  type: array
                  description: Optional target country hints for marketplace/GEO workflows.
                  items:
                    type: string
                model:
                  type: string
                  description: Optional enrichment model override.
                additionalInstructions:
                  type: string
                  maxLength: 4000
                  description: >-
                    Optional instructions applied to LLM enrichment and image
                    handling. For example, exclude images tagged as size charts,
                    maps, or cluttered supplier feed shots.
                workflow:
                  type: object
                  description: Optional workflow switches.
                  properties:
                    enrich:
                      type: boolean
                      default: true
                    aco:
                      type: boolean
                      default: true
                      description: >-
                        When true, runs ACO generation after the product is
                        written.
                    publish:
                      type: boolean
                      default: false
                    syncBack:
                      type: boolean
                      default: false
                      description: >-
                        Reserved for future source-store sync-back. Accepted for
                        forward compatibility, but currently does not trigger a
                        source update.
                    sourceImagesAutomatically:
                      type: boolean
                      default: false
                      description: >-
                        When true, permits products without submitted image URLs
                        and lets enrichment use the Source Product Images tool
                        to find official brand-site gallery photos.
                    enableRichDescription:
                      type: boolean
                      default: false
                      description: >-
                        When true, asks enrichment to produce slot-based Rich
                        Content Descriptions (Markdown With Images). Description
                        image URLs are converted to slot:// placeholders and
                        must be distinct from product gallery image URLs.
                    skipBackgroundRemoval:
                      type: boolean
                      default: false
                      description: >-
                        When true, skips automatic background removal during
                        image ingestion.
                    enableMannequinRemoval:
                      type: boolean
                      default: false
                      description: >-
                        When true, queues ghost mannequin removal for eligible
                        product images after ingestion.
                    autoAssignMarketplaceTaxonomy:
                      type: boolean
                      default: false
                      description: >-
                        When true and marketplace targets are provided,
                        enrichment resolves marketplace categories, brands, and
                        attributes in the same graph before the product is
                        written.
                    excludedImageTags:
                      oneOf:
                        - type: string
                        - type: array
                          maxItems: 50
                          items:
                            type: string
                            maxLength: 120
                      description: >-
                        Optional comma-separated string or string array of
                        normalized image tags to exclude from the saved product
                        gallery after image tagging.
                    customImageTags:
                      type: array
                      maxItems: 20
                      items:
                        type: object
                        required:
                          - name
                          - description
                        additionalProperties: false
                        properties:
                          name:
                            type: string
                            maxLength: 120
                            description: >-
                              Seller-defined tag name. Normalized to snake_case
                              before tagging.
                          description:
                            type: string
                            maxLength: 280
                            description: >-
                              Natural-language instruction describing what the
                              vision model should look for before adding this
                              tag.
                      description: >-
                        Seller-defined image tags evaluated by the same image
                        tagging step as built-in tags. Use `excludedImageTags`
                        separately when matching tagged images should be removed
                        from the saved gallery.
            example:
              product:
                id: cml55mqcq06vwo20ialgr54ry
                sku: TZVBGTB82269
                sku_tpp: TZVBGTB82269
                sku_ori: '63074830'
                title: Navy Blue Leather Tote and Crossbody Bag
                brand: ZADIG & VOLTAIRE
                status: ACTIVE
                price: '600'
                compare_at_price: '720'
                cost_per_item: '425.4'
                description: >-
                  Gender: Women Brand: ZADIG & VOLTAIRE Product Name: Zadig &
                  Voltaire Navy Blue Leather Tote and Crossbody Bag Condition: A
                  Color: navy blue Material: lamb leather Origin: Tunisia
                  Includes: dust bag
                images: >-
                  https://api.example.com/images/1.jpg |
                  https://api.example.com/images/2.jpg
                category: BAGS
                category_name: SHOULDER BAGS
                color: BLUE
                condition: GOOD
                gender: WOMEN
                material: LEATHER
                inventory: '1'
                dimensions: Length 17cm x Height 11cm x Width 9cm
                weight: 450
                product_type: SHOULDER BAGS
              variants:
                - sku: TZVBGTB82269-BLUE
                  price: '600'
                  variationAttributes:
                    color: BLUE
              additionalInstructions: >-
                Exclude images that are size charts, maps, or cluttered supplier
                feed shots.
              workflow:
                aco: true
                sourceImagesAutomatically: false
                enableRichDescription: true
                skipBackgroundRemoval: false
                enableMannequinRemoval: true
                autoAssignMarketplaceTaxonomy: true
                customImageTags:
                  - name: model_holding_bag
                    description: person is holding or wearing the bag
                excludedImageTags:
                  - phone
                  - logo
                  - size_reference
      responses:
        '202':
          description: Product create/enrich workflow accepted
          content:
            application/json:
              schema:
                type: object
                properties:
                  ok:
                    type: boolean
                  apiVersion:
                    type: string
                    default: developer_v1
                  operationId:
                    type: string
                  status:
                    type: string
                  jobId:
                    type: string
                  warnings:
                    type: array
                    items:
                      type: string
                  recommendations:
                    type: array
                    items:
                      type: string
                  links:
                    type: object
                    additionalProperties:
                      type: string
                  data:
                    type: object
                    properties:
                      normalizedInput:
                        type: object
                      issues:
                        type: array
                        items:
                          type: object
                      targetMarketplaces:
                        type: array
                        items:
                          type: string
                      targetCountries:
                        type: array
                        items:
                          type: string
        '400':
          description: Bad Request - Invalid product data
        '401':
          description: Unauthorized - Invalid or missing Bearer token
        '403':
          description: Forbidden - Token not authorized for this organization
        '500':
          description: Internal Server Error
      security:
        - bearerAuth: []
components:
  securitySchemes:
    bearerAuth:
      type: http
      scheme: bearer
      bearerFormat: API Key
      description: >-
        Bearer API key for server-to-server access. Session auth is also
        supported in first-party UI flows.

````