Access the Zoho Books API with managed OAuth authentication. Manage invoices, contacts, bills, expenses, sales orders, purchase orders, and other accounting data with full CRUD operations.
Reference
Available Modules
Zoho Books organizes data into modules. Key modules include:
| Module | Endpoint | Description |
|---|---|---|
| Contacts | /contacts | Customers and vendors |
| Invoices | /invoices | Sales invoices |
| Bills | /bills | Vendor bills |
| Expenses | /expenses | Business expenses |
| Sales Orders | /salesorders | Sales orders |
| Purchase Orders | /purchaseorders | Purchase orders |
| Credit Notes | /creditnotes | Customer credit notes |
| Recurring Invoices | /recurringinvoices | Automated recurring invoices |
| Recurring Bills | /recurringbills | Automated recurring bills |
List Contacts
GET /zoho-books/books/v3/contactsExample:
python <<'EOF'
import urllib.request, os, json
req = urllib.request.Request('https://api.maton.ai/zoho-books/books/v3/contacts')
req.add_header('Authorization', f'Bearer {os.environ["MATON_API_KEY"]}')
print(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))
EOFResponse:
{
"code": 0,
"message": "success",
"contacts": [...],
"page_context": {
"page": 1,
"per_page": 200,
"has_more_page": false,
"sort_column": "contact_name",
"sort_order": "A"
}
}Get Contact
GET /zoho-books/books/v3/contacts/{contact_id}Example:
python <<'EOF'
import urllib.request, os, json
req = urllib.request.Request('https://api.maton.ai/zoho-books/books/v3/contacts/8527119000000099001')
req.add_header('Authorization', f'Bearer {os.environ["MATON_API_KEY"]}')
print(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))
EOFCreate Contact
POST /zoho-books/books/v3/contacts
Content-Type: application/json
{
"contact_name": "Customer Name",
"contact_type": "customer"
}Required Fields:
contact_name- Display name for the contactcontact_type- Eithercustomerorvendor
Optional Fields:
company_name- Legal entity nameemail- Email addressphone- Phone numberbilling_address- Address objectpayment_terms- Days for payment
Example:
python <<'EOF'
import urllib.request, os, json
data = json.dumps({
"contact_name": "Acme Corporation",
"contact_type": "customer",
"company_name": "Acme Corp",
"email": "billing@acme.com",
"phone": "+1-555-1234"
}).encode()
req = urllib.request.Request('https://api.maton.ai/zoho-books/books/v3/contacts', data=data, method='POST')
req.add_header('Authorization', f'Bearer {os.environ["MATON_API_KEY"]}')
req.add_header('Content-Type', 'application/json')
print(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))
EOFResponse:
{
"code": 0,
"message": "The contact has been added.",
"contact": {
"contact_id": "8527119000000099001",
"contact_name": "Acme Corporation",
"company_name": "Acme Corp",
"contact_type": "customer",
...
}
}Update Contact
PUT /zoho-books/books/v3/contacts/{contact_id}
Content-Type: application/json
{
"contact_name": "Updated Name",
"phone": "+1-555-9999"
}Example:
python <<'EOF'
import urllib.request, os, json
data = json.dumps({
"contact_name": "Acme Corporation Updated",
"phone": "+1-555-9999"
}).encode()
req = urllib.request.Request('https://api.maton.ai/zoho-books/books/v3/contacts/8527119000000099001', data=data, method='PUT')
req.add_header('Authorization', f'Bearer {os.environ["MATON_API_KEY"]}')
req.add_header('Content-Type', 'application/json')
print(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))
EOFDelete Contact
DELETE /zoho-books/books/v3/contacts/{contact_id}Example:
python <<'EOF'
import urllib.request, os, json
req = urllib.request.Request('https://api.maton.ai/zoho-books/books/v3/contacts/8527119000000099001', method='DELETE')
req.add_header('Authorization', f'Bearer {os.environ["MATON_API_KEY"]}')
print(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))
EOFResponse:
{
"code": 0,
"message": "The customer has been deleted."
}List Invoices
GET /zoho-books/books/v3/invoicesExample:
python <<'EOF'
import urllib.request, os, json
req = urllib.request.Request('https://api.maton.ai/zoho-books/books/v3/invoices')
req.add_header('Authorization', f'Bearer {os.environ["MATON_API_KEY"]}')
print(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))
EOFGet Invoice
GET /zoho-books/books/v3/invoices/{invoice_id}Create Invoice
POST /zoho-books/books/v3/invoices
Content-Type: application/json
{
"customer_id": "8527119000000099001",
"line_items": [
{
"item_id": "8527119000000100001",
"quantity": 1,
"rate": 100.00
}
]
}Required Fields:
customer_id- Customer identifierline_items- Array of items withitem_idor manual entry
Optional Fields:
invoice_number- Auto-generated if not specifieddate- Invoice date (yyyy-mm-dd format)due_date- Payment due datediscount- Percentage or fixed amountpayment_terms- Days until due
Update Invoice
PUT /zoho-books/books/v3/invoices/{invoice_id}Delete Invoice
DELETE /zoho-books/books/v3/invoices/{invoice_id}Invoice Actions
# Mark as sent
POST /zoho-books/books/v3/invoices/{invoice_id}/status/sent
# Void invoice
POST /zoho-books/books/v3/invoices/{invoice_id}/status/void
# Email invoice
POST /zoho-books/books/v3/invoices/{invoice_id}/emailList Bills
GET /zoho-books/books/v3/billsExample:
python <<'EOF'
import urllib.request, os, json
req = urllib.request.Request('https://api.maton.ai/zoho-books/books/v3/bills')
req.add_header('Authorization', f'Bearer {os.environ["MATON_API_KEY"]}')
print(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))
EOFCreate Bill
POST /zoho-books/books/v3/bills
Content-Type: application/json
{
"vendor_id": "8527119000000099002",
"bill_number": "BILL-001",
"date": "2026-02-06",
"line_items": [
{
"account_id": "8527119000000100002",
"description": "Office Supplies",
"amount": 150.00
}
]
}Required Fields:
vendor_id- Vendor identifierbill_number- Unique bill numberdate- Bill date (yyyy-mm-dd)
Update Bill
PUT /zoho-books/books/v3/bills/{bill_id}Delete Bill
DELETE /zoho-books/books/v3/bills/{bill_id}List Expenses
GET /zoho-books/books/v3/expensesExample:
python <<'EOF'
import urllib.request, os, json
req = urllib.request.Request('https://api.maton.ai/zoho-books/books/v3/expenses')
req.add_header('Authorization', f'Bearer {os.environ["MATON_API_KEY"]}')
print(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))
EOFCreate Expense
POST /zoho-books/books/v3/expenses
Content-Type: application/json
{
"account_id": "8527119000000100003",
"date": "2026-02-06",
"amount": 75.50,
"paid_through_account_id": "8527119000000100004",
"description": "Business lunch"
}Required Fields:
account_id- Expense account IDdate- Expense date (yyyy-mm-dd)amount- Expense amountpaid_through_account_id- Payment account ID
Optional Fields:
description- Expense detailscustomer_id- Billable customer IDis_billable- Boolean for billable expensesproject_id- Associated project
Update Expense
PUT /zoho-books/books/v3/expenses/{expense_id}Delete Expense
DELETE /zoho-books/books/v3/expenses/{expense_id}List Sales Orders
GET /zoho-books/books/v3/salesordersCreate Sales Order
POST /zoho-books/books/v3/salesordersList Purchase Orders
GET /zoho-books/books/v3/purchaseordersCreate Purchase Order
POST /zoho-books/books/v3/purchaseordersList Credit Notes
GET /zoho-books/books/v3/creditnotesList Recurring Invoices
GET /zoho-books/books/v3/recurringinvoicesList Recurring Bills
GET /zoho-books/books/v3/recurringbills