Apna Jobs Scraper — 50 Categories, 23 Fields, Monitor Mode avatar

Apna Jobs Scraper — 50 Categories, 23 Fields, Monitor Mode

Pricing

from $0.90 / 1,000 jobs

Go to Apify Store
Apna Jobs Scraper — 50 Categories, 23 Fields, Monitor Mode

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.90 / 1,000 jobs

Rating

0.0

(0)

Developer

The Mine Works

The Mine Works

Maintained by Community

Actor stats

0

Bookmarked

1

Total users

0

Monthly active users

2 days ago

Last modified

Share

💼 Apna.co Job Scraper: Blue-Collar & Early-Career Jobs

Overview

Apna.co is India's largest job app for blue-collar, entry-level and early-career work — huge in tier-2 and tier-3 cities, covering everything from delivery riders and telecallers to junior accountants and field sales roles. This actor turns Apna's public job listings into structured data: title, company, salary range, location, and the tag chips Apna itself shows (Full Time / Part Time / Field Job / experience level / English requirement) — with an option to pull the full job description and structured salary/experience/date fields straight from Apna's own schema.org markup.

No login, no cookies, no anti-bot workaround needed — Apna's job pages are plain server-rendered HTML with no Cloudflare/Akamai challenge, so this actor runs as a lightweight HTTP scraper (no browser, no residential proxy required).

✅ No login required | ✅ No proxy required | ✅ Pay per job returned | ✅ MCP-ready for AI agents

Important: how "search" works on this actor

Apna.co is primarily a mobile app. Its website has no free-text keyword search?q= and ?search= query parameters are accepted but silently ignored (verified: identical results regardless of the query string). What the site does have is a fixed taxonomy of single-dimension browse pages, each with working pagination:

  • One city (jobs-in-pune, jobs-in-bengaluru_bangalore, ...)
  • One category/department (dep_sales_bd, telecaller_bpo, dep_it_information_security, ...)
  • One job type (full_time, part_time)
  • One education level (10th_pass, 12th_pass)
  • One audience/shift flag (freshers, female, night_shift, work_from_home)

Only one of these filters is honoured per request — combining two in one URL (e.g. a city and a category together) was tested and the second one is silently ignored by Apna's own site. This actor is built around that reality rather than pretending otherwise:

  • category is treated as the closest thing to a keyword search and takes top priority as the primary browse filter, followed by jobType, educationLevel, and the audience/shift flags, then city.
  • Whichever of your inputs isn't used as the primary filter — plus a free-text keyword field the site has no equivalent for at all — is applied as a client-side post-filter on top of whatever the primary browse page returns (keyword matches job titles; city matches the listing's location text).

That means you can combine, say, a category and a city, and get real, narrower results — just sourced from the category feed and filtered down, not from a combined search Apna itself doesn't support.

Features

  • City, category, job type, education and audience filters — mapped directly onto Apna's own browse taxonomy (50+ categories, 70+ cities, with common aliases like Bangalore/Bombay/Calcutta/Delhi/Mysore/Allahabad auto-mapped to Apna's slugs).
  • Keyword post-filter — narrows whatever feed you selected by job title, since Apna's site has no search API to delegate this to.
  • Tag chips preserved — Full Time / Part Time / Field Job / experience band / English requirement / gender preference, exactly as shown on the listing card.
  • Optional full description mode — fetches each job's detail page and pulls Apna's own schema.org JobPosting data: full description, structured salary (min/max/unit/currency), months of experience, employment type, posted/valid-through dates, industry, occupational category, and full address.
  • Monitor mode — run on a schedule and get billed only for jobs not seen in a previous run.

How it works

The actor requests Apna's own server-rendered job-browse pages (apna.co/jobs, apna.co/jobs/jobs-in-<city>, apna.co/jobs/dep_<department>-jobs, etc.) and parses the <a data-testid="job-card"> elements already present in the initial HTML response — no JavaScript execution needed. It paginates with Apna's own ?page=N parameter until either your maxJobs budget is reached or Apna's own feed runs out (confirmed: the site returns a real empty page, not a block, once a filter is exhausted — usually somewhere between 500 and 1,200 jobs deep).

When includeFullDescription is on, each surviving job (after keyword/city post-filtering) gets one extra request to its detail page, where Apna embeds a complete schema.org/JobPosting JSON-LD block — the same structured data Google uses for its own job search rich results. That gives clean, typed fields instead of scraping prose.

🧾 Input configuration

{
"category": "telecaller_bpo",
"city": "Pune",
"keyword": "outbound",
"maxJobs": 100,
"includeFullDescription": true
}

📤 Output format

