# Soopage Malta Business Directory Scraper (`crawlerbros/malta-yp-scraper`) Actor

Scrape mlt.soopage.com - Malta's business directory. Browse the island's listings, walk the nationwide index, or fetch companies directly by URL. Get contact details, address, category, email, website, and more.

- **URL**: https://apify.com/crawlerbros/malta-yp-scraper.md
- **Developed by:** [Crawler Bros](https://apify.com/crawlerbros) (community)
- **Categories:** Automation, Lead generation, Developer tools
- **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/platform/actors/running/actors-in-store#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

## Soopage Malta Business Directory Scraper

Scrape **mlt.soopage.com** — a business directory covering companies across Malta. Browse the island's listings, walk the nationwide index, or fetch specific companies directly by URL. Get name, category, phone, fax, email, website, full address, contact person, and more. HTTP-only, no login, no cookies required.

### What this actor does

- **Three modes:** browse Malta's listings, browse the nationwide index, or fetch companies by URL
- **Full contact enrichment** — every company is enriched from its own detail page: phone, fax, de-obfuscated email, website, address, postal code, contact person, and more
- **Derived Google Maps link** for every company with an address
- **Empty fields are omitted**

### Output per company

- `companyName`
- `companyId` — short id parsed from the source URL
- `category` — business category/type, when listed
- `phone`, `fax`
- `email` — decoded from Cloudflare's obfuscated mail-protection markup when present
- `website` — normalized to a full `https://` URL
- `streetAddress`, `city`, `country`, `postalCode`
- `contactPerson`, `contactPosition`
- `aboutUs` — free-text company description, when provided
- `description`
- `employees` — headcount band (e.g. `1 to 10`), when listed
- `productList` — product/service keywords, when listed
- `googleMapsUrl` — derived from the address (only present when an address exists)
- `searchArea` — always `"Malta"` (byCity mode only)
- `sourceUrl` — canonical company page URL
- `recordType: "company"`, `scrapedAt`

### Input

| Field | Type | Default | Description |
|---|---|---|---|
| `mode` | string | `byCity` | `byCity` / `browseAll` / `byUrl` |
| `city` | string (select) | `Malta` | Only one value — the site has no per-town breakdown |
| `categoryKeyword` | string | – | Keep only companies whose category contains this text (mode=byCity, browseAll) |
| `companyUrls` | array | – | Company page URLs or filenames to fetch directly (mode=byUrl) |
| `maxItems` | int | `10` | Hard cap on emitted records (1–2000) |
| `proxyConfiguration` | object | off | Optional Apify proxy — not required for normal use |

#### Example: browse Malta companies

```json
{
  "mode": "byCity",
  "city": "Malta",
  "maxItems": 20
}
```

#### Example: browse Malta, filtered to a category

```json
{
  "mode": "byCity",
  "city": "Malta",
  "categoryKeyword": "trading",
  "maxItems": 20
}
```

#### Example: walk the nationwide index

```json
{
  "mode": "browseAll",
  "maxItems": 200
}
```

#### Example: fetch specific companies by URL

```json
{
  "mode": "byUrl",
  "companyUrls": [
    "https://mlt.soopage.com/company/FLAGRIPRODUCTS-LTD_10.html",
    "FLAUREX-TRADING-CO-LTD_1"
  ]
}
```

### Use cases

- **B2B lead generation** — build contact lists of Maltese companies by category
- **Market research** — survey business density and category mix across Malta
- **Sales prospecting** — pull phone, email, and website for outbound outreach
- **Data enrichment** — cross-reference company names against your own CRM
- **Directory migration** — bulk-export listings

### Limitations

- **No keyword/text search.** Soopage's `/search.php` page renders only a client-side Google Custom Search widget with no server-rendered results, so a free-text keyword search mode is not possible against this source. Use `byCity` + `categoryKeyword`, or `browseAll` + `categoryKeyword`, instead.
- **No upstream category-browse index.** Soopage does not publish a category listing page. `categoryKeyword` is a post-fetch filter applied to whatever category text each individual company page happens to show — it cannot enumerate "all companies in category X" upstream.
- **`byCity` returns up to ~20 companies per run.** Soopage's own edge/WAF blocks the Malta listing page beyond page 1 (`/city/Malta-page2.html` and higher return a hard 403 — confirmed live, persistent, not a rate limit). Page 1 (up to 20 companies) is the reliable, fetchable slice. For larger pulls, run `mode=browseAll` (which is not affected by this block — confirmed live that `/index-2.html` and beyond return 200), optionally combined with `categoryKeyword`, or supply specific `companyUrls` via `mode=byUrl`.
- **`browseAll` has no authoritative total-page count.** Unlike the Malta listing page (which shows "Page X Of Y"), the nationwide index does not expose a total. `browseAll` stops once two consecutive pages return no listings, or once `maxItems` is reached — whichever comes first.

### FAQ

**What is mlt.soopage.com?** A business directory site listing companies across Malta, with per-company contact and address details. It's the Malta deployment of the same Soopage platform used for several other countries.

**Is this affiliated with Soopage?** No — this is an independent, third-party actor that reads Soopage's public web pages.

**Why do some companies have no email, fax, or website?** Those fields are optional on the source page and are simply omitted if the company listing doesn't include them.

**How is the email address recovered?** Soopage uses Cloudflare's email-obfuscation feature on some listings; the actor decodes it automatically. Where a plain email is shown instead, that is used directly.

**Why is `category` sometimes based on "Type"?** Soopage shows either a "Category" or a "Type" field on a company's page (rarely both). The actor prefers "Category" and falls back to "Type" when "Category" isn't present.

**How fresh is the data?** As fresh as the source pages — the actor reads live HTML on every run and does not cache.

**Is the `website` field always live?** It's the company's self-reported website exactly as published on their Soopage listing, some of which date back many years — a handful of listed domains may have since lapsed or changed hands. `sourceUrl` (the Soopage listing itself) and `googleMapsUrl` are actor-generated and always resolve.

# Actor input Schema

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

What to fetch.

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

Malta is a single-area listing on this site (no per-town breakdown).

## `categoryKeyword` (type: `string`):

Only keep companies whose category text contains this keyword (case-insensitive). Applies after each company's detail page is fetched. (mode=byCity, browseAll)

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

Full soopage company page URLs, e.g. `https://mlt.soopage.com/company/FLAGRIPRODUCTS-LTD_10.html`, or just the filename part `FLAGRIPRODUCTS-LTD_10`.

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

Hard cap on emitted records. Note: mode=byCity reliably returns at most ~20 companies (Soopage blocks city-listing pages beyond page 1) — use mode=browseAll for larger pulls.

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

Optional proxy settings. Leave empty to use no proxy — the site is publicly accessible without one. If you see blocking from your own IP range you can enable the free Apify AUTO datacenter proxy group.

## Actor input object example

```json
{
  "mode": "byCity",
  "city": "Malta",
  "companyUrls": [],
  "maxItems": 10,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# Actor output Schema

## `companies` (type: `string`):

Dataset containing all scraped Soopage companies.

# 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": "byCity",
    "city": "Malta",
    "companyUrls": [],
    "maxItems": 10
};

// Run the Actor and wait for it to finish
const run = await client.actor("crawlerbros/malta-yp-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": "byCity",
    "city": "Malta",
    "companyUrls": [],
    "maxItems": 10,
}

# Run the Actor and wait for it to finish
run = client.actor("crawlerbros/malta-yp-scraper").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print("💾 Check your data here: https://console.apify.com/storage/datasets/" + run["defaultDatasetId"])
for item in client.dataset(run["defaultDatasetId"]).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": "byCity",
  "city": "Malta",
  "companyUrls": [],
  "maxItems": 10
}' |
apify call crawlerbros/malta-yp-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=crawlerbros/malta-yp-scraper",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/cRj4oEJwTnk9394em/builds/UqYB6Cg37baRHyRZb/openapi.json
