> For the complete documentation index, see [llms.txt](https://docs.shortcutco.com/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.shortcutco.com/developers/api-reference/reference/objects/estimate.md).

# The estimate object

The estimate object in the Shortcut API - every field, an example, and the endpoints that return it.

An estimate: prices offered to a lead or customer.

## Fields

| Field                              | Type                                                            | Description                                                                                                                                                                                                                         |
| ---------------------------------- | --------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `id`                               | id                                                              | The estimate's id.                                                                                                                                                                                                                  |
| `object`                           | `"estimate"`                                                    | Always `estimate`.                                                                                                                                                                                                                  |
| `status`                           | `draft`, `pending`, `approved`, `declined`, `voided`, `expired` | `draft` until sent; `pending` once sent and waiting for the customer; then `approved`, `declined`, `voided` by the office, or `expired`.                                                                                            |
| `customerId`                       | id or null                                                      | The customer the estimate is for, or null.                                                                                                                                                                                          |
| `leadId`                           | id or null                                                      | The lead the estimate answers, or null.                                                                                                                                                                                             |
| `propertyId`                       | id or null                                                      | The property the work is at, or null.                                                                                                                                                                                               |
| `propertyLabel`                    | string or null                                                  | The property's label when the estimate was written, or null.                                                                                                                                                                        |
| `propertyAddress`                  | string or null                                                  | The property's address when the estimate was written, or null.                                                                                                                                                                      |
| `message`                          | string or null                                                  | The message to the customer sent with the estimate, or null.                                                                                                                                                                        |
| `total`                            | number or null                                                  | The estimate's total in US dollars as the app shows it, or null before it is priced.                                                                                                                                                |
| `sentAt`                           | timestamp or null                                               | When the estimate was last sent, ISO 8601 in UTC, or null.                                                                                                                                                                          |
| `expiresAt`                        | timestamp or null                                               | When the estimate stops being approvable, ISO 8601 in UTC, or null.                                                                                                                                                                 |
| `expiredAt`                        | timestamp or null                                               | When the estimate expired, ISO 8601 in UTC, or null.                                                                                                                                                                                |
| `approvedAt`                       | timestamp or null                                               | When the estimate was approved, ISO 8601 in UTC, or null.                                                                                                                                                                           |
| `declinedAt`                       | timestamp or null                                               | When the customer declined it, ISO 8601 in UTC, or null.                                                                                                                                                                            |
| `declineReason`                    | string or null                                                  | What the customer said when declining, or null.                                                                                                                                                                                     |
| `createdAt`                        | timestamp                                                       | When the estimate was created, ISO 8601 in UTC.                                                                                                                                                                                     |
| `updatedAt`                        | timestamp                                                       | When the estimate last changed, ISO 8601 in UTC.                                                                                                                                                                                    |
| `lines`                            | array of objects                                                | The estimate's lines, in order. Only in answers from `POST /v1/estimates`, `GET /v1/estimates/{id}`, `PATCH /v1/estimates/{id}`, `POST /v1/estimates/{id}/approve`, `POST /v1/estimates/{id}/send`, `POST /v1/estimates/{id}/void`. |
| `lines[].id`                       | id                                                              | The line's id.                                                                                                                                                                                                                      |
| `lines[].serviceId`                | id or null                                                      | The catalog service the line was made from, or null for a custom line.                                                                                                                                                              |
| `lines[].name`                     | string                                                          | The line's name.                                                                                                                                                                                                                    |
| `lines[].description`              | string or null                                                  | The line's description, or null.                                                                                                                                                                                                    |
| `lines[].priceStructure`           | `per_hour`, `per_sqft`, `flat`, `per_man_hour`                  | How `rate` is charged: per hour, per square foot, flat, or per crew member-hour.                                                                                                                                                    |
| `lines[].rate`                     | number                                                          | The price in US dollars, per `priceStructure`.                                                                                                                                                                                      |
| `lines[].quantity`                 | number or null                                                  | Hours, square feet, or similar that `rate` multiplies, or null.                                                                                                                                                                     |
| `lines[].subtotal`                 | number                                                          | The line's price per visit in US dollars.                                                                                                                                                                                           |
| `lines[].cadence`                  | `one_off`, `recurring`, `on_demand`                             | `recurring`, `one_off`, or `on_demand` (snow work that waits for a storm).                                                                                                                                                          |
| `lines[].cadenceFrequency`         | integer or null                                                 | With `cadencePeriod`, how many visits per period, or null.                                                                                                                                                                          |
| `lines[].cadencePeriod`            | `per_week`, `per_month`, `per_year`, `per_day` or null          | The period `cadenceFrequency` counts in, or null.                                                                                                                                                                                   |
| `lines[].choiceGroupId`            | id or null                                                      | Lines sharing this id are alternatives the customer chooses between, or null.                                                                                                                                                       |
| `lines[].isOptional`               | boolean                                                         | Whether the customer may leave the line out.                                                                                                                                                                                        |
| `lines[].isRemovedByClient`        | boolean                                                         | Whether the customer left the line out when approving.                                                                                                                                                                              |
| `lines[].selectedOptionId`         | id or null                                                      | The option the customer chose, or null.                                                                                                                                                                                             |
| `lines[].sortOrder`                | integer                                                         | Position on the estimate, ascending.                                                                                                                                                                                                |
| `lines[].options`                  | array of objects                                                | Price options the customer can pick between.                                                                                                                                                                                        |
| `lines[].options[].id`             | id                                                              | The option's id.                                                                                                                                                                                                                    |
| `lines[].options[].name`           | string                                                          | The option's name.                                                                                                                                                                                                                  |
| `lines[].options[].rate`           | number                                                          | The option's price in US dollars, per `priceStructure`.                                                                                                                                                                             |
| `lines[].options[].priceStructure` | `per_hour`, `per_sqft`, `flat`, `per_man_hour`                  | How `rate` is charged.                                                                                                                                                                                                              |
| `lines[].options[].cadence`        | `one_off`, `recurring`, `on_demand`                             | How often the option's work happens.                                                                                                                                                                                                |
| `lines[].products`                 | array of objects                                                | Products sold with the line.                                                                                                                                                                                                        |
| `lines[].products[].id`            | id                                                              | The product line's id.                                                                                                                                                                                                              |
| `lines[].products[].productId`     | id                                                              | The product from the catalog.                                                                                                                                                                                                       |
| `lines[].products[].name`          | string                                                          | The product's name on the estimate.                                                                                                                                                                                                 |
| `lines[].products[].description`   | string or null                                                  | The product's description, or null.                                                                                                                                                                                                 |
| `lines[].products[].unitLabel`     | string                                                          | The unit the quantity counts, such as `bag`.                                                                                                                                                                                        |
| `lines[].products[].quantity`      | number                                                          | How many units.                                                                                                                                                                                                                     |
| `lines[].products[].unitPrice`     | number                                                          | The customer's price per unit in US dollars.                                                                                                                                                                                        |
| `lines[].products[].taxable`       | boolean                                                         | Whether sales tax applies.                                                                                                                                                                                                          |
| `lines[].products[].display`       | `itemized`, `included`                                          | `itemized` shows the product as its own line to the customer; `included` folds it into the service's price.                                                                                                                         |

## Example

```json
{
  "id": "ade59d63-aa2f-48aa-867a-13f1a2c44f38",
  "object": "estimate",
  "status": "draft",
  "customerId": "e74ffc7b-e39a-47c2-8fe4-7309dc2eae50",
  "leadId": "d9841fd5-d5ce-4b1c-8218-9663ce62d1aa",
  "propertyId": "ef49981c-eb93-4363-87de-0eaae42849f1",
  "propertyLabel": "Home",
  "propertyAddress": "412 Elm St, Bozeman, MT 59715",
  "message": "Thanks for the chance to quote your lawn care.",
  "total": 45,
  "sentAt": null,
  "expiresAt": null,
  "expiredAt": null,
  "approvedAt": null,
  "declinedAt": null,
  "declineReason": null,
  "createdAt": "2026-10-01T15:02:20.114Z",
  "updatedAt": "2026-10-16T17:04:12.381Z",
  "lines": [
    {
      "id": "47931122-43dd-4c69-8027-87b03c71c2f7",
      "serviceId": "d0b2304d-ccfc-4b94-8946-a6dbc590e222",
      "name": "Weekly mowing",
      "description": null,
      "priceStructure": "per_hour",
      "rate": 45,
      "quantity": 1,
      "subtotal": 45,
      "cadence": "recurring",
      "cadenceFrequency": 1,
      "cadencePeriod": "per_week",
      "choiceGroupId": null,
      "isOptional": false,
      "isRemovedByClient": false,
      "selectedOptionId": null,
      "sortOrder": 0,
      "options": [],
      "products": []
    }
  ]
}
```

## Endpoints

| Endpoint                          | What it does            |
| --------------------------------- | ----------------------- |
| `GET /v1/estimates`               | List estimates          |
| `POST /v1/estimates`              | Create an estimate      |
| `GET /v1/estimates/{id}`          | Get an estimate         |
| `PATCH /v1/estimates/{id}`        | Update a draft estimate |
| `POST /v1/estimates/{id}/approve` | Approve an estimate     |
| `POST /v1/estimates/{id}/send`    | Send an estimate        |
| `POST /v1/estimates/{id}/void`    | Void an estimate        |
