Supported products
Supported products
Scope requirements
Scope requirements
Overview
At a high-level, you’ll typically follow the workflow below for creating and activating a price book:- Create a price book. New price books are always created as inactive.
- Update the name, description, and supported currencies as needed.
- Add products from your product library to the price book. Each added product becomes a price book item.
- Configure pricing on each price book item as needed.
- Validate the price book to surface any errors before activating.
- Activate the price book to make it available for use with deals, quotes, and contracts.
- If you need to delete a price book, you’ll first need to deactivate it, because active price books cannot be deleted.
- Use the associations API to associate the price book with a deal.
- From there, line item creation from price book items must happen in HubSpot. This applies to deals, quotes, and contracts.
The system automatically copies the price book association from the deal to the quote, and from an approved quote to the contract.
Price books
Create a price book
To create a price book, make aPOST request to /commerce/price-books/2026-09-beta/price-books. New price books are always created with an inactive status, which you can later update via the activate endpoint.
In the request body, include the name and supportedCurrencies fields at a minimum.
The response will include the properties you provided, along with a few other details such as the price book’s status and current count of products.
Retrieve price books
Retrieve all price books
To retrieve all price books in your account, make aGET request to /commerce/price-books/2026-09-beta/price-books. The endpoint returns a paginated list of price book records.
You can use the following optional query parameters:
paging field is omitted from the response.
Retrieve an individual price book
To retrieve an individual price book, make aGET request to /commerce/price-books/2026-09-beta/price-books/{priceBookId}.
The response will include the full set of price book properties.
Update a price book
To update a price book, make aPATCH request to /commerce/price-books/2026-09-beta/price-books/{priceBookId}. Only the properties included in the request body will be modified.
- The active/inactive state
statuscannot be changed via this endpoint. Use/activateand/deactivateinstead. - Only inactive price books can be updated.
name and supportedCurrencies properties.
Validate a price book
To validate a price book without changing itsstatus, make a POST request to /commerce/price-books/2026-09-beta/price-books/{priceBookId}/validate. The endpoint runs the same validation as /activate.
Validation checks for the following:
- The price book contains at least one product.
- Every product has a price defined for its pricing model.
- Every product has a price for each of the book’s supported currencies.
200, with an isValid field and errors array to show whether the book can be activated.
Valid response:
Manage price book state
A price book has two states, which can be managed using endpoints in this API:- Inactive: the default state on creation. While inactive, products can be added and modified along with the price book’s currencies, and the price book cannot be used on deals, quotes, and contracts.
- Active: an active price book is available for use on deals, quotes, and contracts, allows users to populate line items using items defined in the price book. Products cannot be added or modified while the price book is active.
Activate a price book
To activate a price book, make aPOST request to /commerce/price-books/2026-09-beta/price-books/{priceBookId}/activate. When hitting this endpoint, validation will be run against the price book items to ensure there are no issues.
Activating a price book sets its status to active and enables it for use in HubSpot. Activating an already-active book is a no-op that returns 200 with the current state.
Deactivate a price book
To deactivate a price book, make aPOST request to /commerce/price-books/2026-09-beta/price-books/{priceBookId}/deactivate.
Existing deals and quotes that reference this price book continue to resolve it by ID for historical accuracy.
Deactivating a price book sets its status to inactive and enables editing while preventing it from being used in HubSpot. Deactivating an already-inactive book is a no-op that returns 200 with the current state.
Delete a price book
To delete a price book, make aPATCH request to /commerce/price-books/2026-09-beta/price-books/{priceBookId}. In the request body, include { "archived": true }.
Price book items
Add a product to a price book
To add a product from your product library to a price book, make aPOST request to /commerce/price-books/2026-09-beta/price-books/{priceBookId}/items. In the request body, include a productId field with the ID of the product you want to copy to the price book.
If you haven’t created any products yet, you can do so via the products API.
price fields. Learn more about configuring tiered pricing via the products API.
The tabs below show example responses for adding a product with flat rate pricing and a product with tiered pricing.
- Basic product response
- Tiered product response
id in the response is the price book item ID (priceBookItemId), which you can use in subsequent /{priceBookId}/items/{priceBookItemId} requests to read, update, archive, or restore the item.
Batch add products to a price book
To add multiple products to a price book in a single request, make aPOST request to /commerce/price-books/2026-09-beta/price-books/{priceBookId}/items/batch/create. The price book must be inactive before adding products.
In the request body, include an inputs array with up to 100 entries. Each entry must include a productId field with the ID of the product to add.
For snapshot semantics and field behavior, refer to Add a product to a price book.
- If the same
productIdappears more than once in a request, duplicates are deduped and only one item is added, with no error. - If some inputs fail, the remaining inputs are still processed.
200 OK with a results[] array containing the full updated price book item for each input. If any inputs fail, the endpoint returns 207 Multi-Status with successes in results[] and per-input failures in errors[].
- 200 OK
- 207 Multi-Status
Retrieve price book items
Retrieve all items in a price book
To retrieve all items in a price book, make aGET request to /commerce/price-books/2026-09-beta/price-books/{priceBookId}/items. The endpoint returns a paginated list of price book item records scoped to the given price book.
You can use the following optional query parameters:
paging field is omitted from the response.
Retrieve an individual price book item
To retrieve a price book item, make aGET request to /commerce/price-books/2026-09-beta/price-books/{priceBookId}/items/{priceBookItemId}.
You can include the ?archived=true query parameter to return an archived price book item.
Update item pricing
To update item pricing, make aPATCH request to /commerce/price-books/2026-09-beta/price-books/{priceBookId}/items/{priceBookItemId}. The price book must be inactive before updating item pricing.
In the request body, you can specify new values for price fields as needed. Other properties, such as pricingModel, currencyCode, and maxQuantity are set at the time of creating the price book item, and cannot be changed. To change a price book item’s pricing tier configuration, you’ll need to archive the item, update the original product that the item was based on, then add it to the price book.
Partial price updates are supported, meaning you can pass in prices for a subset of the price book’s supported currencies, and the prices for the remaining currencies will remain unchanged.
The tabs below show example request bodies for flat and tiered price book items.
- Flat price book item
- Tiered price book item
Batch update item pricing
To update pricing for multiple items in a single request, make aPOST request to /commerce/price-books/2026-09-beta/price-books/{priceBookId}/items/batch/update. The price book must be inactive before updating item pricing.
In the request body, include an inputs array with up to 100 entries. Each entry must include an id field with the price book item ID, along with a properties object containing the details that you want to update.
- If the same
idappears more than once in a request, the inputs are processed in array order and the last write wins. - If some inputs fail, the remaining inputs are still processed.
200 OK with a results[] array containing the full updated price book item for each input. If any inputs fail, the endpoint returns 207 Multi-Status with successes in results[] and per-input failures in errors[].
- 200 OK
- 207 Multi-Status
Archive and restore a price book item
Both archiving and restoring a price book item usePATCH requests to /commerce/price-books/2026-09-beta/price-books/{priceBookId}/items/{priceBookItemId}.
To archive an item, include { "archived": true } in the request body. Archived items are moved to the CRM recycling bin and auto-purged after 90 days. Archiving an already-archived item is a no-op that returns 204.
?archived=true query parameter in the request URL, and include { "archived": false } in the request body.
Batch archive price book items
To archive multiple price book items in a single request, make aPOST request to /commerce/price-books/2026-09-beta/price-books/{priceBookId}/items/batch/archive.
Archived items are moved to the CRM recycling bin and auto-purged after 90 days. You can restore individual archived items using the restore endpoint.
In the request body, include an inputs array with up to 100 entries. Each entry must include an id field with the price book item ID.
204 No Content with no response body. If any inputs fail, the endpoint returns 207 Multi-Status with error details.
- 204 No Content
- 207 Multi-Status