{
"job_id": "357951921",
"title": "Delivery Boy",
"company": "Blinkit Private Limited",
"location": "Viman Nagar, Pune",
"city_slug": "pune",
"salary_text": "₹50,000 - ₹1,00,000",
"tags": ["Field Job", "Part Time", "Full Time", "Any experience", "No English Required"],
"employment_type": "PART_TIME",
"salary_min": 50000,
"salary_max": 100000,
"salary_unit": "MONTH",
"salary_currency": "INR",
"date_posted": "2026-07-24T13:08:58.663Z",
"valid_through": "2026-08-05",
"company_logo": "https://apna-organization-logos.gumlet.io/production/479210?w=128",
"job_url": "https://apna.co/job/pune/delivery-boy-357951921",
"scraped_at": "2026-07-31T18:05:00.000Z"
}
FieldDescription
🆔 job_idApna internal job ID
📌 titleJob title
🏢 companyHiring company name
📍 locationRaw location text from the listing card
🏙️ city_slugCity slug parsed from the job URL
💰 salary_textRaw salary range text shown on the card
🏷️ tagsTag chips (Full Time / Part Time / Field Job / experience / English / gender)
📃 employment_typeStructured employment type — only with includeFullDescription
💵 salary_min / salary_max / salary_unit / salary_currencyStructured salary — only with includeFullDescription
experience_monthsMonths of experience required — only with includeFullDescription
🗓️ date_posted / valid_throughISO dates — only with includeFullDescription
📝 descriptionFull job description — only with includeFullDescription
🔗 job_urlCanonical apna.co job URL

One more row at the end of every run: a final _type: "info" record — informational only, never billed — with a nudge on scheduling and a link to leave a Store review if the data was useful.

💼 Common use cases

Blue-collar labour market research Track live delivery, telecalling and field-sales demand across tier-2/tier-3 cities where Apna dominates and Naukri/LinkedIn have thin coverage.

Gig-economy competitive intelligence Watch Blinkit, Zepto, Swiggy and other gig employers' live hiring volume and pay bands by city, refreshed daily with monitor mode.

Regional wage benchmarking Pull salary ranges by category and city to build pay bands for entry-level and blue-collar roles outside the metro-only data most job boards cover.

Recruitment & staffing feeds Feed a niche staffing agency's pipeline with fresh Apna listings for a specific city or category without a human refreshing the app by hand.

🚀 Getting started

  1. Open the actor and pick a category (Apna's own department taxonomy — the closest thing to a keyword search) and/or a city.
  2. Optionally narrow further with jobType, educationLevel, or the audience/shift toggles, and add a keyword to post-filter titles.
  3. Set maxJobs and, if you want full descriptions and structured salary data, turn on includeFullDescription.
  4. Click Start. Download as JSON, CSV, or Excel, or pull the dataset via API or MCP.

🔁 Run on a schedule

  1. Run once with the input you want repeated, then click Save as a task to keep that exact input.
  2. In the Apify Console, go to SchedulesCreate new, pick a frequency (hourly/daily/weekly or a cron expression).
  3. Add your saved task under Actors or tasks to run and save. It then runs unattended, billed the same pay-per-job way as a manual run.

Monitor mode — pay only for NEW jobs

Set monitorMode: true and the actor remembers every job_id it has already delivered. On the next scheduled run with the same input, only genuinely new jobs are pushed and charged — ideal for a daily "what's new in Pune telecalling" feed without re-paying for the whole listing every time.

FAQ

Does this actor support free-text keyword search? Not against Apna's own API — the site itself doesn't have one (?q= is silently ignored on apna.co). The keyword field filters job titles from whatever city/category feed you selected, client-side, after fetching.

Why can't I filter by city AND category at the same time on Apna's site? Because Apna's own web pages don't support it — only one browse dimension is honoured per URL. This actor works around that by using your most specific filter as the primary fetch and applying the rest as a post-filter, which narrows results without inventing recall the site doesn't have.

Does it need a proxy? No. Apna's job pages showed no anti-bot challenge in testing — plain HTTP requests return full content. A proxy field is available in the input for resilience if that ever changes.

How current is the data? Apna re-renders these pages on every request — the actor pulls exactly what a real visitor's browser would see, with a scraped_at timestamp on every record.

Can I use it in an AI agent? Yes. It's exposed as an MCP tool — see below.

Use in Claude, ChatGPT & any MCP agent

https://mcp.apify.com/?tools=themineworks/apna-jobs-scraper

Or call it programmatically with the Apify client:

import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: 'YOUR_APIFY_TOKEN' });
const run = await client.actor('themineworks/apna-jobs-scraper').call({
category: 'delivery_person',
city: 'Bangalore',
maxJobs: 100,
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items);

Questions or need a custom field set? Reach out through the Apify profile.