# Apna Scraper 💰 $0.75/1K | India Blue-Collar Jobs | Salary (`ahmed_jasarevic/apna-scraper`) Actor

Scrape Apna.co job listings: title, company, city, salary, experience, skills, education and posted date. Ideal for India blue-collar and grey-collar recruitment, job boards, salary research and hiring-trend analysis.

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

## Pricing

from $0.74 / 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.
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

## Apna Scraper — India Blue-Collar & Grey-Collar Job Data

Scrape job listings from [Apna.co](https://apna.co), India's blue- and grey-collar job platform. Search by keyword and/or city, or feed in specific job URLs, and get clean, structured **India job data** — title, company, city, salary, experience, education, skills and public employer contact preferences.

### Main Use Cases

- **Blue-collar & grey-collar recruitment** — source drivers, security guards, telecallers, delivery and warehouse staff into an ATS or hiring pipeline.
- **India job-market research** — measure demand for a role across cities, salary ranges, and which employers are hiring.
- **Salary & hiring-trend analysis** — track advertised monthly salaries (INR) and posting volumes over time.
- **Job-board / aggregator building** — assemble a large structured feed of Indian job listings.
- **Recruitment lead generation** — identify employers hiring at volume, with their public callback / WhatsApp preferences.

### How It Works

![How the Apna Scraper works: role and city to structured Indian job records with salary and skills.](https://api.apify.com/v2/key-value-stores/oeuA0kLOyhbRM4fzt/records/how-it-works-apna.webp)

The actor talks directly to the public JSON backends that power Apna.co instead of rendering pages, so it is fast and cheap. For every job it can additionally call the job-detail endpoint to enrich the record with the full description, skills, education, shift, openings and geo-coordinates.

It sends requests through a genuine Chrome TLS + HTTP/2 handshake (via [`impit`](https://www.npmjs.com/package/impit)) so it can read the site's public job data without a browser.

### Find Apna.co Jobs By Keyword And City

Enter one or more keywords (e.g. `driver`, `nurse`, `telecaller`) and, optionally, an Indian city. Used alone, a city browses all jobs in that city; combined with keywords, results are filtered by city. Every run returns structured records ready for downstream analysis.

### Extract India Job Listings Without An Official API

Apna.co has no public API for exporting its listings. This actor reads the same publicly available job data the site's own front end uses and returns it as JSON, so you can build a job dataset, ATS pipeline or salary dataset without an API key.

### Input

| Field | Type | Required | Default | Notes |
| --- | --- | --- | --- | --- |
| `searchQuery` | string | no | `"driver"` | Role keyword(s). Separate multiple keywords with commas or new lines. |
| `location` | string | no | `""` | Optional Indian city (e.g. `Mumbai`, `Bengaluru`, `Delhi`). |
| `startUrls` | array | no | `[]` | Optional. Scrape these exact Apna job URLs (`https://apna.co/job/...`) or numeric job IDs instead of a search. |
| `maxItems` | integer | no | `100` | Maximum number of job rows saved to the dataset. |
| `maxPagesPerQuery` | integer | no | `3` | Result pages requested per keyword (up to 100 jobs per page). |
| `includeJobDetails` | boolean | no | `true` | Calls the job-detail endpoint for every job to add skills, full description, education, shift and more. |
| `proxy` | object | no | `{ "useApifyProxy": false }` | Optional. Off by default; if enabled, use **residential** proxies (Apna's WAF blocks datacenter IPs). |

### Output

One dataset item per job. Default dataset view: **overview** (title, company, city, salary, experience, posted date, URL); a second **details** view shows department, employment type, shift, education, openings, skills and description.

| Field group | Fields | Notes |
| --- | --- | --- |
| Identity | `jobId`, `title` | Apna job id and role title |
| Company | `companyName`, `companyId`, `companyExternalId`, `companyLogoUrl` | Hiring company info |
| Location | `city`, `state`, `area`, `locationName`, `address`, `latitude`, `longitude` | Where the job is |
| Category | `category`, `subCategory`, `department` | Job categorisation |
| Compensation | `minSalary`, `maxSalary`, `salaryType`, `salaryIncentive`, `earningPotential` | INR / month |
| Experience | `minExperience`, `maxExperience`, `experienceInYears`, `experienceLevel` | Experience requirement |
| Requirements | `education`, `englishLevel`, `gender`, `shift`, `employmentType` | Requirements & work type |
| Work setup | `isWorkFromHome`, `isPartTime`, `isFlexibleJob`, `numberOfOpenings` | Setup flags |
| Content | `skillsRequired`, `jobHighlights`, `description`, `richDescription` | Skills & description (plain + HTML) |
| Dates | `postedDate`, `lastUpdated`, `expiryDate` | Posting dates |
| Contact prefs | `employerPreferences` | `{ call, whatsapp }` — public opt-in flags, not personal contact data |
| Links | `isExternalJob`, `externalJobUrl`, `publicUrl`, `scrapedAt` | Source and timestamp |

### Example Input

```json
{
  "searchQuery": "driver, security guard",
  "location": "Mumbai",
  "maxItems": 200,
  "maxPagesPerQuery": 3,
  "includeJobDetails": true
}
```

### Example Output

```json
{
  "jobId": "38642614",
  "title": "Driver",
  "companyName": "M/s DS Enterprises",
  "city": "Noida",
  "state": "Delhi-NCR",
  "minSalary": 18000,
  "maxSalary": 25000,
  "salaryType": 1,
  "minExperience": 12,
  "maxExperience": 60,
  "experienceInYears": "1-5 years",
  "education": "10th Pass",
  "shift": "Day",
  "employmentType": "Full Time",
  "numberOfOpenings": 5,
  "skillsRequired": ["Driving", "Route Knowledge"],
  "description": "Looking for an experienced driver for local deliveries...",
  "postedDate": "2026-10-10T00:00:00.000Z",
  "employerPreferences": { "call": true, "whatsapp": true },
  "publicUrl": "https://apna.co/job/38642614",
  "scrapedAt": "2026-10-15T09:00:00.000Z"
}
```

### Integrations & Automation

- **Apify API** — run and read the dataset programmatically.
- **Webhooks** — push new jobs into an ATS, Google Sheet or database on run completion.
- **Zapier / Make** — connect new job rows to recruitment tools or a job board.

**Recommended schedule:** run **daily** for recruitment pipelines and job boards that need fresh listings; **weekly** for salary and hiring-trend analysis. For high-volume roles (driver, security guard, delivery), hourly runs keep a live feed current.

### Related Actors

- [Naukri.com Job Scraper](https://apify.com/ahmed_jasarevic/naukri-job-scraper) — India jobs & salary data, the closest companion source to Apna.
- [Foundit Scraper](https://apify.com/ahmed_jasarevic/foundit-scraper) — India jobs & salary data (formerly Monster India).
- [Cutshort Jobs Scraper](https://apify.com/ahmed_jasarevic/cutshort-scraper) — India tech jobs & salaries.
- [Indeed Job Scraper](https://apify.com/ahmed_jasarevic/indeed-job-scraper) — global jobs, salary and company data.
- [Jooble Scraper](https://apify.com/ahmed_jasarevic/jooble-scraper) — jobs, salary and apply URLs across many countries.

### FAQ

#### Why use this actor instead of the official API?

Apna.co does not expose a public API for exporting job listings. This actor reads the same publicly available job data the site's front end uses and returns it as structured JSON, with no API key required.

#### What are alternatives to this actor or to Apna data?

For India job-market data, Naukri.com and Foundit are the closest alternative sources, and this actor's own Naukri and Foundit scrapers cover them. Apna is strongest for blue- and grey-collar roles (drivers, guards, telecallers, delivery), which the other boards under-represent.

#### Does it return recruiter phone numbers or emails?

No. Apna.co does not expose recruiter phone numbers or emails publicly. The actor returns the employer's **public** contact preference flags (`employerPreferences.call` / `.whatsapp`) — not personal contact data.

#### What salary data is available?

Advertised **monthly INR** salary fields: `minSalary`, `maxSalary`, `salaryIncentive` and `earningPotential`, plus the displayed `experienceInYears`.

#### Do I need a proxy?

No, it runs on Apify's own egress IPs by default. If you enable a proxy, use **residential** (Apna's WAF, Link11, returns HTTP 492 to the Apify datacenter ranges), optionally with an India location.

#### How do I export the data to CSV or Excel?

Every run writes to an Apify dataset; use the console's **Export** button or the dataset API endpoint to download CSV, Excel or JSON.

### For AI Agents & LLM Apps

Purpose: return Apna.co (India) job listings as structured records — title, company, location, salary (INR/month), experience, skills, education, description and public employer contact preferences.

Minimal working input:

```json
{ "searchQuery": "driver" }
```

Variant inputs:

```json
{ "searchQuery": "telecaller, delivery boy", "location": "Delhi", "maxItems": 200, "includeJobDetails": true }
```

```json
{ "startUrls": [{ "url": "https://apna.co/job/38642614" }] }
```

Output fields (dataset): `jobId, title, companyName, companyId, companyExternalId, companyLogoUrl, city, state, area, locationName, address, latitude, longitude, category, subCategory, department, minSalary, maxSalary, salaryType, salaryIncentive, earningPotential, minExperience, maxExperience, experienceInYears, experienceLevel, education, englishLevel, gender, shift, employmentType, isWorkFromHome, isPartTime, isFlexibleJob, numberOfOpenings, skillsRequired, jobHighlights, description, richDescription, postedDate, lastUpdated, expiryDate, employerPreferences, isExternalJob, externalJobUrl, publicUrl, scrapedAt`.

Behaviors an agent should know:

- If `startUrls` is provided, the actor scrapes those exact jobs and `searchQuery`/`location` are ignored.
- `location` used **without** keywords browses all jobs in that city; combined with keywords, results are filtered by city **client-side** (Apna ignores the location filter server-side for keyword searches).
- `includeJobDetails: true` (the default) adds skills, full description, education, shift, openings and geo; setting it `false` gives a faster, lighter run with search-only fields.
- `employerPreferences` is `{ call, whatsapp }` boolean opt-in flags — never phone numbers or emails.
- Billing model: pay-per-event — one `apify-default-dataset-item` charge per job saved (from ~$0.00075/result, i.e. ~$0.75 per 1,000) plus a `job-detail` event (~$0.0009/result) for each job enriched when `includeJobDetails` is on, plus one `apify-actor-start` charge per run.

### Legal & Compliance Disclaimer

This actor is an independent tool and is **not affiliated with, endorsed by, or sponsored by Apna** or Apna.co. It reads only publicly available job listing data; it does not bypass login, private endpoints, or CAPTCHAs, and it does not expose recruiter phone numbers or emails. Users are responsible for their own compliance with Apna.co's Terms of Service and applicable data-protection law, and for using the data lawfully.

### SEO Keywords

apna scraper, apna jobs scraper, apna.co data, apna api, blue collar jobs india data, grey collar jobs india, india job data, blue collar recruitment data, india jobs dataset, telecaller jobs data, driver jobs india, security guard jobs data, delivery jobs india data, salary data india, naukri alternative, foundit alternative, hiring trend data india, bulk job listings india, entry level jobs india, recruitment leads india, apna export csv, apna job scraper india

# Actor input Schema

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

Job title / role keyword(s) to search for on Apna.co, e.g. "driver", "nurse", "telecaller". Separate multiple keywords with commas or new lines.

## `location` (type: `string`):

Optional Indian city to filter by, e.g. "Mumbai", "Bengaluru", "Delhi". When used without keywords, all jobs in that city are browsed. When combined with keywords, results are filtered by city.

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

Optional. Scrape these exact Apna job URLs (https://apna.co/job/...) or numeric job IDs instead of running a search.

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

Maximum number of job rows to save to the dataset.

## `maxPagesPerQuery` (type: `integer`):

How many result pages to request per keyword (up to 100 jobs per page). Higher values give more coverage.

## `includeJobDetails` (type: `boolean`):

If enabled, the actor calls the job-detail endpoint for every job to add skills, full description, education, shift and other rich fields. Disable for a faster, lighter run.

## `proxy` (type: `object`):

Select proxies to be used by your crawler.

## Actor input object example

```json
{
  "searchQuery": "driver",
  "startUrls": [],
  "maxItems": 100,
  "maxPagesPerQuery": 3,
  "includeJobDetails": true,
  "proxy": {
    "useApifyProxy": false
  }
}
```

# 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 = {
    "searchQuery": "driver",
    "location": "",
    "startUrls": [],
    "proxy": {
        "useApifyProxy": false
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("ahmed_jasarevic/apna-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 = {
    "searchQuery": "driver",
    "location": "",
    "startUrls": [],
    "proxy": { "useApifyProxy": False },
}

# Run the Actor and wait for it to finish
run = client.actor("ahmed_jasarevic/apna-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 '{
  "searchQuery": "driver",
  "location": "",
  "startUrls": [],
  "proxy": {
    "useApifyProxy": false
  }
}' |
apify call ahmed_jasarevic/apna-scraper --silent --output-dataset

```

## MCP server setup

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