A very quick article updated for 2026 and tested as working to attach a file to a bill in Zoho Books over API.
Why?
There's been some changes (endpoints) as well as the official documentation not helping tremendously. I'm scribbling it here so I can refer to how you attach a document to a record in Zoho Books.
The bigger part of this component is in a solution which replaces the autoscan feature in Zoho Books for received documents (Supplier/Vendor Invoices received to trigger the conversion of the relevant Purchase Order into a Bill and then attach the received invoice to the Bill).
How?
The key part that I was missing was step 2 in the below. Otherwise I would always get the error
{"code":2,"message":"The request passed is not valid."}Note this is on the EU domain and with the updated Zoho Books API endpoints:
copyraw
/*
{"code":2,"message":"The request passed is not valid."}
Scope(s) required: ZohoBooks.bill.CREATE, ZohoBooks.documents.READ
*/
v_OrgID = organization.get("organization_id");
v_BillID = bill.get("bill_id");
v_DocumentID = document.get("document_id");
//
// 1. Download the document as a file
f_DocumentFile = invokeurl
[
url :"https://www.zohoapis.eu/books/v3/documents/" + v_DocumentID + "?organization_id=" + v_OrgID
type :GET
connection:"zb_doc_get"
];
//
// 2. Prep binary for request
m_File = {"paramName":"attachment","content":f_DocumentFile};
//
// 3. Attach document to bill
r_Attach = invokeurl
[
url :"https://www.zohoapis.eu/books/v3/bills/" + v_BillID + "/attachment?organization_id=" + v_OrgID
type :POST
files:m_File
connection:"zb_bill_create"
];
info r_Attach;
- /*
- {"code":2,"message":"The request passed is not valid."}
- Scope(s) required: ZohoBooks.bill.CREATE, ZohoBooks.documents.READ
- */
- v_OrgID = organization.get("organization_id");
- v_BillID = bill.get("bill_id");
- v_DocumentID = document.get("document_id");
- //
- // 1. Download the document as a file
- f_DocumentFile = invokeurl
- [
- url :"https://www.zohoapis.eu/books/v3/documents/" + v_DocumentID + "?organization_id=" + v_OrgID
- type :GET
- connection:"zb_doc_get"
- ];
- //
- // 2. Prep binary for request
- m_File = {"paramName":"attachment","content":f_DocumentFile};
- //
- // 3. Attach document to bill
- r_Attach = invokeurl
- [
- url :"https://www.zohoapis.eu/books/v3/bills/" + v_BillID + "/attachment?organization_id=" + v_OrgID
- type :POST
- files:m_File
- connection:"zb_bill_create"
- ];
- info r_Attach;
Category: Zoho Books :: Article: 1725


