# Zoho Recruit Jobs Scraper (`gefese/zoho-recruit-jobs-scraper`) Actor

Scrapes public job postings from Zoho Recruit careers portals: title, company, location, remote flag, job type, category, salary and experience when published, date and full description. Independent tool, not affiliated with Zoho or any employer.

- **URL**: https://apify.com/gefese/zoho-recruit-jobs-scraper.md
- **Developed by:** [Gonzalo Fajardo](https://apify.com/gefese) (community)
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

$1.50 / 1,000 result items

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

## Zoho Recruit Jobs Scraper

Independent tool, not affiliated with Zoho or any employer. It collects the job postings that employers publish on their public Zoho Recruit careers portals (addresses like `https://<company>.zohorecruit.com/jobs/Careers`) and returns them as clean, structured dataset items. No login, browser or proxy is needed.

### What does it do and which fields does it return?

Give it one or more careers portal URLs and it returns one dataset item per published job. A portal's whole job list is read from a single page request. When you ask for full job details, the actor also opens the public page of each job. Each item contains:

- `jobId`, `title`, `jobOpeningName`
- `companyName`, `tenant` (the portal subdomain)
- `city`, `state`, `country`, `remote` (true or false)
- `jobType`, `jobCategory`, `industry`
- `salary`, `salaryCurrency`, `workExperience` (only when the employer filled them in)
- `datePosted` (ISO 8601 date)
- `descriptionText` and `descriptionHtml` (when full details are on), `customFields` (other text fields the employer added to the posting)
- `jobUrl`, `careerSiteUrl`, `scrapedAt`

Fields a portal does not publish are returned as `null`. Names, e-mail addresses and phone numbers of recruiters, hiring managers or contacts are never output, and e-mail addresses inside descriptions are replaced with `[email removed]`.

### How to run it

1. Open the Actor and keep the prefilled input, or paste the careers portal URL of the employer you are interested in. A tenant root such as `https://bruntwork.zohorecruit.com` or any `/jobs/...` link of that portal is accepted; regional hosts such as `*.zohorecruit.eu` and custom domains work as long as the host's robots.txt allows the careers paths.
2. Optionally enter search keywords and a maximum number of jobs per portal.
3. Leave "Include full job details" on if you want the description, salary and experience fields.
4. Start the run and open the Output tab. The prefilled run (20 jobs from one portal, with descriptions) finished in about 26 seconds in a local test.

### How much does it cost to scrape Zoho Recruit jobs?

The Actor uses pay-per-event pricing: 0.0015 USD per job returned (one `result` event per dataset item). 1,000 jobs cost 1.50 USD and 100 jobs cost 0.15 USD. You only pay result events for items that are returned; skipped and empty portals add none. The run stops by itself when the maximum total charge you set is reached.

### Input example

```json
{
  "startUrls": [{ "url": "https://virtualcoworker.zohorecruit.com/jobs/Careers" }],
  "searchQuery": "",
  "maxItemsPerSite": 20,
  "includeDescription": true
}
```

- `startUrls`: careers portals to read.
- `searchQuery`: optional keywords; a job is kept when every word appears in its title, category, industry, location, job type or (if the portal list includes it) description.
- `maxItemsPerSite`: cap per portal, 20 in the prefill.
- `includeDescription`: open each job's public page for description, salary, experience and custom fields.

### Output example

Real items from a local run on 2 October 2026 (long texts shortened here with an ellipsis):

```json
[
  {
    "jobId": "147741000088757147",
    "title": "Appointment Setter for an IT Company in the US (Home Based Full Time)",
    "jobOpeningName": "Appointment Setter for an IT Company in the US (Home Based Full Time)",
    "companyName": "Virtual Coworker",
    "tenant": "virtualcoworker",
    "city": "Benton",
    "state": "Arkansas",
    "country": "United States",
    "remote": false,
    "jobType": "Full time",
    "jobCategory": "Sales/Lead Generation",
    "industry": "Technology",
    "salary": null,
    "salaryCurrency": null,
    "workExperience": null,
    "datePosted": "2026-09-22",
    "descriptionText": "• Make outbound cold calls to U.S.-based businesses using company-provided prospect lists and hosted phone system\n\n• Reach business owners, executives, IT leaders, office managers, and other decision-…",
    "descriptionHtml": "<span id=\"spandesc\"><div>• Make outbound cold calls to U.S.-based businesses using company-provided prospect lists and hosted phone system <br/></div><div>• Reach business owners, executives, IT leade…",
    "customFields": {
      "Company": "The client is a U.S.-based technology and telecommunications consulting company",
      "Work_Location": "Home Based - Philippines",
      "Work_Schedule1": "Monday - Friday, 8:00AM - 5:00 PM Central Standard Time",
      "Must_Haves": "Please only apply for this role if you have the following home office requiremen…",
      "Must_have": "• Excellent spoken and written English\r\n• Clear, professional, confident, and co…",
      "Nice_to_Have": "• Previous experience in telecommunications, UCaaS/VoIP, managed IT, or technolo…",
      "Work_Schedule": "Full Time – 8 hours per day"
    },
    "jobUrl": "https://virtualcoworker.zohorecruit.com/jobs/Careers/147741000088757147/Appointment-Setter-for-an-IT-Company-in-the-US-Home-Based-Full-Time",
    "careerSiteUrl": "https://virtualcoworker.zohorecruit.com/jobs/Careers",
    "scrapedAt": "2026-10-02T12:15:20Z"
  },
  {
    "jobId": "147741000089084572",
    "title": "Technical Support Assistant for a Business Owner in Australia (Home Based Part Time)",
    "jobOpeningName": "Technical Support Assistant for a Business Owner in Australia (Home Based Part Time)",
    "companyName": "Virtual Coworker",
    "tenant": "virtualcoworker",
    "city": "TBC",
    "state": "Western Australia",
    "country": "Australia",
    "remote": false,
    "jobType": "Part time",
    "jobCategory": "Technical",
    "industry": "Technology",
    "salary": null,
    "salaryCurrency": null,
    "workExperience": null,
    "datePosted": "2026-10-02",
    "descriptionText": "• Provide basic day-to-day technical support and help the client navigate computers, systems, and online platforms.\n\n• Guide and teach the client how to use the website, systems, and technology in a s…",
    "descriptionHtml": "<span id=\"spandesc\"><div>• Provide basic day-to-day technical support and help the client navigate computers, systems, and online platforms. <br/></div><div>• Guide and teach the client how to use the…",
    "customFields": {
      "Company": "The company is a growing online business focused on expanding its digital presen…",
      "Work_Location": "Home Based - Philippines",
      "Work_Schedule1": "Flexible Hours",
      "Must_Haves": "Please only apply for this role if you have the following home office requiremen…",
      "Must_have": "• Good general computer and technology skills.\r\n• Comfortable using websites, so…",
      "Work_Schedule": "Part Time – 4 hours per day"
    },
    "jobUrl": "https://virtualcoworker.zohorecruit.com/jobs/Careers/147741000089084572/Technical-Support-Assistant-for-a-Business-Owner-in-Australia-Home-Based-Part-Time",
    "careerSiteUrl": "https://virtualcoworker.zohorecruit.com/jobs/Careers",
    "scrapedAt": "2026-10-02T12:15:20Z"
  },
  {
    "jobId": "147741000089076371",
    "title": "Social Media Manager for a Community Organization in the US (Home Based Part Time)",
    "jobOpeningName": "Social Media Manager for a Community Organization in the US (Home Based Part Time)",
    "companyName": "Virtual Coworker",
    "tenant": "virtualcoworker",
    "city": "Detroit",
    "state": "Michigan",
    "country": "United States",
    "remote": false,
    "jobType": "Full time",
    "jobCategory": "Social Media Management",
    "industry": "Marketing and Advertising",
    "salary": null,
    "salaryCurrency": null,
    "workExperience": null,
    "datePosted": "2026-10-01",
    "descriptionText": "• Edit short-form video content (Reels, clips) for Instagram and X\n\n• Edit long-form content for the podcast/sports center\n\n• Post and manage content across Instagram and X on a consistent schedule\n\n•…",
    "descriptionHtml": "<span id=\"spandesc\"><div>• Edit short-form video content (Reels, clips) for Instagram and X <br/></div><div>• Edit long-form content for the podcast/sports center<br/></div><div>• Post and manage cont…",
    "customFields": {
      "Company": "YD Sports",
      "Work_Schedule1": "Tuesday to Saturday, 10:00AM - 2:00PM Eastern Daylight Time",
      "Must_Haves": "Please only apply for this role if you have the following home office requiremen…",
      "Must_have": "• Strong video editing skills for both short-form and long-form content (top pri…",
      "Nice_to_Have": "• Experience with sports, athletics, or youth-focused brands\n• Experience target…",
      "Work_Schedule": "Part Time – 4 hours per day"
    },
    "jobUrl": "https://virtualcoworker.zohorecruit.com/jobs/Careers/147741000089076371/Social-Media-Manager-for-a-Community-Organization-in-the-US-Home-Based-Part-Time",
    "careerSiteUrl": "https://virtualcoworker.zohorecruit.com/jobs/Careers",
    "scrapedAt": "2026-10-02T12:15:21Z"
  }
]
```

### Limitations and the free plan

- The actor reads what the portal embeds in its list page. If a portal shows its jobs only after browser-side loading, or has no openings at the moment, the result is empty. A portal that is in maintenance mode, such as one tested with an empty list, returns zero items.
- Locked or unpublished records are skipped.
- With "Include full job details" off, only the fields present in the list are filled; many portals leave out description, date, industry, salary and experience there.
- The keyword filter only sees list data, so on portals whose list has no description it matches title, category, industry, location and job type.
- Requests are sequential with at least one second between them; portal pages are about 1.7 MB each, so 100 jobs with details take a few minutes.
- Salary text and custom field names are whatever each employer typed; they are not normalised across portals.
- The free plan can run the prefilled input; how many jobs you can collect beyond that depends on the credit of your plan.

### FAQ

**Does it need a login or cookies?** No. It reads only public careers pages.

**Does it respect robots.txt?** Yes. It reads the host's robots.txt at the start of each portal and skips the portal if the careers paths are not allowed.

**Why is a field empty?** The employer did not publish it on that portal.

**Can I scrape jobs from a custom careers domain?** Yes, if the domain serves a Zoho Recruit careers portal and its robots.txt allows `/jobs/...`. Use the portal URL as the start URL.

**Where do I report a problem?** Use the Issues tab of this Actor on Apify and include the portal URL and your input.

# Actor input Schema

## `startUrls` (type: `array`):

Public Zoho Recruit careers portals, for example https://virtualcoworker.zohorecruit.com/jobs/Careers. A tenant root or any /jobs/... URL of the portal is accepted. One URL per employer.

## `searchQuery` (type: `string`):

Optional keywords. A job is kept when every word appears in its title, category, industry, location, job type or (when the portal list includes it) description. Leave empty for all jobs.

## `maxItemsPerSite` (type: `integer`):

Stops after this many jobs for each portal URL. Each job is one billed result.

## `includeDescription` (type: `boolean`):

Open the public page of every job (one extra request per job, so the run is slower) to add the description, salary, work experience and custom fields. When off, only the data on the portal list page is returned.

## Actor input object example

```json
{
  "startUrls": [
    {
      "url": "https://virtualcoworker.zohorecruit.com/jobs/Careers"
    }
  ],
  "searchQuery": "",
  "maxItemsPerSite": 20,
  "includeDescription": true
}
```

# Actor output Schema

## `results` (type: `string`):

No description

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "startUrls": [
        {
            "url": "https://virtualcoworker.zohorecruit.com/jobs/Careers"
        }
    ],
    "searchQuery": "",
    "maxItemsPerSite": 20,
    "includeDescription": true
};

// Run the Actor and wait for it to finish
const run = await client.actor("gefese/zoho-recruit-jobs-scraper").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {
    "startUrls": [{ "url": "https://virtualcoworker.zohorecruit.com/jobs/Careers" }],
    "searchQuery": "",
    "maxItemsPerSite": 20,
    "includeDescription": True,
}

# Run the Actor and wait for it to finish
run = client.actor("gefese/zoho-recruit-jobs-scraper").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "startUrls": [
    {
      "url": "https://virtualcoworker.zohorecruit.com/jobs/Careers"
    }
  ],
  "searchQuery": "",
  "maxItemsPerSite": 20,
  "includeDescription": true
}' |
apify call gefese/zoho-recruit-jobs-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,gefese/zoho-recruit-jobs-scraper"
        }
    }
}
```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/SLwbBKD7uCW5S7xNA/builds/hjQ9TdnAt7mPej9uG/openapi.json
