How to Retrieve Serial Numbers from inFlow Inventory API (2026 Guide)

If you are using inFlow Inventory to track serialized products (vehicles, electronics, equipment), you have likely hit a wall trying to retrieve those serial numbers via the API.

As of API version 2025-06-24, serial numbers are surprisingly undocumented. Searching the official documentation for "serial number" yields only the boolean trackSerials flag. You might assume the API doesn't support serial retrieval, but it does, if you know where to look.

Prerequisites

Before attempting to fetch data, ensure the target product is actually serialized.

  • Requirement: trackSerials: true must be set at the product level.
  • Constraint: Non-serialized products will not return serial data, even if you use the correct query parameters.

The Two Approaches

There are two distinct ways to access serial data. Your choice depends entirely on whether you need a current snapshot or a transaction history.

1. Product-Based: include=inventoryLines (Current Snapshot)

Best for: Listing all serials for a product, checking current stock status, or building a local serial number lookup index.

This endpoint returns a point-in-time snapshot of all serials associated with a product, grouped by location.

The Request:
Add ?include=inventoryLines to your product endpoints.

# Single product lookup
GET /products/{productId}?include=inventoryLines

# Bulk fetch (requires pagination)
GET /products?include=inventoryLines&filter[trackSerials]=true&count=100

The Response:

{
  "productId": "abc-123",
  "name": "Widget Pro",
  "trackSerials": true,
  "inventoryLines": [
    {
      "serial": "SN-001234",
      "locationId": "warehouse-uuid",
      "quantityOnHand": "0.00000",
      "sublocation": ""
    },
    {
      "serial": "SN-001235",
      "locationId": "warehouse-uuid",
      "quantityOnHand": "1.00000",
      "sublocation": "Shelf A"
    }
  ]
}

Understanding quantityOnHand
Unlike standard inventory counts, serials are binary.

  • "1.00000": The serial is physically in stock at this location.
  • "0.00000": The serial is not on hand (it has been sold, transferred, or adjusted out).

Note: This endpoint returns the lifetime history of serials for the product. You must filter by quantityOnHand > 0 to see what is currently on the shelf.

2. Order/Movement-Based: include=lines (Transaction History)

Best for: Audit trails, tracking movement history, and answering "Which order was Serial #123 on?"

This approach shows serial numbers assigned to specific line items within transactions.

The Requests:
Add ?include=lines to any transaction endpoint.

# Sales Orders
GET /sales-orders/{orderId}?include=lines

# Purchase Orders
GET /purchase-orders/{poId}?include=lines

# Stock Adjustments & Transfers
GET /stock-adjustments/{adjustmentId}?include=lines
GET /stock-transfers/{transferId}?include=lines

The Response (Sales Order Example):

{
  "salesOrderId": "order-uuid",
  "orderNumber": "1234",
  "lines": [
    {
      "salesOrderLineId": "line-uuid",
      "productId": "abc-123",
      "quantity": {
        "standardQuantity": "1.0000",
        "serialNumbers": ["SN-001234"]
      }
    }
  ]
}

Key Path: lines[].quantity.serialNumbers[]

Vital Limitation: No Direct Lookup

The inFlow API does not provide a direct "Search by Serial Number" endpoint (e.g., GET /serials/SN-001).

To find a specific serial, you must use one of two strategies:

  1. Product Scan: Fetch products with inventoryLines and iterate through the arrays.
  2. Transaction Scan: Paginate through orders with lines and scan the arrays.

Pro Tip: For high-frequency lookups, do not query the API live. Instead, fetch all data using the Product-Based approach and build a cached Key-Value index (Serial to ProductID) locally.

Common Pitfalls

As of version 2025-06-24, attempting to guess the relationship names will result in HTTP 400 errors.

Attempted Include Status Correction
include=items 400 Error Use include=lines
include=stock 400 Error Use include=inventoryLines
include=inventory 400 Error Invalid relationship
include=inventoryMovements 400 Error Invalid for products

Quick Reference Guide

I need to find... Endpoint Include
"What serials exist for Product X?" /products/{id} inventoryLines
"Is Serial Y currently in stock?" /products/{id} inventoryLines (check qty > 0)
"Which Sales Order was Serial Y on?" /sales-orders lines
"Which PO did Serial Y arrive on?" /purchase-orders lines
"List ALL serials in the system" /products inventoryLines + filter[trackSerials]=true

Performance Comparison

Approach API Efficiency Use Case
Product + inventoryLines High (1-2 calls) Bulk lookups, Indexing, Stock Counts
Orders + lines Low (Requires pagination) Auditing specific transaction history

Tested against inFlow Cloud API version 2025-06-24

Back to blog

Leave a comment

    1 out of ...