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

# Add or remove SKUs across B2B product templates

> Add or remove SKUs on many B2B Product Templates in one call.

**Choosing templates:** send explicit `template_ids`, or `all_templates: true`.
`exclude_template_ids` always wins, so "every template except the private-label ones" is
`all_templates: true` plus the private-label IDs from `GET /b2b-product-templates`.

**Choosing SKUs:** send product IDs in `sku_ids`, internal SKU strings in `skus`, or both.
Deleted SKUs count as unknown. On `add`, SKUs the template editor would not offer
(not a SKU product type, a variant child, or discontinued) are left out and listed in
`skipped_sku_ids`.

**Safe to retry:** an add skips SKUs a template already holds (`already_present`), and a
remove skips SKUs it does not hold. An unknown template ID or SKU rejects the whole call
with 400 before anything is written.

Requires the `clientSkuTemplates.update` permission on the token's user; without it the
request returns 403 and nothing changes.




## OpenAPI

````yaml /api-reference/build.yaml post /b2b-product-templates/bulk-items
openapi: 3.0.0
info:
  title: Luminous API
  version: 1.0.0
  description: API documentation for Luminous
servers:
  - url: https://{companyName}.api.joinluminous.com/external/api/v1
    variables:
      companyName:
        default: companyName
        description: Your company-specific subdomain
