Access the Zoho People API with managed OAuth authentication. Manage employees, departments, designations, attendance, leave, and custom HR forms with full CRUD operations.
# List all employees
python <<'EOF'
import urllib.request, os, json
req = urllib.request.Request('https://api.maton.ai/zoho-people/people/api/forms/employee/getRecords?sIndex=1&limit=10')
req.add_header('Authorization', f'Bearer {os.environ["MATON_API_KEY"]}')
print(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))
EOF
https://api.maton.ai/zoho-people/{native-api-path}
Maton proxies requests to people.zoho.com and automatically injects your OAuth token.
All requests require the Maton API key in the Authorization header:
Authorization: Bearer $MATON_API_KEY
Environment Variable: Set your API key as MATON_API_KEY:
export MATON_API_KEY="YOUR_API_KEY"
The following endpoints are Maton platform operations for managing the OAuth connection to Zoho People — they are not part of the Zoho People API itself. Only the endpoints listed in the API Reference section below are proxied to Zoho People.
python <<'EOF'
import urllib.request, os, json
req = urllib.request.Request('https://api.maton.ai/connections?app=zoho-people&status=ACTIVE')
req.add_header('Authorization', f'Bearer {os.environ["MATON_API_KEY"]}')
print(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))
EOF
python <<'EOF'
import urllib.request, os, json
data = json.dumps({'app': 'zoho-people'}).encode()
req = urllib.request.Request('https://api.maton.ai/connections', 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))
EOF
python <<'EOF'
import urllib.request, os, json
req = urllib.request.Request('https://api.maton.ai/connections/{connection_id}')
req.add_header('Authorization', f'Bearer {os.environ["MATON_API_KEY"]}')
print(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))
EOF
Response:
{
"connection": {
"connection_id": "{connection_id}",
"status": "ACTIVE",
"creation_time": "2026-02-06T07:42:07.681370Z",
"last_updated_time": "2026-02-06T07:46:12.648445Z",
"url": "https://connect.maton.ai/?session_token=...",
"app": "zoho-people",
"metadata": {}
}
}
Open the returned url in a browser to complete OAuth authorization.
python <<'EOF'
import urllib.request, os, json
req = urllib.request.Request('https://api.maton.ai/connections/{connection_id}', method='DELETE')
req.add_header('Authorization', f'Bearer {os.environ["MATON_API_KEY"]}')
print(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))
EOF
If you have multiple Zoho People connections, specify which one to use with the Maton-Connection header:
python <<'EOF'
import urllib.request, os, json
req = urllib.request.Request('https://api.maton.ai/zoho-people/people/api/forms')
req.add_header('Authorization', f'Bearer {os.environ["MATON_API_KEY"]}')
req.add_header('Maton-Connection', '{connection_id}')
print(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))
EOF
If you have multiple connections, always include this header to ensure requests go to the intended account.
formLinkName.Get a list of all available forms in your Zoho People account.
GET /zoho-people/people/api/forms
Example:
python <<'EOF'
import urllib.request, os, json
req = urllib.request.Request('https://api.maton.ai/zoho-people/people/api/forms')
req.add_header('Authorization', f'Bearer {os.environ["MATON_API_KEY"]}')
print(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))
EOF
Response:
{
"response": {
"result": [
{
"componentId": 943596000000035679,
"iscustom": false,
"displayName": "Employee",
"formLinkName": "employee",
"PermissionDetails": {
"Add": 3,
"Edit": 3,
"View": 3
},
"isVisible": true,
"viewDetails": {
"view_Id": 943596000000035705,
"view_Name": "P_EmployeeView"
}
}
],
"message": "Data fetched successfully",
"status": 0
}
}
GET /zoho-people/people/api/forms/employee/getRecords?sIndex={startIndex}&limit={limit}
Query Parameters:
| Parameter | Type | Default | Description |
|---|---|---|---|
| ----------- | ------ | --------- | ------------- |
sIndex | integer | 1 | Starting index (1-based) |
limit | integer | 200 | Number of records (max 200) |
SearchColumn | string | - | EMPLOYEEID or EMPLOYEEMAILALIAS |
SearchValue | string | - | Value to search for |
modifiedtime | long | - | Timestamp in milliseconds for modified records |
Example:
python <<'EOF'
import urllib.request, os, json
req = urllib.request.Request('https://api.maton.ai/zoho-people/people/api/forms/employee/getRecords?sIndex=1&limit=10')
req.add_header('Authorization', f'Bearer {os.environ["MATON_API_KEY"]}')
print(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))
EOF
Response:
{
"response": {
"result": [
{
"943596000000294355": [
{
"FirstName": "Christopher",
"LastName": "Brown",
"EmailID": "christopherbrown@zylker.com",
"EmployeeID": "S20",
"Department": "Management",
"Designation": "Administration",
"Employeestatus": "Active",
"Gender": "Male",
"Date_of_birth": "02-Feb-1987",
"Zoho_ID": 943596000000294355
}
]
}
],
"message": "Data fetched successfully",
"status": 0
}
}
GET /zoho-people/api/forms/{viewName}/records?rec_limit={limit}
Example:
python <<'EOF'
import urllib.request, os, json
req = urllib.request.Request('https://api.maton.ai/zoho-people/api/forms/P_EmployeeView/records?rec_limit=10')
req.add_header('Authorization', f'Bearer {os.environ["MATON_API_KEY"]}')
print(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))
EOF
GET /zoho-people/people/api/forms/employee/getRecords?SearchColumn=EMPLOYEEID&SearchValue={employeeId}
Example:
python <<'EOF'
import urllib.request, os, json
req = urllib.request.Request('https://api.maton.ai/zoho-people/people/api/forms/employee/getRecords?SearchColumn=EMPLOYEEID&SearchValue=S20')
req.add_header('Authorization', f'Bearer {os.environ["MATON_API_KEY"]}')
print(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))
EOF
GET /zoho-people/people/api/forms/employee/getRecords?SearchColumn=EMPLOYEEMAILALIAS&SearchValue={email}
GET /zoho-people/people/api/forms/department/getRecords?sIndex={startIndex}&limit={limit}
Example:
python <<'EOF'
import urllib.request, os, json
req = urllib.request.Request('https://api.maton.ai/zoho-people/people/api/forms/department/getRecords?sIndex=1&limit=50')
req.add_header('Authorization', f'Bearer {os.environ["MATON_API_KEY"]}')
print(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))
EOF
Response:
{
"response": {
"result": [
{
"943596000000294315": [
{
"Department": "IT",
"Department_Lead": "",
"Parent_Department": "",
"Zoho_ID": 943596000000294315
}
]
}
],
"message": "Data fetched successfully",
"status": 0
}
}
GET /zoho-people/people/api/forms/designation/getRecords?sIndex={startIndex}&limit={limit}
Example:
python <<'EOF'
import urllib.request, os, json
req = urllib.request.Request('https://api.maton.ai/zoho-people/people/api/forms/designation/getRecords?sIndex=1&limit=50')
req.add_header('Authorization', f'Bearer {os.environ["MATON_API_KEY"]}')
print(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))
EOF
Response:
{
"response": {
"result": [
{
"943596000000294399": [
{
"Designation": "Team Member",
"EEO_Category": "Professionals",
"Zoho_ID": 943596000000294399
}
]
}
],
"message": "Data fetched successfully",
"status": 0
}
}
Add a new record to any form.
POST /zoho-people/people/api/forms/json/{formLinkName}/insertRecord
Content-Type: application/x-www-form-urlencoded
inputData={field1:'value1',field2:'value2'}
Example - Create Department:
python <<'EOF'
import urllib.request, os, json
from urllib.parse import urlencode
inputData = json.dumps({"Department": "Engineering"})
data = urlencode({"inputData": inputData}).encode()
req = urllib.request.Request('https://api.maton.ai/zoho-people/people/api/forms/json/department/insertRecord', data=data, method='POST')
req.add_header('Authorization', f'Bearer {os.environ["MATON_API_KEY"]}')
req.add_header('Content-Type', 'application/x-www-form-urlencoded')
print(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))
EOF
Response:
{
"response": {
"result": {
"pkId": "943596000000300001",
"message": "Successfully Added"
},
"message": "Data added successfully",
"status": 0
}
}
Modify an existing record.
POST /zoho-people/people/api/forms/json/{formLinkName}/updateRecord
Content-Type: application/x-www-form-urlencoded
inputData={field1:'newValue'}&recordId={recordId}
Example - Update Employee:
python <<'EOF'
import urllib.request, os, json
from urllib.parse import urlencode
inputData = json.dumps({"Department": "Engineering"})
data = urlencode({
"inputData": inputData,
"recordId": "943596000000294355"
}).encode()
req = urllib.request.Request('https://api.maton.ai/zoho-people/people/api/forms/json/employee/updateRecord', data=data, method='POST')
req.add_header('Authorization', f'Bearer {os.environ["MATON_API_KEY"]}')
req.add_header('Content-Type', 'application/x-www-form-urlencoded')
print(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))
EOF
GET /zoho-people/people/api/forms/leave/getRecords?sIndex={startIndex}&limit={limit}
POST /zoho-people/people/api/forms/json/leave/insertRecord
Content-Type: application/x-www-form-urlencoded
inputData={Employee_ID:'EMP001',Leavetype:'123456',From:'01-Feb-2026',To:'02-Feb-2026'}
Note: Attendance endpoints require additional OAuth scopes.
GET /zoho-people/people/api/attendance/getAttendanceEntries?date={date}&dateFormat={format}
Parameters:
| Parameter | Type | Description |
|---|---|---|
| ----------- | ------ | ------------- |
date | string | Date in organization format |
dateFormat | string | Date format (e.g., dd-MMM-yyyy) |
empId | string | Employee ID (optional) |
emailId | string | Employee email (optional) |
POST /zoho-people/people/api/attendance
Content-Type: application/x-www-form-urlencoded
dateFormat=dd/MM/yyyy HH:mm:ss&checkIn={datetime}&checkOut={datetime}&empId={empId}
| Form | formLinkName | Description |
|---|---|---|
| ------ | -------------- | ------------- |
| Employee | employee | Employee records |
| Department | department | Departments |
| Designation | designation | Job titles |
| Leave | leave | Leave requests |
| Clients | P_ClientDetails | Client information |
Zoho People uses index-based pagination:
GET /zoho-people/people/api/forms/{formLinkName}/getRecords?sIndex=1&limit=200
sIndex: Starting index (1-based)limit: Number of records per request (max 200)For subsequent pages:
sIndex=1&limit=200sIndex=201&limit=200sIndex=401&limit=200const response = await fetch(
'https://api.maton.ai/zoho-people/people/api/forms/employee/getRecords?sIndex=1&limit=10',
{
headers: {
'Authorization': `Bearer ${process.env.MATON_API_KEY}`
}
}
);
const data = await response.json();
import os
import requests
response = requests.get(
'https://api.maton.ai/zoho-people/people/api/forms/employee/getRecords',
headers={'Authorization': f'Bearer {os.environ["MATON_API_KEY"]}'},
params={'sIndex': 1, 'limit': 10}
)
data = response.json()
943596000000294355)Zoho_ID field in responses contains the record IDinputData JSONINVALID_OAUTHSCOPE error, contact Maton support at support@maton.ai with the specific operations/APIs you need and your use-caseresponse.result[] arraycurl -g when URLs contain special charactersjq or other commands, environment variables like $MATON_API_KEY may not expand correctly in some shell environments| Status | Meaning |
|---|---|
| -------- | --------- |
| 400 | Missing Zoho People connection or invalid request |
| 401 | Invalid or missing Maton API key, or invalid OAuth scope |
| 429 | Rate limited |
| 4xx/5xx | Passthrough error from Zoho People API |
| Code | Description |
|---|---|
| ------ | ------------- |
| 7011 | Invalid form name |
| 7012 | Invalid view name |
| 7021 | Maximum record limit exceeded (200) |
| 7024 | No records found |
| 7042 | Invalid search value |
| 7218 | Invalid OAuth scope |
MATON_API_KEY environment variable is set:echo $MATON_API_KEY
python <<'EOF'
import urllib.request, os, json
req = urllib.request.Request('https://api.maton.ai/connections')
req.add_header('Authorization', f'Bearer {os.environ["MATON_API_KEY"]}')
print(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))
EOF
zoho-people. For example:https://api.maton.ai/zoho-people/people/api/formshttps://api.maton.ai/people/api/forms共 3 个版本