# Apna Jobs Scraper - India Job Listings, Salary & Details (`steadyscrape/apna-jobs-scraper`) Actor

Scrape job listings from Apna (apna.co), India’s blue-collar and entry-level job app: title, company, monthly salary, address and tags, plus description, education, English, gender, skills, openings and pincode. Search by keyword and city or paste links. Export to JSON, CSV or Excel, or via API.

- **URL**: https://apify.com/steadyscrape/apna-jobs-scraper.md
- **Developed by:** [Steady Scrape](https://apify.com/steadyscrape) (community)
- **Categories:** Jobs, Lead generation, Automation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.00 / 1,000 jobs

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

## Apna Jobs Scraper — apna.co jobs with salaries, requirements and full job details

Scrape job listings from **Apna (apna.co)**, India's job app for blue-collar, entry-level and early-career work: sales,
delivery, telecalling, back office, retail, drivers, factory and field jobs in every city. Search by **keyword** and
**city**, use Apna's own **filters** (date posted, department, work mode, full or part time, shift, experience, minimum
salary), or paste any **apna.co** job list or job page link. Every job comes with its **title**, **company**,
**address**, **monthly salary range**, **tags** (work mode, full or part time, experience, English) and **link**. Turn
on the job page (on by default) to also get the **full description**, **posted and valid-through dates**,
**department and role**, **experience**, **education**, **English level**, **gender**, **skills**, **number of
openings**, **fixed pay, incentives and earning potential**, **benefits**, **applicants**, **interview details**, every
requirement line Apna shows (age limit, assets, regional language…) and the **address with pincode and coordinates**.

No login, no API key, no browser to configure. Export the Apna jobs data to JSON, CSV or Excel, or read it via the
Apify API.

### What you can use the Apna jobs data for

- **Blue-collar hiring market research**: which roles, salaries and requirements employers post, city by city.
- **Staffing and recruitment leads**: companies hiring now for delivery, sales, telecalling or factory work, with their
  address.
- **Job boards and alerts**: run on a schedule with **monitor mode** to receive only the jobs new since the last run.
- **Salary benchmarking**: monthly fixed pay, incentives and earning potential by role, city and experience.
- **Analytics and training data**: structured job descriptions with skills, education and English requirements.

### Apna jobs scraper input

| Field | What it does |
|---|---|
| **Job titles or keywords** | What you would type in Apna's search box: `sales executive`, `delivery boy`, `telecaller`. Each keyword is searched in each city. |
| **Cities** | `Pune`, `Bengaluru`, `Gurgaon`, `Navi Mumbai`… Common spellings (`Bangalore`, `Gurugram`, `New Delhi`) are understood. Empty = all of India. Cities without a keyword list every job of the city. |
| **Apna links** | Any job list copied from apna.co (`https://apna.co/jobs/sales-bd-jobs-in-pune`, a search with filters), read from its first page with its own filters; or a job page (`https://apna.co/job/pune/area-sales-manager-656031588`), read with all its details. |
| **Sort by** | Newest first (default), relevance, or salary high to low. |
| **Date posted** / **Departments** / **Work mode** / **Work type** / **Shift** | Apna's own filters. Ticking several values keeps jobs matching any of them. |
| **Candidate experience** | Jobs open to a candidate with this many years (0 = freshers). |
| **Minimum monthly salary** | Apna's salary filter, in rupees a month. |
| **Include the full job page** | One extra page per job for the details listed above (priced as a detailed job). |
| **Max jobs per search** | Stops each search after this many new jobs (default 100; 0 = every page). |
| **Only new jobs (monitor)** | Skips, for free, every job this Actor already delivered to you in an earlier run. |

```json
{
    "keywords": ["sales executive", "delivery boy"],
    "locations": ["Pune", "Bengaluru"],
    "postedWithin": "7d",
    "workTypes": ["fullTime"],
    "includeDetails": true,
    "maxJobsPerSearch": 200
}
```

### Apna jobs data output

One row per job. Example (with the job page, shortened):

