# EU Lobbying Transparency Register Scraper (`crawlerbros/eu-lobbying-transparency-register-scraper`) Actor

Search the EU's Transparency Register of organisations lobbying EU institutions by keyword or structured filters (category, field of interest, country, status). Get full organisation profiles: contacts, legal responsible person, goals/remit, financial data, and code of conduct.

- **URL**: https://apify.com/crawlerbros/eu-lobbying-transparency-register-scraper.md
- **Developed by:** [Crawler Bros](https://apify.com/crawlerbros) (community)
- **Categories:** Automation, Integrations, 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/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

## EU Lobbying Transparency Register Scraper

Search the **European Union's Transparency Register** — the EU's official public database of organisations lobbying EU institutions (companies, trade associations, NGOs, think tanks, law firms, consultancies and more). Search by keyword or by structured filters (category, field of interest, country, status) and get the organisation's full public profile: contact info, legal responsible person, goals/remit, fields of interest, financial data (EU grants received), and code-of-conduct status. Pure HTTP, no login, no API key required.

### Data Source & Usage Notes

- **Free, public, no login.** `transparency-register.europa.eu` (and its backend API at `ec.europa.eu/transparencyregister/public`) is the European Commission and European Parliament's own free register; no account, API key, or paywall stands between a user and this data.
- **Two independent search axes on the source itself.** The register's own UI offers a simple keyword search (10 results/page) and a separate "Advanced search" with structured checkbox/dropdown filters (25 results/page) — this actor exposes both as distinct modes, matching the source exactly.
- **Advanced search filters do not accept free-text keywords.** Confirmed live: the source's advanced-filter endpoint ignores any keyword text passed alongside structured filters. Use `mode=search` for keyword lookups and `mode=advancedSearch` for filter-only browsing.
- **Not affiliated with the European Union.** This is an independent third-party tool using the source's own public, no-login register search.

### What this actor does

- **Three modes:** `search` (keyword), `advancedSearch` (category / field of interest / interests represented / level of interest / activities / country / status / registration & last-update date ranges), `byRegNumber` (exact REG-number lookup, one or more per run)
- **Full organisation profile** — automatically fetches each matched organisation's detail page for contact info, legal responsible person, EU-relations contact, goals/remit, fields of interest, membership/affiliation, financial data (closed financial year, EU grants received with per-source amounts and total, estimated annual lobbying costs), and code-of-conduct status
- **Real enum-backed filters** — every checkbox/dropdown filter on the source's own advanced-search form (13 categories, 40 fields of interest, 3 interest-representation types, 4 levels of interest, 2 activity types, 222 countries, 2 statuses) is exposed as a proper dropdown/multi-select, extracted directly from the live form
- **Empty fields are omitted** — the source itself renders `N/A` for unset fields on many profiles; this actor omits those rather than emitting the literal placeholder text

### What's NOT included (and why)

- **Meeting-declaration line items and consultation-contribution details.** The profile page links to separate pages listing every individual meeting with Commissioners/MEPs and every public-consultation contribution; this actor captures the links themselves (`meetingsWithEuropeanParliamentUrl`, `meetingsWithEuropeanCommissionUrl`) plus contribution summaries where declared, but does not recursively crawl each linked sub-list, which is out of scope for v1.
- **Officer/agent name search.** The source's advanced search does not expose a "search by contact person name" axis at the API level (only organisation-level filters).

### Output per organisation

- `regNumber` — the EU Transparency Register ID
- `organisationName`, `acronym`, `formOfEntity`
- `status` — `Activated` or `Suspended`
- `categoryOfRegistration` — e.g. `Companies & groups`, `Trade and business associations`, `Law firms`
- `country` — location of head office
- `website`, `address`, `telephone` — head office
- `euRelationsAddress`, `euRelationsTelephone`, `euRelationsOfficeNote` — the organisation's separate EU-relations (Brussels) office, when declared distinct from the head office
- `registrationDate`, `lastUpdateDate`, `nextAnnualUpdateDue`
- `legalResponsiblePersonName`, `legalResponsiblePersonPosition` — the person with legal responsibility for the organisation
- `euRelationsContact`, `euRelationsContactPosition` — the separate person in charge of EU relations, when declared distinct
- `goalsAndRemit` — free-text description of the organisation's mission
- `representationType` — own interests / clients' interests / no commercial interest
- `levelOfInterestRepresented` — array, e.g. `["European", "National"]`
- `fieldsOfInterest` — array of EU policy areas, e.g. `["Climate action", "Environment"]`
- `mainEuLegislativeProposals`, `communicationActivities`, `participationInEuForums`
- `intergroupsAndGroupings` — European Parliament intergroups/unofficial groupings the organisation participates in
- `commissionExpertGroups` — array of `{groupId, groupName, memberType, interestRepresented, url}` for European Commission expert groups the organisation is a member of
- `publicConsultationContributions`, `roadmapContributions` — declared contributions to EU public consultations / roadmaps
- `meetingsWithEuropeanParliament`, `meetingsWithEuropeanParliamentUrl` — link to the organisation's MEP-meetings register search
- `meetingsWithEuropeanCommission`, `meetingsWithEuropeanCommissionUrl` — link to the organisation's downloadable Commission-meetings PDF report
- `numberOfPersonsInvolved`, `fullTimeEquivalentFte`, `personsInvolvedByWorkingTime` — breakdown by % of working time (`100pct`, `75pct`, `50pct`, `25pct`, `10pct`)
- `membershipAssociations`, `memberOrganisations`
- `closedFinancialYear`
- `euGrantsReceived` — array of `{source, amount}`, plus `euGrantsTotal`
- `euGrantsCurrentFinancialYear`
- `intermediariesClosedFinancialYear`, `intermediariesCurrentFinancialYear` — array of `{name, regNumber, costRange}` for paid lobbying intermediaries and their declared cost bracket
- `estimateAnnualCosts` — declared cost bracket for lobbying-covered activities
- `financialComplementaryInfo`, `codeOfConduct`, `otherCodeOfConduct`
- `sourceUrl` — the organisation's own bookmarkable public profile page
- `recordType: "organisation"`, `scrapedAt`

### Input

| Field | Type | Default | Description |
|---|---|---|---|
| `mode` | string | `search` | `search` / `advancedSearch` / `byRegNumber` |
| `queryText` | string | `google` | Keyword or REG number (mode=search) |
| `regNumbers` | array | `["307926548480-84"]` | Exact REG numbers to look up (mode=byRegNumber) |
| `categories` | array | – | Category of registration (mode=advancedSearch) |
| `interests` | array | – | Fields of interest (mode=advancedSearch) |
| `interestsRepresented` | array | – | Interests represented (mode=advancedSearch) |
| `perimeters` | array | – | Level of interest (mode=advancedSearch) |
| `activities` | array | – | Activities/groupings (mode=advancedSearch) |
| `countries` | array | – | Location of head office (mode=advancedSearch) |
| `status` | string | `any` | `any` / `ACTIVATED` / `SUSPENDED` (mode=advancedSearch) |
| `registrationDateFrom` / `registrationDateTo` | string | – | `YYYY-MM-DD` (mode=advancedSearch) |
| `lastUpdateDateFrom` / `lastUpdateDateTo` | string | – | `YYYY-MM-DD` (mode=advancedSearch) |
| `includeDetails` | boolean | `true` | Fetch full organisation profile per result |
| `maxItems` | int | `20` | Hard cap (1–500) |

#### Example: keyword search

```json
{
  "mode": "search",
  "queryText": "google",
  "includeDetails": true,
  "maxItems": 20
}
```

#### Example: advanced filtered search

```json
{
  "mode": "advancedSearch",
  "categories": ["category.companiesgroups"],
  "countries": ["country.de"],
  "status": "ACTIVATED",
  "maxItems": 50
}
```

#### Example: lookup by exact REG number(s)

```json
{
  "mode": "byRegNumber",
  "regNumbers": ["307926548480-84"]
}
```

### Use cases

- **Policy & advocacy research** — see which companies and associations lobby on a given EU policy area
- **Compliance & due diligence** — verify a counterparty's lobbying registration status and declared interests
- **Journalism & transparency reporting** — track EU grants received by lobbying organisations, or meetings held with the European Parliament
- **Competitive intelligence** — monitor competitors' EU-level lobbying footprint, budget, and staffing
- **Academic research** — bulk-export structured lobbying-register data by category, country, or field of interest

### FAQ

**Is this an official EU product?**
No. This is an independent tool that uses the European Commission/Parliament's own free, public, no-login Transparency Register search.

**Why are `search` and `advancedSearch` separate modes instead of one combined mode?**
The source's own backend only accepts keyword text on the simple-search endpoint and only accepts structured filters on the advanced-search endpoint — confirmed live, combining both on either endpoint silently drops one side. Two modes match the source's real behavior instead of silently producing wrong results.

**Why do some records have fewer fields than others?**
Organisations self-report their profile; many optional fields (financial data, membership, EU grants) are genuinely blank on a given organisation's own page. This actor omits blank/`N/A` fields rather than emitting placeholder text.

# Actor input Schema

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

What to fetch.

## `queryText` (type: `string`):

Keyword(s) to search for in organisation name, or a REG number, e.g. `google`.

## `regNumbers` (type: `array`):

Exact Transparency Register ID(s) to look up, e.g. `307926548480-84`.

## `categories` (type: `array`):

Only include organisations registered under these categories. Leave empty to include all.

## `interests` (type: `array`):

Only include organisations whose declared fields of interest include any of these. Leave empty to include all.

## `interestsRepresented` (type: `array`):

Only include organisations representing this kind of interest. Leave empty to include all.

## `perimeters` (type: `array`):

Only include organisations operating at this geographic level of interest. Leave empty to include all.

## `activities` (type: `array`):

Only include organisations participating in these EU activities/groupings. Leave empty to include all.

## `countries` (type: `array`):

Only include organisations whose head office is located in these countries. Leave empty to include all.

## `status` (type: `string`):

Only include organisations with this registration status. Leave as "Any" to include both.

## `registrationDateFrom` (type: `string`):

Only include organisations registered on/after this date. Format `YYYY-MM-DD`.

## `registrationDateTo` (type: `string`):

Only include organisations registered on/before this date. Format `YYYY-MM-DD`.

## `lastUpdateDateFrom` (type: `string`):

Only include organisations last updated on/after this date. Format `YYYY-MM-DD`.

## `lastUpdateDateTo` (type: `string`):

Only include organisations last updated on/before this date. Format `YYYY-MM-DD`.

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

When true, the actor fetches each matched organisation's full profile page (contact info, legal responsible person, goals/remit, fields of interest, financial data incl. EU grants received, code of conduct). When false, only the search-result-row fields are returned (faster).

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

Hard cap on emitted records.

## Actor input object example

```json
{
  "mode": "search",
  "queryText": "google",
  "regNumbers": [
    "307926548480-84"
  ],
  "categories": [],
  "interests": [],
  "interestsRepresented": [],
  "perimeters": [],
  "activities": [],
  "countries": [],
  "status": "any",
  "registrationDateFrom": "",
  "registrationDateTo": "",
  "lastUpdateDateFrom": "",
  "lastUpdateDateTo": "",
  "includeDetails": true,
  "maxItems": 20
}
```

# Actor output Schema

## `organisations` (type: `string`):

Dataset containing all scraped EU Transparency Register organisation records.

# 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",
    "queryText": "google",
    "regNumbers": [
        "307926548480-84"
    ],
    "categories": [],
    "interests": [],
    "interestsRepresented": [],
    "perimeters": [],
    "activities": [],
    "countries": [],
    "status": "any",
    "registrationDateFrom": "",
    "registrationDateTo": "",
    "lastUpdateDateFrom": "",
    "lastUpdateDateTo": "",
    "includeDetails": true,
    "maxItems": 20
};

