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

# Batch upsert products

> POST /products/batch on the WISEPIM Public API: create or update up to 200 products by SKU in one atomic, idempotent call. Requires products:write.



## OpenAPI

````yaml openapi.json POST /api/public/v1/products/batch
openapi: 3.1.0
info:
  title: WISEPIM Public API
  version: 1.0.0
  description: >-
    Manage your WisePIM catalogue, prompts and knowledge, and launch enrichment,
    translation and bulk jobs. Authenticate with `Authorization: Bearer wpk_…`;
    create keys under Settings → API keys. Each key is bound to one project and
    to the scopes it was created with.
  summary: >-
    Manage catalog entities, prompts and knowledge; launch enrichment,
    translation and bulk actions and track jobs.
  termsOfService: https://wisepim.com/terms
  contact:
    name: WISEPIM support
    url: https://wisepim.com/contact
    email: info@wisepim.com
  x-logo:
    url: >-
      https://docs.wisepim.com/logo/wisepim-logo-horizontal-transparant-lightmode.png
    altText: WISEPIM
servers:
  - url: https://wisepim.com
    description: Production. Every path below already starts with /api/public/v1.
security:
  - ProjectApiKeyAuth: []
tags:
  - name: Key and project
    description: Key and project endpoints for the project bound to your API key.
  - name: Products
    description: Products endpoints for the project bound to your API key.
  - name: Categories
    description: Categories endpoints for the project bound to your API key.
  - name: Attributes
    description: Attributes endpoints for the project bound to your API key.
  - name: Dictionary Entries
    description: Dictionary Entries endpoints for the project bound to your API key.
  - name: Keywords
    description: Keywords endpoints for the project bound to your API key.
  - name: Import Templates
    description: Import Templates endpoints for the project bound to your API key.
  - name: Export Templates
    description: Export Templates endpoints for the project bound to your API key.
  - name: Attribute Groups
    description: Attribute Groups endpoints for the project bound to your API key.
  - name: Product Families
    description: Product Families endpoints for the project bound to your API key.
  - name: Value Code Sets
    description: Value Code Sets endpoints for the project bound to your API key.
  - name: Code Set Values
    description: Code Set Values endpoints for the project bound to your API key.
  - name: Uom Code Sets
    description: Uom Code Sets endpoints for the project bound to your API key.
  - name: Uom Values
    description: Uom Values endpoints for the project bound to your API key.
  - name: Prompts
    description: Prompts endpoints for the project bound to your API key.
  - name: Knowledge Libraries
    description: Knowledge Libraries endpoints for the project bound to your API key.
  - name: Enrichments
    description: Enrichments endpoints for the project bound to your API key.
  - name: Translations
    description: Translations endpoints for the project bound to your API key.
  - name: Bulk Actions
    description: Bulk Actions endpoints for the project bound to your API key.
  - name: Jobs
    description: Jobs endpoints for the project bound to your API key.
  - name: Family Attributes
    description: Family Attributes endpoints for the project bound to your API key.
  - name: Product Categories
    description: Product Categories endpoints for the project bound to your API key.
externalDocs:
  description: WISEPIM API reference and guides
  url: https://docs.wisepim.com/en/api-reference/introduction
paths:
  /api/public/v1/products/batch:
    post:
      tags:
        - Products
      summary: Create or update up to 200 products by SKU
      description: |-
        Upsert keyed by `sku`: items whose SKU exists are updated, the rest
        are created. The batch is validated first and applied atomically — a
        duplicate SKU within the batch, an unknown category or attribute, an
        invalid value or more creates than the plan allows returns 422
        `batch_invalid` with one entry per offending item and **nothing is
        written**. On success every item is applied in one transaction and the
        response lists each item's `id` and whether it was `created` or
        `updated`. Retrying the same batch is idempotent. Requires
        `products:write`.
      operationId: public_v1_batch_upsert_products
      parameters:
        - name: Idempotency-Key
          in: header
          required: false
          schema:
            type: string
            minLength: 1
            maxLength: 128
            pattern: ^[!-~]+$
          description: >-
            Reuse this key for retries of the same write. Scoped to this API
            key; retained until key deletion. Different requests with the same
            key return 409.
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/ProductBatchIn'
        required: true
      responses:
        '200':
          description: OK
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProductBatchOut'
        '401':
          description: Unauthorized
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorOut'
        '403':
          description: Forbidden
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorOut'
        '404':
          description: Not Found
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorOut'
        '409':
          description: Conflict
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorOut'
        '413':
          description: Content Too Large
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorOut'
        '422':
          description: Unprocessable Content
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/BatchErrorOut'
        '429':
          description: Too Many Requests
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorOut'
      security:
        - ProjectApiKeyAuth: []
