# Infopark Jobs Scraper (Unofficial) | Kerala IT Jobs (`tidyfeeds/infopark-jobs-scraper`) Actor

Unofficial Infopark scraper for IT jobs in Kerala, India. Filter by keyword and campus; get title, company, posting date, last date to apply, description and a link to each job. No login. $1 per 1,000 jobs or less, no start fee. Phone numbers and e-mails are removed.

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

## Pricing

from $0.60 / 1,000 job results

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

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

Get the IT jobs posted on the job board of Infopark, the IT parks of Kerala, India (Kochi, Cherthala, Thrissur), as clean, structured records: job title, company, posting date, last date to apply, the full description and a link to the job page. Filter by keywords and by campus. No login, plain HTTP requests, and you pay per job that is actually saved.

**Unofficial.** This Actor is an independent tool. It is not affiliated with, endorsed by, or sponsored by Infopark.

### Why use this Actor

- **The whole board, newest first.** More than 400 jobs from the companies in the parks (21 list pages of 20 on 2026-10-10), read in the order the site lists them.
- **Open jobs only, unless you ask otherwise.** A job whose last date to apply has passed is left out and not charged. Turn `onlyOpen` off to get those as well.
- **Keywords and campus.** Several keywords at once, matched against the job title and the company name, and one campus list or all of them.
- **Pay only for results.** One saved job is one charge. Searches that find nothing and pages that fail cost nothing, and there is no fee for starting a run.
- **Dates you can sort on.** `postedAt` and `lastDateToApply` as YYYY-MM-DD, and the same field names and types in every run.
- **Contact details left out.** Phone numbers and e-mail addresses are not returned, and description lines that hold them or name a contact person are removed. The full list and its limits are under "What is not in the output".
- **A link to each job.** `url` points to the job's page on Infopark, where the company says how to apply.
- **Gentle on the site.** One page at a time with a pause between pages, and the site's robots.txt is followed.

### Try it in one minute

1. Open the **Input** tab. The form is already filled in with a working example (developer jobs).
2. Click **Start**.
3. When the run finishes, open the **Output** tab to see up to 20 jobs in a table.
4. Use **Export** to download the results as JSON, CSV or Excel, or read them through the API.

### Input examples

**The newest developer jobs**

```json
{
    "keywords": ["developer"],
    "maxResults": 20
}
```

**Several keywords in one run**

```json
{
    "keywords": ["java developer", "qa engineer", "devops"],
    "maxResults": 50
}
```

**Everything in one campus, with the campus name in every record**

```json
{
    "campus": "infopark-cherthala",
    "maxResults": 100
}
```

**Quick daily check of the whole board without opening each job page**

```json
{
    "includeDetails": false,
    "maxResults": 500
}
```

**Jobs of one company**

```json
{
    "keywords": ["thinkpalm"],
    "maxResults": 30
}
```

**Everything in the list, jobs past their last date to apply included**

```json
{
    "onlyOpen": false,
    "maxResults": 500
}
```

### Input

All fields are optional. With an empty input the Actor returns the 20 newest jobs of all campuses that are still open.

| Field | Type | Default | What it does |
|---|---|---|---|
| `keywords` | array of strings | empty | Job titles, technologies or company names. A job is returned when its title or its company name fits at least one keyword; a job that fits two keywords is returned and charged once. Up to 20 keywords. How a keyword is matched is described under "Limits". |
| `campus` | string | `all` | `all`, or one campus list: `infopark-kochi-phase-1`, `infopark-kochi-phase-2`, `infopark-cherthala`, `infopark-thrissur`, `i-by-infopark-ernakulam-south-metro-station`. With a campus chosen, every record carries the campus name. |
| `onlyOpen` | boolean | true | On: a job whose last date to apply is before today is skipped: it is not saved and not charged, and its job page is not opened. The last date itself still counts as open, and "today" is the day in India (UTC+5:30). A job whose last date cannot be read is returned, not skipped. Off: every job in the list is returned, whatever its last date. |
| `maxResults` | integer | 20 | The run stops after saving this many jobs (1 to 1000). |
| `includeDetails` | boolean | true | On: each job page is opened to add `description` and, when the company wrote them on a labelled line, `experience`, `employmentType`, `workMode`, `location` and `skills`. Off: only what the job list shows is returned (title, company, the two dates, link), which is much faster. |
| `startUrls` | array of strings | empty | Addresses of Infopark job list pages to start from, instead of `campus`. Only Infopark addresses are accepted. `keywords` still apply. |
| `proxyConfiguration` | object | off | Leave off. Turn on only if runs fail because requests are blocked. |

