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: truemust 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:
-
Product Scan: Fetch products with
inventoryLinesand iterate through the arrays. -
Transaction Scan: Paginate through orders with
linesand 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