The Mine Works
← All posts
tutorial October 8, 2026 · 9 min read Updated October 8, 2026

Find Entry-Level AI and ML Jobs in Bangalore Posted This Week

Pull fresh AI and ML jobs for 0 to 2 years of experience from Hirist.tech, merge several searches and rank them by seniority and age with Python.

Try the scraper

The actor referenced in this article. Pay only for results delivered.

View the scraper →

If you are a recent graduate or have a year or two of experience and want an AI or ML role in Bangalore, the problem is not finding jobs. It is finding the few that fit. Hirist.tech is a tech-only job board, and most of what it lists asks for five years or more. Scrolling the site for the handful of junior AI roles posted this week is slow, and the useful signals (how many people already applied, how old the post is, what the band really is) are spread across pages.

Try it live: Hirist Jobs Scraper: 147 Locations, 19 Fields, No Login. Pay per result delivered. Failed and empty results are never charged.

The Hirist Jobs Scraper turns a Hirist category or keyword search into rows with the experience band, posting time and application count on every row. This guide runs a few small searches at once, merges them by job_id and gives you one short list sorted by seniority and freshness.

What you get and who it is for

FieldWhat it holds
job_id, urlHirist’s job id and the job’s page on hirist.tech
title, companyThe role as posted and the employer name
experience_min_years, experience_max_yearsThe experience band in years
locations, remoteEvery place the job lists, and whether Hirist marks it work from home
skillsHirist’s skill tags, as a list
posted_atWhen the job was posted, in UTC
apply_countApplications Hirist reports so far
company_rating, company_reviews_countAmbitionBox rating, when Hirist shows it
descriptionThe job description as HTML, when includeJobDescription is on

This is for students and early-career engineers hunting their first AI role, placement cells and bootcamps that send a weekly list to their batch, and anyone who coaches juniors and wants to show them what is open right now.

The input

{
  "categorySlug": "ai-ml-jobs",
  "locations": ["Bangalore", "Remote"],
  "experienceMinYears": 0,
  "experienceMaxYears": 2,
  "postedWithinDays": 7,
  "maxJobs": 50,
  "includeJobDescription": true
}
  • categorySlug browses one of Hirist’s 12 tech categories. ai-ml-jobs is the AI and ML one. You can also send a keyword instead, or both together.
  • locations takes plain names. Bangalore and Bengaluru are the same place, and Remote adds work from home roles. Several names mean “any of these”.
  • experienceMinYears and experienceMaxYears keep jobs whose band overlaps yours. A 0 to 2 search also returns jobs asking 2 to 4 or 2 to 5 years, because they touch 2.
  • postedWithinDays keeps jobs posted in the last N days. For entry-level searches, start at 7, not 2 or 3 (see below).
  • includeJobDescription adds the description at no extra charge per job. You want it here, because “freshers welcome” lives in the text, not in a field.

Why start wide? Junior roles are thin on Hirist. On October 6, 2026 we ran ai-ml-jobs in Bangalore for 0 to 2 years posted within 3 days, and Hirist returned nothing: the dataset held one no_results note row. Two data and analytics searches came back empty too: 0 to 1 years over 1 day across India on October 4, and 0 to 2 years over 2 days in Hyderabad and Bangalore on October 2. Across all 188 distinct jobs in our own runs from September 9 to October 7 (mostly Java and backend searches, so not a fair sample of AI), only one listed a minimum below 2 years, and none listed 0.

What the output looks like

The closest real run we have is a keyword search, "keyword": "GenAI LLM RAG LangChain", 0 to 2 years, posted within 30 days, all of India, on October 5, 2026. It returned three jobs. Trimmed:

[
  {
    "job_id": "1676529",
    "title": "AI Engineer, LLMs & RAG Pipelines",
    "company": "HiringBlaze",
    "locations": ["Gurgaon/Gurugram"],
    "remote": false,
    "skills": ["Python", "LLM", "Machine Learning", "LangChain", "SQL", "Artificial Intelligence"],
    "experience_min_years": 2,
    "experience_max_years": 4,
    "apply_count": 845,
    "posted_at": "2026-10-04T07:20:35.030Z",
    "url": "https://www.hirist.tech/j/ai-engineer-llms-rag-pipelines-2-4-yrs-1676529"
  },
  {
    "job_id": "1676281",
    "title": "GenAI Engineer, Agentic Systems",
    "company": "Pravi HR Advisory",
    "locations": ["Chennai"],
    "skills": ["Python", "LangChain", "LangGraph", "FastAPI", "Machine Learning", "RAG", "Agentic AI", "Generative AI"],
    "experience_min_years": 2,
    "experience_max_years": 4,
    "apply_count": 229,
    "posted_at": "2026-10-01T06:21:44.000Z"
  },
  {
    "job_id": "1673016",
    "title": "AI Engineer, Generative AI/LLM",
    "company": "Vashistha Consulting Group (VCG)",
    "locations": ["Ahmedabad", "Gujarat", "Bangalore"],
    "remote": true,
    "experience_min_years": 2,
    "experience_max_years": 5,
    "apply_count": 1184,
    "posted_at": "2026-09-21T04:14:18.122Z"
  }
]

