# Yellow Pages & Job Board Scraper — 30+ Countries (`andrew_babo/business-directory-jobs-scraper`) Actor

Fast, accurate business listings (name, website, phone, address, category) and job ads (employer, title, link, posted date) from local Yellow Pages and job boards that have no other actor: Vietnam, Australia, Malaysia, Japan, Gulf, South Asia and more.

- **URL**: https://apify.com/andrew_babo/business-directory-jobs-scraper.md
- **Developed by:** [Andrew Babo](https://apify.com/andrew_babo) (community)
- **Categories:** Lead generation, Jobs
- **Stats:** 14 total users, 13 monthly users, 98.9% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

Pay per usage

This Actor is paid per platform usage. The Actor is free to use, and you only pay for the Apify platform usage, which gets cheaper the higher subscription plan you have.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-usage

## 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

## Yellow Pages & Job Board Scraper — local directories with no other actor

Fast, accurate business listings and job ads from **country-specific Yellow Pages and job boards** that have no dependable Apify actor. One input, one clean output for every site.

### What you get

**Business directories** — one row per business:

| Field | Example |
|---|---|
| `name` | ISR Software Services (Pvt) Ltd. |
| `website` | http://www.isrpl.com |
| `phone` | 021-32418280 |
| `email` | when the site shows it |
| `address`, `city`, `region`, `postalCode` | |
| `category` | Software Houses |
| `profileUrl` | link to the listing on the directory |

**Job boards** — one row per job ad: `company`, `title`, `url`, `postedAt` (ISO date), `location`, `companyWebsite`, `snippet`, `employmentType`.

Every row also carries `site`, `kind`, `country`, the `query`/`location` that found it and the `sourceUrl` of the page.

### Input

```json
{
  "site": "jamals.com",
  "mode": "search",
  "query": "software",
  "location": "Karachi",
  "maxItems": 100
}
```

- `mode: "search"` — keyword (+ city) search, paginated until `maxItems`.
- `mode: "lookup"` — `query` is a company name; returns the matching listings from the first result page (fast enrichment of a known company).
- `queries` — run several `{ "query", "location" }` searches in one run.
- `includeDetails` — open the business page when the list does not show website/phone.
- `proxyConfiguration` — each site has a working default (residential proxy of the site's country for Cloudflare-protected sites).

### Supported sites

The list grows with every build; `site` accepts the domain (with or without `www.`).

| Country | Site | Kind |
|---|---|---|
| Pakistan | jamals.com | directory |

### Speed

HTTP-only sites run without a browser at up to 12 parallel requests (a 100-result search usually finishes in under a minute). Sites behind Cloudflare use Firefox with images/fonts blocked.

### Notes

Respect each site's terms of use and local data-protection law. Results contain only what the site publishes publicly.

# Actor input Schema

## `site` (type: `string`):

Domain of the site module to use, e.g. trangvangvietnam.com, localsearch.com.au, yellowpages.my. See README for the full list.

## `mode` (type: `string`):

search = find businesses / job ads by keyword (+ location). lookup = find one company by name (+ city). fetch = return raw HTML of the given URLs (debugging).

## `query` (type: `string`):

Keyword to search (search mode) or the company name (lookup mode).

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

City or region. Leave empty for the whole country.

## `queries` (type: `array`):

Optional list of {"query": "…", "location": "…"} objects; overrides query/location.

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

Stop after this many results in total.

## `maxPagesPerQuery` (type: `integer`):

How many result pages to read per search before moving on.

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

Slower but fills website/email/address that some sites only show on the business page.

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

Pages to fetch in fetch mode.

## `useBrowser` (type: `boolean`):

Fetch mode only: load pages in Firefox instead of plain HTTP.

## `maxConcurrency` (type: `integer`):

Parallel requests. Higher is faster; lower is gentler on the site.

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

Each site module has a sensible default; Cloudflare-protected sites need residential proxies of the site's country.

## Actor input object example

```json
{
  "site": "trangvangvietnam.com",
  "mode": "search",
  "query": "phần mềm",
  "location": "Ho Chi Minh",
  "maxItems": 100,
  "maxPagesPerQuery": 10,
  "includeDetails": true,
  "useBrowser": false,
  "maxConcurrency": 12,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "apifyProxyCountry": "VN"
  }
}
```

# Actor output Schema

## `results` (type: `string`):

Dataset rows: name, website, phone, email, address, category, profile link — or company, title, link, posted date for job ads.

# 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 = {
    "site": "trangvangvietnam.com",
    "query": "phần mềm",
    "location": "Ho Chi Minh",
    "proxyConfiguration": {
        "useApifyProxy": true,
        "apifyProxyGroups": [
            "RESIDENTIAL"
        ],
        "apifyProxyCountry": "VN"
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("andrew_babo/business-directory-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 = {
    "site": "trangvangvietnam.com",
    "query": "phần mềm",
    "location": "Ho Chi Minh",
    "proxyConfiguration": {
        "useApifyProxy": True,
        "apifyProxyGroups": ["RESIDENTIAL"],
        "apifyProxyCountry": "VN",
    },
}

# Run the Actor and wait for it to finish
run = client.actor("andrew_babo/business-directory-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 '{
  "site": "trangvangvietnam.com",
  "query": "phần mềm",
  "location": "Ho Chi Minh",
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "apifyProxyCountry": "VN"
  }
}' |
apify call andrew_babo/business-directory-jobs-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,andrew_babo/business-directory-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/aJKIAaKdHeNo7mtpy/builds/m63dwLNEkzmgwjuuU/openapi.json
