Retrieving price books in Zoho CRM is straightforward once you know the two available API operations — one for listing all price books and one for fetching a specific record by ID.
Why this matters
Price books in Zoho CRM let you manage tiered or customer-specific pricing across your product catalogue. If you're building integrations, automations, or custom dashboards, you'll need to pull price book data programmatically. Knowing which endpoints to call — and how authentication flows into those calls — saves significant debugging time.
> Note: Beam Help is independent expert support for Zoho and is not official Zoho support.
---
Step-by-step
Step 1. Ensure your OAuth connection is established and your token is valid.
Before any API call, your integration must hold a valid access token for Zoho CRM. The connection layer checks token expiry and automatically refreshes using the stored refresh token when the token is within 120 seconds of expiring — so make sure your zoho_connections record is up to date before proceeding. [8]
Step 2. Initialise the CRM API client.
Call getzohoapi with the relevant userid and pass "crm" as the apptype. This returns an authenticated CRM API instance backed by the token-refresh logic described above. If no connection exists for the user, the function returns None — handle that case before continuing. [2]
Step 3. Retrieve all price books.
To fetch the full list of price books, issue a GET request to the /PriceBooks endpoint. In code, this maps to the getprice_books operation, which accepts an optional parameters dictionary (p):
def get_price_books(self, p: dict = None):
return self.c.request("GET", "/Price_Books", p or {})
Pass any supported query parameters (such as pagination or field filters) inside the p dict. If you have no filters, pass an empty dict or omit the argument entirely. [3]
Step 4. Retrieve a single price book by ID.
When you already know the price book's record ID, use the getpricebook operation instead. This issues a GET to /PriceBooks/{pbid}, substituting the actual ID into the path:
def get_price_book(self, pb_id: str):
return self.c.request("GET", f"/Price_Books/{pb_id}")
Supply the pb_id as a string. The response will contain the full record for that specific price book. [4]
Step 5. Confirm your OAuth scopes cover CRM modules.
Your registered OAuth application must include the appropriate Zoho CRM scopes. The scope configuration includes ZohoCRM.org.ALL and broad CRM module access — verify that your app's granted scopes are not more restrictive than what is configured, otherwise the /Price_Books calls will return authorisation errors. [5]
---
Common pitfalls
- Missing or expired access token. If
getzohoapireturnsNone, the connection record is absent or the refresh failed. Check that therefreshtokenstored inzohoconnectionsis still valid and has not been revoked. [2] - Incorrect
apptype. Price books live in Zoho CRM, not Zoho Desk. Always passapptype="crm"when initialising the API client — passing"desk"will route your request to the wrong client entirely. [2] - Empty parameter dict vs.
None. Thegetpricebooksmethod guards against aNonevalue by substituting an empty dict (p or {}), but if you're calling the underlying request layer directly, always pass a dict to avoid type errors. [3] - Data-centre mismatch. CRM URLs and API domains vary by data centre (e.g.,
.com,.eu,.in). Ensure theapi_domainstored in your connection record matches the data centre where your Zoho CRM org is hosted. [7]
---
What to check
- Token validity: Confirm the access token has been refreshed successfully and
tokenexpiresatis in the future before making price book requests. [8] - Correct endpoint response: A successful call to
GET /PriceBooksshould return a list of price book records; a call toGET /PriceBooks/{pb_id}should return a single record object — verify the response structure matches your expectations. [^3, ^4] - Scope coverage: Double-check that the OAuth scopes granted to your connected app include the necessary Zoho CRM permissions, so price book reads are not blocked at the authorisation layer. [5]