---
title: "Create a new quote item"
method: POST
path: "/quotes/public/items"
tags: ["Quote Items"]
---

# Create a new quote item

`POST /quotes/public/items`

## Request

- Base URL: `https://api.paperlessparts.com/v1`
- URL: `https://api.paperlessparts.com/v1/quotes/public/items`
- Auth: API key in header `Authorization`
- TypeScript: <https://skmtc.dev/paperlessparts/apis/paperless-parts-api/docs/quotes/public/items/post.ts> (a function with typed inputs; its response is checked against the schema)

Creates a new quote item on an existing quote by attaching a part from the part library.

By default, the part is imported with the process, material, and quantities you specify, and pricing is calculated fresh using your current pricing rules.

When `use_latest_pricing` is `true`, the part is imported with the process, material, and quantities from the most recent quote on which this part appeared, including all subcomponents and subassemblies; no live pricing refresh is performed. Part must be root part to add to a quote.

## Request body

- object
  - `quote` string, required: The UUID of the quote to add the line item to.
  - `part` string, required: The UUID of the part to import from the part library. Required in all cases, including when `use_latest_pricing` is `true`.
  - `use_latest_pricing` boolean: When `false` (the default), the part is imported with fresh pricing using the process, material, and quantities you supply. When `true`, costing and pricing are copied from the most recent quote on which this part appeared, including all subcomponents and subassemblies. See endpoint description for details on mutual exclusions and fallback behaviour.
  - `quantities` integer[]: The quantities to price the part at. Required when `use_latest_pricing` is `false` or omitted. Must not be provided when `use_latest_pricing` is `true`.
  - `process` string, nullable: The UUID of the process to apply to the part. Optional. Must not be provided when `use_latest_pricing` is `true`.
  - `material` string, nullable: The UUID of the supplier material to apply to the part. Optional. Must not be provided when `use_latest_pricing` is `true`.
  - `public_notes` string, nullable: Notes visible to the customer. Optional. Must not be provided when `use_latest_pricing` is `true`.
  - `private_notes` string, nullable: Internal notes not visible to the customer. Optional. Must not be provided when `use_latest_pricing` is `true`.
  - `estimated_annual_usage` integer, nullable: Estimated annual usage quantity. Optional; only valid when the estimated annual usage feature is enabled for your account. Must not be provided when `use_latest_pricing` is `true`.
  - `metadata` object: Arbitrary key-value metadata to attach to the quote item. Optional. Must not be provided when `use_latest_pricing` is `true`.
  - `unit_price_precision` integer: The number of decimal places used when displaying unit prices (2–4). Optional; if the selected process defines a precision, that value takes precedence. Must not be provided when `use_latest_pricing` is `true`.

## Response `201`

Successful response

