Skip to main content
POST
Add Proposal Items
Adds items to a proposal. Each entry in Items names a source item, its type, and the area options to put it in — one item is created per area option the entry targets. Area option ids come from get proposal; see reading proposal items for where to find them. The response is the standard List<PublicAreaItemModel> array of created items.

Item types and their ids

CatalogItemId means a different thing for each ItemType, and each type takes the item’s name in a different field: Supplying the wrong one for the type — Name on a Part, Model on a Labor item — returns 400. SupplierId applies to Part items only; omit it to use the part’s default supplier.
Only Part ids are discoverable through the public API today. There is no public endpoint that lists the account’s labor, custom, or fee items, so ids for those types have to come from elsewhere until one ships.

Pricing a new item

Omit SellPrice and SellPercentage and the item inherits the catalog item’s default sell price; the same applies to Cost and CostPercentage. Supply one of each pair to override — an absolute amount, or a whole-percent value plus its basis (15 means 15%). Send exactly one member of each pair. Unlike update sell price and update cost, this endpoint does not check the pair for you, so a mistake here fails quietly instead of returning a 400. Send both members and the percentage is used, ignoring the absolute amount. Send a percentage without its basis and there is nothing to calculate it from, so the item is created with no price at all. Per-item SetDefault saves this item’s sell price as the default on the catalog item, so later proposals start with it. It persists nothing else on the item.
This endpoint is not idempotent. A retried call adds another copy of the item rather than reconciling with the first, so confirm with get proposal before repeating a request that may have already landed.

Nesting and attachments

ParentProposalItemIds nests the new item under an existing one. Matching is per area option: in each target option, the new item nests under whichever listed parent lives in that same option, and sits at top level where none does. Nesting is read back as parentId, and children’s prices can be folded into the parent’s displayed total with set combined pricing. IncludeAttachments is separate — it adds the items the catalog item is configured to bring along, nested under the new item. It defaults to true; pass false to skip them. Attachment items are not part of this call’s response and may take a moment to appear, so re-fetch the proposal to read them.

Adding several items at once

items takes any number of entries, and they do not have to be the same type. This call adds a Part and a Labor line to area option 201, with the part nested under the existing item 5000:
The part nests under 5000 because that item sits in option 201; where none of the listed parents lives in a target option, the new item is added at that option’s top level instead. The labor line names no parent, so it starts at top level. Each entry is created once per area option it lists, so adding further proposalAreaOptions entries places copies across several options in the same call.

Authorizations

X-MSS-API-APPID
string
header
required

Portal application identifier used as part of HMAC-authenticated API requests.

X-MSS-API-USERKEY
string
header
required

Portal user API key used together with the HMAC signature headers.

X-MSS-CUSTOM-DATE
string
header
required

Timestamp header included in the signed request to prevent replay attacks.

X-MSS-SIGNATURE
string
header
required

HMAC-SHA256 signature for the request, calculated over the canonical string defined in the authentication docs.

Headers

Accept
enum<string>
required

Accept Header

Available options:
application/json

Path Parameters

ProposalId
integer<int32>
required

Unique ID of the proposal (not the proposal number).

Body

application/json

Proposals Service

items
PublicProposalItemModel · object[]
required

New items to add to the proposal. At least one item is required.

includeAttachments
boolean

(Optional) Also add the items attached to each newly created item, nested under it. Defaults to true - pass false to skip. Attachment items are not part of this call's response and may take a moment to appear; re-fetch the proposal to read them.

Response

Success

id
integer<int32>
required

Unique numeric identifier of the proposal item

referencedItemId
integer<int32>
required

Identifier of the catalog, labor, custom, or fee item this proposal item was created from

createdDate
string<date-time>
required

UTC timestamp when the proposal item was created

quantity
number<double>
required

Quantity of the proposal item

parentId
integer<int32>

Identifier of the parent item when this item is nested under another item

itemType
enum<string>
Available options:
Part,
Labor,
CustomItem,
Fee
lastModifiedDate
string<date-time>

UTC timestamp when the proposal item was last modified

brand
string

Brand name of the item

model
string

Model value of the item

name
string

Name of a Labor item

shortDescription
string

Short description shown for the proposal item

clientNote
string

Client-facing note for the proposal item

imageUrl
string

Image URL of the item

msrp
number<double>

MSRP amount of the item

sellPrice
number<double>

Sell price for the proposal item

cost
number<double>

Supplier cost for the proposal item

costUpdateDate
string<date-time>

UTC timestamp when the supplier cost was last updated

supplier
string

Display name of the supplier assigned to the item.

total
PublicItemTotalModel · object

Total amount for a proposal item

isTaxExempt
boolean

Whether the proposal item is tax exempt

isRecurringService
boolean

Whether the proposal item is a recurring service

linkedOrders
PublicLinkedOrderModel · object[]

Linked orders created from this proposal item