---
title: "Lists quote 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 quote moved into, the status it left, who made the change and when, and the quote's number, customer, salesperson, current status and part line count. Revision and deletion events, and every change of a deleted quote, are left out."
method: POST
path: "/api/quotes/status-history/list"
tags: ["Quote"]
---

# Lists quote 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 quote moved into, the status it left, who made the change and when, and the quote's number, customer, salesperson, current status and part line count. Revision and deletion events, and every change of a deleted quote, are left out.

`POST /api/quotes/status-history/list`

## Request

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

## Query parameters

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

## Request body

- DtoQuoteStatusHistoryListFilter: Filter for the quote 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` DtoQuoteStatusHistoryStatus[], nullable: Keeps changes whose `newStatus` (the status the quote moved into) is one of these. Empty or omitted keeps every status.
  - `quoteId` string, nullable: Keeps the changes of this one quote, 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.

- DtoPagedResultDtoDtoQuoteStatusHistoryRow: Paged result
  - `data` DtoQuoteStatusHistoryRow[], required: The data
    - `id` string, required: Unique id of this status change; use it as the row key.
    - `quoteId` string, required: Id of the quote that changed status. A quote has one row per status change.
    - `quoteNumber` integer, required: The quote's number, as returned by the quote endpoints.
    - `customerId` string, nullable: Id of the quote's customer now.
    - `customerName` string, nullable: Name of the quote's customer now, as recorded on the quote.
    - `salesPersonId` string, nullable: User id of the quote's salesperson now. Null when the quote has none.
    - `salesPersonName` string, nullable: Display name of the quote's salesperson now. Null when the quote has none.
    - `currentStatus` 'open' | 'draft' | 'needsApproval' | 'approved' | 'sent' | 'won' | 'lost': Quotes status
    - `newStatus` 'created' | 'draft' | 'needsApproval' | 'approved' | 'sent' | 'won' | 'lost', required: A status in a quote's status history. On a history row, `newStatus` is the status the change moved the quote INTO and `previousStatus` the status it left. `created` means the quote was created in Draft. A quote made by copying another has no `created` row. The other values match the quote statuses of the same name.
    - `previousStatus` 'created' | 'draft' | 'needsApproval' | 'approved' | 'sent' | 'won' | 'lost': A status in a quote's status history. On a history row, `newStatus` is the status the change moved the quote INTO and `previousStatus` the status it left. `created` means the quote was created in Draft. A quote made by copying another has no `created` row. The other values match the quote 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.
    - `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 quote 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 Quote permission.

## Changes

- **2026-10-23** `bcbc73c77e2c`: 1 info
  - endpoint added

[Operation history](https://skmtc.dev/fulcrumpro/apis/fulcrum-publicapi/changes/api/quotes/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)
