Apna Jobs Scraper | 50 Categories, 23 Fields, Monitor Mode
Pricing
from $0.60 / 1,000 jobs
Apna Jobs Scraper | 50 Categories, 23 Fields, Monitor Mode
Scrape live job listings from Apna.co, India's largest blue-collar and early-career job app. Title, company, salary, location, tags by city, category and job type. No login, no anti-bot, pay per job. Works in Claude, ChatGPT & any MCP AI agent.
Pricing
from $0.60 / 1,000 jobs
Rating
0.0
(0)
Developer
The Mine Works
Maintained by CommunityActor stats
0
Bookmarked
28
Total users
7
Monthly active users
4 days ago
Last modified
Categories
Share
From The Mine Works, makers of Threads Scraper and B2B Leads Finder, with over 140,000 runs across 170+ public actors. This actor ranks #3 for "apna jobs" in Apify Store search.
Apna.co is India's big job app for entry level, field and blue collar work: telecallers, delivery riders, sales executives, back office staff, drivers, technicians and nurses, across metros and smaller cities alike. This actor turns Apna's public job listings into clean rows with title, company, location, salary range and the tag chips Apna shows, and can add the full description and structured salary from each job's own page.
Why choose this actor?
- 250 jobs in about 90 seconds, 10 fields on every one. On 1 Oct 2026 a run of the all-India feed returned 250 jobs in 93.9 seconds, and all 250 rows had every listing field filled. It reads Apna's public pages over plain HTTP: no login, no cookies, no browser.
- Only new jobs on repeat runs. Turn on
monitorModeand the actor remembers up to 50,000 job IDs it has delivered to your account and skips them next time. A job you already received is never sent or charged again. - From $0.60 per 1,000 jobs. You pay per job saved, plus Apify's start event of $0.005 per run at the 1 GB memory this actor uses. The summary row, jobs already seen in monitor mode and failed pages are never charged.
Part of The Mine Works Jobs and hiring family: Foundit Monster India Jobs, Hirist Jobs Scraper, India Jobs MCP, Naukri Jobs Scraper, Shine.com Jobs Scraper, Internshala Scraper.
Try it in one minute
Paste this into the JSON tab of the input page and press Start. It returns 10 Bengaluru jobs in a few seconds: our own daily runs of 3 Bengaluru jobs finish in 4 to 10 seconds on Apify.
{"city": "Bangalore","maxJobs": 10}
The actor takes filters, not Apna links or search words, because Apna's website has no keyword search. Pick a city (a plain name such as Pune; Bangalore, Bombay, Calcutta, Delhi, Mysore and Allahabad style names are mapped to Apna's own city pages for you), or a category from Apna's 50 departments, or one of the job type, education, night shift, work from home, freshers or female candidate options. Then narrow with keyword, which keeps only titles that contain your word.
Apify's free plan includes $5 of credit every month, which covers about 4,990 results at this actor's price.
Copy to your AI assistant
themineworks/apna-jobs-scraper on Apify. It browses public Apna.co job listings (India entry level and blue collar jobs) by city, category, job type, education or audience, and returns one row per job with title, company, location, salary range text, tag chips and job link, plus description, structured salary, experience and dates when includeFullDescription is on. Call ApifyClient("TOKEN").actor("themineworks/apna-jobs-scraper").call(run_input={...}), then client.dataset(run["defaultDatasetId"]).list_items().items. Required: nothing (empty input reads the all-India feed). Optional: city (string), category (one of 50 Apna department slugs such as "telecaller_bpo" or "dep_delivery_driver_logistics"), jobType ("full_time" or "part_time"), educationLevel ("10th_pass" or "12th_pass"), nightShiftOnly, workFromHomeOnly, freshersOnly, femaleOnly (booleans, default false), keyword (title contains), maxJobs (default 5, maximum 1000), includeFullDescription (default false), monitorMode (default false), proxyConfiguration (default no proxy; keep it). Only one of category, jobType, educationLevel, the four flags or city is used to browse, in that order; city and keyword then filter the results, other unused filters are ignored. Rows with a _type field are run summaries, not jobs. Full spec: GET https://api.apify.com/v2/acts/themineworks~apna-jobs-scraper/builds/default (Bearer TOKEN), which returns inputSchema and readme. Token: https://console.apify.com/account/integrations
Key features
- 10 fields on every job from the listing card, rising to 23 with
includeFullDescription: description, posted and closing dates, structured salary with its unit, months of experience, industry, occupation, address and more, read from the schema.org JobPosting data on each job's page. - 50 Apna departments in the
categorylist, from Telecaller / BPO and Delivery, Driver & Logistics to Healthcare, Retail and Software Engineering. - 8 browse filters and 2 narrowing filters. Apna's site serves one filter per page, so the actor browses by the most specific one you set and then narrows by
cityandkeywordon its side. - 25 jobs per page, up to 60 pages and 1,000 jobs per run. Jobs are de-duplicated by Apna's job ID within the run.
- Monitor mode for daily or hourly feeds of new jobs only.
- A summary row at the end of every run with jobs requested, delivered, failed pages and charged count. It is never charged.
How to use it
Basic: one city
{"city": "Pune","maxJobs": 100}
With only a city set, the actor browses Apna's page for that city, 25 jobs per page, until it has 100.
A category in one city, narrowed by a word
{"category": "telecaller_bpo","city": "Pune","keyword": "outbound","maxJobs": 100}
Apna's site cannot combine a category and a city on one page, so the actor browses the Telecaller / BPO feed for all of India and keeps only jobs whose location text contains "pune" and whose title contains "outbound". Narrowing can only remove jobs, so a narrow combination may return fewer than maxJobs even after reading all 60 pages.
Daily new-job alerts
{"category": "dep_sales_bd","city": "Hyderabad","maxJobs": 200,"monitorMode": true}
Save this as a task and schedule it daily, for example with the cron 0 8 * * *. The first run records a baseline. Every run after that delivers only jobs you have not received before, and the summary row shows how many were skipped. The memory of seen jobs is shared by every run of this actor on your account, so a job delivered by one task is skipped by another.
Full descriptions and structured salary
{"category": "dep_delivery_driver_logistics","city": "Bengaluru","maxJobs": 200,"includeFullDescription": true}
Each job gets one extra request to its own page, which adds the description, structured salary (salary_min, salary_max, salary_unit, salary_currency), experience_months, date_posted, valid_through, industry, occupational_category, address and direct_apply. It is slower, and for a few hundred jobs or more with this on, raise the run memory to 2,048 MB in Run options.
Work from home jobs
{"workFromHomeOnly": true,"keyword": "customer","maxJobs": 100}
The four audience options (nightShiftOnly, workFromHomeOnly, freshersOnly, femaleOnly) each map to one Apna page. Set only one: if you set two, the actor uses the first in its order and ignores the other. The same goes for jobType and educationLevel. Only city and keyword narrow the results on top.
Wage benchmarking by category
{"category": "dep_retail_ecommerce","maxJobs": 1000}
Run one category at a time and compare salary_text by city_slug, or turn on includeFullDescription for numeric salary_min and salary_max. Repeat the run weekly to watch pay move.
Input parameters
| Parameter | Type | Default | What it does |
|---|---|---|---|
city | string | none | A city name such as Pune or Bangalore. Used to browse when no other filter is set; otherwise it narrows results to jobs whose location text contains it. |
category | string, one of 50 | none | An Apna department, such as telecaller_bpo, delivery_person, dep_sales_bd or dep_customer_support. Takes first priority for browsing. |
jobType | string: full_time or part_time | none | Browse full time or part time jobs. Used only if category is empty. |
educationLevel | string: 10th_pass or 12th_pass | none | Browse jobs Apna tags for that minimum education. Used only if the filters above are empty. |
nightShiftOnly | boolean | false | Browse night shift jobs. |
workFromHomeOnly | boolean | false | Browse work from home jobs. |
freshersOnly | boolean | false | Browse jobs open to freshers. |
femaleOnly | boolean | false | Browse jobs open to or preferring female candidates. |
keyword | string | none | Keep only jobs whose title contains this text, ignoring case. |
maxJobs | integer, 1 to 1,000 | 5 | Cap on jobs delivered. Set it; the default is only 5. |
includeFullDescription | boolean | false | Open each job's own page for the description and 12 more structured fields. One extra request per job. |
monitorMode | boolean | false | Deliver only jobs not delivered to your account in an earlier run. |
proxyConfiguration | object | {"useApifyProxy": false} | Leave it off. See "Do I need a proxy?" below. |
The browse order is category, then jobType, educationLevel, nightShiftOnly, workFromHomeOnly, freshersOnly, femaleOnly, and last city. With nothing set, the actor reads Apna's all-India feed.
The input form in the Apify Console starts with Pune, Software Engineering, Full time, 10th pass and the keyword delivery filled in. Run as is, that browses Software Engineering jobs and keeps only those in Pune with "delivery" in the title, which may be none. Clear the fields you do not want before you start. Runs through the API or an AI assistant get only what you send.
What data do you get?
One row per job. A field Apna does not publish for a job is left out of that row rather than sent empty.
From the listing card (every row): job_id, title, company, location as Apna writes it (for example "Kothrud, Pune" or "All areas in Hyderabad Region"), city_slug from the job link, salary_text as shown on the card, tags (the chips Apna shows, see below), company_logo, job_url and scraped_at.
With includeFullDescription on: description, employment_type (such as FULL_TIME), date_posted, valid_through, industry, occupational_category, experience_months, salary_min, salary_max, salary_unit (such as MONTH), salary_currency, address and direct_apply.
Run rows: every run ends with a _type: "summary" row (jobs requested, delivered and charged, failed pages, the filter used, monitor counts) and, when at least one job was delivered, a _type: "info" row. Neither is charged. Filter on _type to keep only jobs.
Tag chips we saw in 695 rows on 1 Oct 2026: Full Time, Part Time, Field Job, Work from Office, Night Shift, Any experience, Freshers only, Min. 6 months up to Min. 10 years, and the English level (No English Required, Basic English, Good (Intermediate / Advanced) English).
What else we saw, so you can plan for it:
salary_texthas no unit on the card. All 38 jobs in our full description sample gavesalary_unitMONTH, but some cards appear to show yearly packages, such as "₹5,00,000 to ₹10,00,000" for a field manager. WithincludeFullDescriptionon,salary_maxcan be higher than the card's top figure: one telecaller job showed ₹12,000 to ₹85,000 on the card andsalary_max103000 on its page.company_logois the first image on the card. About 1 row in 4 (80 of 345 in one run) had no company logo, and the field then holds Apna's "Work from office" badge image instead.city_slugcomes from the job link and can be a suburb or district, such ashoskotefor a job listed as "All areas in Bengaluru/Bangalore Region".descriptionis plain text with HTML entities such as left in. In our sample the median was 925 characters.- When a job's own page cannot be read, the job is still delivered with its card fields and charged like any other job. In our full description test through a datacenter proxy, 38 of 100 jobs got the extra fields; see "Do I need a proxy?".
Stable fields for automations
These 10 fields were present, and not empty, in all 695 job rows from our three 1 Oct 2026 runs. Their names will not change, so a Sheet, Zap, Make scenario or n8n flow can map to them safely.
| Field | What it is |
|---|---|
job_id | Apna's job ID. Use it as the unique key. |
title | Job title as posted |
company | Hiring company or recruiter |
location | Area and city as shown on the card |
city_slug | City or locality part of the job link |
salary_text | Pay range as shown on the card, without a unit |
tags | List of tag chips |
company_logo | Image link from the card (see note above) |
job_url | Link to the job on apna.co |
scraped_at | When the row was collected, ISO 8601 in UTC |
Output examples
Real rows from our 1 Oct 2026 runs. The description is cut to its first words.
A listing card row from the all-India feed
{"job_id": "45932498","title": "Registrar / Junior Anaesthetist","company": "International Knee & Orthopaedic Centre","location": "HSR Layout, Bengaluru/Bangalore","city_slug": "bengaluru-bangalore","salary_text": "₹1,00,000 - ₹1,49,999","tags": ["Work from Office", "Full Time", "Min. 2 years", "Good (Intermediate / Advanced) English"],"company_logo": "https://apna-organization-logos.gumlet.io/production/logos/7eb074b0-9cb7-4240-aae4-ed3cf0c10742/61c5e47696bead7dc1713e69.jpg?w=128","job_url": "https://apna.co/job/bengaluru-bangalore/registrar-junior-anaesthetist-45932498","scraped_at": "2026-10-01T13:54:24.258Z"}
A field job whose card shows a yearly package
{"job_id": "898583317","title": "Assistant General Manager","company": "Cadila Pharmaceuticals Limited","location": "All areas in Hyderabad Region","city_slug": "hyderabad","salary_text": "₹5,00,000 - ₹10,00,000","tags": ["Field Job", "Full Time", "Min. 1 year"],"company_logo": "https://apna-organization-logos.gumlet.io/production/63084769fec4fe072bcdf94e?w=128","job_url": "https://apna.co/job/hyderabad/assistant-general-manager-898583317","scraped_at": "2026-10-01T13:54:21.137Z"}
A telesales job with includeFullDescription on
{"job_id": "696773884","title": "Telesales Manager","company": "Galaxy HR Solutions","location": "Kothrud, Pune","city_slug": "pune","salary_text": "₹40,000 - ₹65,000","tags": ["Work from Office", "Full Time", "Min. 5 years", "Good (Intermediate / Advanced) English"],"company_logo": "https://apna-organization-logos.gumlet.io/production/logos/80713705-9788-42c2-b828-cc5361023a8f/66c82cf0ce68242fd2c0da80.png?w=128","job_url": "https://apna.co/job/pune/telesales-manager-696773884","scraped_at": "2026-10-01T13:47:12.678Z","description": "Designation: Telesales Manager Location: Pune Job Description: 1. Lead, supervise and motivate telesales team to achieve individual and team advertisement sales target...","employment_type": "FULL_TIME","date_posted": "2026-09-26T05:56:12.796Z","valid_through": "2026-10-11","industry": "Sales & BD","occupational_category": "Telesales","experience_months": 60,"salary_min": 40000,"salary_max": 70000,"salary_unit": "MONTH","salary_currency": "INR","address": "Kothrud, Pune, Maharashtra, India","direct_apply": true}
The summary row from the 250 job run
{"_type": "summary","facet": "(all-India feed)","jobs_requested": 250,"low_memory_warning": false,"jobs_scraped": 250,"jobs_failed": 12,"charged_for": 250,"pages_fetched": 22,"ended_on_deadline": false,"monitor": false,"scraped_at": "2026-10-01T13:55:47.296Z"}
jobs_failed counts failed pages and any row that could not be saved. Here it is the 12 pages Apna refused through a datacenter proxy; the run skipped them and carried on. With monitorMode on, the summary also shows previously_seen, new_this_run and skipped_duplicates.
Pricing
Pay per event: you are charged for each job saved to your dataset, plus Apify's standard start event. The price per job drops as your Apify plan goes up.
| Event | Free plan | Bronze (Starter) | Silver (Scale) | Gold and above (Business) |
|---|---|---|---|---|
job-scraped, per job | $0.001 | $0.0009 | $0.00075 | $0.0006 |
| Per 1,000 jobs | $1.00 | $0.90 | $0.75 | $0.60 |
apify-actor-start, per run | $0.005 per GB of memory | $0.005 per GB | $0.005 per GB | $0.005 per GB |
- Start fee: $0.005 per GB of run memory, with a minimum of one event. This actor runs with at least 1,024 MB, so a run at the default memory pays $0.005. If you raise memory to 2,048 MB for a large full description run, the start fee is $0.01.
- Never charged: the
summaryandinforows, jobs already delivered in monitor mode, jobs repeated on a later page of the same run, jobs removed by yourcityorkeywordfilter, and refused or empty pages. - Charged at the normal price: a job whose own page could not be read in full description mode. It arrives with its card fields only.
- Spending cap: if you set a maximum cost per run in Apify, the actor stops once that budget is used, so you never receive rows you were not charged for and never pay past your cap.
- No price change is scheduled. The current prices have applied since 17 Sep 2026.
Worked examples on the Free plan: 100 jobs cost $0.10 plus the $0.005 start fee, and 1,000 jobs cost $1.00 plus $0.005. On Gold, 1,000 jobs cost $0.60 plus $0.005.
FAQ
What is Apna.co? Apna is an Indian job app built for entry level, field and blue collar hiring: telecalling, delivery, sales, back office, drivers, retail, healthcare staff and trades. It is strong in tier 2 and tier 3 cities where Naukri and LinkedIn have less coverage.
How many jobs can I get? Up to 1,000 per run. The actor reads up to 60 pages of 25 jobs and stops early when two pages in a row bring nothing new. In our 1 Oct 2026 test the all-India feed still had new jobs on page 36. For more than 1,000, split the work across cities or categories.
Can I search by keyword?
Not on Apna itself: its website has no keyword search. keyword filters the titles of the jobs the actor browses. For best results, pick the closest category and add a short keyword.
Can I combine a city and a category?
Yes. Apna's pages take one filter at a time, so the actor browses by category and keeps jobs whose location contains your city. The same works for keyword. Other combinations do not: if you set category and freshersOnly, for example, only category is used. To get freshers jobs in one category, run freshersOnly with a keyword instead.
How fresh is the data?
Each run reads Apna live when it starts. There is no cache. With includeFullDescription on, date_posted and valid_through show each job's age and closing date.
Do I need an Apna account, cookies or an API key? No. The actor reads the same public pages any visitor sees, with no login. You only need an Apify account.
Do I need a proxy? No, and we suggest you leave it off, which is the default. Our scheduled runs on Apify without a proxy have all succeeded. Through Apify's datacenter proxy, Apna refused many pages with HTTP 492 on 1 Oct 2026: 12 of 22 in our best run and all of the first 6 in another, which ended with no jobs. The actor skips a refused page and stops after 6 refusals in a row, so a blocked run costs only the start fee.
How does monitor mode decide what is new?
It keeps a list of the job IDs it has delivered to your Apify account, up to 50,000, and skips any job on that list. The list is shared by every run of this actor on your account, whatever the input. If the list cannot be read, that run delivers everything and the summary shows monitor_degraded: true.
Why did my run return fewer jobs than maxJobs?
Either the feed ran out, your city or keyword filter removed most jobs, or monitor mode skipped jobs you already had. The summary row shows the filter used and the counts. Only delivered jobs are charged.
Can I run it on a schedule?
Yes. Save your input as a task, then add a schedule in Apify Console under Schedules, for example daily at 08:00. Turn on monitorMode so each run brings only new jobs.
Which formats can I export?
JSON, CSV, Excel, XML, RSS or HTML from the run's Storage tab, or through the Apify API. In CSV and Excel, list fields such as tags are split into numbered columns (tags/0, tags/1 and so on).
Can I use it from Claude, ChatGPT or another AI assistant?
- Connector URL:
https://mcp.apify.com/?tools=themineworks/apna-jobs-scraper. - Claude: Settings > Connectors > Add custom connector, paste the URL, sign in with Apify.
- ChatGPT: developer mode, add an MCP connector with the URL, sign in with Apify.
- Cursor or VS Code: add it as an HTTP MCP server with that URL.
- Claude Code:
claude mcp add -t http apna-jobs-scraper "https://mcp.apify.com/?tools=themineworks/apna-jobs-scraper".
Is it legal to scrape Apna? The actor collects only public job listings, the same pages anyone can view without logging in. It collects nothing about job seekers. Listings can include an employer's address, which is business information. You are responsible for how you use the data, including Apna's terms and data protection law such as GDPR, CCPA and India's DPDP Act. This is general information, not legal advice.
Integrations
- Google Sheets: send each run's dataset to a sheet with Apify's Google Sheets integration.
- Make, Zapier and n8n: start a run and read the jobs with the official Apify modules and nodes.
- Webhooks: have Apify call your URL when a run finishes, then fetch the dataset.
- API: start runs and read results over HTTP, or with the Python and JavaScript clients.
- MCP clients: Claude, ChatGPT, Cursor and other MCP clients can call the actor through
https://mcp.apify.com.
More from The Mine Works
Jobs and hiring
- Foundit Monster India Jobs
- Hirist Jobs Scraper
- India Jobs MCP
- Naukri Jobs Scraper
- Shine.com Jobs Scraper
- Internshala Scraper
- Instahyre Jobs Scraper
- Indeed Jobs Scraper
- CutShort Jobs Scraper
- LinkedIn Jobs Scraper
- Recruiting & Jobs MCP
- Career Site Jobs Scraper
Social media and video
Leads and business directories
Marketing, SEO and reviews
Real estate
Science, health and government data
E-commerce and marketplaces
Company and business data
Food and local services
Developer and AI tools
More tools
Support
Found a bug or need a field we do not return? Open an issue in the Issues tab. Want a job board or data source we do not cover yet? Email dmineworks@gmail.com. A guide for this actor also lives at themineworks.com.
Apna Jobs Scraper turns Apna.co's public listings into clean job rows by city, category or audience, with new-job monitoring and pay per job from $0.60 per 1,000.

