Zoho People
Zoho People API integration with managed OAuth. Manage employees, departments, designations, attendance, and leave. Use this skill when users want to read, create, update, or query HR data like employ
Zoho People API integration with managed OAuth. Manage employees, departments, designations, attendance, and leave. Use this skill when users want to read, create, update, or query HR data like employ
Real data. Real impact.
Emerging
Developers
Per week
Open source
Skills give you superpowers. Install in 30 seconds.
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://gateway.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://gateway.maton.ai/zoho-people/{native-api-path}
Replace
{native-api-path} with the actual Zoho People API endpoint path. The gateway 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"
Manage your Zoho People OAuth connections at
https://ctrl.maton.ai.
python <<'EOF' import urllib.request, os, json req = urllib.request.Request('https://ctrl.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://ctrl.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://ctrl.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": "7d11ea2e-c580-43fe-bc56-d9d4765b9bc6", "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://ctrl.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://gateway.maton.ai/zoho-people/people/api/forms') req.add_header('Authorization', f'Bearer {os.environ["MATON_API_KEY"]}') req.add_header('Maton-Connection', '7d11ea2e-c580-43fe-bc56-d9d4765b9bc6') print(json.dumps(json.load(urllib.request.urlopen(req)), indent=2)) EOF
If omitted, the gateway uses the default (oldest) active connection.
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://gateway.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 |
|---|---|---|---|
| integer | 1 | Starting index (1-based) |
| integer | 200 | Number of records (max 200) |
| string | - | or |
| string | - | Value to search for |
| long | - | Timestamp in milliseconds for modified records |
Example:
python <<'EOF' import urllib.request, os, json req = urllib.request.Request('https://gateway.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://gateway.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://gateway.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://gateway.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://gateway.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-urlencodedinputData={field1:'value1',field2:'value2'}
Example - Create Department:
python <<'EOF' import urllib.request, os, json from urllib.parse import urlencodeinputData = json.dumps({"Department": "Engineering"}) data = urlencode({"inputData": inputData}).encode()
req = urllib.request.Request('https://gateway.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-urlencodedinputData={field1:'newValue'}&recordId={recordId}
Example - Update Employee:
python <<'EOF' import urllib.request, os, json from urllib.parse import urlencodeinputData = json.dumps({"Department": "Engineering"}) data = urlencode({ "inputData": inputData, "recordId": "943596000000294355" }).encode()
req = urllib.request.Request('https://gateway.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-urlencodedinputData={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 |
|---|---|---|
| string | Date in organization format |
| string | Date format (e.g., ) |
| string | Employee ID (optional) |
| string | Employee email (optional) |
POST /zoho-people/people/api/attendance Content-Type: application/x-www-form-urlencodeddateFormat=dd/MM/yyyy HH:mm:ss&checkIn={datetime}&checkOut={datetime}&empId={empId}
| Form | formLinkName | Description |
|---|---|---|
| Employee | | Employee records |
| Department | | Departments |
| Designation | | Job titles |
| Leave | | Leave requests |
| Clients | | 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://gateway.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 requestsresponse = requests.get( 'https://gateway.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://ctrl.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://gateway.maton.ai/zoho-people/people/api/formshttps://gateway.maton.ai/people/api/formsNo automatic installation available. Please visit the source repository for installation instructions.
View Installation Instructions1,500+ AI skills, agents & workflows. Install in 30 seconds. Part of the Torly.ai family.
© 2026 Torly.ai. All rights reserved.