### Output

Each job is one item in the dataset. These fields are always present; a value is `null` when the site does not show it, or when it is left out on purpose (see "What is not in the output").

| Field | Type | Description |
|---|---|---|
| `jobId` | string | Infopark's own job number. Stable between runs, so you can use it to spot new jobs. |
| `title` | string | Job title as the company wrote it. |
| `company` | string or null | Company that posted the job. `null` when the name neither reads as an organisation nor is one of the names checked against Infopark's own company listing, or when it holds an e-mail address, a phone number or a link. |
| `location` | string or null | The place the company wrote on a labelled line of the description, for example "Infopark, Kochi". Otherwise the campus name, when a campus was chosen in the input. |
| `country` | string | Always `India`. |
| `employmentType` | string or null | Job type from a labelled line of the description, for example "Full-time". |
| `experience` | string or null | Required experience from a labelled line of the description, for example "1–2 Years". |
| `salaryText` | null | The site has no salary field. |
| `salaryMin` | null | Same. |
| `salaryMax` | null | Same. |
| `salaryCurrency` | null | Same. |
| `postedAt` | string or null | Posting date as YYYY-MM-DD (India time, as the site shows it). |
| `skills` | array of strings | Skills from a labelled line of the description, for example "Primary Skills: Python, Machine Learning". Empty when there is no such line. |
| `description` | string or null | Job description as plain text, without lines that hold e-mail addresses, phone numbers or links, and without the contact names a program can recognise. `null` when `includeDetails` is off. |
| `source` | string | Always `infopark`. |
| `scrapedAt` | string | When the record was collected (ISO 8601, UTC). |
| `campus` | string or null | Infopark campus, when a campus was chosen in the input. `null` for the list of all campuses, which does not say which campus a job belongs to. |
| `workMode` | string or null | Office, hybrid or remote work from a labelled line of the description, for example "Remote (Temporary)". |
| `lastDateToApply` | string or null | Last date to apply as YYYY-MM-DD, as shown in the job list. With `onlyOpen` on it is today or later, or `null` when the site shows no date that can be read. |
| `url` | string or null | The job's page on Infopark. |

Example item:

```json
{
    "jobId": "26034",
    "title": "Java Developer",
    "company": "Trafoss Pvt.Ltd",
    "location": "Infopark, Kochi",
    "country": "India",
    "employmentType": "Full-time",
    "experience": "1–2 Years",
    "salaryText": null,
    "salaryMin": null,
    "salaryMax": null,
    "salaryCurrency": null,
    "postedAt": "2026-10-09",
    "skills": [],
    "description": "Full Stack Java Developer Experience: 1–2 Years Employment Type: Full-time About the Role TRAFOSS is looking for a motivated Full Stack Java Developer with 1–2 years of hands-on experience to join our growing technology team. ...",
    "source": "infopark",
    "scrapedAt": "2026-10-10T09:00:00.000Z",
    "campus": null,
    "workMode": null,
    "lastDateToApply": "2026-11-15",
    "url": "<the job's page on Infopark>"
}
```

#### What is not in the output

