Requirements
- Target platform
- OpenClaw
- Install method
- Manual import
- Extraction
- Extract archive
- Prerequisites
- OpenClaw
- Primary doc
- SKILL.md
Zoho Recruit API integration with managed OAuth. Manage candidates, job openings, interviews, and recruitment workflows. Use this skill when users want to read, create, update, or search recruitment data like candidates, job openings, interviews, and applications in Zoho Recruit. For other third party apps, use the api-gateway skill (https://clawhub.ai/byungkyu/api-gateway). Requires network access and valid Maton API key.
Zoho Recruit API integration with managed OAuth. Manage candidates, job openings, interviews, and recruitment workflows. Use this skill when users want to read, create, update, or search recruitment data like candidates, job openings, interviews, and applications in Zoho Recruit. For other third party apps, use the api-gateway skill (https://clawhub.ai/byungkyu/api-gateway). Requires network access and valid Maton API key.
Hand the extracted package to your coding agent with a concrete install brief instead of figuring it out manually.
I downloaded a skill package from Yavira. Read SKILL.md from the extracted folder and install it by following the included instructions. Tell me what you changed and call out any manual steps you could not complete.
I downloaded an updated skill package from Yavira. Read SKILL.md from the extracted folder, compare it with my current installation, and upgrade it while preserving any custom configuration unless the package docs explicitly say otherwise. Summarize what changed and any follow-up checks I should run.
Access the Zoho Recruit API with managed OAuth authentication. Manage candidates, job openings, interviews, applications, and recruitment workflows with full CRUD operations.
# List all candidates python <<'EOF' import urllib.request, os, json req = urllib.request.Request('https://gateway.maton.ai/zoho-recruit/recruit/v2/Candidates?per_page=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-recruit/{native-api-path} Replace {native-api-path} with the actual Zoho Recruit API endpoint path. The gateway proxies requests to recruit.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"
Sign in or create an account at maton.ai Go to maton.ai/settings Copy your API key
Manage your Zoho Recruit 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-recruit&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-recruit'}).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": "0c9fa9b1-80b6-4caa-afc2-8629fe4d9661", "status": "ACTIVE", "creation_time": "2026-02-06T07:48:59.474215Z", "last_updated_time": "2026-02-06T07:57:52.950167Z", "url": "https://connect.maton.ai/?session_token=...", "app": "zoho-recruit", "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 Recruit 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-recruit/recruit/v2/Candidates') req.add_header('Authorization', f'Bearer {os.environ["MATON_API_KEY"]}') req.add_header('Maton-Connection', '0c9fa9b1-80b6-4caa-afc2-8629fe4d9661') print(json.dumps(json.load(urllib.request.urlopen(req)), indent=2)) EOF If omitted, the gateway uses the default (oldest) active connection.
List All Modules Get a list of all available modules in your Zoho Recruit account. GET /zoho-recruit/recruit/v2/settings/modules Example: python <<'EOF' import urllib.request, os, json req = urllib.request.Request('https://gateway.maton.ai/zoho-recruit/recruit/v2/settings/modules') req.add_header('Authorization', f'Bearer {os.environ["MATON_API_KEY"]}') print(json.dumps(json.load(urllib.request.urlopen(req)), indent=2)) EOF
List Candidates GET /zoho-recruit/recruit/v2/Candidates Query Parameters: ParameterTypeDefaultDescriptionfieldsstring-Comma-separated field API namessort_orderstring-asc or descsort_bystring-Field API name to sort byconvertedstring-true, false, or bothapprovedstring-true, false, or bothpageinteger1Page numberper_pageinteger200Records per page (max 200) Example: python <<'EOF' import urllib.request, os, json req = urllib.request.Request('https://gateway.maton.ai/zoho-recruit/recruit/v2/Candidates?per_page=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: { "data": [ { "id": "846336000000552208", "First_Name": "Christina", "Last_Name": "Palaskas", "Email": "c.palaskas@example.com", "Candidate_Status": "Converted - Employee", "Current_Employer": "Chandlers", "Current_Job_Title": "Technical Consultant", "Experience_in_Years": 3, "Skill_Set": "Communication, Presentation, Customer service", "Candidate_Owner": { "name": "Byungkyu Park", "id": "846336000000549541" } } ], "info": { "per_page": 10, "count": 1, "page": 1, "more_records": false } } Get Candidate by ID GET /zoho-recruit/recruit/v2/Candidates/{record_id} Example: python <<'EOF' import urllib.request, os, json req = urllib.request.Request('https://gateway.maton.ai/zoho-recruit/recruit/v2/Candidates/846336000000552208') req.add_header('Authorization', f'Bearer {os.environ["MATON_API_KEY"]}') print(json.dumps(json.load(urllib.request.urlopen(req)), indent=2)) EOF Search Candidates GET /zoho-recruit/recruit/v2/Candidates/search?criteria={criteria} Query Parameters: ParameterTypeDescriptioncriteriastringSearch criteria (e.g., (Last_Name:contains:Smith))emailstringSearch by emailphonestringSearch by phonewordstringGlobal word searchpageintegerPage numberper_pageintegerRecords per page Search Operators: Text: equals, not_equal, starts_with, ends_with, contains, not_contains, in Date/Number: equals, not_equal, greater_than, less_than, greater_equal, less_equal, between Example: python <<'EOF' import urllib.request, os, json import urllib.parse criteria = urllib.parse.quote('(Candidate_Status:equals:Active)') req = urllib.request.Request(f'https://gateway.maton.ai/zoho-recruit/recruit/v2/Candidates/search?criteria={criteria}') req.add_header('Authorization', f'Bearer {os.environ["MATON_API_KEY"]}') print(json.dumps(json.load(urllib.request.urlopen(req)), indent=2)) EOF Create Candidate POST /zoho-recruit/recruit/v2/Candidates Content-Type: application/json { "data": [ { "First_Name": "John", "Last_Name": "Doe", "Email": "john.doe@example.com", "Phone": "555-123-4567", "Current_Job_Title": "Software Engineer" } ] } Example: python <<'EOF' import urllib.request, os, json data = json.dumps({ "data": [{ "First_Name": "John", "Last_Name": "Doe", "Email": "john.doe@example.com", "Phone": "555-123-4567" }] }).encode() req = urllib.request.Request('https://gateway.maton.ai/zoho-recruit/recruit/v2/Candidates', 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 Response: { "data": [ { "code": "SUCCESS", "status": "success", "message": "record added", "details": { "id": "846336000000600001", "Created_Time": "2026-02-06T10:00:00-08:00", "Created_By": { "name": "User Name", "id": "846336000000549541" } } } ] } Update Candidate PUT /zoho-recruit/recruit/v2/Candidates/{record_id} Content-Type: application/json { "data": [ { "Current_Job_Title": "Senior Software Engineer" } ] } Example: python <<'EOF' import urllib.request, os, json data = json.dumps({ "data": [{ "Current_Job_Title": "Senior Software Engineer" }] }).encode() req = urllib.request.Request('https://gateway.maton.ai/zoho-recruit/recruit/v2/Candidates/846336000000552208', 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)) EOF Delete Candidates DELETE /zoho-recruit/recruit/v2/Candidates?ids={record_id1},{record_id2}
List Job Openings GET /zoho-recruit/recruit/v2/Job_Openings Example: python <<'EOF' import urllib.request, os, json req = urllib.request.Request('https://gateway.maton.ai/zoho-recruit/recruit/v2/Job_Openings?per_page=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: { "data": [ { "id": "846336000000552093", "Posting_Title": "Senior Accountant (Sample)", "Job_Opening_Status": "Waiting for approval", "Date_Opened": "2026-01-21", "Target_Date": "2026-02-20", "Industry": "Accounting", "City": "Tallahassee", "No_of_Candidates_Hired": 0, "No_of_Candidates_Associated": 0 } ], "info": { "per_page": 10, "count": 1, "page": 1, "more_records": false } } Get Job Opening by ID GET /zoho-recruit/recruit/v2/Job_Openings/{record_id} Create Job Opening POST /zoho-recruit/recruit/v2/Job_Openings Content-Type: application/json { "data": [ { "Posting_Title": "Software Engineer", "Job_Opening_Status": "In-progress", "Date_Opened": "2026-02-01", "Target_Date": "2026-03-01" } ] } Update Job Opening PUT /zoho-recruit/recruit/v2/Job_Openings/{record_id} Content-Type: application/json Delete Job Openings DELETE /zoho-recruit/recruit/v2/Job_Openings?ids={record_id1},{record_id2}
List Interviews GET /zoho-recruit/recruit/v2/Interviews Example: python <<'EOF' import urllib.request, os, json req = urllib.request.Request('https://gateway.maton.ai/zoho-recruit/recruit/v2/Interviews?per_page=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 Interview by ID GET /zoho-recruit/recruit/v2/Interviews/{record_id} Create Interview POST /zoho-recruit/recruit/v2/Interviews Content-Type: application/json { "data": [ { "Interview_Name": "Technical Interview", "Candidate_Name": {"id": "846336000000552208"}, "Posting_Title": {"id": "846336000000552093"}, "Start_DateTime": "2026-02-10T10:00:00-08:00", "End_DateTime": "2026-02-10T11:00:00-08:00" } ] }
List Departments GET /zoho-recruit/recruit/v2/Departments Example: python <<'EOF' import urllib.request, os, json req = urllib.request.Request('https://gateway.maton.ai/zoho-recruit/recruit/v2/Departments?per_page=10') req.add_header('Authorization', f'Bearer {os.environ["MATON_API_KEY"]}') print(json.dumps(json.load(urllib.request.urlopen(req)), indent=2)) EOF
List Applications GET /zoho-recruit/recruit/v2/Applications
All modules support the same CRUD operations: # List records GET /zoho-recruit/recruit/v2/{module_api_name} # Get record by ID GET /zoho-recruit/recruit/v2/{module_api_name}/{record_id} # Create records POST /zoho-recruit/recruit/v2/{module_api_name} # Update records PUT /zoho-recruit/recruit/v2/{module_api_name}/{record_id} # Delete records DELETE /zoho-recruit/recruit/v2/{module_api_name}?ids={id1},{id2} # Search records GET /zoho-recruit/recruit/v2/{module_api_name}/search?criteria={criteria}
ModuleAPI NameDescriptionCandidatesCandidatesJob candidatesJob OpeningsJob_OpeningsOpen positionsApplicationsApplicationsJob applicationsInterviewsInterviewsScheduled interviewsDepartmentsDepartmentsCompany departmentsClientsClientsClient companiesContactsContactsContact personsCampaignsCampaignsRecruitment campaignsReferralsReferralsEmployee referralsTasksTasksTo-do itemsEventsEventsCalendar eventsVendorsVendorsExternal vendors
Zoho Recruit uses page-based pagination: GET /zoho-recruit/recruit/v2/{module_api_name}?page=1&per_page=200 page: Page number (default: 1) per_page: Records per page (default: 200, max: 200) Response includes pagination info: { "data": [...], "info": { "per_page": 200, "count": 50, "page": 1, "more_records": false } }
const response = await fetch( 'https://gateway.maton.ai/zoho-recruit/recruit/v2/Candidates?per_page=10', { headers: { 'Authorization': `Bearer ${process.env.MATON_API_KEY}` } } ); const data = await response.json();
import os import requests response = requests.get( 'https://gateway.maton.ai/zoho-recruit/recruit/v2/Candidates', headers={'Authorization': f'Bearer {os.environ["MATON_API_KEY"]}'}, params={'per_page': 10} ) data = response.json()
Record IDs are numeric strings (e.g., 846336000000552208) Maximum 200 records per GET request Maximum 100 records per POST/PUT request Maximum 100 records per DELETE request Module API names are case-sensitive (e.g., Job_Openings, not job_openings) Last_Name is mandatory for Candidates Date format: yyyy-MM-dd DateTime format: yyyy-MM-ddTHH:mm:ssยฑHH:mm (ISO 8601) Lookup fields use JSON objects with id and optionally name IMPORTANT: When using curl commands, use curl -g when URLs contain special characters IMPORTANT: When piping curl output to jq or other commands, environment variables like $MATON_API_KEY may not expand correctly in some shell environments
StatusMeaning400Missing Zoho Recruit connection or invalid request401Invalid or missing Maton API key429Rate limited4xx/5xxPassthrough error from Zoho Recruit API
CodeDescriptionINVALID_DATAInvalid field valueMANDATORY_NOT_FOUNDRequired field missingDUPLICATE_DATADuplicate record detectedINVALID_MODULEInvalid module API nameNO_PERMISSIONInsufficient permissions
Check that the MATON_API_KEY environment variable is set: echo $MATON_API_KEY Verify the API key is valid by listing connections: 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
Ensure your URL path starts with zoho-recruit. For example: Correct: https://gateway.maton.ai/zoho-recruit/recruit/v2/Candidates Incorrect: https://gateway.maton.ai/recruit/v2/Candidates
Zoho Recruit API v2 Overview Get Records API Insert Records API Update Records API Delete Records API Search Records API Modules API Maton Community Maton Support
Code helpers, APIs, CLIs, browser automation, testing, and developer operations.
Largest current source with strong distribution and engagement signals.