# India Medical Jobs API — Official Healthcare Vacancies (`thescrapelab/india-medical-jobs-aggregator`) Actor

Fetch current medical and healthcare vacancies from supported official Indian hospital, government, and medical institute recruitment sources. Filter by role, location, recency, and source, then export recruiter-ready results to JSON, CSV, or Excel.

- **URL**: https://apify.com/thescrapelab/india-medical-jobs-aggregator.md
- **Developed by:** [Inus Grobler](https://apify.com/thescrapelab) (community)
- **Categories:** Jobs, Lead generation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.00 / 1,000 results

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/platform/actors/running/actors-in-store#pay-per-event

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
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.
Actors are written with capital "A".

## 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.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

## India Medical Jobs API — Official Healthcare Vacancies

Fetch fresh medical and healthcare vacancies from supported official Indian recruitment websites. Built for healthcare recruiters, staffing teams, talent researchers, and job-data workflows that need traceable public-source data rather than copied job-board listings.

Each run visits the selected official websites at run time, normalizes the current notices, removes duplicates, and writes results to an Apify Dataset. Export JSON, CSV, or Excel, or use the Dataset directly in your recruiting workflow.

### What this Actor is for

- Build a current pipeline of doctors, residents, nursing, medical faculty, pathology, laboratory, and healthcare vacancies.
- Search official hospital, government, medical-institute, and research recruitment notices by role, location, and recency.
- Keep the official notice and any explicit application link with every result.
- See source health in each run, so a missing website is never mistaken for "no jobs found".

The Actor does not run in the background or reuse older results. Start a run whenever you need a fresh search.

### Quick start

1. Choose a role or specialty.
2. Optionally add cities or states.
3. Keep the recommended official-source selection or choose specific sources.
4. Set the maximum number of records and start the Actor.
5. Review the Dataset and open the official notice before contacting candidates or applying.

#### Example: pathology and faculty search

```json
{
  "rolePreset": "pathology",
  "locations": ["Maharashtra", "Delhi"],
  "postedWithinDays": 90,
  "maxItems": 100
}
```

#### Example: custom specialty search

```json
{
  "rolePreset": "custom",
  "roleKeywords": ["blood bank medical officer", "clinical psychologist"],
  "locations": ["Pune", "Mumbai"],
  "sourceIds": ["DMER_TEACHING", "DMER_NON_TEACHING"],
  "postedWithinDays": 60,
  "maxItems": 50
}
```

### Inputs

| Input | Description |
| --- | --- |
| `rolePreset` | All medical roles, pathology, residents, medical officer, nursing, medical faculty, or custom roles. |
| `roleKeywords` | Your own role or specialty terms when `rolePreset` is `custom`. |
| `locations` | Optional cities or states. |
| `postedWithinDays` | Notice age to include. A future application deadline keeps an older notice eligible. |
| `sourceIds` | Official recruitment sources to search. Supply one or more IDs; omit the field to use the documented recommended set. |
| `maxItems` | Maximum normalized job or notice records returned. |

An empty `sourceIds` array is intentionally rejected. Choose at least one source so a paid run never expands unexpectedly.

### Cost control

This is a pay-per-event Actor: a run may include a start charge and charges for returned Dataset records. Keep searches focused by selecting the sources, role, and locations you need, and set `maxItems` to the smallest useful result limit. A run always fetches live official pages; it does not charge for a background daily monitor.

### Official coverage

The current verified 12-source set includes:

- VMMC & Safdarjung Hospital, New Delhi: regular, contractual, project, and resident recruitment.
- Directorate of Medical Education & Research, Maharashtra: teaching, non-teaching, and nursing recruitment.
- AIIMS New Delhi recruitment notices.
- Delhi Health & Family Welfare hospital vacancies.
- AIIMS Bilaspur, Bhubaneswar, and Rishikesh recruitment notices.
- Indian Council of Medical Research recruitment notices.

Coverage is transparent and source-specific. This Actor searches supported official sources from selected Indian regions and national authorities; it does not claim to capture every medical vacancy in the country.

### Output

Every Dataset row includes the official source URL. Important fields include:

- `recordType`: `job` for a safely normalized individual role, or `notice` when an official notice contains multiple roles that cannot be split reliably.
- `jobTitle`, `rolesMentioned`, `employerName`, `location`, `department`, `specialty`, and `employmentType`.
- `vacancyCount`, `salaryText`, `qualificationRequired`, and `experienceRequired` when the official notice exposes them.
- `datePosted`, `applicationDeadline`, `dateStatus`, and `isOpen`.
- `applyUrl` only when the official source explicitly provides one; otherwise use `sourceUrl`.
- `extractionQuality`: `full`, `listingOnly`, or `pdfUnavailable`.
- `sourceUrl`, `sourceUrls`, `attachmentUrls`, and `scrapedAt` for traceability.

Open **Run summary and source health** after each run to see which sources succeeded, which were unavailable, and how filtering affected the results.

### Data quality and limitations

- The Actor uses direct, low-rate HTTP requests to public official websites. It does not use login automation, CAPTCHA bypassing, or residential proxies.
- Some official PDFs are scanned or unavailable as machine-readable text. Those records retain their official attachment and are marked with an extraction-quality value.
- A future deadline takes priority over the selected notice age. Expired and undated notices are excluded.
- Always confirm eligibility, deadline, and application instructions in the official notice before acting on a result.

### Use from Python

```python
from apify_client import ApifyClient

client = ApifyClient("YOUR_APIFY_TOKEN")
run = client.actor("thescrapelab/india-medical-jobs-aggregator").call(
    run_input={
        "rolePreset": "medicalFaculty",
        "locations": ["Delhi", "Maharashtra"],
        "postedWithinDays": 90,
        "maxItems": 100,
    }
)

items = client.dataset(run["defaultDatasetId"]).list_items().items
for item in items:
    print(item["jobTitle"], item["employerName"], item["sourceUrl"])
```

### Troubleshooting

**No results?** Broaden `postedWithinDays`, remove the location filter, choose a broader role preset, or select different sources.

**A source is missing?** Check the run summary. A degraded run returns data from available sources and reports the unavailable source separately.

**Need to apply?** Use `applyUrl` only when present. Otherwise use the linked official notice, which is the authoritative source for the application route.

# Actor input Schema

## `rolePreset` (type: `string`):

Choose a common healthcare search. Select Custom only when you need your own role terms.

## `roleKeywords` (type: `array`):

Use only with Custom roles. Enter job titles or specialties such as clinical psychologist or blood bank medical officer.

## `locations` (type: `array`):

Optional cities or states, for example Delhi, Maharashtra, Mumbai, or Pune.

## `postedWithinDays` (type: `integer`):

Show notices published within this many days. A future application deadline keeps an older notice eligible.

## `sourceIds` (type: `array`):

Choose at least one source. The default selection is the current recommended coverage set.

## `maxItems` (type: `integer`):

Maximum number of normalized records to return. Keep this focused to control pay-per-result costs.

## Actor input object example

```json
{
  "rolePreset": "allMedical",
  "roleKeywords": [],
  "locations": [],
  "postedWithinDays": 90,
  "sourceIds": [
    "VMMC_REGULAR",
    "VMMC_CONTRACTUAL",
    "VMMC_RESIDENTS",
    "DMER_TEACHING",
    "DMER_NON_TEACHING",
    "DMER_NURSING",
    "AIIMS_NEW_DELHI_RECRUITMENT",
    "DELHI_HEALTH_VACANCIES",
    "AIIMS_BILASPUR_RECRUITMENT",
    "AIIMS_BHUBANESWAR_RECRUITMENT",
    "AIIMS_RISHIKESH_RECRUITMENT",
    "ICMR_RECRUITMENT"
  ],
  "maxItems": 100
}
```

# Actor output Schema

## `datasetItems` (type: `string`):

Current official healthcare vacancies, each linked to the official notice or application route.

## `runSummary` (type: `string`):

Sources searched, extraction counts, source health, and any limitations for this run.

# 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 = {};

// Run the Actor and wait for it to finish
const run = await client.actor("thescrapelab/india-medical-jobs-aggregator").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 = {}

# Run the Actor and wait for it to finish
run = client.actor("thescrapelab/india-medical-jobs-aggregator").call(run_input=run_input)

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

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

```

## CLI example

```bash
echo '{}' |
apify call thescrapelab/india-medical-jobs-aggregator --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=thescrapelab/india-medical-jobs-aggregator",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

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