- **Phone numbers and e-mail addresses.** Every job page shows the company's phone number and e-mail address next to its name; that block is never read. In `description`, a line that holds a phone number or an e-mail address is dropped, and in a long paragraph the detail is replaced with `[removed]`.
- **Where to send an application.** Most companies on Infopark ask for a resume by e-mail, and the job page ends with that address. It is often a person's own address, so it is not returned. Use `url` to open the job page and apply there.
- **Links to other sites.** Registration forms, company websites and chat links written in a description are removed, whether they are written with `http`, with `www` or with neither. The only link in a record is `url`, the job's own page on Infopark.
- **Company names that do not read as an organisation.** `company` is returned when the name carries a sign of an organisation: a word such as Technologies, Solutions, Consulting, Pvt, Ltd or Tech, a digit, or "&". A name without such a sign is returned only when it is one of the names the Actor keeps from Infopark's own "Company A-Z Listing"; otherwise it is `null`. That list is fixed inside the Actor and is not read at each run, so that a run does not load ten more pages of the site. It was made on 2026-10-10 from all 10 pages of the listing (401 companies): 40 names are kept, and 3 were left out because they are, or may be, built on a person's name. A company that joins the parks later under a name without such a sign comes out as `null` until the list is updated.
- **Contact names a program can recognise.** A name with a title such as "Mr." or "Ms.", a line that holds a contact detail, a line that starts with a label such as "Contact person:", and a signature after "Regards".

One limit remains: a person's name written in running text with none of these signs cannot be recognised.

#### Limits

- **Keywords are matched by the Actor, not by the site.** The site's own search box does not narrow the list, so the Actor reads the job list from the newest job down and keeps the jobs that fit. A keyword fits when each of its words starts a word of the job title and the company name taken together: `java` finds "Java Developer" and "JavaScript Developer", `qa engineer` finds "Associate - QA Engineer". Words inside the description are not looked at. A rare keyword makes the Actor read the whole list (21 pages on 2026-10-10) before it stops.
- **No separate fields for experience, job type, work mode, place or skills.** A job page is the company name, the title and one block of text typed by the company. `experience`, `employmentType`, `workMode`, `location` and `skills` are filled only when that text has a labelled line such as "Experience: 2-4 Years" or "Job Location: Infopark, Kochi". In the six job pages checked on 2026-10-10, three had an experience line, two a location line, and one each a job type, a work mode and a skills line. Nothing is worked out from the running text, so expect `null` often.
- **`campus` is known only for a campus list.** The list of all campuses does not name the campus of a job. Choose a campus in the input to get it.
- **No salary.** The site has no salary field.
- **The description is one line of text.** Line breaks of the job page are turned into spaces.
- **Old postings stay on the board.** Companies extend the last date to apply, so some open jobs were first posted years ago. `onlyOpen` looks at the last date to apply, not at the posting date, so these jobs are returned. Sort or filter on `postedAt` if you only want recent ones.
- **`onlyOpen` goes by the date in the job list.** A job whose last date cannot be read is returned, not skipped. The day changes at midnight in India, and the Actor takes the day on which the run started. Expect it to skip few jobs: among the rows read on 9 and 10 October 2026 (the 20 newest on the 10th), none was past its last date, so the site itself seems to take a job off the list once that date has passed.
- **Kerala only.** Infopark is one group of IT parks; this is not a search across India.

### Use with AI assistants

This Actor can be used as a tool by Claude, ChatGPT and other assistants that support MCP, through the Apify MCP server. Add this Actor to your assistant's Apify tools and ask in plain language, for example:

> Find the 30 newest developer jobs at Infopark and list them by last date to apply, soonest first, with the company and a link.

The assistant fills in `keywords`, `campus`, `onlyOpen` and `maxResults` for you and reads the results from the dataset.

### Pricing

This Actor uses pay per event pricing with a single event:

| Event | When it is charged |
|---|---|
| Job result | Once for each job saved to the dataset. |

- **$1.00 per 1,000 jobs ($0.001 per job) on the Apify Free plan.** Paid plans pay less per job: $0.80 per 1,000 on Starter, $0.70 on Scale and $0.60 on Business. The **Pricing** tab of this Actor always shows the current prices.
- **Platform usage is included.** You pay only for the jobs that are saved. The compute and storage a run uses are not charged to you on top.
- **How far the free plan goes:** the Apify Free plan comes with $5 of usage each month. At $1.00 per 1,000 jobs, that is up to about 5,000 jobs a month, if you spend that credit only on this Actor.
- **Not charged:** searches with no results, jobs that fit no keyword, jobs past their last date to apply (while `onlyOpen` is on), pages that fail to load, jobs that were removed from the site, and duplicate jobs.
- **No start fee.** Starting a run costs nothing by itself.
- You can set a maximum cost for a run in the run options. The Actor stops before going over it.