```json
{
    "status": "ok",
    "search": "sales executive in Pune",
    "position": 1,
    "jobId": "656031588",
    "title": "Area Sales Manager",
    "companyName": "Varthana Finance",
    "companyId": "1420537",
    "companyLogoUrl": "https://apna-organization-logos.gumlet.io/production/logos/…/400x400-new-logoc.png?w=128",
    "url": "https://apna.co/job/pune/area-sales-manager-656031588",
    "address": "Pune",
    "salaryMin": 40000,
    "salaryMax": 90000,
    "tags": ["Field Job", "Full Time", "Min. 3 years", "Basic English"],
    "highlights": ["Urgently hiring"],
    "scrapedAt": "2026-10-24T06:00:00.000Z",
    "details": {
        "description": "Hiring: Area Sales Manager (ASM) – Pune\nCompany: Varthana Finance\n… share their updated CV on [phone hidden]",
        "descriptionHtml": "<p><strong>Hiring: Area Sales Manager (ASM) – Pune</strong></p>…",
        "postedAt": "2026-10-21T11:30:15.487Z",
        "createdOn": "2026-10-21",
        "validThrough": "2026-11-05",
        "department": "Sales & BD",
        "role": "Field Sales",
        "employmentType": "Full Time",
        "workFromHome": false,
        "shift": "Day Shift",
        "experience": "Min. 3 Years",
        "minExperienceYears": 3,
        "maxExperienceYears": null,
        "education": "Graduate",
        "english": "Basic English",
        "gender": "Male",
        "skills": ["Channel sales", "DSA"],
        "openings": 10,
        "facts": { "Regional language": "Fluent in speaking Marathi", "Gender": "Male", "…": "…" },
        "fixedSalaryMin": 40000,
        "fixedSalaryMax": 90000,
        "incentive": 10000,
        "earningPotential": 100000,
        "benefits": [],
        "applicants": 54,
        "highlights": ["Urgently hiring"],
        "interviewDetails": [{ "label": "Company Address", "value": "Pune, Maharashtra, India" }],
        "address": { "line": "Pune, Maharashtra, India", "area": null, "city": "Pune", "state": "Maharashtra", "pincode": "411002", "latitude": 18.5246091, "longitude": 73.8786239 },
        "isExternal": false,
        "applyUrl": null
    }
}
```

| Field | Meaning |
|---|---|
| `status` | `ok` for a job; free rows carry another status (below). |
| `jobId` / `url` | Apna's job id and the job's page on apna.co. |
| `title` / `companyName` / `companyId` / `companyLogoUrl` | The job title, the employer as Apna names it, Apna's id for it, and its logo (`null` when it has none). |
| `address` | Where the job is, as the card prints it: "Hinjewadi, Pune", "Work From Home". |
| `scrapedAt` | When the row was read, ISO 8601 UTC. |
| `search` / `position` | The keyword and city, or link, the row came from, and its place in Apna's results (from 1). |
| `salaryMin` / `salaryMax` | Fixed monthly pay in rupees as the card shows it; `null` when Apna shows none. A few employers enter yearly figures. |
| `tags` / `highlights` | The card's labels ("Work from Office", "Min. 2 years", "Basic English") and badges ("Urgently hiring", "New"). |
| `details` | `null` without the job page, or when that page could not be read (the row is then charged as a plain job). |
| `details.description` / `descriptionHtml` | The job description as text (paragraphs kept as line breaks) and as Apna's HTML. |
| `details.postedAt` | ISO 8601 UTC; `createdOn` and `validThrough` are dates. |
| `details.department` / `role` / `employmentType` / `shift` / `workFromHome` | Apna's department and role, "Full Time" or "Part Time", day or night shift, and whether it is remote. |
| `details.experience` / `minExperienceYears` / `maxExperienceYears` | As Apna prints it ("Min. 3 Years"), and in years (`maxExperienceYears` is `null` without an upper limit). |
| `details.education` / `english` / `gender` / `skills` / `openings` | The requirements the employer set and the number of openings. |
| `details.fixedSalaryMin` / `fixedSalaryMax` | Fixed monthly pay in rupees from the job page. |
| `details.facts` | Every line of the page's "Job role" and "Job requirements" boxes, as shown (age limit, assets, languages…). |
| `details.incentive` / `earningPotential` | Monthly incentives on top of the fixed pay, and the total Apna advertises. |
| `details.benefits` / `applicants` / `highlights` | Benefits listed ("Weekly Payout", "Health Insurance", "Joining Bonus"…), how many have applied (`null` when Apna shows only "500+ applicants", kept in `highlights`), and the page's badges. |
| `details.interviewDetails` | The interview lines Apna shows (company address, work location), without recruiter names or contacts. |
| `details.address` | `line`, `area`, `city`, `state`, `pincode`, `latitude`, `longitude` of the workplace. |
| `details.isExternal` / `applyUrl` | Jobs Apna lists from a company's own careers site, and where they are applied for. |

A search, link or job that gives nothing to charge produces one **free** row with `status`, `url` and `reason`:
`no_results`, `location_not_found` (a city Apna has no page for, or a state), `invalid` (a link that is not an Apna job
list or job page), `expired` (a job whose page says it no longer takes applications), `not_found` (a job link Apna
answers 404), `blocked` (Apna refused to answer) or `unreadable`. The run's `SUMMARY` record lists every search with
Apna's total, pages read, jobs delivered, expired jobs, duplicates and jobs skipped by the monitor.

### Apna jobs scraper pricing

Pay per result, nothing per run:

- **US$0.001 per job** as the list page shows it (US$1 per 1,000).
- **US$0.002 per job with its full page** (US$2 per 1,000).

A job found by several of your searches is charged once. Free rows, expired jobs, duplicates and jobs skipped by
monitor mode are never charged. Set a maximum cost per run in Apify and the Actor stops before reading pages it cannot
charge for.

