I've discovered a bug in how Zoho's API Console handles the OAuth 2.0 authorization flow when the state parameter contains pipe characters (|), and I'm hoping the Zoho team can address this in a future update.
The Issue
Zoho's OAuth 2.0 implementation for server-based client applications uses the standard authorization endpoint:
https://accounts.zoho.com/oauth/v2/auth?response_type=code
&client_id=<client_id>
&scope=<scope>
&redirect_uri=<redirect_uri>
&access_type=offline
&state=<state_value>
While Zoho's
documentation does not explicitly list the
state parameter, it is a standard part of the OAuth 2.0 specification (
RFC 6749 Section 4.1.1) and is widely used for CSRF protection and maintaining application state through the authorization flow.
However, when the state parameter contains pipe characters (|), Zoho's authorization server fails to process the request correctly, preventing users from authorizing the connection. This occurs whether the pipe characters are URL-encoded (%7C) or left unencoded.
The Problem
The pipe character is a standard delimiter in multi-part state values, particularly when passing a combination of a CSRF token and a return URL. This behavior—failing on both encoded and unencoded pipe characters—is often indicative of overly restrictive input validation or a "leaky" WAF/Proxy layer that decodes parameters before the application logic can handle them.
| State Value |
As Sent in URL |
Result |
abc123xyz |
state=abc123xyz |
✓ Works correctly |
session_12345 |
state=session_12345 |
✓ Works correctly |
user|action|timestamp |
state=user|action|timestamp (unencoded pipes) |
✗ Authorization fails |
user|action|timestamp |
state=user%7Caction%7Ctimestamp (URL-encoded pipes) |
✗ Authorization fails |
user:action:timestamp |
state=user%3Aaction%3Atimestamp |
? Not tested |
Note: Pipe characters cause failures whether URL-encoded or not. Other special characters/delimiters have not been tested and may or may not exhibit similar issues.
RFC 6749 Compliance Issue
Section 4.1.1 - Authorization Request:
"state: RECOMMENDED. An opaque value used by the client to maintain state between the request and callback."
Section 4.1.2 - Authorization Response:
"state: REQUIRED if the 'state' parameter was present in the client authorization request. The exact value received from the client."
The RFC explicitly defines the state parameter as an opaque value. This means:
- The Authorization Server should not be looking "inside" or parsing the string at all
- The state value must pass through the authorization process unchanged
- Any URL-encoded characters should be handled transparently
- The exact value received must be returned to the client in the redirect
Key Point: By definition, an "opaque" parameter means the authorization server must treat it as a data blob—accepting it, storing it, and returning it without any interpretation or transformation.
Current Behavior vs Expected Behavior
| Current Behavior |
Expected Behavior (Per RFC 6749) |
1. Client sends: state=user|action|123
(or state=user%7Caction%7C123)
2. Zoho fails to parse the state parameter
3. Authorization server returns HTTP 400 Bad Request
4. User cannot authorize the connection
|
1. Client sends: state=user|action|123
2. Zoho treats state as opaque data blob
3. User authorizes the connection
4. Redirect includes the exact value received:
state=user|action|123
(or consistently encoded as sent)
|
The Current Workaround (Suboptimal)
Important: The workarounds below only apply if you have control over the client application generating the OAuth request. If you're integrating with a third-party application that sets the state parameter (e.g., integration platforms, SaaS tools, enterprise software), you have no ability to modify the state value and therefore no workaround is available. You are completely blocked from completing the OAuth flow.
For developers who do control the client application, you must avoid pipe characters entirely:
// Instead of using pipes as delimiters:
state = csrf_token + "|" + user_id + "|" + redirect_path;
// ❌ This breaks Zoho's authorization flow
// Developers must use alternative approaches:
state = csrf_token + "_SEP_" + user_id + "_SEP_" + redirect_path;
// or
state = base64_encode(json_encode({"csrf": token, "user": id, "path": path}));
// or
state = csrf_token; // Store other data server-side keyed by CSRF token
Problems with these workarounds:
- Requires refactoring existing codebases that use pipe delimiters
- Base64 encoding increases state parameter length significantly, risking URL length limits (particularly in older browsers and some enterprise proxies which enforce ~2000 character limits)
- Server-side storage approach adds complexity, database overhead, and potential race conditions
- Inconsistent with how the same code works with other OAuth providers (Google, Microsoft, etc.)
- Developers may not discover this issue until production deployment
- Custom delimiters (like
_SEP_) are non-standard and may conflict with actual data values
What Should Happen Instead
Proposed Solution:
Zoho's authorization server should properly handle URL-encoded pipe characters (%7C) in the state parameter, as required by RFC 6749. The state value must be treated as an opaque data blob.
Technical Requirement: Treat state as a Data Blob
| 1. Input |
Accept %7C (and other encoded characters) as valid parts of the query string without triggering validation errors or WAF rules |
| 2. Persistence |
Store the string exactly as received during the user's login/consent session—do not decode, parse, or transform |
| 3. Output |
Append the exact string back to the redirect_uri without additional transformations that might strip or corrupt the delimiters |
This approach:
- Complies with RFC 6749's requirement to return "the exact value received"
- Follows the same behavior as other major OAuth providers
- Requires no changes from client applications
- Unblocks third-party integrations that cannot modify their state format
Real-World Impact
This limitation affects any integration where:
- Third-party applications set the state parameter and cannot be modified (integration platforms, SaaS connectors, enterprise software)
- Multi-tenant applications need to encode tenant ID and return URL in state
- CSRF protection implementations combine security tokens with application state
- Single Sign-On flows need to preserve original request context
- Migration projects from other OAuth providers that used pipe delimiters
Critical Blocker: When the state parameter originates from a third-party system outside your control, there is no workaround available. The integration is completely impossible until this is fixed.
Security Note: The state parameter is critical for CSRF protection in OAuth flows. Forcing developers to change their state encoding approach may inadvertently introduce security vulnerabilities if not handled carefully.
Request to Zoho Team
Can this be addressed in a future update?
This is a standards compliance issue that impacts developers integrating with Zoho's API. For those who control their client application, the current implementation forces unnecessary workarounds. For those integrating third-party applications, the situation is worse:
1. Custom development
Refactor code to avoid pipe characters, creating Zoho-specific OAuth handling
|
2. Third-party integrations
No workaround possible - integration is completely blocked
|
Users should not be blocked from integrating with Zoho due to non-standard OAuth implementation.
Community Input Requested: Has anyone else encountered this issue? Are there other special characters that cause similar problems with Zoho's OAuth implementation?
📚 Documentation References:
Recent Topics
New integration: Zoho Sign for Zoho Projects
Hey there! We’re excited to announce the brand-new Zoho Sign integration for Zoho Projects! With this integration, users can now send documents for signatures, track their progress, and manage approvals—all without leaving Zoho Projects. This bridges
Update to attachment display in ticket threads
This enhancement will provide faster access for support teams and end-users, significantly boosting productivity for everyone. Get ready for a more efficient and satisfying experience! Immediate benefits Faster ticket rendering reduces wait times and
Narrative 15: Blueprint - Automate, guide, and transform your support processes
Behind the scenes of a successful ticketing system: BTS Series Narrative 15: Blueprint - Automate, guide, and transform your support processes Even organizations that deliver quality products and services can face low customer satisfaction when their
Different MRP / Pricing for same product but different batches
We often face the following situations where MRP of a particular product changes on every purchase and hence we have to charge the customer accordingly. This can't be solved by Batch tracking as of now so far as I understand Zoho. How do you manage it as of now?
ZOHO BOOKS - RECEIVING MORE ITEMS THAN ORDERED
Hello, When trying to enter a vendor's bill that contains items with bigger quantity than ordered in the PO (it happens quite often) - The system would not let us save the bill and show this error: "Quantity recorded cannot be more than quantity ordered."
Refresh frequency
Dear Zoho Team, I really, truly appreciate that Zoho Books gets frequent updates. As a matter of fact this is how a good SaaS company should stay on top. However, I feel that I have to hit refresh almost every day. This was exciting at the beginning but
Refund
My plan expired today, and I updated my payment details with a new credit card. At the same time, I wanted to downgrade, but the system wouldn’t allow the downgrade until the payment details were updated. As a result, I was charged for the same plan before
Calling Function via REST API with API Key gives 401 using Zoho Developer
Hi, I created a couple of functions using the one month trial of Enterprise edition, which I was able to call using the API Key method from Postman and from an external site. Now that my trial has expired, I have created the same functions in the Developer
Error due to - 'Internal Exception' when uploading Sign-generated PDF file to workdrive via Deluge in Zoho CRM
Hi I wasnt getting this error a few days ago and my code had not changed, so I'm wondering if there's a Zoho bug somewhere? I am downloading a PDF file from a Zoho Sign url using invokeurl and then uploading it to a Workdrive folder using zoho.workdrive.uploadFile.
Embed CRM record images in email templates
I have email templates that I want to embed dynamic images in their body - not as an attachment. For the context, the image is a QR code individual to each contact. So there are couple of challenges for which I think there is no solution in CRM: 1/ I
Assign multiple departments to multiple helpcenters
Hi there! I have a reseller company for a software and I'm using Zoho Desk as my helpcenter and ticket management system. The software is great and I would like to make a suggestion! With multi-branding activated, your departments that visible in help
Zoho Desk Training
Hello, We've had Zoho desk for a while now, but we run into issues occasionally, and I was wondering if there was a customer who currently uses it and really enjoys the functionality, that would be wiling to chat with us?
PO Based Advance payment to Vendor
We recommend to introduce a provision at PO to make advance payment to vendors and auto apply that advance paid later at the time of Vendor Bill submission for that PO. This will help us track PO-wise Total Payments.
How to get Quickbooks Desktop Info into Zoho?
Our team has used Quickbooks desktop for years and is looking at switching to Zoho books in 2026. I want to bring all old sales history over since we use Zoho CRM. I can export Item sales history and generic sales orders from Quickbooks desktop. How do
ZeptoMail API Request
We tried to send mail using ZeptoMail using Django. Following is my payload {'from': {'address': 'abc@abc.com'}, 'to': [{'email_address': {'address': 'xyz@xyz.in', 'name': 'Bhavik'}}], 'subject': 'Report Name', 'htmlbody': '<p>Test</p>'} Following is
Mass import of documents into Zoho Writer
I'm using Google's word processor at the moment but feel that Zoho does a better job (on the online apps market). Iwant to move my documents (about 50-70) to Zoho but it seems to me that I have to import them seperately. Is it already possible to upload several documents at a time or is this a forthcoming feature? Cheers Rolli :?:
Add home page or dashboard in CRM customer portal
is it possible to add home page or dashboard in CRM customer portal?
User Tips: How to change the the label display name of a system defined field
Most users know how to change field label names via Settings > Modules & Fields but if you want to change the name of a system defined field you can’t as there is no “edit properties” option. However with a simple hack you can edit any system defined
Zoho CRM Community Digest - October 2025 | Part 1
Hello Everyone! Here's a quick recap of first two weeks of October! Product Updates: Zoho CRM Android App Update: Surveys, Blueprints, and Smarter Mobile Features! Zoho CRM’s Android app just got a useful upgrade. You can now share records, upload your
Automate onboarding emails with CRM Workflow and Accounts module
We’re a B2B SaaS company selling to public-sector organisations. Each organisation is stored as an Account in Zoho CRM, and each organisation typically has multiple associated Contacts. Our backend syncs product-usage data (setup status, user activity,
Important update: Enhanced security measures for account operations in Zoho Cliq
Greetings from the Zoho Cliq team! We’d like to share an important security update that has an influence on some admin actions such as password reset, MFA reset, and MFA backup code generation. What’s changing? With our latest security enhancements, these
Sales Receipts Duplicating when I run reports why and how do we rectify this and any other report if this happens
find attached extract of my report
No Functional Autosave or Manual Save Button
Application : Zoho Notebook So I wanted to try Zoho Notebook(On Ubuntu) as an application, I installed the application and went solving my LeetCode problems visually(Drawing mode), at one point the app just stopped saving anything... Every time I tried
Enterprise subscription support
My organization sells subscription services to enterprise customers, which is a different model from the consumer subscription model that Zoho Billing has been designed to support and I beleve this capability should be added. An enterprise subscription
Issue with Creator's IF logic
Hi, I found the following code produces unexpected results: if(-1.0 < 0.0000000) { info "True"; } else { info "False"; } if(-1.0 < 0.000000) { info "True"; } else { info "False"; } The output returned is: False True However, the
Need option to send Package PDF in shipment email (Shipment PDF is missing Lot info)
Is there any way to automatically attach the Package PDF instead of (or alongside) the Shipment PDF in the notification emails? We really need this feature because the default Shipment PDF creates a blind spot for our customers. It does not display Batch/Lot
zoho creator view is not present in the workspace and blank reports
Hi Support, Users who have "write" permissions keep getting this error for all of our embedded reports all of a sudden. See screen shot below: Meanwhile, my developer permissions account sees a blank screen in view and edit mode as shown in the screenshots
Customize portal email template
Can i fetch only first name of the user in portal email template instead of the below code Hi ${User.FULL_NAME}
Can't we let users decide which options they'd like to add at embed widget?
It seems embed widget DOES NOT offer a feature, where users can choose options upon subscribing plans. What Zoho has instead, is that admins have to manually create plan with options. How come no one in Zoho dev team never raised issue about usability
Reupload and rename from one field to another field (file upload)
Hi Everyone, Sorry, i have question to use invoke url for rename and reupload attachments file to another field. Tested on development mode. Zoho C6. Refer to https://www.zoho.com/creator/help/api/v2/upload-file.html look my error notification. Does anyone
Printing Multi-Page Reports (PDF Export)
Hi, I am moving a report from Google's Looker Studio to Zoho Analytics and trying to reproduce the Looker page by page dashboard editing experience. With Google, what you see is what you get when you print to PDF. But I can't seem to create the same experience
I NEED TO NUMBER TO TEXT NO HERE
=NUMBERTEXT NEEED
Error: View is not present in the workspace
When saving a dashboard, user receives a popup with the following error. "View is not present in the workspace" What does this mean or refer to? There is no further insight given.
Dear Zoho CEO: Business Growth is about how you prioritise!
All of us in business know that when you get your priorities right, your business grows. Zoho CRM and Zoho Books are excellent products, but sadly, Zoho Inventory continues to lag behind. Just this morning, I received yet another one-sided email about
Bin Locations
Dear all, I am wondering if someone has the ability to develop the bin locations option for zoho inventory (integrated with zoho books) Regards, Ryan
Create and populate a record in an instant: Introducing zero-shot field prompting to Zia's ICR
A couple of months ago, we upgraded our in-house AI image detection and validation tool, Zia Vision, with intelligent character recognition (ICR). By training Zia with sample images, you could create and enrich CRM records with data extracted from standard
How to Prevent Users From Skipping LMS Videos in Zoho People
How to Prevent Users From Skipping LMS Videos in Zoho People Hello Zoho Developers, In this blog, we will quickly look at how you can stop users from skipping or fast-forwarding videos in Zoho People LMS. Zoho People provides a feature called Disable
[Integration Edition] Deluge Learning Series – Custom API with Deluge | November 2025
We’re excited to conclude this four-month Integration Edition of the Deluge Learning Series: Session 1 – Integrating Zoho Apps with Deluge Using Built-In Integration Tasks Session 2 – Integrating Zoho Apps with Deluge Using invokeURL and invokeAPI Session
Tips for Organizing Workflows and Improving Team Coordination in Zoho
Hi everyone, I’m looking for some general advice on how different teams are organizing their daily work within Zoho’s apps. Our team recently expanded, and we’re trying to streamline how tasks, discussions, and documents are shared so everything stays
Prevent user from viewing all records?
I have a report that is meant to be used by vendors to view only the records that are assigned to them. All the vendor information is stored in a separate application, so I need to call a function to get the current user's ID (not the zoho user ID). The report settings criteria doesn't support using function calls, so instead I'm embedding the report in an html page like this: if (thisapp.Global.CurrentUserIs("Vendor")) { personID = common.getLoggedInPersonID(); query = "Assigned_Vendor.ID="
Next Page