# Bdjobs Jobs Scraper (`steadyscrape/bdjobs-jobs-scraper`) Actor

Scrape Bdjobs.com jobs in Bangladesh by keyword, place, category, industry, job type and level: title, company, location, salary, deadline, experience, education and the full ad (requirements, skills, benefits, employer). Export the data to JSON, CSV or Excel, or via API.

- **URL**: https://apify.com/steadyscrape/bdjobs-jobs-scraper.md
- **Developed by:** [Steady Scrape](https://apify.com/steadyscrape) (community)
- **Categories:** Jobs, Lead generation
- **Security:** Limited permissions
- **Stats:** 3 total users, 2 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

## Bdjobs Jobs Scraper — jobs in Bangladesh from Bdjobs.com

Scrape job listings from **[Bdjobs.com](https://bdjobs.com)**, Bangladesh's largest job board, by **keyword**,
**place** (division, district or country abroad), **category**, **industry**, **organization type**, **job type**,
**job level**, **posting date** and **deadline**, or from any Bdjobs search link. This Bdjobs scraper gives every job
with its **company**, **location**, **posting date and deadline**, **salary** when the ad shows one (taka a month),
**experience**, **education**, **job type**, **workplace** (office or home), **vacancies**, **category** and **key
points**, and, with the full ad on, the **responsibilities**, **education and experience requirements**, **skills**,
**age and gender asked**, **benefits**, the **employer's address, website and business**, and a newspaper job's
**scanned ad**.

Two prices per job, no start fee, no login. Searches that find nothing cost nothing.

> This Actor is unofficial and is not affiliated with, endorsed by or connected to Bdjobs.com Limited.

### What you can do with Bdjobs data

- **Job feeds for Bangladesh**: schedule a run with *Only jobs new since the last run* and get each day's new jobs for
  your keywords, as JSON, CSV or Excel, or through the Apify API.
- **Salary research**: compare the salaries Bangladeshi employers publish by title, category, district or level.
- **Lead generation for recruiters and HR software**: which companies are hiring, for what, where, and how many people.
- **Overseas jobs**: every job Bdjobs lists abroad (Saudi Arabia, the UAE, Japan, Malaysia…) with the recruiting
  agency's licence number when the ad gives one.
- **Labour-market analysis**: demand by category and industry across the whole board (about 5,900 open jobs on
  5 November 2026).

### How to scrape Bdjobs jobs

1. Type **keywords** (job titles such as `accountant`, `software engineer`, `driver`) and **places** (`Dhaka`,
   `Gazipur`, `Chattogram Division`, `Saudi Arabia`, `All Overseas`). Each keyword is searched in each place. Leave
   both empty to list every job of the filters you pick.
2. Pick **filters** if you want: category, industry, organization type (government, NGO, private firm…), job type
   (full time, part time, contractual, internship), job level (entry, mid, top), posted within (today to the last
   5 days), deadline within, work from home, freshers only.
3. Or paste **Bdjobs links**: a result list (search on bdjobs.com, pick filters, copy the address) is read with every
   filter it carries, salary, age and experience ranges included; a job page (`https://bdjobs.com/h/details/1552762`)
   is read with its full ad. Old `jobs.bdjobs.com/jobdetails.asp?id=…` links work too.
4. Keep **Include each job's full ad** on for the complete ad (charged as `job-with-details`), or turn it off for the
   list data only (charged as `job`).

#### Input example

```json
{
  "keywords": ["accountant", "sales executive"],
  "locations": ["Dhaka", "Chattogram"],
  "jobType": "FullTime",
  "postedWithin": "3",
  "includeDetails": true,
  "maxJobsPerSearch": 100,
  "onlyNewJobs": false
}
```

### Bdjobs data output

One row per job. With the full ad on, `details` holds the job's own record:

```json
{
  "jobId": "1552762",
  "url": "https://bdjobs.com/h/details/1552762",
  "title": "Accountant",
  "companyName": "ideabox",
  "companyLogo": null,
  "location": "Dhanmondi",
  "postedAt": "2026-11-04T12:56:00.000Z",
  "postedDate": "2026-11-04",
  "deadline": "2026-11-08",
  "experience": "1 to 3 years",
  "education": "Bachelor of Business Administration (BBA) in Accounting, Cost & Management Accounting",
  "jobType": "Full Time",
  "workplace": "Office",
  "vacancies": 1,
  "salary": "Tk. 18000 - 22000 (Monthly)",
  "salaryMin": 18000,
  "salaryMax": 22000,
  "salaryPeriod": "Monthly",
  "salaryCurrency": "BDT",
  "category": "Accounting/Finance",
  "categoryId": 1,
  "keyPoints": null,
  "isNewspaperJob": false,
  "isFeatured": false,
  "rowType": "job",
  "status": "ok",
  "search": "accountant · Dhaka",
  "scrapedAt": "2026-11-05T06:45:00.000Z",
  "searchUrl": "https://bdjobs.com/h/jobs?txtsearch=accountant&locationId=14",
  "position": 2,
  "details": {
    "description": "IdeaBox Communications Ltd. is a growth-focused advertising and marketing agency working with leading brands across education, corporate, SME, and development s…",
    "educationRequirements": "Bachelor of Business Administration (BBA) in Accounting, Cost & Management Accounting",
    "experienceRequirements": "1 to 3 years\nThe applicants should have experience in the following business area(s): Advertising Agency, Event Management",
    "additionalRequirements": "Age 24 to 30 years\nStrong knowledge of MS Excel (formulas, reporting, sheets)\nBasic knowle…",
    "skills": [
      "Google Sheets",
      "Microsoft Excel",
      "MS Excel",
      "Quickbooks",
      "Tally Prime",
      "Tally Software"
    ],
    "suggestedSkills": [
      "Accounting Data Entry",
      "Accounting Software",
      "Accounts and Finance",
      "Financial Analysis",
      "Financial Reporting",
      "VAT and Tax"
    ],
    "age": "24 to 30 years",
    "gender": "Male, Female, Other",
    "jobLocation": "Dhaka (Dhanmondi)",
    "salary": "Tk. 18000 - 22000 (Monthly)",
    "salaryMin": 18000,
    "salaryMax": 22000,
    "salaryPeriod": "Monthly",
    "salaryCurrency": "BDT",
    "benefits": "Why Join IdeaBox Communications Ltd.? Opportunity to work in a fast-growing creative agenc…",
    "compensationAndBenefits": [],
    "lunchFacility": null,
    "salaryReview": null,
    "festivalBonuses": null,
    "companyId": "201678",
    "companyAddress": "33A, Road 4, Dhanmondi R/A",
    "companyWebsite": "https://ideaboxbd.com",
    "companyBusiness": "Ideabox Communications Ltd. is a group of individuals united by one ethos: creative storyt…",
    "isConfidentialCompany": false,
    "source": null,
    "adImageUrl": null,
    "onlineApply": true,
    "applyInstructions": null,
    "applyUrl": null,
    "hardCopyAddress": null,
    "walkInInterview": null,
    "recruitingLicenseNumber": null
  }
}
```

A search or link that gives no job gives one **free** row instead, with `rowType: "status"`, a `status`
(`no_results`, `not_found`, `invalid`, `blocked`, `unreadable`) and the `reason` in plain words.

#### Fields

| field | what it is |
| --- | --- |
| `rowType`, `status`, `reason` | `job` / `ok`, or a free `status` row whose `reason` says why a search or link gave nothing |
| `jobId`, `url` | Bdjobs' job id and the job's page |
| `title`, `companyName`, `companyLogo` | as the ad shows them; a confidential employer is named the way its ad describes it |
| `location` | as the list writes it: "Dhaka", "Banani", "Anywhere in Bangladesh", "Saudi Arabia" |
| `postedAt`, `postedDate` | the posting time in UTC, and the day in Bangladesh the site prints as "Posted on" |
| `deadline` | the last day to apply (YYYY-MM-DD) |
| `experience`, `education` | as the ad asks them |
| `jobType`, `workplace`, `vacancies` | "Full Time", "Contractual"…; "Office", "Home"; how many people are hired |
| `salary`, `salaryMin`, `salaryMax`, `salaryPeriod`, `salaryCurrency` | the salary text the site shows ("Tk. 18000 - 22000 (Monthly)") and its amounts in BDT |
| `category`, `categoryId` | Bdjobs' job category |
| `keyPoints` | the ad's highlights |
| `isNewspaperJob` | a job Bdjobs copied from a newspaper (its full ad is the scanned image in `details.adImageUrl`) |
| `isFeatured` | one of the premium jobs the site shows above each result page |
| `search`, `searchUrl`, `position`, `scrapedAt` | the search or link the job came from, the site's page for it, the place in it, and when the row was read (UTC) |
| `details.description` | the responsibilities and job context |
| `details.educationRequirements`, `details.experienceRequirements`, `details.additionalRequirements` | the requirements, in full |
| `details.skills`, `details.suggestedSkills` | skills the employer asks, and the ones Bdjobs suggests |
| `details.age`, `details.gender`, `details.jobLocation` | age range, genders accepted ("Any" when open to all) and the full location ("Dhaka (Dhanmondi)") |
| `details.salary`, `details.salaryMin`, `details.salaryMax`, `details.salaryPeriod`, `details.salaryCurrency` | the salary as the job page shows it, which can say "Negotiable" where the list shows none |
| `details.benefits`, `details.compensationAndBenefits`, `details.lunchFacility`, `details.salaryReview`, `details.festivalBonuses` | benefits as the ad lists them |
| `details.companyId`, `details.companyAddress`, `details.companyWebsite`, `details.companyBusiness`, `details.isConfidentialCompany` | the employer, except what a confidential employer or a hidden address keeps back |
| `details.source`, `details.adImageUrl` | the newspapers a newspaper job was copied from, and its scanned ad |
| `details.onlineApply`, `details.applyInstructions`, `details.applyUrl`, `details.hardCopyAddress`, `details.walkInInterview` | how to apply |
| `details.recruitingLicenseNumber` | an overseas recruiting agency's licence number |

### Pricing

**US$0.002 per job with its full ad** (`job-with-details`, US$2 per 1,000 jobs) or **US$0.001 per job** with the list
data only (`job`, US$1 per 1,000). No start fee. Status rows are free, and a job found by several searches of one run
is charged once. If a job's record cannot be read, the job is delivered with its list data and charged as `job`. Set a
maximum cost per run in Apify and the Actor stops there, without reading records it could not charge.

### Limits

- Results are what Bdjobs' own search returns for the same keyword and filters: a keyword matches job titles and
  company names, symbols are dropped (`c#` searches "c"), and a keyword needs at least two characters.
- The salary is given only as the site shows it to visitors: an amount the employer hid stays hidden.
- **No contact data**: the recruiter's phone and the application e-mail are never read, and a phone number or e-mail an
  employer typed into an ad is replaced by `[phone hidden]` / `[e-mail hidden]`.
- A pasted job page gives the day it was posted, not the hour, and no category (its record does not carry one).
- The Actor reads Bdjobs' public API at about two requests a second. If Bdjobs shows a challenge, the Actor **never
  solves or bypasses it**: it stops, keeps what it already delivered and gives free `blocked` rows for the rest.

### Is it legal to scrape Bdjobs?

This Actor reads only public job ads that anyone can open on bdjobs.com without an account, the same data the site's
own pages load. Bdjobs' terms of use have no clause on automated access, and its robots.txt closes only asset and data
folders. Personal data is kept out: no recruiter contact is collected. You are responsible for how you use the data;
check the laws that apply to you (such as Bangladesh's data protection rules or the GDPR) before processing it.

# Actor input Schema

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

Searched the way bdjobs.com's search box searches them (job title and company name). Each keyword is searched in each place below. Leave empty to list every job of the places or filters you pick.

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

A division ("Dhaka Division"), a district ("Dhaka", "Gazipur", "Chattogram"), a country abroad ("Saudi Arabia", "Japan") or "All Overseas", as Bdjobs lists them; old spellings such as Chittagong, Comilla or Bogra work too. Leave empty for all of Bangladesh and abroad.

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

Result lists (search on bdjobs.com, pick filters, copy the address, such as https://bdjobs.com/h/jobs?fcatId=1\&locationId=14) are read with the filters they carry. Job pages (https://bdjobs.com/h/details/1552762) are read with their full ad.

## `category` (type: `string`):

Bdjobs' job category, functional or special skilled.

## `industry` (type: `string`):

The employer's industry, as Bdjobs files it.

## `organizationType` (type: `string`):

Only jobs of this kind of employer, as Bdjobs' own "Organization type" filter: government, semi-government, NGO, private firm, international agency or other.

## `jobType` (type: `string`):

Only full-time, part-time, contractual or internship jobs, as Bdjobs' "Job nature" filter.

## `jobLevel` (type: `string`):

Only entry-level, mid-level or top-level jobs, as Bdjobs' "Job level" filter.

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

Only jobs Bdjobs posted within this many days (today counts as one).

## `deadlineWithin` (type: `string`):

Only jobs whose application deadline is this close.

## `workFromHome` (type: `boolean`):

Only jobs Bdjobs marks as work from home.

## `freshersOnly` (type: `boolean`):

Only jobs open to freshers (no experience required), as Bdjobs' "Fresher" filter.

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

Reads each job's own record: responsibilities, education and experience requirements, skills, age and gender, salary as the job page shows it ("Negotiable" too), benefits, the employer's address, website and business, and a newspaper job's scanned ad. Charged as job-with-details; off, each job is charged as job.

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

0 for no maximum (Bdjobs listed about 5,900 jobs in all on 5 November 2026).

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

For a scheduled run: jobs an earlier run with the same searches delivered are skipped and not charged.

## Actor input object example

```json
{
  "keywords": [
    "accountant"
  ],
  "locations": [
    "Dhaka"
  ],
  "urls": [],
  "category": "any",
  "industry": "any",
  "organizationType": "any",
  "jobType": "any",
  "jobLevel": "any",
  "postedWithin": "any",
  "deadlineWithin": "any",
  "workFromHome": false,
  "freshersOnly": false,
  "includeDetails": true,
  "maxJobsPerSearch": 10,
  "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": [
        "accountant"
    ],
    "locations": [
        "Dhaka"
    ],
    "maxJobsPerSearch": 10
};

// Run the Actor and wait for it to finish
const run = await client.actor("steadyscrape/bdjobs-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": ["accountant"],
    "locations": ["Dhaka"],
    "maxJobsPerSearch": 10,
}

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

```

## MCP server setup

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