// Run the Actor and wait for it to finish
const run = await client.actor("crawlerbros/eu-lobbying-transparency-register-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",
    "queryText": "google",
    "regNumbers": ["307926548480-84"],
    "categories": [],
    "interests": [],
    "interestsRepresented": [],
    "perimeters": [],
    "activities": [],
    "countries": [],
    "status": "any",
    "registrationDateFrom": "",
    "registrationDateTo": "",
    "lastUpdateDateFrom": "",
    "lastUpdateDateTo": "",
    "includeDetails": True,
    "maxItems": 20,
}

# Run the Actor and wait for it to finish
run = client.actor("crawlerbros/eu-lobbying-transparency-register-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",
  "queryText": "google",
  "regNumbers": [
    "307926548480-84"
  ],
  "categories": [],
  "interests": [],
  "interestsRepresented": [],
  "perimeters": [],
  "activities": [],
  "countries": [],
  "status": "any",
  "registrationDateFrom": "",
  "registrationDateTo": "",
  "lastUpdateDateFrom": "",
  "lastUpdateDateTo": "",
  "includeDetails": true,
  "maxItems": 20
}' |
apify call crawlerbros/eu-lobbying-transparency-register-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,crawlerbros/eu-lobbying-transparency-register-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/nN0WumW06WYtglRlc/builds/rNRb2HL2RwglVQQsc/openapi.json
