Skip to main content

Supported products

Price books are collections of product pricing that let you define tailored prices across regions, customer segments, and channels. Use this API to create price books, configure product pricing within them, and manage their lifecycle programmatically.

Overview

At a high-level, you’ll typically follow the workflow below for creating and activating a price book:
  1. Create a price book. New price books are always created as inactive.
  2. Update the name, description, and supported currencies as needed.
  3. Add products from your product library to the price book. Each added product becomes a price book item.
  4. Configure pricing on each price book item as needed.
  5. Validate the price book to surface any errors before activating.
  6. Activate the price book to make it available for use with deals, quotes, and contracts.
  7. If you need to delete a price book, you’ll first need to deactivate it, because active price books cannot be deleted.
Then, you’ll typically follow the workflow below to use price books with deals:
  1. Use the associations API to associate the price book with a deal.
  2. 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 a POST 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 a GET 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:
When there are no further records, the paging field is omitted from the response.

Retrieve an individual price book

To retrieve an individual price book, make a GET 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 a PATCH 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 status cannot be changed via this endpoint. Use /activate and /deactivate instead.
  • Only inactive price books can be updated.
For example, the request body below would set new values for the name and supportedCurrencies properties.
The response will include the full set of price book properties, including the ones you updated.

Validate a price book

To validate a price book without changing its status, 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.
If validation passes, the price book is ready to be activated. If validation fails, you’ll need to address the returned issues before you can activate it. Requests to this endpoint always return 200, with an isValid field and errors array to show whether the book can be activated. Valid response:
Invalid 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.
When activating a price book, a validator is run against all items in the price book. To check for issues before activating, you can use the validation endpoint.

Activate a price book

To activate a price book, make a POST 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 a POST 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

Please note:
  • Once a price book has been deleted, it cannot be restored.
  • A price book can only be deleted when its status is inactive. To delete an active price book, you’ll first need to deactivate it.
To delete a price book, make a PATCH 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 a POST 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.
You can retrieve product IDs via the Products API or by viewing the product’s Record ID property in HubSpot. Only one instance of each product can appear in a price book at a time.
After making the request, a price book item will be created based on the product’s properties, including the name, SKU, pricing information (in all currencies if applicable), billing period, and billing frequency. The source product is never modified by price book operations, similar to line items created from products. Tiered pricing is supported for price book items. The pricing model and tier configuration are carried over from the source product and cannot be modified after creation, with the only exception being the 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.
The 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 a POST 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 productId appears 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.
On full success, the endpoint returns 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[].

Retrieve price book items

Retrieve all items in a price book

To retrieve all items in a price book, make a GET 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:
When there are no further records, the paging field is omitted from the response.

Retrieve an individual price book item

To retrieve a price book item, make a GET 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 a PATCH 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.

Batch update item pricing

To update pricing for multiple items in a single request, make a POST request to /commerce/price-books/2026-09-beta/price-books/{priceBookId}/items/batch/update. The price book must be inactive before updating item pricing.
Please note: not all pricing fields can be updated via this API, and are instead set when initially creating the item. Learn more about updating product 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 id appears 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.
On full success, the endpoint returns 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[].

Archive and restore a price book item

Both archiving and restoring a price book item use PATCH 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.
To restore an archived item, include the ?archived=true query parameter in the request URL, and include { "archived": false } in the request body.
The item will be restored to active state once the request succeeds.
Please note: archive and restore request bodies must contain only { "archived": true } or { "archived": false }. Including any other fields will return an error. To update the pricing of an archived item, you’ll first need to restore the item, then make a separate PATCH request after restoration.

Batch archive price book items

To archive multiple price book items in a single request, make a POST 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.
On full success, the endpoint returns 204 No Content with no response body. If any inputs fail, the endpoint returns 207 Multi-Status with error details.
Last modified on July 27, 2026