# Rozee.pk Scraper - Pakistan Job Listings · $1.5/1K (`listingworks/rozee-scraper`) Actor

Extract job postings from Rozee.pk (Pakistan) by keyword and city: title, employer, city, job type, salary in PKR, posting date, closing date, URL.

- **URL**: https://apify.com/listingworks/rozee-scraper.md
- **Developed by:** [Yusuke Suda](https://apify.com/listingworks) (community)
- **Categories:** Jobs, Automation
- **Stats:** 5 total users, 4 monthly users, 50.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.75 / 1,000 result items

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

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 Scraper — Pakistan job listings by keyword and city

Extract job postings from Rozee.pk (Pakistan) by keyword and city: title, employer, city, job type, salary in PKR, posting date, closing date, URL.

Rozee.pk, run by Naseeb Networks, is one of Pakistan's large job boards. This
Actor turns its search results into a clean table: the job title, the employer,
the city, the job type, the salary where the posting gives one, the day it was
posted and the day applications close.

Press Start. The defaults return accountant jobs in Lahore, with no
configuration needed.

### What a row looks like

```json
{
  "title": "Accountant",
  "company": "Al Faizan Garments",
  "location": "Lahore",
  "employment_type": "Full Time/Permanent",
  "salary_min": 35000.0,
  "salary_max": 35000.0,
  "salary_currency": "PKR",
  "salary_period": "month",
  "posted_at": "2026-09-24",
  "application_deadline": "2026-10-24",
  "source_url": "https://www.rozee.pk/al-faizan-garments-accountant-lahore-jobs-1880800",
  "external_id": "1880800"
}
```

`company` is the employer as the listing shows it. A posting that hides its
employer ("Confidential") comes with `company` empty. Contact persons, email
addresses and phone numbers are never collected. This Actor reads the search
results only and never opens the job text.

### Salary, job type and dates

- **Salary.** Some postings carry a salary in rupees. It becomes `salary_min`
  and `salary_max` with `salary_period` "month", the way Pakistani postings
  quote pay. A posting without one has no salary fields.
- **Job type.** `employment_type` is the site's job type ("Full Time/Permanent",
  "Part Time", "Internship"). Some postings give a shift instead ("First Shift
  (Day)"). A shift is not a job type, so those rows leave `employment_type`
  empty. The shift "Remote" sets `remote: true`.
- **Dates.** `posted_at` is the day the posting went up (UTC).
  `application_deadline` is the day applications close.

### What people use it for

Tracking which employers in a Pakistani city are hiring, and for what.
Watching salary offers for a role across cities. Feeding a job board, a
newsletter or a recruitment pipeline with fresh Pakistani openings. Labour
market research that needs structured rows rather than a page of links.

### Input

| Field | What it does |
|---|---|
| `searchTerms` | Keywords, one or two words each, e.g. `accountant`, `sales executive`, `teacher`. Each keyword is its own search. Leave empty for everything. |
| `location` | A Pakistani city as Rozee lists it: `Lahore`, `Karachi`, `Islamabad`, `Rawalpindi`, `Faisalabad`. Leave empty for the whole country. |
| `postedAfter` | Only keep postings from this day on, e.g. `2026-09-20`. Handy for daily runs that should return just what is new. |
| `sinceDays` | The same, as a rolling window: `1` keeps yesterday and today, `7` the last week. Set it once on a scheduled task and never edit the date again. |
| `maxItems` | Hard stop, so your bill is predictable. |
| `proxyConfiguration` | Off by default. Most runs do not need one. |

Rozee lists results by relevance, not by date. With `postedAfter` or
`sinceDays`, the Actor drops older postings and stops after two pages in a row
with nothing that recent. The run report says so whenever it stops that way.

### How much one run returns

Rozee serves 20 postings per page. On 29 September 2026 it listed 10,155
postings in all, 51 for "accountant" in Lahore and 703 for "sales executive" in
Karachi. A run pages through a search until `maxItems` is reached or the list
ends, and removes duplicates within the run.

### How this compares

- It reads the public search results only. It never opens a posting's own
  page, and never collects the posting text, a contact person, an email or a
  phone number.
- It keeps to the paths Rozee's robots.txt allows.
- A run that goes wrong says so: it goes red instead of handing back a quiet,
  short result.
- The price is in the title, and you pay per row you receive.

### Pricing

$1.50 per 1,000 listings, dropping to $0.75 per 1,000 on higher Apify plans,
plus $0.005 each time a run starts. Platform usage is not passed on to you.

You are charged for rows you actually receive. If you set a maximum charge for
the run, it stops cleanly at that limit instead of overshooting it.

### Scope and limits

Public listings only, from the search results pages (`/job/jsearch/…`), which
Rozee's robots.txt allows. The paths it disallows are never requested.

Rozee shows the keyword, city and page it actually searched. This Actor checks
them against what you asked for. If they differ, the run fails rather than
returning rows you did not ask for and charging you for them. A city Rozee does
not list fails the run before anything is fetched.

If Rozee changes its page structure, the run goes red. It does not return zero
rows and report success. A silent scraper is worse than a broken one, because
you find out weeks later.

A run that is blocked or cut short partway also goes red, even though the rows
it did collect are in the dataset and yours to keep. Red here means "this is
not the complete answer", not "you lost the data". On a schedule, a run that
quietly came back short is the thing you most need to hear about.

Every run also publishes the site's own result count next to the rows it
delivered, so you can see "51 rows of 51 the site reports" without going back
to the site to check. That number is what the site says, not a promise about
what one run returns.

### Same shape, other sites

This Actor shares its output shape with the other job Actors in this catalogue:
Jobindex (Denmark), jobs.ch and JobScout24 (Switzerland), Jobware (Germany) and
more. A parser you write for one keeps working on the others.

### Support

Open an issue on this Actor with the run ID and your input. Answered within
one business day.

# Actor input Schema

## `searchTerms` (type: `array`):

Keywords to search for, one or two words each, e.g. accountant, sales executive, teacher. Each keyword is its own search. Leave empty for all postings.

## `location` (type: `string`):

A Pakistani city as rozee.pk lists it, e.g. Lahore, Karachi, Islamabad, Rawalpindi, Faisalabad. Leave empty for the whole country. A city the site does not list fails the run instead of returning unfiltered results.

## `postedAfter` (type: `string`):

Return only postings from this day on, e.g. 2026-09-20. Rozee lists by relevance, not by date, so the Actor stops after two pages with nothing that recent.

## `sinceDays` (type: `integer`):

Keep only listings posted in the last N days, counted in UTC from the day the run starts: 1 = yesterday and today. Made for a daily schedule. Ignored when Posted after is set.

## `maxItems` (type: `integer`):

Stop after this many postings. Keeps your cost predictable.

## `proxyConfiguration` (type: `object`):

Off by default. Turn on (residential, in the site's country) only if runs start getting blocked with 403/429.

## Actor input object example

```json
{
  "searchTerms": [
    "accountant"
  ],
  "location": "Lahore",
  "postedAfter": "",
  "maxItems": 100,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# Actor output Schema

## `overview` (type: `string`):

All Pakistani job postings from this run: what the job is, who is hiring, and where.

## `employers` (type: `string`):

The same postings ordered around who is hiring.

## `runReport` (type: `string`):

Pages read, records delivered, errors, and the verdict (ok, degraded or broken).

# 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 = {
    "searchTerms": [
        "accountant"
    ],
    "location": "Lahore",
    "proxyConfiguration": {
        "useApifyProxy": false
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("listingworks/rozee-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 = {
    "searchTerms": ["accountant"],
    "location": "Lahore",
    "proxyConfiguration": { "useApifyProxy": False },
}

# Run the Actor and wait for it to finish
run = client.actor("listingworks/rozee-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 '{
  "searchTerms": [
    "accountant"
  ],
  "location": "Lahore",
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}' |
apify call listingworks/rozee-scraper --silent --output-dataset

```

## MCP server setup

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