# FirmenABC Scraper — Austrian Company Register Data (`studio-amba/firmenabc-at-scraper`) Actor

Scrape company data from FirmenABC.at, Austria's largest business directory. Extract Firmenbuchnummer, VAT ID, address, founding date, industry, and management/shareholder details for any Austrian company by name.

- **URL**: https://apify.com/studio-amba/firmenabc-at-scraper.md
- **Developed by:** [Studio Amba](https://apify.com/studio-amba) (community)
- **Categories:** Business, Lead generation
- **Features:** Limited permissions
- **Stats:** 13 total users, 3 monthly users, 99.9% 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/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

## FirmenABC Scraper

Scrape Austrian company register data from FirmenABC.at by company name.

### Why use this actor?

FirmenABC.at is Austria's largest business directory, covering over 800,000
companies. This actor turns a company name search into structured data:
Firmenbuchnummer (official company register number), VAT ID, registered
address, founding date, industry, and management/shareholder details. Useful
for sales lead generation, KYC/compliance checks, credit risk screening, and
market research on Austrian businesses — without manually looking up each
company on the site.

### How to scrape FirmenABC company data

1. Enter a company name or keyword in **Search Query** (e.g. `Bau GmbH`,
   `Palfinger AG`, `Installateur Graz`, or the exact company you're looking
   for).
2. Set **Max Results** to how many matching companies you want (up to 500;
   the actor follows FirmenABC's pagination, 50 companies per page).
3. Run the actor. It searches FirmenABC.at, then visits each matching
   company's profile page to extract the full register data.
4. Download the results as JSON, CSV, or Excel, or connect the dataset to
   your CRM / spreadsheet via the Apify API.

The actor works from any Apify plan — no FirmenABC account or login needed.

### Input

| Field | Type | Required | Description |
|-------|------|----------|-------------|
| `searchQuery` | String | No | Company name or keyword to search for (default: `Bau GmbH`) |
| `maxResults` | Integer | No | Maximum companies to return, up to 500 (default: 20) |
| `proxyConfiguration` | Object | No | Legacy field, kept for backwards compatibility (fetching uses a built-in unlocking service) |

### How matching works

FirmenABC's own search requires every word of the query to match, and it
matches page text, not only the company name. A full legal name with an
abbreviated legal form therefore often returns nothing: `Palfinger AG` gives
0 matches on the site while `Palfinger` gives 21, and `A1 Telekom Austria
AG` gives 0 because the directory stores `A1 Telekom Austria
Aktiengesellschaft`. The actor handles this for you:

1. It searches the exact query first.
2. If there is no match, it retries without legal-form words (AG, GmbH,
   Ges.m.b.H., KG, OG, e.U., & Co) and then with trailing words dropped one
   at a time (`Red Bull GmbH Fuschl` becomes `Red Bull Fuschl`, then
   `Red Bull`). At most four searches per run.
3. Results are ranked by how well the company name matches your query, so a
   lookup of one company returns that company first, ahead of FirmenABC's
   sponsored listings. On a relaxed query, companies whose name shares no
   word with your query are dropped.

Each result carries `matchedQuery` (the query variant that found it) and
`searchTotalResults` (how many matches FirmenABC reported for it), so you
can tell an exact hit from a relaxed one. A run that finds nothing on any
variant finishes successfully with an empty dataset and a status message
naming the variants tried.

### Output

Each result contains:

| Field | Type | Example |
|-------|------|---------|
| `companyName` | String | `"A.S. Pflaster GmbH"` |
| `legalName` | String | `"A.S. Pflaster Gesellschaft m.b.H."` |
| `registerId` | String | `"FN 192193 m"` |
| `vatId` | String | `"ATU49136304"` |
| `foundingDate` | String | `"2000-02-03T00:00:00+01:00"` |
| `legalFormStartDate` | String | `"03.02.2000"` |
| `address` | String | `"Industriestraße 4, 2292 Engelhartstetten"` |
| `street` | String | `"Industriestraße 4"` |
| `postalCode` | String | `"2292"` |
| `city` | String | `"Engelhartstetten"` |
| `country` | String | `"AT"` |
| `industry` | String | `"Pflastersteine / Pflasterungen"` |
| `activityDescription` | String | `"Betrieb einer Pflasterei;"` |
| `officers` | Array | `[{"name": "Scherer Andreas", "role": "alleinvertretungsberechtigt"}]` |
| `officerNames` | String | `"Scherer Andreas"` |
| `shareholders` | Array | `[{"name": "Scherer Andreas", "role": "Anteil: 100,00%"}]` |
| `phone` | String | `"02214 33 56"` |
| `email` | String | `"office@as-pflaster.at"` |
| `website` | String | `"www.as-pflaster.at"` |
| `url` | String | Full FirmenABC profile URL |
| `searchQuery` | String | The `searchQuery` input |
| `matchedQuery` | String | Query variant that produced this result (see "How matching works") |
| `searchTotalResults` | Integer | Matches FirmenABC reported for `matchedQuery` |

### Example output

```json
{
    "companyName": "A.S. Pflaster GmbH",
    "legalName": "A.S. Pflaster Gesellschaft m.b.H.",
    "registerId": "FN 192193 m",
    "vatId": "ATU49136304",
    "foundingDate": "2000-02-03T00:00:00+01:00",
    "legalFormStartDate": "03.02.2000",
    "address": "Industriestraße 4, 2292 Engelhartstetten",
    "street": "Industriestraße 4",
    "postalCode": "2292",
    "city": "Engelhartstetten",
    "country": "AT",
    "industry": "Pflastersteine / Pflasterungen",
    "activityDescription": "Betrieb einer Pflasterei;",
    "officers": [
        { "name": "Scherer Andreas", "role": "alleinvertretungsberechtigt" }
    ],
    "officerNames": "Scherer Andreas",
    "shareholders": [
        { "name": "Scherer Andreas", "role": "Anteil: 100,00%" }
    ],
    "phone": "02214 33 56",
    "email": "office@as-pflaster.at",
    "website": "www.as-pflaster.at",
    "url": "https://www.firmenabc.at/a-s-pflaster-gmbh_NAKq",
    "searchQuery": "A.S. Pflaster GmbH",
    "matchedQuery": "A.S. Pflaster GmbH",
    "searchTotalResults": 11,
    "scrapedAt": "2026-07-14T14:30:00.000Z"
}
```

### Cost estimate

You pay a start fee per run ($0.01 per GB of actor memory — about $0.04 at
the default 4 GB) plus $0.012 per company result. A 10-company run
therefore costs about $0.16, a 50-company run about $0.64. Lower the
memory setting on small runs if you want to shave the start fee. The
run's usage cost only settles after it reports SUCCEEDED.

### Limitations

- The actor returns at most 500 companies per run (10 results pages). Very
  broad searches (e.g. just "GmbH", 43,000+ matches) surface the first 500
  only; narrow the query or run several queries instead.
- A single-company lookup can return several companies (subsidiaries,
  namesakes). Use `registerId` (Firmenbuchnummer) or `vatId` to pick the
  right one.
- Some smaller or newly registered companies may have incomplete profiles
  (missing VAT ID, phone, or email) if FirmenABC itself doesn't have that
  data on file.
- Data is scraped from the public website and may change without notice.
- Respect the website's terms of service and use responsibly.

# Actor input Schema

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

Company name or keyword to search for (e.g. 'Bau GmbH', 'Palfinger AG', 'Installateur Graz'). FirmenABC matches every word of the query, so if the exact query has no match the actor retries without legal-form words (AG, GmbH, KG) and then with trailing words dropped, and ranks results by how well the company name matches your query. The output fields matchedQuery and searchTotalResults show which query produced each result.

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

Maximum number of companies to return (hard cap: 500). FirmenABC lists 50 companies per results page; the actor follows the pagination for larger values. Each result needs its own detail-page fetch (about 15-20 s each, 5 in parallel), so 50 results take around 3 minutes and 500 around 25 minutes.

## `brightDataApiKey` (type: `string`):

Optional: your own Bright Data API key for the Web Unlocker zone. Leave empty to use the built-in unlocking service.

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

Legacy field, kept for backwards compatibility. Fetching goes through the built-in Bright Data Web Unlocker, so this is ignored.

## Actor input object example

```json
{
  "searchQuery": "Bau GmbH",
  "maxResults": 5,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}
```

# Actor output Schema

## `results` (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 = {
    "searchQuery": "Bau GmbH",
    "maxResults": 5,
    "proxyConfiguration": {
        "useApifyProxy": true,
        "apifyProxyGroups": [
            "RESIDENTIAL"
        ]
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("studio-amba/firmenabc-at-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": "Bau GmbH",
    "maxResults": 5,
    "proxyConfiguration": {
        "useApifyProxy": True,
        "apifyProxyGroups": ["RESIDENTIAL"],
    },
}

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

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,studio-amba/firmenabc-at-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/BVgCjxfFGVEvusqKi/builds/GiwxI7y9GdShhAD42/openapi.json
