HubSpot CRM Quotes
For sales reps who quote out of HubSpot: find quotes by deal, status or expiration date, draft a new quote on a deal with its template and line items, adjust terms or expiry, and pull several quotes at once to see what is still waiting for a signature.
Connect this API to an AI agent Browse all specs
What you can do with HubSpot CRM Quotes via MCP
Every endpoint below becomes a governed tool your AI agent (Claude, ChatGPT, or a customer-facing VX agent) can call — with scoped permissions, sandbox testing, and audit logs.
| Method | Path | Operation | Description |
|---|---|---|---|
| GET | /crm/objects/2026-09/quotes |
listQuotes | List quotes, newest pages first, with chosen properties |
| POST | /crm/objects/2026-09/quotes |
createQuote | Create a draft quote, optionally linked to a deal, template and line items |
| GET | /crm/objects/2026-09/quotes/{objectId} |
getQuote | Get one quote with its properties and associated records |
| PATCH | /crm/objects/2026-09/quotes/{objectId} |
updateQuote | Update a quote's properties, such as title, expiry or status |
| POST | /crm/objects/2026-09/quotes/search |
searchQuotes | Search quotes by status, deal, owner or expiration date |
| POST | /crm/objects/2026-09/quotes/batch/read |
batchReadQuotes | Read several quotes by id in one call |
| PUT | /crm/objects/2026-09/quotes/{fromObjectId}/associations/default/{toObjectType}/{toObjectId} |
associateQuote | Link an existing quote to a deal, line item, contact or company |
Authentication
private_app_token
Bearer token — sent as Authorization: Bearer <token>
HubSpot private app access token (or an OAuth access token), sent as Authorization: Bearer <token>.
How to get a credential
- In HubSpot, open Development (or Settings > Integrations) > Legacy apps / Private apps.
- Click Create legacy app > Private, and name it (e.g. VX Agents quotes).
- On the Scopes tab add
crm.objects.quotes.readandcrm.objects.quotes.write. To link quotes to deals, line items and contacts also addcrm.objects.deals.read,crm.objects.line_items.readandcrm.objects.contacts.read. - Create the app and copy the access token (
pat-...).
Permissions used
| Scope | Operations |
|---|---|
crm.objects.quotes.read |
listQuotes, getQuote, searchQuotes, batchReadQuotes |
crm.objects.quotes.write |
createQuote, updateQuote, associateQuote |
Common errors
| Status | Meaning | Fix |
|---|---|---|
| 401 | Token missing, expired or revoked | Copy the token again from the private app; rotate it if it was revoked. |
| 403 | Scope missing | Add the scope from the table above to the private app and use the new token. |
| 400 | Invalid property name or value, or a quote without the required hs_title / hs_expiration_date |
Read the message and errors fields and fix the property. |
| 429 | Rate limit (per 10 seconds, or search per second) | Wait and retry; narrow searches instead of paging far. |
Store the token as a Bearer credential in VX Agents; never paste it into chat.
Usage guide
Setup
- Add a HubSpot private app token (
pat-...) as a VX Agents Bearer credential, with scopescrm.objects.quotes.readandcrm.objects.quotes.write. - Optional: pin
propertiesonlistQuotes/getQuotetohs_title,hs_status,hs_expiration_date,hs_quote_amount,hs_currency,hs_quote_link,hs_pdf_download_link,hubspot_owner_id, otherwise HubSpot returns only a few default fields.
Quote a deal
- Find open quotes with
searchQuotes:filterGroupsonhs_status(e.g.DRAFT,PENDING_APPROVAL,REJECTED),associations.dealEQ<deal id>, orhs_expiration_dateLT<Unix ms>for quotes about to expire. Addsortsandproperties; page withafter. getQuotewithassociations=deals,line_items,contactsto see what a quote is attached to;batchReadQuotesreads up to 100 quotes by id.- To draft a quote, show the user the details and confirm, then
createQuotewithproperties(required:hs_title,hs_expiration_datee.g.2026-12-31,hs_template_type=CPQ_QUOTE) andassociations, each{"to": {"id": "<id>"}, "types": [{"associationCategory": "HUBSPOT_DEFINED", "associationTypeId": <n>}]}. Type ids: line item 67, deal 64, contact 69, quote template 286. A quote needs a deal, a contact and line items; the template can only be set at creation. - To link a record later, confirm, then
associateQuotewithtoObjectType(deal,line_item,contact,company) andtoObjectId. - To change a quote, confirm, then
updateQuotewith only the changed properties. A published quote is locked: seths_statusback toDRAFTfirst.
Good to know
- Creating quotes needs a Revenue Hub Professional or Enterprise subscription; older Sales Hub accounts may only have legacy quotes.
hs_quote_linkandhs_pdf_download_linkare filled in after the quote is published.- Search date filters use Unix milliseconds; search returns at most 10,000 results and allows only a few requests per second.
- Quotes are customer-facing: confirm every create, update or association. Archiving quotes is not part of this spec.
Source: HubSpot Quotes API reference (https://developers.hubspot.com/docs/api-reference/latest/crm/objects/quotes/guide), checked 2026-10-22.
How to use this spec
- Create a free VX Agents account (sandbox tools included).
- Open the marketplace and connect “HubSpot CRM Quotes” to an agent.
- Expose it as an MCP server for Claude/ChatGPT, or chat with it directly.