---
title: "List quote items"
method: GET
path: "/quotes/{id}/items"
tags: ["Quotes"]
---

# List quote items

`GET /quotes/{id}/items`

## Request

- Base URL: `https://joinways.app/api/v1`
- URL: `https://joinways.app/api/v1/quotes/{id}/items`
- Auth: one of:
  - HTTP bearer
  - OAuth 2 (authorization code, authorization URL `https://joinways.app/oauth/authorize`, token URL `https://joinways.app/api/oauth/token`, scopes: `mcp.read`)

Line items of the quote, by day then `sort_order`. Not paginated. A package is one item, its articles under `package` (see Packages). **Role permission:** `reports.view` or `quotes.manage`.

## Response `200`

Items.

- object
  - `items` QuoteItem[], required
    - `id` string, uuid
    - `quote_id` string, uuid
    - `account_id` string, uuid, nullable
    - `title` string
    - `description` string
    - `quantity` number
    - `unit_price` number: Price per unit, excluding tax. On a package: the price of one package unit (`package.unit_price`).
    - `vat` number, nullable: Tax rate as a percentage (e.g. 20 for 20 %). A package mixes rates: this is only the lowest of them, read `package.tax_rates` and never compute its tax from `vat`.
    - `total` number, nullable: Computed line total, excluding tax, after the line discount. On a package: the sum of its articles (`package.total_excl_tax`).
    - `is_package` boolean: The line is a package; `package` is then present.
    - `parent_item_id` string, uuid, nullable: The package line an article belongs to. `null` on the items returned: the articles of a package are under its `package.articles`, not items of their own.
    - `package` QuoteItemPackage: Only on a package line. Amounts are summed article by article, like the quote totals, so they can differ by a cent from `unit_price × quantity`.
      - `unit_price` number, required: Price of one package unit, excluding tax, before discount.
      - `total_excl_tax` number, required: Sum of the articles, after the package's discount.
      - `total_tax` number, required
      - `total_incl_tax` number, required
      - `tax_rates` number[], required: Distinct tax rates of the articles, ascending, in %.
      - `articles` QuoteItemPackageArticle[], required: What the package is made of, in the order of its composition. Read-only: written by Joinways from the package line. Their ids are refused by every write (`package_article`).
        - `id` string, uuid
        - `location_item_id` string, uuid, nullable: Catalog item of the article.
        - `title` string
        - `description` string, nullable
        - `quantity` number: Package quantity × `package_unit_quantity`.
        - `package_unit_quantity` number: Quantity of the article in one package unit.
        - `unit_price` number: Unit price of the article inside the package, excluding tax.
        - `vat` number: Tax rate of the article, in %.
        - `total` number: Amount of the article, excluding tax, after the package's discount.
    - `location_item_id` string, uuid, nullable: The catalog item this line was priced from, if any.
    - `min_price_applied` number, nullable: Catalog minimum price the line was checked against.
    - `is_option` boolean, nullable
    - `is_discount` boolean, nullable
    - `is_offered` boolean, nullable: Offered (free) line; bypasses the catalog minimum-price check.
    - `discount_amount` number, nullable
    - `discount_percent` number, nullable
    - `event_day` integer: 1-based day this line belongs to (multi-day events).
    - `event_day_date` string, date, nullable
    - `sort_order` integer: Display order within the day.
    - `client_selected_at` string, date-time, nullable: When the client ticked this option on the public quote.
    - `inherited_from_item_id` string, uuid, nullable
    - `ai_rationale` string, nullable
    - `created_at` string, date-time

## Other responses

- `401`: Missing, invalid, expired or revoked bearer token (`unauthorized`).
- `403`: `forbidden`: the token lacks the scope, its owner's role lacks the permission named by the operation, or the workspace has neither the Pro plan nor a trial (`details.reason` `plan_not_eligible`).
- `404`: Not found in this workspace, or the id of the path is not a UUID (`not_found`).
- `429`: Too many requests (`rate_limited`). `details.reason`: `per-ip`, `per-account-minute`, `per-account-day`, or `email_rate_limited` (email budget). Always carries `Retry-After`: wait that many seconds.

---

[API](https://skmtc.dev/joinways/apis/joinways-public-api.md) · [All operations](https://skmtc.dev/joinways/apis/joinways-public-api/llms.txt) · [OpenAPI document](https://skmtc.dev/joinways/apis/joinways-public-api/revisions/39e84309953e?raw)
