# BUSINESS.bg scraper: Bulgarian company leads, фирмени контакти (`getascraper/business-bg-company-leads-scraper`) Actor

Scrape public BUSINESS.bg listings across Bulgaria into business records and бизнес каталог data with phones, emails when listed, websites, addresses, ratings, source URLs, and change tracking. Export JSON or CSV to Google Sheets, Airtable, HubSpot, Salesforce, n8n, or Zapier. $0.00088 per record.

- **URL**: https://apify.com/getascraper/business-bg-company-leads-scraper.md
- **Developed by:** [GetAScraper](https://apify.com/getascraper) (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 $0.66 / 1,000 company records

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

## BUSINESS.bg scraper: Bulgarian company leads, фирмени контакти

**Build a reliable Bulgarian business lead list from public BUSINESS.bg pages.** Collect company profiles, phone numbers, listed emails, websites, categories, addresses, ratings, and factual changes over time. The output is designed for CRM and automation workflows, with Bulgarian and English profile support and no login.

<table width="100%" style="display:table;width:100%;border-collapse:collapse"><tr><td style="border:1px solid #d7dee8;background:#eef6ff;padding:18px;color:#102a43"><strong style="color:#102a43">Find better local prospects in one run</strong><br><span style="color:#334e68">Start with a public category page, then filter by industry, city, contact coverage, description, or rating.</span></td></tr></table>

<table width="100%"><tr><td style="border:1px solid #d7dee8;background:#ffffff;padding:14px;color:#102a43"><strong style="color:#102a43">Public contact signals</strong><br><span style="color:#486581">Separate directory contacts from opt-in public website contacts.</span></td><td style="border:1px solid #d7dee8;background:#ffffff;padding:14px;color:#102a43"><strong style="color:#102a43">Bilingual profiles</strong><br><span style="color:#486581">Keep English, Bulgarian, or both when a profile exposes both versions.</span></td><td style="border:1px solid #d7dee8;background:#ffffff;padding:14px;color:#102a43"><strong style="color:#102a43">Recurring changes</strong><br><span style="color:#486581">Run on a schedule and identify new, changed, unchanged, or removed listings.</span></td><td style="border:1px solid #d7dee8;background:#ffffff;padding:14px;color:#102a43"><strong style="color:#102a43">Bounded by default</strong><br><span style="color:#486581">The default run uses one public source, two pages, and 20 rows.</span></td></tr></table>

### 🧭 How to use it

<table width="100%"><tr><td style="border:1px solid #d7dee8;background:#f8fafc;padding:14px;color:#102a43"><strong style="color:#102a43">1. Choose a source</strong><br><span style="color:#486581">Use a BUSINESS.bg category or search URL. You can also enter search terms.</span></td><td style="border:1px solid #d7dee8;background:#f8fafc;padding:14px;color:#102a43"><strong style="color:#102a43">2. Set useful filters</strong><br><span style="color:#486581">Narrow by city, category text, rating, description, or public contact fields.</span></td><td style="border:1px solid #d7dee8;background:#f8fafc;padding:14px;color:#102a43"><strong style="color:#102a43">3. Schedule the next run</strong><br><span style="color:#486581">Keep the same state name to compare listings and review the changes view.</span></td></tr></table>

### 🧾 Input

| Field | Type | Required | Description |
| --- | --- | --- | --- |
| `startUrls` | array of URLs | No | Public BUSINESS.bg category, search, or profile URLs. |
| `searchTerms` | array of strings | No | Terms sent to the public BUSINESS.bg search. |
| `languageMode` | enum | No | `both`, `english`, or `bulgarian`. |
| `industryContains` | text | No | Keep categories containing this text. |
| `cityContains` | text | No | Keep cities containing this text. |
| `requirePublicPhone` | boolean | No | Keep listings with a directory phone. |
| `requirePublicEmail` | boolean | No | Keep listings with a directory email. |
| `requireWebsite` | boolean | No | Keep listings linking to a public company website. |
| `minRating` | number | No | Keep profiles at or above the public rating. |
| `requireDescription` | boolean | No | Keep listings with a public description. |
| `includeDetails` | boolean | No | Fetch public profile pages for ratings, full address, categories, images, and map links. |
| `includeImages` | boolean | No | Keep source image URLs when exposed. |
| `includePublicWebsiteContacts` | boolean | No | Read visible email and phone links from linked public company websites. |
| `maxEnrichedProfiles` | integer | No | Bound profile and website enrichment. |
| `maxItems` | integer | No | Maximum output rows, from 1 to 500. |
| `maxPages` | integer | No | Maximum pages per source, from 1 to 50. |
| `outputMode` | enum | No | `snapshot`, `snapshotAndChanges`, or `changesOnly`. |
| `stateName` | text | No | Stable state name for scheduled comparisons. |
| `proxyConfiguration` | object | No | Optional Apify Proxy settings. Direct HTTP is the default. |

### 📊 Data table

| Field | Type | Description |
| --- | --- | --- |
| `listingId` | string | Stable BUSINESS.bg profile ID. |
| `companyName` | string | Public company name. |
| `companyNameNative` | string | Native name when exposed alongside the selected profile. |
| `profileUrl` | URL | Canonical public profile URL. |
| `description` | string | Public directory description. |
| `industryNames` | array | Public category names. |
| `city`, `streetAddress`, `postalCode`, `country` | string | Public location fields when present. |
| `phoneNumbers` | array | Directory phone numbers. |
| `directoryEmails` | array | Emails listed by BUSINESS.bg. |
| `websiteUrl` | URL | Public company website linked from the directory. |
| `websiteEmails`, `websitePhones` | array | Contacts found only when website enrichment is enabled. |
| `emailSource` | enum | `directory`, `website`, or `directory_and_website`. |
| `publicContactChannels` | array | Factual channels such as phone, email, website, and profile. |
| `hasPublicPhone`, `hasPublicEmail`, `hasWebsite`, `hasDescription` | boolean | Presence flags based on emitted values. |
| `leadCompletenessScore` | number | Deterministic score from factual field presence. |
| `ratingValue`, `ratingCount` | number | Public profile rating facts when details are enabled. |
| `changeType` | enum | `new`, `changed`, `unchanged`, or `removed`. |
| `changedFields` | array | Fields that changed from the prior complete run. |
| `previousRatingValue` | number | Prior rating when a rating change is factual. |
| `changeDetectedAt`, `scrapedAt` | date-time | Change and collection timestamps. |

### 👀 Dataset views

The dataset has three views:

- **🔍 Business leads**: company identity, location, category, profile, description, rating, and change state.
- **☎️ Contact coverage**: phones, directory emails, websites, opt-in website contacts, channels, and lead score.
- **🔄 Inventory changes**: new, changed, unchanged, and removed records with changed fields and timestamps.

Run diagnostics, source status, warning codes, and pagination completeness are stored in `RUN_SUMMARY` in the key-value store. They are not mixed into the three user-facing views.

### 🔄 Monitoring behavior

Use `snapshotAndChanges` for recurring runs. The first complete run marks current rows as `new`. A later identical run marks them as `unchanged`. A factual profile, contact, category, address, description, or rating difference marks a row as `changed`. Removed rows are emitted only after every requested source completes without a cap or pagination warning.

`changesOnly` emits only new, changed, and safely inferred removed rows. Partial or capped runs never infer removals.

### 🔒 Public-only boundaries

This Actor reads anonymous public BUSINESS.bg pages and optional public company websites. It does not use credentials, private-person lookup, reviewer identity data, private APIs, or guessed contact values. Missing fields are omitted.

### 💰 Pricing

Pricing is pay per business record. Empty runs cost nothing, and there are no separate phone or email surcharges.

| Plan | Price per record | Price per 1,000 records |
| --- | ---: | ---: |
| Free | $0.00088 | $0.88 |
| Starter | $0.00079 | $0.79 |
| Scale | $0.00072 | $0.72 |
| Business | $0.00066 | $0.66 |

### ⭐ Enjoying BUSINESS.bg scraper: Bulgarian company leads, фирмени контакти?

<table width="100%" style="display:table;width:100%"><tr><td style="border:1px solid #0f766e;background:#0f766e;padding:16px;text-align:center"><a href="https://apify.com/getascraper/business-bg-company-leads-scraper/reviews" style="display:block;color:#ffffff;text-decoration:none;font-weight:700">★ Rate this Actor on Apify</a></td></tr></table>

### ❓ FAQ

#### Can I collect Bulgarian and English profiles together?

Yes. Keep `languageMode` set to `both`. The Actor merges the same public profile by its stable ID and preserves the source languages.

#### Мога ли да извлека фирми от BUSINESS.bg?

Yes. Use a public category URL or add search terms. The output contains only contact and profile fields that the source exposes publicly.

#### Does the Actor find private contact data?

No. It keeps directory contacts separate from opt-in contacts found on a linked public company website. It never infers an email or phone number.

#### How are removals handled?

A removal is emitted only after a complete run. A capped or partially failed run records a warning and preserves the previous state.

### 🔗 Other actors

- [🇨🇳 51job scraper 前程无忧](https://apify.com/getascraper/51job-scraper) ↗: Collect public jobs, salaries, and hiring changes.
- [📇 Startup investor contact database](https://apify.com/getascraper/startup-investor-contact-database) ↗: Build public startup and investor contact records.
- [2GIS Reviews Scraper: Отзывы 2ГИС](https://apify.com/getascraper/2gis-reviews-scraper) ↗: Monitor public place reviews and ratings.
- [🏢 GSMA MWC exhibitor directory scraper](https://apify.com/getascraper/gsma-mwc-exhibitor-directory-scraper) ↗: Collect public exhibitor companies and contact fields.

# Changelog

This Actor's version history is a separate document: https://apify.com/getascraper/business-bg-company-leads-scraper/changelog.md

# Actor input Schema

## `startUrls` (type: `array`):

Public BUSINESS.bg URLs only. Supported paths are category pages, public profile pages, and the site's public search URL.

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

Bulgarian or English business terms. Each term uses BUSINESS.bg's public search and can be combined with category URLs.

## `languageMode` (type: `string`):

Keep Bulgarian rows, English rows, or both when a public profile is available in both languages.

## `industryContains` (type: `string`):

Keep rows whose public BUSINESS.bg category contains this text.

## `cityContains` (type: `string`):

Keep rows whose public city contains this text.

## `requirePublicPhone` (type: `boolean`):

Keep only listings with a phone number published by BUSINESS.bg.

## `requirePublicEmail` (type: `boolean`):

Keep only listings with a directory email published by BUSINESS.bg.

## `requireWebsite` (type: `boolean`):

Keep only listings that link to a public company website.

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

Optional public BUSINESS.bg rating floor from 0 to 5. This enables bounded profile enrichment when needed.

## `requireDescription` (type: `boolean`):

Keep only rows with a public company description.

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

Direct HTTP is the default. Select an Apify Proxy only when your workflow needs it.

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

Fetch public profile pages for fuller address, rating, category, image, and map-link fields.

## `includeImages` (type: `boolean`):

Keep image URLs exposed by BUSINESS.bg. No image URL is constructed when the source omits it.

## `includePublicWebsiteContacts` (type: `boolean`):

Opt in to bounded requests to linked public company websites to collect visible email and phone channels. Never infer contacts.

## `maxEnrichedProfiles` (type: `integer`):

Maximum number of public BUSINESS.bg profiles and linked websites to enrich.

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

Maximum business rows emitted after normalization, deduplication, enrichment, and filters.

## `maxPages` (type: `integer`):

Bound pagination for each category or search source. Partial runs never infer removed businesses.

## `outputMode` (type: `string`):

Snapshot emits current rows, snapshot and changes also emits removals after complete runs, and changes only suppresses unchanged rows.

## `stateName` (type: `string`):

Use a stable name to compare this source scope across scheduled runs.

## Actor input object example

```json
{
  "startUrls": [
    {
      "url": "https://www.business.bg/en/o-360/restaurants-bars.html"
    }
  ],
  "searchTerms": [],
  "languageMode": "both",
  "industryContains": "",
  "cityContains": "",
  "requirePublicPhone": false,
  "requirePublicEmail": false,
  "requireWebsite": false,
  "minRating": 0,
  "requireDescription": false,
  "proxyConfiguration": {
    "useApifyProxy": false
  },
  "includeDetails": false,
  "includeImages": false,
  "includePublicWebsiteContacts": false,
  "maxEnrichedProfiles": 20,
  "maxItems": 20,
  "maxPages": 2,
  "outputMode": "snapshotAndChanges",
  "stateName": "default"
}
```

# Actor output Schema

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

No description

## `runSummary` (type: `string`):

No description

# 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 = {
    "startUrls": [
        {
            "url": "https://www.business.bg/en/o-360/restaurants-bars.html"
        }
    ],
    "searchTerms": [],
    "languageMode": "both",
    "industryContains": "",
    "cityContains": "",
    "requirePublicPhone": false,
    "requirePublicEmail": false,
    "requireWebsite": false,
    "minRating": 0,
    "requireDescription": false,
    "proxyConfiguration": {
        "useApifyProxy": false
    },
    "includeDetails": false,
    "includeImages": false,
    "includePublicWebsiteContacts": false,
    "maxEnrichedProfiles": 20,
    "maxItems": 20,
    "maxPages": 2,
    "outputMode": "snapshotAndChanges",
    "stateName": "default"
};

// Run the Actor and wait for it to finish
const run = await client.actor("getascraper/business-bg-company-leads-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 = {
    "startUrls": [{ "url": "https://www.business.bg/en/o-360/restaurants-bars.html" }],
    "searchTerms": [],
    "languageMode": "both",
    "industryContains": "",
    "cityContains": "",
    "requirePublicPhone": False,
    "requirePublicEmail": False,
    "requireWebsite": False,
    "minRating": 0,
    "requireDescription": False,
    "proxyConfiguration": { "useApifyProxy": False },
    "includeDetails": False,
    "includeImages": False,
    "includePublicWebsiteContacts": False,
    "maxEnrichedProfiles": 20,
    "maxItems": 20,
    "maxPages": 2,
    "outputMode": "snapshotAndChanges",
    "stateName": "default",
}

# Run the Actor and wait for it to finish
run = client.actor("getascraper/business-bg-company-leads-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 '{
  "startUrls": [
    {
      "url": "https://www.business.bg/en/o-360/restaurants-bars.html"
    }
  ],
  "searchTerms": [],
  "languageMode": "both",
  "industryContains": "",
  "cityContains": "",
  "requirePublicPhone": false,
  "requirePublicEmail": false,
  "requireWebsite": false,
  "minRating": 0,
  "requireDescription": false,
  "proxyConfiguration": {
    "useApifyProxy": false
  },
  "includeDetails": false,
  "includeImages": false,
  "includePublicWebsiteContacts": false,
  "maxEnrichedProfiles": 20,
  "maxItems": 20,
  "maxPages": 2,
  "outputMode": "snapshotAndChanges",
  "stateName": "default"
}' |
apify call getascraper/business-bg-company-leads-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,getascraper/business-bg-company-leads-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/duLMRkiNBJeiYFh5t/builds/eNfFhtnkxAzWPWuG9/openapi.json
