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

# Create or replace a transfer route

> Create or replace the route for a warehouse pair, keyed by `source_warehouse_id` →
`destination_warehouse_id`. Idempotent: applying the same body twice changes nothing, so this is
the call to use for configuration. `PATCH /transfer-routes` (on the collection) behaves the same.

Returns `201` when the route was created and `200` when an existing one was replaced. Omitting
`channel_id` clears the channel.

Refused with `422` when the source and destination are the same warehouse, or when an
`automated` source is combined with a channel that pushes orders to a 3PL (the 3PL ships those
transfers, so it would never auto-ship).




## OpenAPI

````yaml /api-reference/build.yaml put /transfer-routes
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:
  /transfer-routes:
    put:
      tags:
        - Transfer Orders
      summary: Create or replace a transfer route
      description: >
        Create or replace the route for a warehouse pair, keyed by
        `source_warehouse_id` →

        `destination_warehouse_id`. Idempotent: applying the same body twice
        changes nothing, so this is

        the call to use for configuration. `PATCH /transfer-routes` (on the
        collection) behaves the same.


        Returns `201` when the route was created and `200` when an existing one
        was replaced. Omitting

        `channel_id` clears the channel.


        Refused with `422` when the source and destination are the same
        warehouse, or when an

        `automated` source is combined with a channel that pushes orders to a
        3PL (the 3PL ships those

        transfers, so it would never auto-ship).
      operationId: upsertTransferRoute
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              required:
                - source_warehouse_id
                - destination_warehouse_id
                - source_mode
                - destination_mode
              properties:
                source_warehouse_id:
                  type: integer
                  description: Active warehouse (location) the transfer ships from
                  example: 22
                destination_warehouse_id:
                  type: integer
                  description: >-
                    Active warehouse (location) the transfer ships to; must
                    differ from the source
                  example: 2
                source_mode:
                  type: string
                  enum:
                    - worked
                    - automated
                  example: automated
                destination_mode:
                  type: string
                  enum:
                    - worked
                    - automated
                  example: worked
                channel_id:
                  type: integer
                  nullable: true
                  description: >-
                    Existing channel used to fulfill the source side. Omit or
                    send `null` to clear it.
                  example: null
      responses:
        '200':
          description: Existing route replaced
          content:
            application/json:
              schema:
                type: object
                properties:
                  data:
                    type: object
                    properties:
                      id:
                        type: integer
                        example: 1
                      source_warehouse:
                        type: object
                        properties:
                          id:
                            type: integer
                            example: 22
                          name:
                            type: string
                            nullable: true
                            example: LA Warehouse
                      destination_warehouse:
                        type: object
                        properties:
                          id:
                            type: integer
                            example: 2
                          name:
                            type: string
                            nullable: true
                            example: Milwaukee Warehouse
                      source_mode:
                        type: string
                        enum:
                          - worked
                          - automated
                        description: >
                          `worked`: an FO is generated and picked/packed here or
                          pushed to the 3PL/WMS.

                          `automated`: the transfer's sales order is marked
                          shipped automatically on the order date.
                      destination_mode:
                        type: string
                        enum:
                          - worked
                          - automated
                        description: >
                          `worked`: the transfer PO is received by receiving
                          report, the mobile app or WMS inbound receipts.

                          `automated`: the transfer is received automatically on
                          the arrival date.
                      channel:
                        type: object
                        nullable: true
                        description: >-
                          Optional fulfillment channel for the source side, or
                          `null`
                        properties:
                          id:
                            type: integer
                          label:
                            type: string
                            nullable: true
                      transfer_order_defaults:
                        type: object
                        readOnly: true
                        description: >
                          What a new transfer order between this pair starts
                          with (the transfer-order fields the route

                          pre-fills). If the channel pushes orders to a 3PL,
                          `auto_mark_so_as_shipped` is `false` even

                          for an automated source, because the 3PL ships those
                          transfers.
                        properties:
                          auto_mark_so_as_shipped:
                            type: boolean
                          auto_ship_on_order_date:
                            type: boolean
                          auto_receive_order_on_arrival:
                            type: boolean
                          channel_id:
                            type: integer
                            nullable: true
                      created_at:
                        type: string
                        format: date-time
                      updated_at:
                        type: string
                        format: date-time
        '201':
          description: Route created
          content:
            application/json:
              schema:
                type: object
                properties:
                  data:
                    type: object
                    properties:
                      id:
                        type: integer
                        example: 1
                      source_warehouse:
                        type: object
                        properties:
                          id:
                            type: integer
                            example: 22
                          name:
                            type: string
                            nullable: true
                            example: LA Warehouse
                      destination_warehouse:
                        type: object
                        properties:
                          id:
                            type: integer
                            example: 2
                          name:
                            type: string
                            nullable: true
                            example: Milwaukee Warehouse
                      source_mode:
                        type: string
                        enum:
                          - worked
                          - automated
                        description: >
                          `worked`: an FO is generated and picked/packed here or
                          pushed to the 3PL/WMS.

                          `automated`: the transfer's sales order is marked
                          shipped automatically on the order date.
                      destination_mode:
                        type: string
                        enum:
                          - worked
                          - automated
                        description: >
                          `worked`: the transfer PO is received by receiving
                          report, the mobile app or WMS inbound receipts.

                          `automated`: the transfer is received automatically on
                          the arrival date.
                      channel:
                        type: object
                        nullable: true
                        description: >-
                          Optional fulfillment channel for the source side, or
                          `null`
                        properties:
                          id:
                            type: integer
                          label:
                            type: string
                            nullable: true
                      transfer_order_defaults:
                        type: object
                        readOnly: true
                        description: >
                          What a new transfer order between this pair starts
                          with (the transfer-order fields the route

                          pre-fills). If the channel pushes orders to a 3PL,
                          `auto_mark_so_as_shipped` is `false` even

                          for an automated source, because the 3PL ships those
                          transfers.
                        properties:
                          auto_mark_so_as_shipped:
                            type: boolean
                          auto_ship_on_order_date:
                            type: boolean
                          auto_receive_order_on_arrival:
                            type: boolean
                          channel_id:
                            type: integer
                            nullable: true
                      created_at:
                        type: string
                        format: date-time
                      updated_at:
                        type: string
                        format: date-time
        '401':
          description: Unauthorized
          content:
            application/json:
              schema:
                type: object
                properties:
                  message:
                    type: string
        '422':
          description: >
            Validation failed: missing/invalid field, inactive or unknown
            warehouse, same source and

            destination ("The source and destination warehouses must be
            different."), or an automated

            source on a 3PL-pushing channel ("This channel pushes orders to a
            fulfillment partner, which

            ships the transfer itself. Set the source to worked.")
          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.

````

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