# Jordan Business Directory Scraper (`crawlerbros/jordan-business-directory-scraper`) Actor

Scrape JordanYP (jordanyp.com) - Jordan's online business directory. Search by keyword, browse any of 300+ categories or 20 cities, or fetch specific business profiles by URL/ID. Get phone numbers, addresses, websites, working hours, ratings, coordinates, and photos.

- **URL**: https://apify.com/crawlerbros/jordan-business-directory-scraper.md
- **Developed by:** [Crawler Bros](https://apify.com/crawlerbros) (community)
- **Categories:** Lead generation, Automation, Other
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $3.00 / 1,000 results

This Actor is paid per event and usage. You are charged both the fixed price for specific events and for Apify platform usage.
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?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
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.
Actors are written with capital "A".

## 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.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

## Jordan Business Directory Scraper (JordanYP)

Scrape **JordanYP (jordanyp.com)**, Jordan's largest online business directory with 47,000+ verified listings. Search by keyword, browse any of 300+ business categories or 20 Jordanian cities, or look up specific businesses by profile URL / ID. Get phone numbers, mobile numbers, addresses, websites, working hours, manager names, establishment year, employee count, review ratings, GPS coordinates, and photos - ready for lead generation, market research, or building a local business dataset for Jordan.

No login, no cookies, no paid proxies required.

### What this actor does

- **Keyword search** - search JordanYP the same way a visitor would, optionally narrowed to a specific city
- **Category browsing** - pull every business listed under any of 300+ categories (Lawyers, Restaurants, Hotels, Doctors & Clinics, Construction Services, Car Dealers, and hundreds more), optionally narrowed to a city
- **City browsing** - pull every business listed in any of Jordan's 20 covered cities (Amman, Irbid, Aqaba, Zarqa, Madaba, and more)
- **Direct lookup** - fetch specific businesses by pasting their JordanYP profile URL or numeric ID
- **Rich filters** - verified-only, has-website, minimum rating, minimum review count, establishment-year range, and a name/description keyword filter
- **Deduplication** - the same business is never emitted twice, even across pages or overlapping filters
- **Clean output** - every field is real data pulled from the live page; fields the source doesn't provide for a given business are simply omitted (never `null`, `""`, or placeholder text)

### Output fields

Each item in the dataset represents one business:

| Field | Description |
|---|---|
| `companyId` | JordanYP's internal numeric business ID |
| `name` | Business name |
| `tagline` | Short one-line business summary |
| `description` | Full business description |
| `city` | City in Jordan |
| `address` | Full street address |
| `country` | Always `Jordan` |
| `phone` | Primary contact number |
| `mobilePhone` | Mobile contact number (when listed) |
| `website` | Business website (resolved to the real external URL) |
| `companyManager` | Listed company manager / owner name |
| `establishmentYear` | Year the business was established |
| `employees` | Employee count range (e.g. `1-5`, `11-50`) |
| `workingHours` | Opening hours per day of the week |
| `categories` | JordanYP categories the business is listed under |
| `verified` | Whether JordanYP has verified this listing |
| `yearsListed` | How many years the business has been listed on JordanYP |
| `recentlyUpdated` | Whether the listing was recently refreshed by its owner |
| `reviewCount` | Number of JordanYP reviews |
| `rating` | Average review rating (0-5), only present when `reviewCount` > 0 |
| `latitude` / `longitude` | GPS coordinates (when the business has a map pin) |
| `logoImageUrl` | Main business photo/logo |
| `photoUrls` | All gallery photos for the business |
| `registeredAt` | When the listing was first registered on JordanYP |
| `lastUpdatedAt` | When the listing was last updated |
| `sourceUrl` | Canonical JordanYP profile URL |
| `scrapedAt` | UTC timestamp of when the record was scraped |
| `recordType` | Always `business` |

### Input options

| Field | Type | Description |
|---|---|---|
| `mode` | select | `search`, `byCategory`, `byCity`, or `byUrls` |
| `searchQuery` | string | Free-text keyword (mode=search), e.g. `restaurant`, `lawyer`, `hotel` |
| `city` | select | One of 20 Jordanian cities. Required for `byCity`; optional narrowing filter for `search`/`byCategory` |
| `category` | select | One of 300+ business categories. Required for `byCategory` |
| `companyUrls` | array | JordanYP profile URLs or bare numeric IDs (mode=byUrls) |
| `verifiedOnly` | boolean | Only emit JordanYP-verified businesses |
| `hasWebsite` | boolean | Only emit businesses that list a website |
| `minRating` | number | Drop businesses with a review rating below this (0-5) |
| `minReviews` | integer | Drop businesses with fewer reviews than this |
| `minEstablishmentYear` | integer | Drop businesses established before this year |
| `maxEstablishmentYear` | integer | Drop businesses established after this year |
| `containsKeyword` | string | Case-insensitive substring filter on name/tagline/description |
| `maxItems` | integer | Hard cap on emitted records (1-300) |

### Example inputs

#### Search for restaurants in Amman

```json
{
  "mode": "search",
  "searchQuery": "restaurant",
  "city": "Amman",
  "maxItems": 50
}
```

#### Every verified lawyer in Amman

```json
{
  "mode": "byCategory",
  "category": "lawyers",
  "city": "Amman",
  "verifiedOnly": true,
  "maxItems": 100
}
```

#### All businesses in Irbid with a website listed

```json
{
  "mode": "byCity",
  "city": "Irbid",
  "hasWebsite": true,
  "maxItems": 100
}
```

#### Look up specific businesses by URL or ID

```json
{
  "mode": "byUrls",
  "companyUrls": [
    "https://www.jordanyp.com/company/373584/Arida_Law_Firm",
    "349701"
  ]
}
```

### Use cases

- **Lead generation** - build targeted contact lists of Jordanian businesses by category and city
- **Market research** - analyze business density, categories, and coverage across Jordan's cities
- **Competitive analysis** - pull every competitor listed in a category, with ratings and review counts
- **Data enrichment** - attach verified phone numbers, websites, and coordinates to an existing business dataset
- **Local SEO / directory audits** - check how a business (or its competitors) appears on JordanYP

### FAQ

**Do I need a JordanYP account, API key, or proxy?**
No. This actor works with plain, public pages - no login, cookies, or paid proxy configuration needed.

**Why are some fields missing from certain businesses?**
JordanYP listings are self-reported by business owners, so not every business lists a mobile number, working hours, establishment year, or photos. This actor only includes fields that are actually present on the source page - it never fabricates placeholder values.

**Why don't some businesses have a `rating` field?**
`rating` is only included when the business has at least one review (`reviewCount` > 0). Businesses with zero reviews still include `reviewCount: 0` but omit `rating`, since there's no genuine rating signal yet.

**Can I search in Arabic?**
Yes - `searchQuery` accepts Arabic (or any Unicode) text and is passed straight through to JordanYP's own search.

**Does `city` restrict `byCategory` results to only that city?**
Yes. When both `category` and `city` are set, results are narrowed to businesses in that category **and** that city.

**What happens if a filter combination matches nothing?**
The run finishes cleanly with zero items and a status message explaining why (e.g. "no results" or "try widening filters") - it won't error out.

**Why is there no `email` field?**
JordanYP gates each business's e-mail address behind a "Show Email" sign-in action - it is never present in the public page markup, so it can't be reliably scraped without a logged-in session. This actor stays login-free by design, so `email` is intentionally excluded. `phone`, `mobilePhone`, and `website` remain fully available.

# Actor input Schema

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

What to fetch from JordanYP.

## `searchQuery` (type: `string`):

Free-text keyword to search JordanYP for (business name, service, or category term), e.g. `restaurant`, `lawyer`, `hotel`.

## `city` (type: `string`):

City to filter/browse. Required for mode=byCity. Optional narrowing filter for mode=search and mode=byCategory.

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

Business category to browse. Required for mode=byCategory.

## `companyUrls` (type: `array`):

JordanYP company profile URLs (e.g. `https://www.jordanyp.com/company/373584/Arida_Law_Firm`) or bare numeric company IDs (e.g. `373584`).

## `verifiedOnly` (type: `boolean`):

Only emit businesses with a JordanYP-verified listing badge.

## `hasWebsite` (type: `boolean`):

Only emit businesses that list a website address.

## `minRating` (type: `number`):

Drop businesses with a review rating below this (0-5). Businesses with no reviews are always kept.

## `minReviews` (type: `integer`):

Drop businesses with fewer reviews than this.

## `minEstablishmentYear` (type: `integer`):

Drop businesses established before this year.

## `maxEstablishmentYear` (type: `integer`):

Drop businesses established after this year.

## `containsKeyword` (type: `string`):

Case-insensitive substring filter applied to business name, tagline, and description.

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

Hard cap on emitted records.

## Actor input object example

```json
{
  "mode": "search",
  "searchQuery": "restaurant",
  "city": "Amman",
  "category": "restaurants",
  "companyUrls": [],
  "verifiedOnly": false,
  "hasWebsite": false,
  "maxItems": 20
}
```

# Actor output Schema

## `businesses` (type: `string`):

Dataset containing all scraped JordanYP businesses.

# 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 = {
    "mode": "search",
    "searchQuery": "restaurant",
    "city": "Amman",
    "category": "restaurants",
    "companyUrls": [],
    "verifiedOnly": false,
    "hasWebsite": false,
    "maxItems": 20
};

// Run the Actor and wait for it to finish
const run = await client.actor("crawlerbros/jordan-business-directory-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 = {
    "mode": "search",
    "searchQuery": "restaurant",
    "city": "Amman",
    "category": "restaurants",
    "companyUrls": [],
    "verifiedOnly": False,
    "hasWebsite": False,
    "maxItems": 20,
}

# Run the Actor and wait for it to finish
run = client.actor("crawlerbros/jordan-business-directory-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 '{
  "mode": "search",
  "searchQuery": "restaurant",
  "city": "Amman",
  "category": "restaurants",
  "companyUrls": [],
  "verifiedOnly": false,
  "hasWebsite": false,
  "maxItems": 20
}' |
apify call crawlerbros/jordan-business-directory-scraper --silent --output-dataset

```

## MCP server setup

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