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

# Export products (cursor pagination)

> Bulk-export active products (`status = 1`) using cursor-based keyset
pagination. Designed for bulk catalog syncs and pipelines.

Each run is anchored to a **fixed cutoff time** (set on the first request),
so pages are stable even if records are updated mid-run. Order is ascending
by `(updated_at, id)`.

## Pagination

| Parameter | Description |
|-----------|-------------|
| `since`   | Lower bound for `updated_at` (inclusive). Required on the **first** page. ISO 8601 date or datetime, UTC recommended. |
| `cursor`  | Opaque token from `next_cursor` on the previous response. Required on **follow-up** pages. Do not send with `since`. |
| `limit`   | Max records per page. Default `100`, maximum `1000`. |

## Example flow

```
# 1. Start a run
GET /products/export?since=1970-01-01T00:00:00Z&limit=1000

# 2. Continue while has_more is true
GET /products/export?cursor=<next_cursor>

# 3. Stop when has_more is false
```

## Notes

- The cursor is cryptographically signed; do not modify it.
- Nested data omitted for performance: full BOM line items, variant SKU
  rows, attachments, substitutions, priority list, alternate-SKU unit
  conversion rule expansion. Use `GET /products/{id}` for full detail.
- Some deployments rewrite to `index.php?q=$uri&$args`; the server ignores
  the `q` query parameter during validation.




## OpenAPI

````yaml /api-reference/build.yaml get /products/export
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: Purchase Orders
    description: Get and modify purchase orders
  - 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 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: Integration Mappings
    description: Manage integration mappings for external systems
  - name: Integration Field Mappings
    description: Manage field-level mappings between Luminous and external systems
