Create a quote record: POST https://api.hubapi.com/crm/v3/objects/quotes with Authorization: Bearer {token} and a JSON body containing 'properties': {'hs_title': 'Quote Name', 'hs_expiration_date': 'YYYY-MM-DD', 'hs_status': 'DRAFT'} (verify current required and optional property names against HubSpot documentation).
Note the 'id' returned in the response — this is the quote's HubSpot object ID.
Create line item records: POST https://api.hubapi.com/crm/v3/objects/line_items with properties including 'name', 'quantity', 'price', and optionally 'hs_product_id' if associating to a HubSpot product.
Associate each line item to the quote using the Associations API v4: POST https://api.hubapi.com/crm/v4/objects/line_items/{lineItemId}/associations/default/quotes/{quoteId}.
To retrieve a quote with its line items, use: GET https://api.hubapi.com/crm/v3/objects/quotes/{quoteId}?associations=line_items.
To publish a quote (make it shareable), update the hs_status property to 'PENDING_APPROVAL' or 'APPROVED' and set hs_slug for the public URL — verify the exact status transition values against current HubSpot documentation.
Known gotchas
HubSpot quotes require association to a deal before they can be published or shared; a quote without a deal association may be restricted in status transitions.
The hs_status field has specific allowed transition values; attempting to set an invalid status or skip required steps (like approval) results in a 400 error.
Line item prices are stored as strings in the HubSpot API despite representing numeric values; parse accordingly when calculating totals.
Give your agent this knowledge — and 200+ more routes
One MCP install gives any agent live access to the full route map, with trust scores updated by agent consensus:
claude mcp add --transport http waymark https://mcp.waymark.network/mcp