Three things to read from this. All three bands start at 2 years, so they matched a 0 to 2 search through the overlap rule, not because they want freshers. The apply_count values are high: the job posted the day before our run already had 845 applications, which is why posting age matters so much for juniors. And all three were posted by companies whose names point to hiring or consulting firms, so the real employer may be named only in the description.

The empty October 6 run looked like this, and it was not charged:

{
  "status": "no_results",
  "note": "Hirist returned no jobs for the given filters. Try a broader keyword, different category, or remove the location/experience filters, and re-run.",
  "scraped_at": "2026-10-06T07:38:54.028Z"
}

Rows without a job_id are notes like this one or the info row a successful run adds at the end. Skip them in anything you build.

Run it in Apify Console

  1. Open https://apify.com/themineworks/hirist-jobs-scraper and click Try for free.
  2. Clear the Keyword field (the form comes prefilled with java developer).
  3. In Category, pick AI / ML.
  4. In Locations, enter Bangalore and Remote on separate lines.
  5. Set Minimum experience to 0, Maximum experience to 2 and Posted within to 7.
  6. Set Max jobs to 50 and tick Include full job description.
  7. Click Start. If the Output tab shows a no_results row, raise Posted within to 14 or remove the city and run again.
  8. Click Export for CSV, JSON or Excel. In CSV, list fields such as skills are split into skills/0, skills/1 and so on.

Run it from Python

One category search misses junior roles that recruiters filed under another category. The script runs three small searches, merges them by job_id, flags descriptions that mention freshers or graduates, and writes one sorted CSV.

pip install apify-client
import csv
import re
from datetime import datetime, timezone
from apify_client import ApifyClient

client = ApifyClient("YOUR_APIFY_TOKEN")
ACTOR = "themineworks/hirist-jobs-scraper"

base = {
    "locations": ["Bangalore", "Remote"],
    "experienceMinYears": 0,
    "experienceMaxYears": 2,
    "postedWithinDays": 7,
    "maxJobs": 50,
    "includeJobDescription": True,
}
searches = [
    {"categorySlug": "ai-ml-jobs"},
    {"keyword": "machine learning"},
    {"keyword": "generative ai"},
]

jobs = {}
for extra in searches:
    label = extra.get("categorySlug") or extra.get("keyword")
    run = client.actor(ACTOR).call(run_input={**base, **extra})
    for item in client.dataset(run["defaultDatasetId"]).iterate_items():
        if "job_id" not in item:
            if item.get("status"):
                print(f"{label}: {item['status']}")
            continue
        if item["job_id"] in jobs:
            jobs[item["job_id"]]["found_by"] += f", {label}"
        else:
            item["found_by"] = label
            jobs[item["job_id"]] = item

FRESHER = re.compile(r"fresher|graduate|entry level|0 to 1 year|campus", re.I)
now = datetime.now(timezone.utc)

rows = []
for j in jobs.values():
    posted = datetime.fromisoformat(j["posted_at"].replace("Z", "+00:00"))
    text = re.sub(r"<[^>]+>", " ", j.get("description", ""))
    rows.append({
        "title": j["title"],
        "company": j["company"].strip(),
        "min_years": j["experience_min_years"],
        "max_years": j["experience_max_years"],
        "days_old": (now - posted).days,
        "applications": j.get("apply_count"),
        "mentions_freshers": bool(FRESHER.search(text)),
        "locations": "; ".join(j["locations"]),
        "remote": j["remote"],
        "skills": ", ".join(j["skills"]),
        "rating": j.get("company_rating"),
        "found_by": j["found_by"],
        "url": j["url"],
    })

