---
title: "Lists sales order status changes in a fixed order, newest first (changes at the same instant by `id`, descending); Sort is ignored. One row per change: the status the sales order moved into, the status it left, who made the change and when, and the sales order's number, customer, salesperson, current status and part line count. Revision and deletion events, and every change of a deleted sales order, are left out."
method: POST
path: "/api/sales-orders/status-history/list"
tags: ["Sales Order"]
---

# Lists sales order status changes in a fixed order, newest first (changes at the same instant by \`id\`, descending); Sort is ignored. One row per change: the status the sales order moved into, the status it left, who made the change and when, and the sales order's number, customer, salesperson, current status and part line count. Revision and deletion events, and every change of a deleted sales order, are left out.

`POST /api/sales-orders/status-history/list`

## Request

- Base URL: `https://api.fulcrumpro.com`
- URL: `https://api.fulcrumpro.com/api/sales-orders/status-history/list`
- Auth: none declared

## Query parameters

- `Sort.Field` string
- `Sort.Dir` 'ascending' | 'descending': Specify sorting direction.
- `Skip` integer
- `Take` integer

## Request body

- DtoSalesOrderStatusHistoryListFilter: Filter for the sales order status history list. Every field is optional and an omitted field does not filter; the fields that are sent must all match.
  - `changedFromUtc` string, date-time, nullable: Keeps changes made at or after this exact instant (inclusive), compared to the full timestamp, not the day. A value without an offset is read as UTC.
  - `changedBeforeUtc` string, date-time, nullable: Keeps changes made strictly before this exact instant (exclusive), compared to the full timestamp, not the day. Windows from `changedFromUtc` to `changedBeforeUtc` that share an instant put every change in exactly one window. To walk a stable set across pages, fix this at the first request and dedupe on `id`. A value without an offset is read as UTC.
  - `newStatuses` DtoSalesOrderStatusHistoryStatus[], nullable: Keeps changes whose `newStatus` (the status the sales order moved into) is one of these. Empty or omitted keeps every status.
  - `salesOrderId` string, nullable: Keeps the changes of this one sales order, by its id. Empty or blank is treated as omitted.
  - `changedByUserId` string, nullable: Keeps the changes made by this one user, matched against `changedByUserId`. Empty or blank is treated as omitted.

## Response `200`

A page of status changes with the total matching count.

- DtoPagedResultDtoDtoSalesOrderStatusHistoryRow: Paged result
  - `data` DtoSalesOrderStatusHistoryRow[], required: The data
    - `id` string, required: Unique id of this status change; use it as the row key.
    - `salesOrderId` string, required: Id of the sales order that changed status. A sales order has one row per status change.
    - `salesOrderNumber` integer, required: The sales order's number, as returned by the sales order endpoints.
    - `customerId` string, nullable: Id of the sales order's customer now.
    - `customerName` string, nullable: Name of the sales order's customer now, as recorded on the sales order.
    - `salesPersonId` string, nullable: User id of the sales order's salesperson now. Null when the sales order has none.
    - `salesPersonName` string, nullable: Display name of the sales order's salesperson now. Null when the sales order has none.
    - `currentStatus` 'draft' | 'needsApproval' | 'approved' | 'inProgress' | 'complete': Sales order status
    - `newStatus` 'created' | 'draft' | 'needsApproval' | 'approved' | 'inProgress' | 'complete', required: A status in a sales order's status history. On a history row, `newStatus` is the status the change moved the sales order INTO and `previousStatus` the status it left. `created` means the sales order was created, in Draft unless it was created directly in another status, which then has no row of its own. A sales order made by copying another has no `created` row. The other values match the sales order statuses of the same name.
    - `previousStatus` 'created' | 'draft' | 'needsApproval' | 'approved' | 'inProgress' | 'complete': A status in a sales order's status history. On a history row, `newStatus` is the status the change moved the sales order INTO and `previousStatus` the status it left. `created` means the sales order was created, in Draft unless it was created directly in another status, which then has no row of its own. A sales order made by copying another has no `created` row. The other values match the sales order statuses of the same name.
    - `changedByUserId` string, nullable: User id of the person who made the change, or null when none is recorded. A change made with a tenant-wide API key has id "Api"; a change made with a user-bound key records that user. A sales order completed automatically by a background job records a system user whose id starts with "Hangfire-".
    - `changedByName` string, nullable: Name of the person who made the change, as recorded at the time, or null when none is recorded. A change made with a tenant-wide API key has the key's name followed by "(API)" as its name.
    - `changedUtc` string, date-time, required: When the change was made, in UTC. Rows run newest first; changes at the same instant are ordered by `id`, descending.
    - `partLineItemCount` integer, required: Number of part line items on the sales order now, not as of the change.
  - `page` integer, required: The 1-indexed page
  - `pageSize` integer, required: The page size
  - `totalCount` integer, required: The total count of records
  - `totalPages` integer, required: The total pages
  - `hasPreviousPage` boolean, required: True if there is a previous page
  - `hasNextPage` boolean, required: True if there is a next page

## Other responses

- `400`: The filter or paging is invalid.
- `403`: The viewer lacks the View Sales Order permission.

## Changes

- **2026-10-25** `796ca69ba290`: 1 info
  - endpoint added

[Operation history](https://skmtc.dev/fulcrumpro/apis/fulcrum-publicapi/changes/api/sales-orders/status-history/list/post.md)

---

[API](https://skmtc.dev/fulcrumpro/apis/fulcrum-publicapi.md) - [All operations](https://skmtc.dev/fulcrumpro/apis/fulcrum-publicapi/llms.txt) - [OpenAPI document](https://skmtc.dev/fulcrumpro/apis/fulcrum-publicapi/revisions/c9e6f41852d1?raw)