paths:
  /products/export:
    get:
      tags:
        - Products
      summary: Export products (cursor pagination)
      description: >
        Bulk-export active products (`status = 1`) using cursor-based keyset

        pagination. Designed for bulk catalog syncs and pipelines.


        Each run is anchored to a **fixed cutoff time** (set on the first
        request),

        so pages are stable even if records are updated mid-run. Order is
        ascending

        by `(updated_at, id)`.


        ## Pagination


        | Parameter | Description |

        |-----------|-------------|

        | `since`   | Lower bound for `updated_at` (inclusive). Required on the
        **first** page. ISO 8601 date or datetime, UTC recommended. |

        | `cursor`  | Opaque token from `next_cursor` on the previous response.
        Required on **follow-up** pages. Do not send with `since`. |

        | `limit`   | Max records per page. Default `100`, maximum `1000`. |


        ## Example flow


        ```

        # 1. Start a run

        GET /products/export?since=1970-01-01T00:00:00Z&limit=1000


        # 2. Continue while has_more is true

        GET /products/export?cursor=<next_cursor>


        # 3. Stop when has_more is false

        ```


        ## Notes


        - The cursor is cryptographically signed; do not modify it.

        - Nested data omitted for performance: full BOM line items, variant SKU
          rows, attachments, substitutions, priority list, alternate-SKU unit
          conversion rule expansion. Use `GET /products/{id}` for full detail.
        - Some deployments rewrite to `index.php?q=$uri&$args`; the server
        ignores
          the `q` query parameter during validation.
      operationId: exportProducts
      parameters:
        - in: query
          name: since
          schema:
            type: string
            format: date-time
            example: '1970-01-01T00:00:00Z'
          description: >
            Lower bound for `updated_at` (inclusive). Required on the **first**
            page;

            omit when using `cursor`.
        - in: query
          name: cursor
          schema:
            type: string
            example: eyJ2IjoxLCJtb2RlIjoiZXhwb3J0In0.abc123
          description: |
            Signed continuation token from a previous response's `next_cursor`.
            Required on **follow-up** pages; cannot be combined with `since`.
        - in: query
          name: limit
          schema:
            type: integer
            minimum: 1
            maximum: 1000
            default: 100
          description: Maximum number of products to return per page.
      responses:
        '200':
          description: Successful export page
          content:
            application/json:
              schema:
                type: object
                required:
                  - data
                  - next_cursor
                  - has_more
                  - meta
                properties:
                  data:
                    type: array
                    items:
                      type: object
                      description: >
                        One product row from the bulk export. Shares core fields
                        with the list/detail

                        product resource but omits expensive nested data (full
                        BOM line items, variant

                        SKU rows, attachments, substitutions, priority list,
                        alternate-SKU unit

                        conversion rule expansion). Use `GET /products/{id}` for
                        full detail.
                      properties:
                        id:
                          type: integer
                        name:
                          type: string
                        description:
                          type: string
                          nullable: true
                        retail_price:
                          type: number
                          format: float
                        wholesale_price:
                          type: number
                          format: float
                        unit_cost:
                          type: number
                          format: float
                          description: From the base weighted price column; `0` when unset.
                        landed_cost:
                          type: number
                          format: float
                          nullable: true
                          description: >-
                            Weighted landed cost across remaining cost layers.
                            `null` when no positive-cost layer exists.
                        product_length:
                          type: number
                          format: float
                          nullable: true
                        product_width:
                          type: number
                          format: float
                          nullable: true
                        product_height:
                          type: number
                          format: float
                          nullable: true
                        box_length:
                          type: number
                          format: float
                          nullable: true
                        box_width:
                          type: number
                          format: float
                          nullable: true
                        box_height:
                          type: number
                          format: float
                          nullable: true
                        carton_length:
                          type: number
                          format: float
                          nullable: true
                        carton_width:
                          type: number
                          format: float
                          nullable: true
                        carton_height:
                          type: number
                          format: float
                          nullable: true
                        shipping_length:
                          type: number
                          format: float
                          nullable: true
                        shipping_width:
                          type: number
                          format: float
                          nullable: true
                        shipping_height:
                          type: number
                          format: float
                          nullable: true
                        pallet_length:
                          type: number
                          format: float
                          nullable: true
                        pallet_width:
                          type: number
                          format: float
                          nullable: true
                        pallet_height:
                          type: number
                          format: float
                          nullable: true
                        product_weight:
                          nullable: true
                          description: >
                            API weight format: `null`, a single `{unit, value}`
                            object, or an array of

                            segments. `unit` is typically `lb`, `lbs`, or `oz`.
                          oneOf:
                            - type: object
                              required:
                                - unit
                                - value
                              properties:
                                unit:
                                  type: string
                                  enum:
                                    - lb
                                    - oz
                                    - lbs
                                value:
                                  type: number
                                  format: float
                            - type: array
                              items:
                                type: object
                                required:
                                  - unit
                                  - value
                                properties:
                                  unit:
                                    type: string
                                    enum:
                                      - lb
                                      - oz
                                      - lbs
                                  value:
                                    type: number
                                    format: float
                        product_weight_oz:
                          type: number
                          format: float
                          nullable: true
                        product_weight_lb:
                          type: number
                          format: float
                          nullable: true
                        box_weight:
                          nullable: true
                          description: >
                            API weight format: `null`, a single `{unit, value}`
                            object, or an array of

                            segments. `unit` is typically `lb`, `lbs`, or `oz`.
                          oneOf:
                            - type: object
                              required:
                                - unit
                                - value
                              properties:
                                unit:
                                  type: string
                                  enum:
                                    - lb
                                    - oz
                                    - lbs
                                value:
                                  type: number
                                  format: float
                            - type: array
                              items:
                                type: object
                                required:
                                  - unit
                                  - value
                                properties:
                                  unit:
                                    type: string
                                    enum:
                                      - lb
                                      - oz
                                      - lbs
                                  value:
                                    type: number
                                    format: float
                        box_weight_oz:
                          type: number
                          format: float
                          nullable: true
                        box_weight_lb:
                          type: number
                          format: float
                          nullable: true
                        carton_weight:
                          nullable: true
                          description: >
                            API weight format: `null`, a single `{unit, value}`
                            object, or an array of

                            segments. `unit` is typically `lb`, `lbs`, or `oz`.
                          oneOf:
                            - type: object
                              required:
                                - unit
                                - value
                              properties:
                                unit:
                                  type: string
                                  enum:
                                    - lb
                                    - oz
                                    - lbs
                                value:
                                  type: number
                                  format: float
                            - type: array
                              items:
                                type: object
                                required:
                                  - unit
                                  - value
                                properties:
                                  unit:
                                    type: string
                                    enum:
                                      - lb
                                      - oz
                                      - lbs
                                  value:
                                    type: number
                                    format: float
                        carton_weight_oz:
                          type: number
                          format: float
                          nullable: true
                        carton_weight_lb:
                          type: number
                          format: float
                          nullable: true
                        shipping_weight:
                          nullable: true
                          description: >
                            API weight format: `null`, a single `{unit, value}`
                            object, or an array of

                            segments. `unit` is typically `lb`, `lbs`, or `oz`.
                          oneOf:
                            - type: object
                              required:
                                - unit
                                - value
                              properties:
                                unit:
                                  type: string
                                  enum:
                                    - lb
                                    - oz
                                    - lbs
                                value:
                                  type: number
                                  format: float
                            - type: array
                              items:
                                type: object
                                required:
                                  - unit
                                  - value
                                properties:
                                  unit:
                                    type: string
                                    enum:
                                      - lb
                                      - oz
                                      - lbs
                                  value:
                                    type: number
                                    format: float
                        shipping_weight_oz:
                          type: number
                          format: float
                          nullable: true
                        shipping_weight_lb:
                          type: number
                          format: float
                          nullable: true
                        pallet_weight:
                          nullable: true
                          description: >
                            API weight format: `null`, a single `{unit, value}`
                            object, or an array of

                            segments. `unit` is typically `lb`, `lbs`, or `oz`.
                          oneOf:
                            - type: object
                              required:
                                - unit
                                - value
                              properties:
                                unit:
                                  type: string
                                  enum:
                                    - lb
                                    - oz
                                    - lbs
                                value:
                                  type: number
                                  format: float
                            - type: array
                              items:
                                type: object
                                required:
                                  - unit
                                  - value
                                properties:
                                  unit:
                                    type: string
                                    enum:
                                      - lb
                                      - oz
                                      - lbs
                                  value:
                                    type: number
                                    format: float
                        pallet_weight_oz:
                          type: number
                          format: float
                          nullable: true
                        pallet_weight_lb:
                          type: number
                          format: float
                          nullable: true
                        dimensional_weight:
                          nullable: true
                          description: >
                            API weight format: `null`, a single `{unit, value}`
                            object, or an array of

                            segments. `unit` is typically `lb`, `lbs`, or `oz`.
                          oneOf:
                            - type: object
                              required:
                                - unit
                                - value
                              properties:
                                unit:
                                  type: string
                                  enum:
                                    - lb
                                    - oz
                                    - lbs
                                value:
                                  type: number
                                  format: float
                            - type: array
                              items:
                                type: object
                                required:
                                  - unit
                                  - value
                                properties:
                                  unit:
                                    type: string
                                    enum:
                                      - lb
                                      - oz
                                      - lbs
                                  value:
                                    type: number
                                    format: float
                        dimensional_weight_oz:
                          type: number
                          format: float
                          nullable: true
                        dimensional_weight_lb:
                          type: number
                          format: float
                          nullable: true
                        qty_low_alert:
                          type: integer
                        qty_reorder_threshold:
                          type: integer
                        qty_minimum:
                          type: integer
                        sellable:
                          type: boolean
                        discontinued:
                          type: boolean
                        image_url:
                          type: string
                          nullable: true
                        category:
                          type: object
                          nullable: true
                          properties:
                            id:
                              type: integer
                            name:
                              type: string
                          required:
                            - id
                            - name
                        subcategory:
                          type: object
                          nullable: true
                          properties:
                            id:
                              type: integer
                            name:
                              type: string
                          required:
                            - id
                            - name
                        custom_fields:
                          type: object
                          description: Keyed by custom field label; empty object when none.
                          additionalProperties: true
                        variant_attributes:
                          description: >-
                            Decoded `product_variants` JSON; shape varies
                            (object, array, or null).
                          nullable: true
                        sku:
                          type: string
                          description: Internal (master) SKU.
                        alternate_skus:
                          type: array
                          items:
                            type: object
                            required:
                              - id
                              - sku
                              - unit_conversion_rule_id
                            properties:
                              id:
                                type: integer
                              sku:
                                type: string
                              unit_conversion_rule_id:
                                type: integer
                                nullable: true
                                description: >-
                                  ID only; the rule object is not expanded in
                                  export rows.
                        upc:
                          type: string
                          nullable: true
                        tags:
                          type: array
                          items:
                            type: object
                            required:
                              - id
                              - name
                              - description
                              - icon
                              - color
                            properties:
                              id:
                                type: integer
                              name:
                                type: string
                              description:
                                type: string
                                nullable: true
                              icon:
                                type: string
                                nullable: true
                              color:
                                type: string
                                nullable: true
                        supplier:
                          type: object
                          nullable: true
                          description: Preferred supplier (factory) when set.
                          properties:
                            id:
                              type: integer
                            status:
                              type: integer
                              nullable: true
                            name:
                              type: string
                            description:
                              type: string
                              nullable: true
                            street_address:
                              type: string
                              nullable: true
                            city:
                              type: string
                              nullable: true
                            state:
                              type: string
                              nullable: true
                            zip:
                              type: string
                              nullable: true
                            country:
                              type: string
                              nullable: true
                            supplier_admin_id:
                              type: integer
                              nullable: true
                            contact_name:
                              type: string
                              nullable: true
                            contact_email:
                              type: string
                              nullable: true
                            contact_phone:
                              type: string
                              nullable: true
                            created_by:
                              type: string
                              nullable: true
                            created_at:
                              type: string
                              format: date-time
                              nullable: true
                            updated_by:
                              type: string
                              nullable: true
                            updated_at:
                              type: string
                              format: date-time
                              nullable: true
                        substitutions:
                          type: array
                          description: >-
                            Always empty in export; use `GET /products/{id}` for
                            substitutions.
                          items:
                            type: object
                        boms:
                          type: array
                          description: >-
                            Shallow BOM assignments only (IDs). Use `GET
                            /boms/{bomId}` for full detail.
                          items:
                            type: object
                            required:
                              - id
                            properties:
                              id:
                                type: integer
                        type:
                          type: string
                          description: '`PRODUCT` or `KIT` (and other RFQ types if present).'
                          example: PRODUCT
                        kit_items:
                          type: array
                          description: Populated when `type` is `KIT`; otherwise empty.
                          items:
                            type: object
                            required:
                              - id
                              - product_id
                              - quantity
                              - uom_id
                              - base_uom_quantity
                              - price
                              - original_price
                              - total
                            properties:
                              id:
                                type: integer
                              product_id:
                                type: integer
                              quantity:
                                type: number
                                format: float
                              uom_id:
                                type: integer
                              base_uom_quantity:
                                type: number
                                format: float
                              price:
                                type: number
                                format: float
                              original_price:
                                type: number
                                format: float
                              total:
                                type: number
                                format: float
                                description: '`quantity × price`'
                        created_at:
                          type: string
                          format: date-time
                          nullable: true
                        updated_at:
                          type: string
                          format: date-time
                          nullable: true
                      required:
                        - id
                        - name
                        - description
                        - retail_price
                        - wholesale_price
                        - unit_cost
                        - sku
                        - upc
                        - sellable
                        - discontinued
                        - alternate_skus
                        - tags
                        - custom_fields
                        - substitutions
                        - boms
                        - type
                        - kit_items
                        - created_at
                        - updated_at
                  next_cursor:
                    type: string
                    nullable: true
                    description: >-
                      Signed cursor token to fetch the next page. `null` when
                      the export is complete.
                    example: eyJ2IjoxLCJtb2RlIjoiZXhwb3J0In0.abc123
                  has_more:
                    type: boolean
                    description: >-
                      `true` when the page is full (`data.length === limit`),
                      indicating more rows may exist.
                  meta:
                    type: object
                    required:
                      - rows
                    properties:
                      rows:
                        type: integer
                        minimum: 0
                        description: Number of items in `data` for this response.
        '400':
          description: Invalid or malformed cursor
          content:
            application/json:
              schema:
                type: object
                properties:
                  message:
                    type: string
                  error:
                    type: string
                    example: invalid_cursor
        '401':
          description: Authentication credentials were missing or invalid
          content:
            application/json:
              schema:
                type: object
                properties:
                  error:
                    type: string
                    example: Unauthorized
                  message:
                    type: string
                    example: Authentication credentials are missing or invalid
                  status_code:
                    type: integer
                    example: 401
        '422':
          description: Validation error
          content:
            application/json:
              schema:
                type: object
                properties:
                  message:
                    type: string
                  errors:
                    type: object
                    additionalProperties:
                      type: array
                      items:
                        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.

````