rows.sort(key=lambda r: (not r["mentions_freshers"], r["min_years"], r["days_old"]))
if rows:
    with open("entry_level_ai_jobs.csv", "w", newline="", encoding="utf-8") as f:
        writer = csv.DictWriter(f, fieldnames=list(rows[0].keys()))
        writer.writeheader()
        writer.writerows(rows)

junior = sum(1 for r in rows if r["min_years"] <= 1)
print(f"{len(rows)} jobs, {junior} with a minimum of 0 or 1 year")

The CSV puts jobs whose description mentions freshers or graduates first, then sorts by the minimum years and by age, so a 0 to 2 year job posted yesterday sits above a 2 to 5 year job from last week. The found_by column shows which search caught each job, which tells you after a few weeks which searches are worth keeping. If all three searches come back empty, change postedWithinDays to 14 before you drop the city.

Run it every week

Put the script on a weekly cron on your own machine or server, for example Monday at 08:00 IST, and send the CSV to your batch or your own inbox. If you prefer to stay inside Apify, save each of the three inputs as a task in Apify Console, open Schedules, create one schedule with the timezone set to Asia/Kolkata and add all three tasks to it, and add Apify’s Google Sheets integration so each run appends to a sheet. Sort the sheet by experience_min_years and drop repeats on job_id. The actor has no only-new mode, so a job that is still inside the 7 day window next week will come back; the job_id key is how you avoid listing it twice.

Weekly with a 7 day window is the right rhythm for juniors. Windows of 1 to 3 days are where all our empty results came from, and every empty run still pays the start fee.

What it costs

Billing is per job delivered: $4.20 per 1,000 jobs on the Bronze plan, $3.55 on Silver, and $3.00 on Gold and above, plus a flat $0.005 per run. The job description costs nothing extra, and empty results and note rows are never charged.

The weekly script makes three runs of at most 50 jobs, so the ceiling is 150 jobs a week: $0.63 on Bronze plus $0.015 in start fees, or about $0.55 on Silver and $0.47 on Gold. Junior searches rarely hit the ceiling. Our October 5 run delivered 3 jobs, which is $0.0126 on Bronze plus $0.005, and the empty October 6 run cost only its $0.005 start fee. Four weeks of the full ceiling would be about $2.58 on Bronze.

Limits worth knowing

  • Hirist skews senior. In our own 188 jobs only one had a minimum under 2 years. Expect a short list, and widen the window before you widen the band. Junior roles also sit on company career pages, and Greenhouse, Lever, Workday and Ashby boards can be read in bulk.
  • The experience filter is an overlap. A 0 to 2 search returns 2 to 4 and 2 to 5 year roles. Sort or filter on experience_min_years yourself.
  • Many junior AI posts come from hiring firms. All three rows in our sample did. Read the description for the actual employer.
  • Applications pile up fast. One job a day old had 845 applications. Run early in the week and apply early.
  • Salary is usually missing. In the actor’s 30 September tests, pay showed on 6 of 200 keyword rows and 82 of 1,000 category rows. When it is missing, the salary fields are left out of the row.
  • Descriptions are cut at 4,000 characters, so a “freshers welcome” line at the very end of a long post can be missed.
  • Location names must be known. An unknown name is skipped; if none is known the run stops with an unknown_location row and charges nothing.
Related Actor

Explore the scraper referenced in this article: inputs, outputs, and pricing, then run it on Apify.

Frequently asked questions

Why did my fresher search return nothing? +

Hirist lists far more mid-level and senior roles than entry-level ones, so a narrow category, one city, 0 to 2 years and a 3 day window often leaves nothing. Our 6 October 2026 run with exactly those filters returned a no_results row. Widen the window to 7 or 14 days, add Remote, and run a couple of keyword searches next to the category.

Does an empty run cost anything? +

Only the flat $0.005 start fee. The no_results row is not charged, and neither are the info row or any repeated listing.

Why do I get jobs asking for 2 to 4 years when I asked for 0 to 2? +

The experience filter keeps jobs whose range overlaps yours, so a 2 to 4 year job matches a 0 to 2 year search. The script in this guide sorts by the minimum so the lowest bands come first.

Can it tell me whether a job accepts freshers? +

Not as a field. Turn on includeJobDescription (no extra charge) and search the description text for words such as fresher or graduate, as the script below does.

Apify Store

Find a ready-made scraper for your job

Apify has over 80,000 scrapers and automations, ours included. Start free with $5 of platform credit every month.