---
title: "Lists the organization's sales orders, oldest first, one page at a time."
method: GET
path: "/api/v1/sales-orders"
tags: ["SalesOrders"]
---

# Lists the organization's sales orders, oldest first, one page at a time.

`GET /api/v1/sales-orders`

## Request

- Base URL: `https://app.flexonthejob.com`
- URL: `https://app.flexonthejob.com/api/v1/sales-orders`
- Auth: HTTP bearer

Requires `ViewSalesOrders`. Pagination: pass the previous response's
`nextCursor` as `after`; `limit` defaults to 50 and is capped at 200. All
filters combine with AND. Example: `GET /api/v1/sales-orders?status=Pending&customerId=42`
lists customer 42's orders that are waiting to be fulfilled. Response carries a weak
`ETag`; resend it as `If-None-Match` to get 304 when nothing changed.
Also available as CSV (`Accept: text/csv` or `?format=csv`); paging cursor in `X-Next-Cursor`.

## Query parameters

- `status` string
- `customerId` integer
- `updatedSince` string, date-time
- `after` string
- `limit` integer
- `format` 'csv'

## Response `200`

A page of sales orders and the cursor for the next page (null on the last page).

- PagedResponseOfSalesOrderSummaryDto: One page of a cursor-paginated /api/v1 collection (API_AND_MCP.md: `?after=<syncId>&limit=`).
  - `items` SalesOrderSummaryDto[]: Items of this page in ascending creation order.
    - `id` integer: Numeric id used in `/api/v1/sales-orders/{id}`. Unique within this organization. Example: `318`.
    - `syncId` string, uuid: Stable cross-device identifier (GUID) — also the pagination cursor value. Example: `7b1e2c3d-4f5a-4b6c-9d8e-0f1a2b3c4d5e`.
    - `orderNumber` string: Order number assigned by the app, `SO` + two-digit year + two-digit month + a four-digit sequence per month. Example: `SO26090007`.
    - `status` string: Order status. One of `Pending` (created, lines can be added, fulfilment not started or not covering every line), `Picking` (a pick transfer covers every line and items are being picked), `Packed` (everything picked), `Shipped` (every transfer has shipping info), `Delivered` (every transfer completed), `Complete` (terminal: marked complete, or delivered and fully invoiced and paid) and `Cancelled` (terminal). Legacy rows may still say the deprecated `Confirmed`. Over the API `/fulfill` starts fulfilment and the later statuses follow from `/pick`, `/complete-pick`, `/ship` and `/deliver`, as in the app.
    - `paymentStatus` string, nullable: Payment status: `Pending`, `Partial`, `Paid`, `Overdue`, `Refunded`, `Invoiced` or `Cancelled`. Example: `Pending`. Null on some legacy rows.
    - `fulfillmentStatus` string, nullable: Aggregate status of the order's transfers (the earliest one wins): `None` (no transfer yet), `Draft`, `Pending`, `InTransit`, `AtWaypoint`, `InTransitToWaypoint`, `InTransitToDestination`, `Completed`, `Cancelled`, `Failed`. Example: `Pending`.
    - `customerId` integer: Customer id (see `/api/v1/customers/{id}`). Example: `42`.
    - `customerName` string, nullable: Customer name at read time. Example: `Acme Plumbing`.
    - `customerPONumber` string, nullable: The customer's own purchase-order reference; null when none. Example: `PO-7781`.
    - `orderDate` string, date-time: Order date as entered in the app: the organization's local calendar date with no UTC offset (not an instant; do not convert it between time zones). Example: `2026-09-23T00:00:00`.
    - `requestedDeliveryDate` string, date-time, nullable: Requested delivery date, same organization-local calendar-date format as `orderDate`; null when none. Example: `2026-09-30T00:00:00`.
    - `subTotal` number, double: Sum of the line totals, in the organization's currency. Example: `1250.00`.
    - `taxRate` number, double: Tax rate in percent (8.25 = 8.25 %). 0 for a tax-exempt customer. Example: `8.25`.
    - `taxAmount` number, double: Tax, `subTotal` × `taxRate` / 100, in the organization's currency. Example: `103.13`.
    - `shippingCost` number, double: Shipping charged on the order, in the organization's currency. Example: `25.00`.
    - `totalAmount` number, double: Order total, `subTotal` + `taxAmount` + `shippingCost`, in the organization's currency. Example: `1378.13`.
    - `amountPaid` number, double: Amount paid so far, in the organization's currency. Example: `500.00`.
    - `balanceDue` number, double: Still owed: `totalAmount` − `amountPaid` − store credit applied, in the organization's currency. Example: `878.13`.
    - `lineCount` integer: Number of lines on the order (removed lines excluded). Example: `3`.
    - `createdAt` string, date-time: Creation time, ISO-8601 UTC. Example: `2026-09-23T14:05:00Z`.
    - `updatedAt` string, date-time, nullable: Last recorded modification (header or line edits, lines added or removed, status change, fulfilment and pick progress, `fulfillmentStatus` change), ISO-8601 UTC; null when never modified since creation. Payments do not move it (`paymentStatus` / `amountPaid` / `balanceDue` can change without it). Example: `2026-09-23T15:12:00Z`.
  - `nextCursor` string, nullable: SyncId of the last item; pass it back as `?after=` to fetch the next page. `null` when this is the last page.

## Other responses

- `304`: Unchanged since the `If-None-Match` ETag.
- `400`: Unknown `status` or unusable `after` cursor (field listed in `errors`).
- `401`: Unauthorized
- `403`: Forbidden
- `429`: Too Many Requests

---

[API](https://skmtc.dev/flexonthejob/apis/flex-api.md) · [All operations](https://skmtc.dev/flexonthejob/apis/flex-api/llms.txt) · [OpenAPI document](https://skmtc.dev/flexonthejob/apis/flex-api/revisions/19c8f4d27acf?raw)
