# Panoramafirm.pl Scraper - Polish Business Directory Leads (`studio-amba/panoramafirm-pl-scraper`) Actor

Extract Polish business leads from panoramafirm.pl. Search by keyword and city for company name, phone, email, full address, website and rating. Data comes straight from the results page, no detail visits needed. Optional NIP tax-number enrichment. Export to CSV, JSON or Excel.

- **URL**: https://apify.com/studio-amba/panoramafirm-pl-scraper.md
- **Developed by:** [Studio Amba](https://apify.com/studio-amba) (community)
- **Categories:** Business, Lead generation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $12.00 / 1,000 result scrapeds

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/platform/actors/running/actors-in-store#pay-per-event

## What's an Apify Actor?

Actors are a software tools running on the Apify platform, for all kinds of web data extraction and automation use cases.
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.

In JavaScript/TypeScript projects, use official [JavaScript/TypeScript client](https://docs.apify.com/api/client/js/docs.md):

```bash
npm install apify-client
```

In Python projects, use official [Python client library](https://docs.apify.com/api/client/python/docs.md):

```bash
pip install apify-client
```

In shell scripts, use [Apify CLI](https://docs.apify.com/cli/docs.md):

````bash
# MacOS / Linux
curl -fsSL https://apify.com/install-cli.sh | bash
# Windows
irm https://apify.com/install-cli.ps1 | iex
```bash

In AI frameworks, you might use the [Apify MCP server](https://docs.apify.com/integrations/mcp.md).

If your project is in a different language, use 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

## Panoramafirm.pl Scraper — Polish Business Directory Leads

Extract business leads from [panoramafirm.pl](https://panoramafirm.pl), one of Poland's largest online business directories. Search by keyword and city and get company name, phone, email, full postal address, website and rating — straight from the results pages, no login and no per-listing clicking.

### Why use this actor?

Sales teams, lead-gen agencies and market researchers need clean lists of Polish companies with contact details. Panoramafirm lists hundreds of thousands of businesses across every trade and city, but copying them by hand is slow and the site paginates results 25 at a time. This actor turns any keyword and city into a structured spreadsheet of leads with phone and email already filled in.

### How to scrape Panoramafirm data

1. Enter a **search query** in Polish — a business type or keyword such as `restauracja`, `hydraulik`, `adwokat` or `fryzjer`.
2. Optionally enter a **city** (for example `Warszawa` or `Krakow`) to narrow the results to that location.
3. Set **max results** to how many businesses you want.
4. Click **Start**. The actor walks the results pages, reads the structured data embedded in each page and returns one row per business.
5. Download the data as **CSV, JSON, Excel** or via the API.

Every business on a Panoramafirm results page is published as schema.org structured data, so the phone, email and address come back complete without visiting each company page. The optional **Fetch details** toggle additionally opens each company page to read the NIP (tax registration number).

### Input

| Field | Type | Required | Description |
|-------|------|----------|-------------|
| `searchQuery` | String | No | Keyword or business type in Polish (default: `restauracja`) |
| `location` | String | No | City to narrow the search (e.g. `Warszawa`) |
| `fetchDetails` | Boolean | No | Visit each company page to also collect the NIP (tax number). Slower. Default `false` |
| `maxResults` | Integer | No | Maximum number of businesses to return (default: 100) |
| `proxyConfiguration` | Object | No | Apify proxy settings. Default Apify proxy is enough |

#### Example input

```json
{
    "searchQuery": "restauracja",
    "location": "Warszawa",
    "maxResults": 100,
    "proxyConfiguration": { "useApifyProxy": true }
}
````

### Output

Each result contains:

| Field | Type | Example |
|-------|------|---------|
| `businessName` | String | `"Restauracja Moonsfera"` |
| `category` | String | `"restauracja"` |
| `address` | String | `"ul. Piękna 15"` |
| `city` | String | `"Warszawa"` |
| `postalCode` | String | `"00-549"` |
| `region` | String | `""` |
| `phone` | String | `"509060050"` |
| `website` | String | `"http://www.moonsfera.pl"` |
| `email` | String | `"ask@moonsfera.pl"` |
| `registrationNumber` | String | NIP, only when `fetchDetails` is on |
| `extraFields` | Object | `{ "rating": 4.7, "reviewCount": 38 }` |
| `url` | String | Full company page URL |
| `scrapedAt` | String | ISO timestamp |

#### Example output

```json
{
    "businessName": "Restauracja Moonsfera",
    "category": "restauracja",
    "address": "ul. Piękna 15",
    "city": "Warszawa",
    "postalCode": "00-549",
    "region": "",
    "phone": "509060050",
    "website": "http://www.moonsfera.pl",
    "email": "ask@moonsfera.pl",
    "registrationNumber": "",
    "extraFields": { "rating": 4.7, "reviewCount": 38 },
    "url": "https://panoramafirm.pl/mazowieckie,,warszawa,.../restauracja-moonsfera-xxxx.html",
    "scrapedAt": "2026-07-13T09:12:44.000Z"
}
```

### How pagination and coverage work

Panoramafirm shows 25 businesses per results page. The actor keeps loading pages until it reaches your `maxResults` or runs out of listings. Prominent, verified businesses at the top of a category carry the most complete contact details; the further down a large category you go, the more bare listings (name and address only) you meet. That is the directory's real data, not a scraping gap — the actor returns exactly what the site publishes.

### Cost estimate

The actor uses plain HTTP requests (no browser), so it is cheap and fast. One request returns 25 businesses. Expect a few thousand leads per US dollar of Apify platform usage, depending on your plan. Turning on `fetchDetails` adds one request per business (to read the NIP) and increases cost and runtime accordingly — these runs are resumable if interrupted.

### Limitations

- **Email and phone coverage vary by listing.** Claimed, prominent businesses have full contact details; basic listings may only have name and address.
- **NIP (tax number) requires `fetchDetails`.** It is only on the company page, not the results page.
- **Website** is present for roughly 8 in 10 prominent listings.
- Be considerate with very large runs; the actor paginates politely.

### Related Scrapers

- [Allabolag.se Scraper](https://apify.com/jelle.desramaults/allabolag-se-scraper) — Swedish company data, revenue and leads
- [Firmy.cz Scraper](https://apify.com/jelle.desramaults/firmy-cz-scraper) — Czech business directory leads
- [Local.ch Scraper](https://apify.com/jelle.desramaults/local-ch-scraper) — Swiss business directory leads
- [Companies House Scraper](https://apify.com/jelle.desramaults/companies-house-scraper) — UK company registry data
- [KRS Scraper](https://apify.com/jelle.desramaults/krs-scraper) — Polish National Court Register company data
- [Pappers Scraper](https://apify.com/jelle.desramaults/pappers-scraper) — French company registry data

### FAQ

**Do I need a Panoramafirm account or cookies?**
No. Everything comes from public results pages.

**Is scraping this data legal?**
The actor only collects publicly listed business contact information. You are responsible for using the data in line with GDPR and local marketing rules — Poland's directories list business contact details, but B2C outreach has its own rules.

**Why is the phone or email empty for some businesses?**
Those businesses did not publish that detail on Panoramafirm. The actor returns every field the site exposes.

# Actor input Schema

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

Keyword or business type to search for, in Polish (e.g. 'restauracja', 'hydraulik', 'adwokat').

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

Optional city to narrow the search (e.g. 'Warszawa', 'Krakow'). Leave empty to search the whole country.

## `fetchDetails` (type: `boolean`):

Visit each company page to extract the NIP (tax registration number). Slower: one extra request per company. Runs are resumable if interrupted.

## `maxResults` (type: `integer`):

Maximum number of businesses to return.

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

Apify proxy settings. Default Apify proxy works fine for panoramafirm.pl.

## Actor input object example

```json
{
  "searchQuery": "restauracja",
  "location": "Warszawa",
  "fetchDetails": false,
  "maxResults": 20,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}
```

# 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 = {
    "searchQuery": "restauracja",
    "location": "Warszawa",
    "maxResults": 20,
    "proxyConfiguration": {
        "useApifyProxy": true,
        "apifyProxyGroups": [
            "RESIDENTIAL"
        ]
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("studio-amba/panoramafirm-pl-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 = {
    "searchQuery": "restauracja",
    "location": "Warszawa",
    "maxResults": 20,
    "proxyConfiguration": {
        "useApifyProxy": True,
        "apifyProxyGroups": ["RESIDENTIAL"],
    },
}

# Run the Actor and wait for it to finish
run = client.actor("studio-amba/panoramafirm-pl-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 '{
  "searchQuery": "restauracja",
  "location": "Warszawa",
  "maxResults": 20,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}' |
apify call studio-amba/panoramafirm-pl-scraper --silent --output-dataset

```

## MCP server setup

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

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "Panoramafirm.pl Scraper - Polish Business Directory Leads",
        "description": "Extract Polish business leads from panoramafirm.pl. Search by keyword and city for company name, phone, email, full address, website and rating. Data comes straight from the results page, no detail visits needed. Optional NIP tax-number enrichment. Export to CSV, JSON or Excel.",
        "version": "0.0",
        "x-build-id": "ifYAeCrG5vEDzgpXP"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/studio-amba~panoramafirm-pl-scraper/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-studio-amba-panoramafirm-pl-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for its completion, and returns Actor's dataset items in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        },
        "/acts/studio-amba~panoramafirm-pl-scraper/runs": {
            "post": {
                "operationId": "runs-sync-studio-amba-panoramafirm-pl-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor and returns information about the initiated run in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/runsResponseSchema"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/acts/studio-amba~panoramafirm-pl-scraper/run-sync": {
            "post": {
                "operationId": "run-sync-studio-amba-panoramafirm-pl-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for completion, and returns the OUTPUT from Key-value store in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        }
    },
    "components": {
        "schemas": {
            "inputSchema": {
                "type": "object",
                "properties": {
                    "searchQuery": {
                        "title": "Search Query",
                        "type": "string",
                        "description": "Keyword or business type to search for, in Polish (e.g. 'restauracja', 'hydraulik', 'adwokat').",
                        "default": "restauracja"
                    },
                    "location": {
                        "title": "City / Location (optional)",
                        "type": "string",
                        "description": "Optional city to narrow the search (e.g. 'Warszawa', 'Krakow'). Leave empty to search the whole country."
                    },
                    "fetchDetails": {
                        "title": "Fetch details (NIP tax number)",
                        "type": "boolean",
                        "description": "Visit each company page to extract the NIP (tax registration number). Slower: one extra request per company. Runs are resumable if interrupted.",
                        "default": false
                    },
                    "maxResults": {
                        "title": "Max Results",
                        "minimum": 1,
                        "maximum": 20000,
                        "type": "integer",
                        "description": "Maximum number of businesses to return.",
                        "default": 100
                    },
                    "proxyConfiguration": {
                        "title": "Proxy Configuration",
                        "type": "object",
                        "description": "Apify proxy settings. Default Apify proxy works fine for panoramafirm.pl.",
                        "default": {
                            "useApifyProxy": true
                        }
                    }
                }
            },
            "runsResponseSchema": {
                "type": "object",
                "properties": {
                    "data": {
                        "type": "object",
                        "properties": {
                            "id": {
                                "type": "string"
                            },
                            "actId": {
                                "type": "string"
                            },
                            "userId": {
                                "type": "string"
                            },
                            "startedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "finishedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "status": {
                                "type": "string",
                                "example": "READY"
                            },
                            "meta": {
                                "type": "object",
                                "properties": {
                                    "origin": {
                                        "type": "string",
                                        "example": "API"
                                    },
                                    "userAgent": {
                                        "type": "string"
                                    }
                                }
                            },
                            "stats": {
                                "type": "object",
                                "properties": {
                                    "inputBodyLen": {
                                        "type": "integer",
                                        "example": 2000
                                    },
                                    "rebootCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "restartCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "resurrectCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "computeUnits": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "options": {
                                "type": "object",
                                "properties": {
                                    "build": {
                                        "type": "string",
                                        "example": "latest"
                                    },
                                    "timeoutSecs": {
                                        "type": "integer",
                                        "example": 300
                                    },
                                    "memoryMbytes": {
                                        "type": "integer",
                                        "example": 1024
                                    },
                                    "diskMbytes": {
                                        "type": "integer",
                                        "example": 2048
                                    }
                                }
                            },
                            "buildId": {
                                "type": "string"
                            },
                            "defaultKeyValueStoreId": {
                                "type": "string"
                            },
                            "defaultDatasetId": {
                                "type": "string"
                            },
                            "defaultRequestQueueId": {
                                "type": "string"
                            },
                            "buildNumber": {
                                "type": "string",
                                "example": "1.0.0"
                            },
                            "containerUrl": {
                                "type": "string"
                            },
                            "usage": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "integer",
                                        "example": 1
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "usageTotalUsd": {
                                "type": "number",
                                "example": 0.00005
                            },
                            "usageUsd": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "number",
                                        "example": 0.00005
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