components:
  schemas:
    ProductBatchIn:
      additionalProperties: false
      properties:
        items:
          items:
            $ref: '#/components/schemas/ProductUpsertIn'
          maxItems: 200
          minItems: 1
          title: Items
          type: array
      required:
        - items
      title: ProductBatchIn
      type: object
    ProductBatchOut:
      properties:
        results:
          items:
            $ref: '#/components/schemas/BatchResultItemOut'
          title: Results
          type: array
        summary:
          $ref: '#/components/schemas/BatchSummaryOut'
      required:
        - results
        - summary
      title: ProductBatchOut
      type: object
    ErrorOut:
      description: |-
        The shared error envelope every NinjaAPI instance renders.

        `code` is present for :class:`user_app.ninja_api.errors.ApiError`
        (`insufficient_scope`, `rate_limited`, `invalid_cursor`, …) so machine
        clients can branch without parsing `error`.
      properties:
        error:
          title: Error
          type: string
        code:
          anyOf:
            - type: string
            - type: 'null'
          title: Code
        request_id:
          title: Request Id
          type: string
      required:
        - error
        - request_id
      title: ErrorOut
      type: object
    BatchErrorOut:
      description: 'HTTP 422 for `POST /products/batch`: nothing was written.'
      properties:
        error:
          title: Error
          type: string
        code:
          anyOf:
            - type: string
            - type: 'null'
          title: Code
        request_id:
          title: Request Id
          type: string
        errors:
          items:
            $ref: '#/components/schemas/BatchErrorItemOut'
          title: Errors
          type: array
      required:
        - error
        - request_id
        - errors
      title: BatchErrorOut
      type: object
    ProductUpsertIn:
      additionalProperties: false
      properties:
        ean:
          anyOf:
            - maxLength: 255
              type: string
            - type: 'null'
          title: Ean
        upc:
          anyOf:
            - maxLength: 12
              type: string
            - type: 'null'
          title: Upc
        manufacturer_part_number:
          anyOf:
            - maxLength: 255
              type: string
            - type: 'null'
          title: Manufacturer Part Number
        brand:
          anyOf:
            - maxLength: 255
              type: string
            - type: 'null'
          title: Brand
        name:
          anyOf:
            - maxLength: 500
              type: string
            - type: 'null'
          title: Name
        name_long:
          anyOf:
            - maxLength: 500
              type: string
            - type: 'null'
          title: Name Long
        description:
          anyOf:
            - type: string
            - type: 'null'
          title: Description
        short_description:
          anyOf:
            - type: string
            - type: 'null'
          title: Short Description
        name_localized:
          anyOf:
            - additionalProperties:
                type: string
              type: object
            - type: 'null'
          description: 'Locale code → name, e.g. {"nl": "Boormachine"}.'
          title: Name Localized
        description_localized:
          anyOf:
            - additionalProperties:
                type: string
              type: object
            - type: 'null'
          title: Description Localized
        short_description_localized:
          anyOf:
            - additionalProperties:
                type: string
              type: object
            - type: 'null'
          title: Short Description Localized
        status:
          anyOf:
            - type: string
            - type: 'null'
          description: One of active, inactive, pending, archived.
          title: Status
        meta_title:
          anyOf:
            - maxLength: 255
              type: string
            - type: 'null'
          title: Meta Title
        meta_description:
          anyOf:
            - type: string
            - type: 'null'
          title: Meta Description
        meta_keywords:
          anyOf:
            - maxLength: 255
              type: string
            - type: 'null'
          title: Meta Keywords
        price:
          anyOf:
            - type: string
            - type: integer
            - type: 'null'
          description: >-
            Decimal string with at most two decimals ("19.99") or an integer.
            Null clears it.
          title: Price
        special_price:
          anyOf:
            - type: string
            - type: integer
            - type: 'null'
          description: >-
            Decimal string with at most two decimals ("14.99") or an integer.
            Null clears it.
          title: Special Price
        special_price_start_date:
          anyOf:
            - format: date-time
              type: string
            - type: 'null'
          title: Special Price Start Date
        special_price_end_date:
          anyOf:
            - format: date-time
              type: string
            - type: 'null'
          title: Special Price End Date
        category_ids:
          anyOf:
            - items:
                type: integer
              maxItems: 200
              type: array
            - type: 'null'
          description: >-
            Replaces the product's category set. Every id must belong to this
            project.
          title: Category Ids
        attributes:
          anyOf:
            - additionalProperties: true
              type: object
            - type: 'null'
          description: >-
            Attribute values keyed by attribute code. A value is a scalar or
            list, or {"value": ..., "unit": "kg"}; null removes the value. Only
            the codes sent are touched.
          title: Attributes
        sku:
          description: Upsert key within the project.
          maxLength: 255
          minLength: 1
          title: Sku
          type: string
      required:
        - sku
      title: ProductUpsertIn
      type: object
    BatchResultItemOut:
      properties:
        index:
          title: Index
          type: integer
        sku:
          title: Sku
          type: string
        id:
          title: Id
          type: integer
        action:
          description: '"created" or "updated".'
          title: Action
          type: string
      required:
        - index
        - sku
        - id
        - action
      title: BatchResultItemOut
      type: object
    BatchSummaryOut:
      properties:
        created:
          title: Created
          type: integer
        updated:
          title: Updated
          type: integer
      required:
        - created
        - updated
      title: BatchSummaryOut
      type: object
    BatchErrorItemOut:
      properties:
        index:
          title: Index
          type: integer
        sku:
          anyOf:
            - type: string
            - type: 'null'
          title: Sku
        code:
          title: Code
          type: string
        message:
          title: Message
          type: string
      required:
        - index
        - code
        - message
      title: BatchErrorItemOut
      type: object
  securitySchemes:
    ProjectApiKeyAuth:
      type: http
      scheme: bearer
      x-scopes:
        project:read: Read the project's identity, locales and limits.
        products:read: >-
          List and read products, including attribute values and category
          membership.
        products:write: Create and update products and their catalogue content.
        products:delete: Delete products from this project.
        categories:read: List the project's category tree.
        categories:write: Create and update the project's categories.
        categories:delete: Delete the project's categories.
        attributes:read: List the project's attribute definitions.
        attributes:write: Create and update the project's attribute definitions.
        attributes:delete: Delete the project's attribute definitions.
        attribute-groups:read: Read the project's attribute groups.
        attribute-groups:write: Create and update the project's attribute groups.
        attribute-groups:delete: Delete the project's attribute groups.
        product-families:read: Read the project's product families.
        product-families:write: Create and update the project's product families.
        product-families:delete: Delete the project's product families.
        family-attributes:read: Read the project's family attribute bindings.
        family-attributes:write: Create and update the project's family attribute bindings.
        family-attributes:delete: Delete the project's family attribute bindings.
        product-categories:read: Read the project's product category memberships.
        product-categories:write: Create and update the project's product category memberships.
        product-categories:delete: Delete the project's product category memberships.
        value-code-sets:read: Read the project's controlled vocabularies.
        value-code-sets:write: Create and update the project's controlled vocabularies.
        value-code-sets:delete: Delete the project's controlled vocabularies.
        code-set-values:read: Read values in the project's controlled vocabularies.
        code-set-values:write: Create and update values in the project's controlled vocabularies.
        code-set-values:delete: Delete values in the project's controlled vocabularies.
        uom-code-sets:read: Read the project's unit-of-measure sets.
        uom-code-sets:write: Create and update the project's unit-of-measure sets.
        uom-code-sets:delete: Delete the project's unit-of-measure sets.
        uom-values:read: Read units in the project's unit-of-measure sets.
        uom-values:write: Create and update units in the project's unit-of-measure sets.
        uom-values:delete: Delete units in the project's unit-of-measure sets.
        prompts:read: Read prompts visible to the key issuer in this project.
        prompts:write: >-
          Create prompts and update the key issuer's own prompts in this
          project.
        prompts:delete: Delete the key issuer's own prompts in this project.
        knowledge-libraries:read: Read this project's knowledge library.
        knowledge-libraries:write: Create and update this project's knowledge library.
        knowledge-libraries:delete: Delete this project's knowledge library.
        keywords:read: Read the project's keywords.
        keywords:write: Create and update the project's keywords.
        keywords:delete: Delete the project's keywords.
        dictionary-entries:read: Read the project's translation dictionary entries.
        dictionary-entries:write: Create and update the project's translation dictionary entries.
        dictionary-entries:delete: Delete the project's translation dictionary entries.
        import-templates:read: Read the project's reusable import templates.
        import-templates:write: Create and update the project's reusable import templates.
        import-templates:delete: Delete the project's reusable import templates.
        export-templates:read: Read the project's reusable export templates.
        export-templates:write: Create and update the project's reusable export templates.
        export-templates:delete: Delete the project's reusable export templates.
        enrichment:execute: >-
          Start product enrichment using this project's native pipelines and
          credit limits.
        translations:execute: >-
          Start product translation using this project's native pipelines and
          credit limits.
        bulk-actions:execute: Start bulk actions against this project's products.
        jobs:read: Read this project's background job status and progress.
        jobs:cancel: Request cooperative cancellation of this project's background jobs.
      bearerFormat: Project API key (wpk_...)
      description: >-
        Use a project API key from **Settings > API Access**. Send it as
        `Authorization: Bearer wpk_...`. See [authentication and
        scopes](/en/api-reference/authentication) for setup and permissions.

````

This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.