> ## 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 an extra cost

> Add one assembly cost line to a draft, planned or in-progress work order. Other lines are unchanged.

- **Lines are per unit produced.** `quantity` is multiplied by the quantity produced at completion.
- **A line reaches only assembly orders created after it is added.** An assembly order that already
  exists keeps the lines it had, so add lines before quick-complete or before completing a step.
- **Line limit:** `quantity × unit_price` may not exceed 99,999,999.99; larger lines return `422`
  (split them). The same limit applies at completion to each line multiplied by the quantity
  produced: a completion over it is refused with `422` and that step posts nothing.
- Completed and cancelled work orders return `422` and nothing changes. Writes also return `422`
  when the cost rules feature is not enabled on the account.
- The COGS tab in the app saves all its lines at once, so a save from a tab opened earlier can
  overwrite a line added here in the meantime.
- Document charges (the Charges tab) are not covered; they never reach cost.

## Retries and idempotency
Accepts an optional `Idempotency-Key` header. Send one so a retry can't add the cost twice: a
retry with the same key and body replays the first response (with an `Idempotent-Replay: true`
header); the same key with a different body returns `409`. Keys are kept for 24 hours and are
scoped to your API token.




## OpenAPI

````yaml /api-reference/build.yaml post /work-orders/{workOrderId}/extra-costs
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:
  /work-orders/{workOrderId}/extra-costs:
    post:
      tags:
        - Work Orders
      summary: Add an extra cost
      description: >
        Add one assembly cost line to a draft, planned or in-progress work
        order. Other lines are unchanged.


        - **Lines are per unit produced.** `quantity` is multiplied by the
        quantity produced at completion.

        - **A line reaches only assembly orders created after it is added.** An
        assembly order that already
          exists keeps the lines it had, so add lines before quick-complete or before completing a step.
        - **Line limit:** `quantity × unit_price` may not exceed 99,999,999.99;
        larger lines return `422`
          (split them). The same limit applies at completion to each line multiplied by the quantity
          produced: a completion over it is refused with `422` and that step posts nothing.
        - Completed and cancelled work orders return `422` and nothing changes.
        Writes also return `422`
          when the cost rules feature is not enabled on the account.
        - The COGS tab in the app saves all its lines at once, so a save from a
        tab opened earlier can
          overwrite a line added here in the meantime.
        - Document charges (the Charges tab) are not covered; they never reach
        cost.


        ## Retries and idempotency

        Accepts an optional `Idempotency-Key` header. Send one so a retry can't
        add the cost twice: a

        retry with the same key and body replays the first response (with an
        `Idempotent-Replay: true`

        header); the same key with a different body returns `409`. Keys are kept
        for 24 hours and are

        scoped to your API token.
      operationId: addWorkOrderExtraCost
      parameters:
        - in: path
          name: workOrderId
          required: true
          description: ID of the work order.
          schema:
            type: integer
        - in: header
          name: Idempotency-Key
          required: false
          schema:
            type: string
          description: >
            Optional idempotency token. A retry with the same key and body
            replays the original stored

            response instead of adding a second line. Reusing the key with a
            different body returns `409`.
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              required:
                - name
                - quantity
                - unit_price
              properties:
                name:
                  type: string
                  maxLength: 255
                  description: Name/description of the cost.
                  example: Plating
                quantity:
                  type: number
                  minimum: 0
                  maximum: 1000000000000
                  description: Quantity **per unit produced**, up to 6 decimal places.
                  example: 2
                unit_price:
                  type: number
                  minimum: 0
                  maximum: 99999999.99
                  description: >-
                    Unit price, up to 2 decimal places. `quantity × unit_price`
                    may not exceed 99,999,999.99.
                  example: 50
      responses:
        '201':
          description: Extra cost line added
          content:
            application/json:
              schema:
                type: object
                properties:
                  data:
                    type: object
                    properties:
                      id:
                        type: integer
                        description: Unique identifier for the extra cost line
                      name:
                        type: string
                        description: Name/description of the cost
                      quantity:
                        type: number
                        format: float
                        description: >-
                          Quantity **per unit produced**. Multiplied by the
                          quantity produced when the cost reaches the finished
                          item.
                      unit_price:
                        type: number
                        format: float
                        description: Unit price for this cost
                      line_total:
                        type: number
                        format: float
                        description: >-
                          quantity × unit_price, the cost for **one** unit
                          produced. Read-only.
                      source:
                        type: string
                        nullable: true
                        description: >
                          Where the line came from. `work_order` (or `null`)
                          lines were added on the work order and

                          can be changed or removed. Any other value (for
                          example `rule`, a line created by a cost rule) is
                          read-only here.
                      created_at:
                        type: string
                        format: date-time
                        description: Timestamp when the line was created
                      updated_at:
                        type: string
                        format: date-time
                        description: Timestamp when the line was last updated
                    required:
                      - id
                      - name
                      - quantity
                      - unit_price
                      - line_total
        '401':
          description: Unauthorized
          content:
            application/json:
              schema:
                type: object
                properties:
                  message:
                    type: string
        '404':
          description: Work order not found
          content:
            application/json:
              schema:
                type: object
                properties:
                  message:
                    type: string
        '409':
          description: >-
            Idempotency conflict (key in flight, or reused with a different
            body).
          content:
            application/json:
              schema:
                type: object
                properties:
                  message:
                    type: string
        '422':
          description: >
            Validation error, the work order is completed or cancelled, the line
            total exceeds

            99,999,999.99 (`That comes to more than we can record on one line.
            Please split it.`), or

            the cost rules feature is not enabled.
          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.