### FAQ

**Do I need an Infopark account, or cookies?**
No. Only public pages are read.

**Does the output include phone numbers, e-mail addresses or contact names?**
Phone numbers and e-mail addresses: no. Links to other sites: no. Contact names are removed where a program can recognise them. The exact rules and the limit that remains are listed under "What is not in the output".

**How do candidates apply, then?**
Through the job page. `url` opens it on Infopark, and the company's own instructions are there.

**The run message says some listings were skipped. Is something wrong?**
No. When `keywords` are set, every job in the list that fits no keyword is counted as skipped. With `onlyOpen` on, so is every job whose last date to apply has passed. Jobs whose page was removed or could not be read are counted the same way. Skipped listings are never charged.

**Why did I get fewer jobs than `maxResults`?**
Fewer jobs fit your keywords or your campus than you asked for, some jobs were past their last date to apply, or some job pages were removed between the list and the job page. Try a shorter keyword: `developer` instead of `senior java developer`.

**Why are `experience`, `location` or `skills` empty for many jobs?**
The site has no fields for them. They are filled only when the company wrote a labelled line in the description (see "Limits"). The full text is always in `description`.

**How do I get only new jobs each day?**
Schedule a daily run with `includeDetails` off and compare `jobId` with the ones you already have, or keep the jobs whose `postedAt` is today. `jobId` stays the same for a job between runs.

**Why is a run slower than I expected?**
The Actor reads one page at a time and pauses about two seconds between pages so that it does not put load on the site. Turn `includeDetails` off for a faster run when you only need what the job list shows.

**A field is `null`. Is that an error?**
No. It means the site did not show that information for the job, or that it was left out on purpose (see "What is not in the output").

### Support

Found a problem or missing a field? Open the **Issues** tab of this Actor and describe the input you used and what you expected. Issues are read and answered there.

# Actor input Schema

## `keywords` (type: `array`):

Job titles, technologies or company names, one per line. A job is returned when its title or its company name fits at least one keyword. The Actor reads the job list and filters it itself, so the newest matching jobs come first. Leave empty to get the newest jobs.

## `campus` (type: `string`):

Read the job list of one Infopark campus, or of all campuses. Choose a campus to get the campus name in every record: the list of all campuses does not say which campus a job belongs to.

## `onlyOpen` (type: `boolean`):

On: a job whose last date to apply has passed is left out, and you are not charged for it. The last date itself still counts as open; "today" is the day in India. A job whose last date cannot be read is returned. Off: every job in the list is returned.

## `maxResults` (type: `integer`):

The run stops after saving this many jobs. You pay only for jobs that are saved.

## `includeDetails` (type: `boolean`):

On: every job page is opened to add the description and, when the company wrote them on a labelled line, experience, job type, work mode, location and skills. Off: only what the job list shows is returned (title, company, posting date, last date to apply), which is much faster.

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

Paste addresses of Infopark job list pages to start from, instead of choosing a campus. Only Infopark addresses are accepted. Keywords still apply.

## `proxyConfiguration` (type: `object`):

Off by default. Turn on only if runs fail because the site blocks requests.

## Actor input object example

```json
{
  "keywords": [
    "java",
    "qa engineer"
  ],
  "campus": "all",
  "onlyOpen": true,
  "maxResults": 20,
  "includeDetails": true,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# Actor output Schema

## `jobs` (type: `string`):

All jobs saved by the run, as items of the default dataset.

# 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 = {
    "keywords": [
        "developer"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("tidyfeeds/infopark-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 = { "keywords": ["developer"] }

# Run the Actor and wait for it to finish
run = client.actor("tidyfeeds/infopark-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 '{
  "keywords": [
    "developer"
  ]
}' |
apify call tidyfeeds/infopark-jobs-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,tidyfeeds/infopark-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/b2i9MxofY6bVunFqo/builds/xGUhfSwTGpAsfla9p/openapi.json