### Limits and notes

- Apna's keyword search returns at most **500 jobs per keyword and city** (20 pages). Job lists by city or category
  (pasted links, or a city without a keyword) page on to their last job.
- Apna's relevance order mixes expired jobs into keyword searches; the default **newest first** keeps them out, and
  with the job page on, any expired job found is given as a free `expired` row.
- A city's list ends with jobs Apna adds from nearby places and work-from-home roles, as on the site; each row's
  `address` says where the job is.
- Recruiters' names, phone numbers and e-mail addresses are not collected, and phone numbers or e-mails an employer
  typed into a description are replaced by `[phone hidden]` / `[e-mail hidden]`.
- The Actor reads about one page a second, so 1,000 jobs with their pages take about 17 minutes (without them, about a
  minute).
- If Apna refuses requests, the run stops asking and returns what it has; nothing undelivered is charged.

### Is it legal?

This Actor reads only public job listings that Apna shows to any visitor without an account: no login and no candidate
data, recruiter contact details are left out, and it reads only pages Apna's robots.txt allows. Check that your use of
the data complies with Apna's terms and the laws that apply to you (such as India's DPDP Act or the GDPR) before using
it commercially.

This is an unofficial tool: it is not affiliated with, endorsed by or sponsored by Apna or Apnatime Tech Private Limited.

# Actor input Schema

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

One per line, as you would type them in Apna’s search box: <code>sales executive</code>, <code>delivery boy</code>, <code>telecaller</code>. Each keyword is searched in each city below. Apna’s search returns at most 500 jobs per keyword and city. Leave empty to list every job of the cities.

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

One per line, as Apna names them: <code>Pune</code>, <code>Bengaluru</code>, <code>Gurgaon</code>, <code>Navi Mumbai</code>, <code>Jaipur</code>. Common spellings such as <code>Bangalore</code>, <code>Gurugram</code> or <code>New Delhi</code> are understood. A city Apna has no page for gives a free row explaining why. Leave empty to search all of India.

## `urls` (type: `array`):

Links copied from apna.co: a job list with any filters you set on the site (<code>https://apna.co/jobs/sales-bd-jobs-in-pune</code>, <code>https://apna.co/jobs/delivery-boy-jobs</code>, a search), read from its first page with its own filters; or a single job page (<code>https://apna.co/job/pune/area-sales-manager-656031588</code>), read with all its details. The filters below do not apply to links.

## `sortBy` (type: `string`):

Apna’s own order. <b>Newest first</b> also keeps expired jobs, which Apna’s relevance order mixes into keyword searches, out of the results.

## `postedWithin` (type: `string`):

Apna’s date filter.

## `departments` (type: `array`):

Apna’s department filter. Ticking several keeps jobs of any of them.

## `workModes` (type: `array`):

Apna’s work mode filter.

## `workTypes` (type: `array`):

Apna’s full time / part time filter.

## `shifts` (type: `array`):

Apna’s shift filter.

## `experienceYears` (type: `integer`):

Apna’s experience filter: jobs open to a candidate with this many years of experience. <code>0</code> keeps jobs for freshers. Leave empty for any.

## `minMonthlySalary` (type: `integer`):

Apna’s salary filter, in rupees a month. 0 keeps every job.

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

Opens each job’s own page for its full description, posted and valid-through dates, department and role, experience, education, English level, gender, skills, openings, fixed pay and incentives, benefits, applicants, interview details, address with pincode and coordinates. Priced as a detailed job (see Pricing). Jobs that turn out to have expired are given as free rows.

## `maxJobsPerSearch` (type: `integer`):

Stops each search after this many new jobs. 0 reads every page Apna shows.

## `onlyNewJobs` (type: `boolean`):

Turns a scheduled run into a job alert: a job this Actor already delivered to you in an earlier run is skipped and not charged. The first run delivers everything and is the baseline.

## Actor input object example

```json
{
  "keywords": [
    "sales executive"
  ],
  "locations": [
    "Pune"
  ],
  "sortBy": "newest",
  "postedWithin": "any",
  "minMonthlySalary": 0,
  "includeDetails": true,
  "maxJobsPerSearch": 20,
  "onlyNewJobs": false
}
```

# Actor output Schema

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

No description

## `summary` (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 = {
    "keywords": [
        "sales executive"
    ],
    "locations": [
        "Pune"
    ],
    "maxJobsPerSearch": 20
};

// Run the Actor and wait for it to finish
const run = await client.actor("steadyscrape/apna-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": ["sales executive"],
    "locations": ["Pune"],
    "maxJobsPerSearch": 20,
}

# Run the Actor and wait for it to finish
run = client.actor("steadyscrape/apna-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": [
    "sales executive"
  ],
  "locations": [
    "Pune"
  ],
  "maxJobsPerSearch": 20
}' |
apify call steadyscrape/apna-jobs-scraper --silent --output-dataset

```

## MCP server setup

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