# Rozee.pk Jobs Scraper (`steadyscrape/rozee-jobs-scraper`) Actor

Scrape Rozee.pk job listings across Pakistan by keyword and city: title, company, city with coordinates, posted and apply-by dates, salary, experience, career level, shift, skills, full description and the job's source. Only-new-jobs mode for daily feeds. Export to JSON, CSV or Excel, or via API.

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

## Pricing

$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

## Rozee.pk Jobs Scraper

Scrape job listings from **[Rozee.pk](https://www.rozee.pk)**, Pakistan's largest job board, by **keyword** and **city**
or from any Rozee search link. This Rozee.pk scraper gives every job with its **company**, **city with coordinates**,
**posting date and apply-by date**, **salary** when Rozee shows one (PKR a month), **experience**, **career level**,
**job type and shift** (on-site, remote, hybrid, work from home), **gender preference**, **education**, **skills**, the
**full job description** and the **job's source** — the site Rozee took the ad from (Indeed, BeBee, Jobz.pk…).

One price 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 Rozee.pk or Naseeb Networks.

### What you can do with this Rozee.pk scraper

- **Recruiting and sourcing in Pakistan**: every open role for a title or skill in Lahore, Karachi, Islamabad, Rawalpindi,
  Faisalabad or any of Rozee's 576 cities, with the company hiring and the full ad text.
- **Salary research**: the monthly salary ranges employers publish, as numbers you can sort and average by role and city.
- **Job alerts and feeds**: schedule it daily with **Posted within** and **Only new jobs** to receive just the jobs posted
  since the last run — into a spreadsheet, Slack, email or your ATS through Apify's integrations.
- **Lead generation**: which companies are hiring for what, and where, for recruitment agencies, HR software and B2B sales.
- **Labour-market research**: demand by city, skills asked for, remote and hybrid work in Pakistan, and how much of Rozee
  is crawled from other job sites.

### Input

| Field | What it does |
|---|---|
| **Keywords** | Job titles, skills or company names as people type them into Rozee: `accountant`, `software engineer`, `sales`, `nurse`. Each is read through Rozee's own search page (`rozee.pk/job/jsearch/q/accountant`). Empty with a city: every job in that city. |
| **Cities** | Empty for all of Pakistan. `Lahore`, `Karachi`, `Islamabad`, `Rawalpindi`, `Dera Ghazi Khan`… (any of Rozee's 576 cities; `Pindi`, `D.G. Khan` and similar short forms work), or `International` for jobs abroad. Each keyword is searched in each city. A city Rozee does not list gives a free row with close names. |
| **Rozee search links** | Result lists copied from rozee.pk after searching and clicking its filters (experience, shift, career level, job type, gender, industry…), e.g. `https://www.rozee.pk/job/jsearch/q/accountant/fc/1185/fsi/2771`. Each is read from its first page with all its filters. |
| **Posted within** | Only jobs posted in the last 1, 3, 7, 14 or 30 days. |
| **Minimum monthly salary (PKR)** | Only jobs whose published monthly salary reaches it. |
| **Only jobs with a published salary** | Leave out jobs that show no salary. |
| **Max jobs per search** | Stop each search after this many jobs (default 100; 0 = every job the list holds). |
| **Only new jobs since the last run** | Deliver, and charge, only jobs an earlier run with the same input has not delivered. Made for schedules. |

Example:

```json
{
    "keywords": ["accountant", "software engineer"],
    "cities": ["Lahore", "Karachi"],
    "postedWithin": "7",
    "maxJobsPerSearch": 200
}
```

### Output

One row per job. A search or link that gives no job gives one free row with `rowType: "status"` and the reason, so you
always know why a search came back empty.

```json
{
  "jobId": "1936477",
  "url": "https://www.rozee.pk/financial-accountant-lahore-jobs-1936477",
  "title": "Financial Accountant",
  "companyName": "A. Fragrances",
  "companyLogo": null,
  "city": "Lahore",
  "locations": [
    {
      "city": "Lahore",
      "latitude": 31.503922024,
      "longitude": 74.330406188
    }
  ],
  "latitude": 31.503922024,
  "longitude": 74.330406188,
  "country": "Pakistan",
  "postedAt": "2026-10-31T19:02:24.000Z",
  "updatedAt": "2026-10-31T19:02:24.000Z",
  "applyBy": "2026-11-06",
  "experience": "5 Years",
  "maxExperience": "5 Years",
  "careerLevel": null,
  "jobType": "First Shift (Day)",
  "shift": "First Shift (Day)",
  "genderPreference": "No Preference",
  "education": null,
  "salaryMin": 27000,
  "salaryMax": 27000,
  "salaryCurrency": "PKR",
  "skills": [
    "Accounting Principles",
    "Communication Skills",
    "Accounting Software Proficiency",
    "MS Excel",
    "ERP systems (preferred)",
    "Analytical skills"
  ],
  "description": "We are looking for a detail-oriented and experienced accounting professional to join our team at A. Fragrances. The successful candidate will be responsible for…",
  "source": "Indeed",
  "isExternal": true,
  "listingType": "crawl",
  "rowType": "job",
  "status": "ok",
  "search": "accountant · Lahore",
  "scrapedAt": "2026-11-02T21:48:00.000Z",
  "searchUrl": "https://www.rozee.pk/job/jsearch/q/accountant/fc/1185",
  "position": 1
}
```

```json
{
  "rowType": "status",
  "status": "no_results",
  "search": "neurosurgeon · Abbaspur",
  "scrapedAt": "2026-11-02T21:48:00.000Z",
  "url": "https://www.rozee.pk/job/jsearch/q/neurosurgeon/fc/2505",
  "reason": "Rozee lists no job at https://www.rozee.pk/job/jsearch/q/neurosurgeon/fc/2505."
}
```

#### Fields

| Field | Description |
|---|---|
| `jobId`, `url`, `title` | Rozee's job id, the job's page and its title. |
| `companyName`, `companyLogo` | The company as Rozee shows it; `null` when the advertiser keeps its name confidential. |
| `city`, `locations`, `latitude`, `longitude`, `country` | The city as listed ("Lahore", "Multiple Cities", "All Cities"), each city with Rozee's coordinates for it, the first one's coordinates, and the country. |
| `postedAt`, `updatedAt`, `applyBy` | When the job was posted and last updated (ISO 8601 UTC, converted from Pakistan time) and the last day to apply (YYYY-MM-DD). |
| `experience`, `maxExperience` | Experience asked, as Rozee writes it ("2 Years", "Fresh"). |
| `careerLevel` | "Entry Level", "Experienced Professional", "Manager", "Department Head"… when the listing carries one. |
| `jobType`, `shift` | Rozee's job type ("Full Time/Permanent", "Internship"…) and shift ("First Shift (Day)", "Remote", "Hybrid Work Model", "Work From Home"…). |
| `genderPreference`, `education` | The ad's gender preference ("No Preference", "Male", "Female") and the degrees it asks for. |
| `salaryMin`, `salaryMax`, `salaryCurrency` | The monthly salary Rozee shows visitors, as numbers. |
| `skills` | The skill tags of the ad. |
| `description` | The full ad text. |
| `source`, `isExternal`, `listingType` | The site the ad came from when Rozee crawled it ("Indeed", "BeBee", "Jobz.pk", "ROZEEGPT.AI"…), whether Rozee lists it from outside its own employers, and Rozee's listing package ("crawl", "Featured", "Top"…). |
| `search`, `searchUrl`, `position`, `scrapedAt` | Which search found the job, its list, its place in that list, and when it was read. |
| `rowType`, `status`, `reason` | `rowType` is `job` for a job (its `status` is `ok`) and `status` for a search or link that gave none, whose `status` is `no_results`, `not_found`, `invalid`, `disallowed`, `blocked` or `unreadable`, with the reason in words. |

### Pricing

**US$0.001 per job** (US$1 per 1,000 jobs), full description included. No start fee. Status rows are free, and jobs
already delivered in the same run are never charged twice. Set a maximum cost per run in Apify and the Actor stops there.

### Limits

- Every field comes from Rozee's **result lists**, which carry each job's full description; the job pages themselves
  are not read. So a career level shows on about one job in four (the lists leave it out on most crawled ads), and the
  number of positions and the age range are not given.
- Rozee answers Apify's own servers with a Cloudflare check, so the Actor reads it through **Apify Proxy** (your plan's
  datacenter proxy). If Cloudflare challenges the connection anyway, the Actor **never solves or bypasses it**: it stops,
  keeps what it already delivered and gives free `blocked` rows for the rest.
- Rozee sorts results by relevance, not date, and pages deep (its all-jobs list held 11,147 jobs on 2 November 2026 and
  answered past job 10,000). **Posted within** is checked on the jobs read, so a search with a date filter reads the list
  up to your maximum.
- Rozee itself reads a `+` in a keyword as a space (`c++` searches `c`), and for a keyword it does not know it may still
  list a few loosely related jobs; the Actor delivers what Rozee lists.
- A salary the advertiser hid from visitors is not given, even when Rozee's page data carries it.

### Is it legal to scrape Rozee.pk?

This Actor reads public job listings that anyone can see without an account, follows the site's robots.txt (it never
touches CVs, `/people/`, or the employers' area), and asks for one page a second. It collects no personal data as fields;
job ads may name a contact person in their own text. Check that your use of the data complies with Rozee's terms and with
the laws that apply to you. This Actor is unofficial and not affiliated with Rozee.pk or Naseeb Networks.

# Actor input Schema

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

Job titles, skills or company names as people type them into Rozee, e.g. <code>accountant</code>, <code>software engineer</code>, <code>sales</code>, <code>nurse</code>. Each is read through Rozee's own search page for it (<code>rozee.pk/job/jsearch/q/accountant</code>). Leave empty with a city to get every job in that city.

## `cities` (type: `array`):

Leave empty for all of Pakistan. <code>Lahore</code>, <code>Karachi</code>, <code>Islamabad</code>, <code>Rawalpindi</code>, <code>Faisalabad</code>… as Rozee writes them (any of its 576 cities), or <code>International</code> for jobs abroad. Each keyword is searched in each city. A city Rozee does not list gives a free row with close names.

## `searchUrls` (type: `array`):

Result lists copied from rozee.pk after searching and picking filters (experience, shift, career level, job type…), e.g. <code>https://www.rozee.pk/job/jsearch/q/accountant/fc/1185/fsi/2771</code>. Each is read from its first page with all its filters. Job pages are not taken.

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

Only jobs posted in the last days, checked against each job's posting time. Rozee sorts by relevance, so the whole list is read up to your maximum. Combine with a schedule and Only new jobs for a daily feed.

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

Only jobs whose published monthly salary reaches this much. Jobs without a published salary are left out when this is set.

## `onlyWithSalary` (type: `boolean`):

Leave out jobs that show no salary to visitors.

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

Stop each search (each keyword in each city, and each link) after this many jobs. 0 means every job the list holds.

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

Deliver, and charge, only jobs that an earlier run with the same searches and filters has not delivered. Made for scheduled runs.

## Actor input object example

```json
{
  "keywords": [
    "accountant"
  ],
  "cities": [
    "Lahore"
  ],
  "searchUrls": [],
  "postedWithin": "any",
  "onlyWithSalary": false,
  "maxJobsPerSearch": 2,
  "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"
    ],
    "cities": [
        "Lahore"
    ],
    "maxJobsPerSearch": 2
};

// Run the Actor and wait for it to finish
const run = await client.actor("steadyscrape/rozee-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"],
    "cities": ["Lahore"],
    "maxJobsPerSearch": 2,
}

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

```

## MCP server setup

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