- QuoteItem: A quote item represents a line item in a quote. Quote items can either be manual or automatic, as indicated by the 'type' property. Automatic quote items are those generated by adding a part to a quote. Pricing data for automatic quote items is automatically populated using the process, material, and operations, if they exist. Manual quote items do not have an associated part, so the pricing information must be inputted manually.
  - `id` integer
  - `type` 'automatic' | 'manual': Indicates whether the quote item is associated with a part (automatic pricing), or not (manual pricing).
  - `root_component_id` integer: ID of the root component. A root component houses the pricing information for a quote item. Every quote item has a root component. In the case of an automatic quote item, the root component corresponds to a part; in the case of a manual quote item, which does not have an associated part, the root component stores the manual pricing data. As the name 'root component' implies, it is possible for a quote item to have many components, as in the case of an assembly of nested parts.
  - `components` QuoteComponent[]
    - `id` string
    - `add_ons` QuoteAddOn[]
      - `is_required` boolean
      - `name` string
      - `erp_code` string
      - `notes` string
      - `quantities` QuoteAddOnQuantity[]
        - `price` number, float
        - `manual_price` number, float
        - `quantity` integer
      - `costing_variables` QuoteCostingVariable[]
        - `label` string
        - `variable_class` 'basic' | 'drop_down' | 'table'
        - `value_type` 'string' | 'number' | 'currency' | 'boolean': Describes the type of the 'value' key in quantities property
        - `quantity_specific` boolean: Flag as to whether or not this costing variable can be manipulated for each quantity break
        - `quantities` object[]: The value of the costing variable for each quoted quantity. This is an object with keys corresponding to the top level quote quantities in string form e.g. '1', '5', '10'. The values for each of these keys take different shape depending on the variable_class. If variable_class=='basic', the dictionary values will take the shape {'value': 1.0}. If variable_class=='drop_down', the dictionary values will take the shape {'value': 'a', 'options': ['a', 'b']}. If variable_class=='table', the dictionary values will take the shape {'value': 'a', 'row': {'column1': 'a', 'column2': 'b'}}. So for quoted quantities 1, 5, 10 for a basic variable_class, the object will look like: {'1': {'value': 1.0}, '5': {'value': 2.0}, '10': {'value': 3.0}}
          - `stringQuotedQuantity1` object
            - `value` union
              - …
            - `row` object, nullable
            - `options` union[], nullable
              - …
          - `stringQuotedQuantity2` object
            - `value` union
              - …
            - `row` object, nullable
            - `options` union[], nullable
              - …
        - `type` string: To Be Deprecated
        - `value` union: This will be indicated by the value_type field. To Be Deprecated
          - string
          - number
          - integer
          - boolean
        - `row` object, nullable: The row field will only be non-null when the type field is 'table'. Row represents a row in a lookup table and is an object with arbitrary keys. To Be Deprecated
    - `discounts` object[]
    - `is_assembly` boolean
    - `obtain_method` string, nullable
    - `part_custom_attrs` object[]
    - `pricing_items` object[]
    - `quantities` QuoteQuantity[]
      - `id` integer
      - `quantity` integer
      - `markup_1_price` number, float, nullable: Users of Paperless Parts can specify up to two distinct markup values on a component.
      - `markup_1_name` string, nullable
      - `markup_2_price` number, float, nullable: Users of Paperless Parts can specify up to two distinct markup values on a component.
      - `markup_2_name` string, nullable
      - `unit_price` number, float
      - `total_price` number, float
      - `total_price_with_required_add_ons` number, float
      - `lead_time` integer: Days
      - `expedites` QuoteExpedite[]
        - `id` integer
        - `lead_time` integer: Days
        - `markup` number, float: Percent
        - `unit_price` number, float
        - `total_price` number, float
      - `is_most_likely_won_quantity` boolean: Whether or not this quantity is the most likely quantity to be won.
      - `most_likely_won_quantity_percent` integer
      - `deliver_quantity` integer
      - `make_quantity` integer
      - `manual_total_unit_price` number, float, nullable
      - `total_component_overrides_cost` number, float, nullable
      - `total_discount` number, float, nullable
      - `total_discount_percentage` number, float, nullable
      - `total_inside_processing_cost` number, float, nullable
      - `total_outside_processing_cost` number, float, nullable
      - `total_price_before_discounts` number, float, nullable
      - `total_purchased_component_cost` number, float, nullable
      - `total_raw_material_cost` number, float, nullable
      - `unit_price_before_discounts` number, float, nullable
      - `yield_pct` number, float, nullable
    - `child_ids` integer[]
    - `children` ComponentChild[]
      - `child_id` integer: ID of the child component
      - `quantity` integer: The number of child component instances belonging to this parent. Note, the total number of instances of this child component in this assembly tree may be larger if this child appears in multiple places in the tree.
    - `description` string, nullable
    - `export_controlled` boolean: Whether or not this component contains data that is export controlled (ITAR) by the US Government.
    - `finishes` string[]: Note: this field is deprecated. Finishes now show up as Operations.
    - `innate_quantity` integer: The quantity of this subcomponent that must be produced to make one top-level component.
    - `is_root_component` boolean
    - `material` OrderMaterial: This can also be null
      - `id` integer
      - `display_name` string
      - `family` string
      - `material_class` string
      - `name` string
    - `material_operations` QuoteOperation[]
      - `id` integer
      - `category` 'material' | 'operation'
      - `cost` number, float
      - `costing_variables` QuoteCostingVariable[]
        - `label` string
        - `variable_class` 'basic' | 'drop_down' | 'table'
        - `value_type` 'string' | 'number' | 'currency' | 'boolean': Describes the type of the 'value' key in quantities property
        - `quantity_specific` boolean: Flag as to whether or not this costing variable can be manipulated for each quantity break
        - `quantities` object[]: The value of the costing variable for each quoted quantity. This is an object with keys corresponding to the top level quote quantities in string form e.g. '1', '5', '10'. The values for each of these keys take different shape depending on the variable_class. If variable_class=='basic', the dictionary values will take the shape {'value': 1.0}. If variable_class=='drop_down', the dictionary values will take the shape {'value': 'a', 'options': ['a', 'b']}. If variable_class=='table', the dictionary values will take the shape {'value': 'a', 'row': {'column1': 'a', 'column2': 'b'}}. So for quoted quantities 1, 5, 10 for a basic variable_class, the object will look like: {'1': {'value': 1.0}, '5': {'value': 2.0}, '10': {'value': 3.0}}
          - `stringQuotedQuantity1` object
            - `value` union
              - …
            - `row` object, nullable
            - `options` union[], nullable
              - …
          - `stringQuotedQuantity2` object
            - `value` union
              - …
            - `row` object, nullable
            - `options` union[], nullable
              - …
        - `type` string: To Be Deprecated
        - `value` union: This will be indicated by the value_type field. To Be Deprecated
          - string
          - number
          - integer
          - boolean
        - `row` object, nullable: The row field will only be non-null when the type field is 'table'. Row represents a row in a lookup table and is an object with arbitrary keys. To Be Deprecated
      - `quantities` OperationQuantity[]
        - `price` number, float
        - `manual_price` number, float, nullable
        - `lead_time` integer, nullable
        - `manual_lead_time` integer, nullable
        - `quantity` integer
      - `is_finish` boolean
      - `is_outside_service` boolean
      - `name` string
      - `erp_code` string
      - `operation_definition_name` string
      - `notes` string, nullable
      - `position` integer: The position of the order operation in the order display, indexed from 1. Note that the position applies across both material operations and order operations. TODO - this shows up as 0 if there is only one operation on the order?
      - `runtime` number, float, nullable
      - `setup_time` number, float, nullable
    - `parent_ids` integer[]
    - `part_name` string
    - `part_number` string, nullable
    - `part_url` string, url
    - `part_uuid` string
    - `process` OrderProcess
      - `id` integer
      - `external_name` string
      - `name` string
    - `purchased_component` QuotePurchasedComponent
      - `oem_part_number` string: Unique identifier for purchased component within a supplier account
      - `internal_part_number` string, nullable
      - `description` string, nullable
      - `piece_price` number: Cost per piece to 4 decimal places
      - `id` string
      - `properties` PurchasedComponentProperty[]
        - `name` string: Name of corresponding purchased component column in table display
        - `code_name` string: Name used to access property within pricing formulas via 'dot' operator
        - `value_type` 'string' | 'boolean' | 'numeric'
        - `value` union: Value of property, None or of type corresponding to value_type
          - string
          - number
          - boolean
    - `revision` string, nullable
    - `shop_operations` QuoteOperation[]
      - `id` integer
      - `category` 'material' | 'operation'
      - `cost` number, float
      - `costing_variables` QuoteCostingVariable[]
        - `label` string
        - `variable_class` 'basic' | 'drop_down' | 'table'
        - `value_type` 'string' | 'number' | 'currency' | 'boolean': Describes the type of the 'value' key in quantities property
        - `quantity_specific` boolean: Flag as to whether or not this costing variable can be manipulated for each quantity break
        - `quantities` object[]: The value of the costing variable for each quoted quantity. This is an object with keys corresponding to the top level quote quantities in string form e.g. '1', '5', '10'. The values for each of these keys take different shape depending on the variable_class. If variable_class=='basic', the dictionary values will take the shape {'value': 1.0}. If variable_class=='drop_down', the dictionary values will take the shape {'value': 'a', 'options': ['a', 'b']}. If variable_class=='table', the dictionary values will take the shape {'value': 'a', 'row': {'column1': 'a', 'column2': 'b'}}. So for quoted quantities 1, 5, 10 for a basic variable_class, the object will look like: {'1': {'value': 1.0}, '5': {'value': 2.0}, '10': {'value': 3.0}}
          - `stringQuotedQuantity1` object
            - `value` union
              - …
            - `row` object, nullable
            - `options` union[], nullable
              - …
          - `stringQuotedQuantity2` object
            - `value` union
              - …
            - `row` object, nullable
            - `options` union[], nullable
              - …
        - `type` string: To Be Deprecated
        - `value` union: This will be indicated by the value_type field. To Be Deprecated
          - string
          - number
          - integer
          - boolean
        - `row` object, nullable: The row field will only be non-null when the type field is 'table'. Row represents a row in a lookup table and is an object with arbitrary keys. To Be Deprecated
      - `quantities` OperationQuantity[]
        - `price` number, float
        - `manual_price` number, float, nullable
        - `lead_time` integer, nullable
        - `manual_lead_time` integer, nullable
        - `quantity` integer
      - `is_finish` boolean
      - `is_outside_service` boolean
      - `name` string
      - `erp_code` string
      - `operation_definition_name` string
      - `notes` string, nullable
      - `position` integer: The position of the order operation in the order display, indexed from 1. Note that the position applies across both material operations and order operations. TODO - this shows up as 0 if there is only one operation on the order?
      - `runtime` number, float, nullable
      - `setup_time` number, float, nullable
    - `supporting_files` OrderSupportingFile[]
      - `filename` string
      - `url` string, url
    - `thumbnail_url` string, nullable
    - `type` 'assembled' | 'manufactured' | 'purchased'
  - `position` integer: The position of the quote item in the quote display, indexed from 1.
  - `export_controlled` boolean: Whether or not this quote item contains data that is export controlled (ITAR) by the US Government.
  - `component_ids` integer[]
  - `metadata` object, nullable
  - `private_notes` string, nullable
  - `public_notes` string, nullable
  - `workflow_status` string, nullable
  - `root_component` object, nullable

## Other responses

- `400`: Bad request — validation error. Returned when required fields are missing, field values are invalid, or mutually exclusive fields are combined with `use_latest_pricing`.
- `404`: Not found. Returned when the `quote` or `part` UUID does not exist or does not belong to your account.

---

[API](https://skmtc.dev/paperlessparts/apis/paperless-parts-api.md) - [All operations](https://skmtc.dev/paperlessparts/apis/paperless-parts-api/llms.txt) - [OpenAPI document](https://skmtc.dev/paperlessparts/apis/paperless-parts-api/revisions/3eb132ead1fe?raw)
