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

# Test shipping rules against an order

> Evaluate shipping rules against one fulfillment order and explain the result: the order's
facts, each rule's per-condition result and whether it matched, and the label refusal (if any)
for a given service at a given time.

Identify the order with `fulfillment_order_id` or `order_number` (an order number or scan,
resolved like the label panel's lookup). Pass `rules` to test a draft list — it is validated
first (`422` as for `PUT /shipping-rules`) and never saved. When `rules` is omitted, the saved
rules are used.

Available to every account. When per-user permissions are enabled, the token's owner needs the `fulfillmentSettings.read` permission (the same as the Operations Admin pages); otherwise `403`.




## OpenAPI

````yaml /api-reference/build.yaml post /shipping-rules/test
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:
  /shipping-rules/test:
    post:
      tags:
        - Shipping Rules
      summary: Test shipping rules against an order
      description: >
        Evaluate shipping rules against one fulfillment order and explain the
        result: the order's

        facts, each rule's per-condition result and whether it matched, and the
        label refusal (if any)

        for a given service at a given time.


        Identify the order with `fulfillment_order_id` or `order_number` (an
        order number or scan,

        resolved like the label panel's lookup). Pass `rules` to test a draft
        list — it is validated

        first (`422` as for `PUT /shipping-rules`) and never saved. When `rules`
        is omitted, the saved

        rules are used.


        Available to every account. When per-user permissions are enabled, the
        token's owner needs the `fulfillmentSettings.read` permission (the same
        as the Operations Admin pages); otherwise `403`.
      operationId: testShippingRules
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                fulfillment_order_id:
                  type: integer
                  nullable: true
                  description: Required unless `order_number` is given.
                order_number:
                  type: string
                  maxLength: 100
                  nullable: true
                  description: Required unless `fulfillment_order_id` is given.
                rules:
                  type: array
                  nullable: true
                  description: >-
                    A draft rule list to test instead of the saved rules. Never
                    saved.
                  items:
                    type: object
                    required:
                      - name
                    properties:
                      name:
                        type: string
                        description: >-
                          Unique rule name. Shown in label refusals and on
                          rates.
                        example: Perishables West → FedEx 2Day
                      when:
                        type: object
                        description: >
                          Conditions. All conditions that are set must hold for
                          the rule to apply. Empty lists and

                          `null` mean "no condition"; a rule with no conditions
                          matches every order.
                        properties:
                          packingClasses:
                            type: array
                            items:
                              type: string
                              enum:
                                - ambient
                                - perishable_dry_ice
                                - flour
                                - fragile
                                - bulk
                                - liquid
                            description: >-
                              Any line on the order has one of these packing
                              classes.
                          states:
                            type: array
                            items:
                              type: string
                            description: >-
                              Ship-to state or province code (e.g. `CA`, `AK`,
                              `AA`).
                          countries:
                            type: array
                            items:
                              type: string
                            description: Ship-to country, two-letter ISO code.
                          poBox:
                            type: boolean
                            nullable: true
                            description: >-
                              `true`: the ship-to address is a PO box; `false`:
                              it is not; `null`/absent: either.
                          tagsAny:
                            type: array
                            items:
                              type: string
                            description: >-
                              The fulfillment order or its sales order carries
                              one of these tags (by name).
                          tiktokOrder:
                            type: boolean
                            nullable: true
                            description: >-
                              `true`: a TikTok Shop order; `false`: not;
                              `null`/absent: either.
                          channelIds:
                            type: array
                            items:
                              type: integer
                            description: The order came from one of these sales channels.
                      then:
                        type: object
                        description: Effects applied when the rule matches.
                        properties:
                          services:
                            type: array
                            items:
                              type: string
                            description: >-
                              Allowed services. A rate is kept when its service
                              code equals an entry or its service name contains
                              one.
                          maxTransitDays:
                            type: integer
                            minimum: 1
                            maximum: 30
                            nullable: true
                            description: >-
                              Keep only rates quoting this many transit days or
                              fewer.
                          shipDays:
                            type: array
                            items:
                              type: string
                              enum:
                                - Mon
                                - Tue
                                - Wed
                                - Thu
                                - Fri
                                - Sat
                                - Sun
                            description: >-
                              Labels may only be bought on these days (tenant
                              operating timezone).
                          lock:
                            type: boolean
                            description: >-
                              Refuse a label on any service outside `services`.
                              Requires `services`.
                    example:
                      name: Perishables West → FedEx 2Day
                      when:
                        packingClasses:
                          - perishable_dry_ice
                        states:
                          - WA
                          - OR
                          - CA
                      then:
                        services:
                          - FEDEX_2_DAY
                          - FedEx 2Day
                        shipDays:
                          - Tue
                          - Wed
                        lock: true
                service_code:
                  type: string
                  maxLength: 120
                  nullable: true
                  description: The service to check a label refusal for.
                at:
                  type: string
                  format: date-time
                  nullable: true
                  description: When the label would be bought. Defaults to now.
            example:
              order_number: BF-104233
              service_code: FEDEX_GROUND
      responses:
        '200':
          description: Evaluation result.
          content:
            application/json:
              schema:
                type: object
                properties:
                  data:
                    type: object
                    properties:
                      fulfillment_order_id:
                        type: integer
                      order_number:
                        type: string
                      facts:
                        type: object
                        description: The order values the conditions are evaluated against.
                        properties:
                          state:
                            type: string
                            nullable: true
                          country:
                            type: string
                            nullable: true
                          poBox:
                            type: boolean
                          tiktok:
                            type: boolean
                          packingClasses:
                            type: array
                            items:
                              type: string
                          tags:
                            type: array
                            items:
                              type: string
                          channelId:
                            type: integer
                            nullable: true
                      rules:
                        type: array
                        items:
                          type: object
                          properties:
                            index:
                              type: integer
                              description: Zero-based position in the list.
                            name:
                              type: string
                            matched:
                              type: boolean
                              description: >-
                                `true` when every condition the rule sets
                                passes.
                            conditions:
                              type: array
                              description: >-
                                Each condition the rule sets, with the order's
                                value and whether it holds.
                              items:
                                type: object
                                properties:
                                  key:
                                    type: string
                                    example: states
                                  expected:
                                    description: The rule's value for this condition.
                                  actual:
                                    description: The order's value for this condition.
                                  pass:
                                    type: boolean
                      label_refusal:
                        type: string
                        nullable: true
                        description: >-
                          Why a label on `service_code` at `at` would be
                          refused, or `null` if it would be allowed.
                example:
                  data:
                    fulfillment_order_id: 4821
                    order_number: BF-104233
                    facts:
                      state: CA
                      country: US
                      poBox: false
                      tiktok: false
                      packingClasses:
                        - perishable_dry_ice
                      tags: []
                      channelId: 3
                    rules:
                      - index: 0
                        name: Perishables West → FedEx 2Day
                        matched: true
                        conditions:
                          - key: states
                            expected:
                              - WA
                              - OR
                              - CA
                            actual: CA
                            pass: true
                          - key: packingClasses
                            expected:
                              - perishable_dry_ice
                            actual:
                              - perishable_dry_ice
                            pass: true
                    label_refusal: >-
                      Perishables West → FedEx 2Day: ship with FEDEX_2_DAY or
                      FedEx 2Day.
        '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
        '403':
          description: >-
            The token's owner lacks the `fulfillmentSettings.read` permission
            (enforced when per-user permissions are enabled).
          content:
            application/json:
              schema:
                type: object
                properties:
                  message:
                    type: string
                    example: User does not have the right permissions.
        '404':
          description: The fulfillment order was not found.
          content:
            application/json:
              schema:
                type: object
                properties:
                  message:
                    type: string
                    example: Fulfillment order not found.
        '422':
          description: >-
            Missing order identifier, invalid parameters, or the draft `rules`
            have errors.
          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.