security: []
tags:
  - name: Products
    description: Get and manage products
  - name: Pricing
    description: Manage price schedules, levels, and customizations
  - name: BOMs
    description: Manage Bills of Materials (BOMs)
  - name: Labels
    description: Label rendering via Labelary ZPL service
  - name: Companies
    description: Manage business accounts and their associated data
  - name: Contacts
    description: Manage contact information for individuals
  - name: Suppliers
    description: Manage suppliers (factories) — vendors used on purchase orders
  - name: Supplier SKUs
    description: Manage per-supplier SKU and unit-cost overrides for products
  - name: Locations
    description: Manage warehouses and locations
  - name: Inventory
    description: Get and adjust product stock levels
  - name: Lots
    description: Create, update, and delete product lots (batches)
  - name: Transfer Orders
    description: Manage transfer orders
  - name: Fulfillment Orders
    description: Manage fulfillment orders and picklists
  - name: Freight
    description: >-
      Freightview LTL freight — quotes, booking and documents for fulfillment
      orders
  - name: Fulfillment Priority Lists
    description: Configure fulfillment routing priority lists
  - name: Purchase Orders
    description: Get and modify purchase orders
  - name: Supplier Portal
    description: >-
      Read a supplier's response to a purchase order and control the one-click
      portal link
  - name: Receiving Reports
    description: Manage receiving reports
  - name: Payment Obligations
    description: Manage payment obligations for purchase orders
  - name: Sales Orders
    description: Manage sales orders and sales order shipments
  - name: Purgatory
    description: >-
      Inspect and resolve non-posted sales orders in the purgatory staging
      workflow
  - name: PickFlow Warehouse
    description: >-
      Warehouse-floor lookups for PickFlow — barcode resolution, bin and product
      stock, bin search, and receivables
  - name: PickFlow Shipping
    description: >-
      Provider-agnostic shipping rates, services, packages, and label purchase
      for PickFlow
  - name: Cycle Counts
    description: >-
      Create, drive, and post PickFlow cycle counts — batches, per-warehouse
      sessions, and CSV import/export
  - name: Print Stations
    description: List paired print stations and enqueue print jobs to them
  - name: Invoices
    description: Get and manage invoices
  - name: Work Orders
    description: >-
      Manage work orders — production lifecycle, steps, materials, links,
      shipments, and comments
  - name: Production Batches
    description: Group and manage work orders as production batches
  - name: Bills
    description: >-
      Accounts payable bill management, payments, attachments, allocations, and
      variance
  - name: Prepayments
    description: Manage vendor prepayments and applications
  - name: Vendor Credits
    description: Manage vendor credits and applications
  - name: Vendor Returns
    description: Manage vendor returns and credit generation
  - name: Customer Returns
    description: Manage customer returns (sales returns), receiving, and restock behavior
  - name: Stock Snapshot
    description: Point-in-time stock snapshots with export support
  - name: Consumption
    description: Consumption reports and exports
  - name: Inventory Aging
    description: Cost-layer-based inventory aging reports
  - name: Bills Reports
    description: Accounts payable bills aging reports
  - name: Forecast
    description: Materialized forecast data
  - name: Reports
    description: Close the books, inventory discrepancy, transaction COGS, and EDI reports
  - name: Tags
    description: Add/remove tags across various resources
  - name: Custom Fields
    description: Get and set custom fields across various resources
  - name: Currency
    description: Currency configuration, exchange rates, and conversion
  - name: Drive
    description: >
      Browse, upload, tag and manage files in your Luminous Drive. An API token
      sees the shared

      drive only, never My Files or restricted folders and files. Every write
      and download made

      through the API is recorded in the file's activity log (`GET
      /file-cabinet/files/{id}/activity`)

      with `actor_kind: api_token`.
  - name: Integration Mappings
    description: Manage integration mappings for external systems
  - name: Integration Field Mappings
    description: Manage field-level mappings between Luminous and external systems
  - name: Automations
    description: Create, test, and inspect automation rules and their runs
paths:
  /b2b-product-templates/bulk-items:
    post:
      tags:
        - Products
      summary: Add or remove SKUs across B2B product templates
      description: >
        Add or remove SKUs on many B2B Product Templates in one call.


        **Choosing templates:** send explicit `template_ids`, or `all_templates:
        true`.

        `exclude_template_ids` always wins, so "every template except the
        private-label ones" is

        `all_templates: true` plus the private-label IDs from `GET
        /b2b-product-templates`.


        **Choosing SKUs:** send product IDs in `sku_ids`, internal SKU strings
        in `skus`, or both.

        Deleted SKUs count as unknown. On `add`, SKUs the template editor would
        not offer

        (not a SKU product type, a variant child, or discontinued) are left out
        and listed in

        `skipped_sku_ids`.


        **Safe to retry:** an add skips SKUs a template already holds
        (`already_present`), and a

        remove skips SKUs it does not hold. An unknown template ID or SKU
        rejects the whole call

        with 400 before anything is written.


        Requires the `clientSkuTemplates.update` permission on the token's user;
        without it the

        request returns 403 and nothing changes.
      operationId: bulkUpdateB2bProductTemplateItems
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              required:
                - action
              properties:
                action:
                  type: string
                  enum:
                    - add
                    - remove
                  description: Whether to add or remove the SKUs (case-insensitive)
                template_ids:
                  type: array
                  maxItems: 1000
                  items:
                    type: integer
                  description: >-
                    Template IDs to change (distinct, must exist). Required
                    unless `all_templates` is true.
                exclude_template_ids:
                  type: array
                  items:
                    type: integer
                  description: >-
                    Template IDs to leave untouched. Always wins over
                    `template_ids` and `all_templates`.
                all_templates:
                  type: boolean
                  default: false
                  description: Apply to every template (minus `exclude_template_ids`)
                sku_ids:
                  type: array
                  maxItems: 1000
                  items:
                    type: integer
                  description: >-
                    Product IDs (distinct, must exist and not be deleted). At
                    least one of `sku_ids` or `skus` is required.
                skus:
                  type: array
                  maxItems: 1000
                  items:
                    type: string
                  description: >-
                    Internal SKU strings (distinct, must exist and not be
                    deleted). At least one of `sku_ids` or `skus` is required.
            example:
              action: add
              all_templates: true
              exclude_template_ids:
                - 12
                - 15
              skus:
                - COLD-BREW-32OZ
      responses:
        '200':
          description: One result per template that was considered
          content:
            application/json:
              schema:
                type: object
                properties:
                  data:
                    type: object
                    properties:
                      action:
                        type: string
                        enum:
                          - add
                          - remove
                      sku_count:
                        type: integer
                        description: >-
                          SKUs the call acted on, after skipped ones are left
                          out
                      skipped_sku_ids:
                        type: array
                        items:
                          type: integer
                        description: >-
                          On add, SKU IDs left out because the template editor
                          would not offer them (not a SKU product type, a
                          variant child, or discontinued). Always empty on
                          remove.
                      templates_changed:
                        type: integer
                      templates_unchanged:
                        type: integer
                      results:
                        type: array
                        items:
                          type: object
                          properties:
                            id:
                              type: integer
                              description: Template ID
                            name:
                              type: string
                            added:
                              type: integer
                            already_present:
                              type: integer
                            removed:
                              type: integer
                            changed:
                              type: boolean
        '400':
          description: >-
            Validation failed (unknown template ID or SKU, no SKUs, no templates
            chosen). Nothing was changed.
          content:
            application/json:
              schema:
                type: object
                properties:
                  message:
                    type: string
        '401':
          description: Unauthorized
          content:
            application/json:
              schema:
                type: object
                properties:
                  message:
                    type: string
        '403':
          description: >-
            The token's user lacks the `clientSkuTemplates.update` permission.
            Nothing was changed.
          content:
            application/json:
              schema:
                type: object
                properties:
                  message:
                    type: string
      security:
        - BearerAuth: []
components:
  securitySchemes:
    BearerAuth:
      type: http
      scheme: bearer
      description: >-
        Authenticate using a bearer token. To create a token, navigate to
        /settings/api-tokens and click Create API Token.

````

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