# UK MP Financial Interests Watchlist (`hllerdgn80/uk-mp-financial-interests-watchlist`) Actor

Track named UK MPs via the official Parliament Register of Interests API and get only NEW shareholdings, gifts, donations, land, jobs and foreign trips registered since your last run.

- **URL**: https://apify.com/hllerdgn80/uk-mp-financial-interests-watchlist.md
- **Developed by:** [Halil Erdogan](https://apify.com/hllerdgn80) (community)
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.01 / 1,000 results

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

## UK MP Financial Interests Watchlist

Watch a list of named UK MPs and get told, run after run, exactly which
**new** financial interests they registered since you last checked —
new shareholdings, gifts, donations, land and property, paid jobs, family
members employed, or foreign trips. Not a one-off scrape: a real watchlist
with change detection, built the same way as this account's Companies House
Watchlist Actor.

### Why this exists

The UK Parliament publishes MPs' Register of Members' Financial Interests
as open data, free, no API key. Several Actors already scrape or mirror that
register as a static snapshot. None of them tell you what changed. If an MP
you follow quietly registers a new directorship, a paid consultancy, or a
foreign-funded trip, a static snapshot buries it in a list of 20–90 entries
you have to re-read by eye every time.

The US Congress has an equivalent well-known pattern — Actors and apps that
track members of Congress' stock trades have real, proven usage on this
platform (tens of monthly active users). The UK has no equivalent watchlist
for its own Parliament's interests register. This Actor fills that gap.

**What makes this different from a plain scraper:**

- **Change detection, not just data.** Every run is diffed against the
  previous run for the same MP (stored in this Actor's own key-value
  store). The first run is a baseline — no false "everything is new"
  alarm. Every run after that reports only interests registered since
  last time, sorted newest first.
- **Category filtering.** Watch only Shareholdings, or only Land and
  property, or only Gifts — instead of wading through all ten official
  categories every time.
- **Official data only.** Two UK Parliament APIs, both public and free,
  no key required: the Members API (resolves a name to the current MP
  record) and the Interests API (the full register). No scraping of
  parliament.uk's HTML, no third-party mirror, no ToS risk.

### What you get (one row per MP per run)

```json
{
  "input_name": "Nigel Farage",
  "status": "ok",
  "member": {
    "member_id": 5091,
    "name": "Nigel Farage",
    "party": "Reform UK",
    "constituency": "Clacton",
    "is_current_member": true
  },
  "total_interests": 40,
  "is_baseline_run": false,
  "new_interests": [
    {
      "interest_id": 17005,
      "summary": "International visit to Cayman Islands between 22 August 2026 and 28 August 2026",
      "category_number": "4",
      "category_name": "Visits outside the UK",
      "registration_date": "2026-09-19",
      "published_date": "2026-09-21",
      "updated_dates": []
    }
  ],
  "removed_interest_count": 0,
  "all_interests": [ "... every currently registered interest, flattened ..." ],
  "fetched_at": "2026-09-27T10:00:00.000Z"
}
```

- `is_baseline_run: true` on the very first run for that MP — the register
  is stored, nothing is reported as "new" yet (there is nothing to compare
  against).
- `new_interests` is always `[]` when nothing changed. A clean, empty
  result on every subsequent run is itself useful — "still nothing new" is
  the point of a watchlist, not a failure.
- `status` is one of `ok`, `not_found` (name did not match any current or
  former MP), `lookup_error` or `interests_fetch_error` (a transient
  problem with the official API — retried automatically with backoff
  before being reported).

### Input

| Field | What it does |
|---|---|
| `mpNames` | List of MP full names, e.g. `"Rishi Sunak"`, `"Keir Starmer"`. |
| `mpNamesText` | Same, pasted as one name per line or comma-separated — for copying a spreadsheet column straight in. Combined with `mpNames` and de-duplicated. |
| `categories` | Optional. Leave empty to watch every category. Otherwise pick one or more of: employment and earnings, donations, gifts (UK), visits abroad, gifts (abroad), land and property, shareholdings, miscellaneous, family employed, family lobbying. |
| `maxConcurrency` | How many MPs to check in parallel (1–8, default 3). |

Names are matched against the official Members API's own name search — the
closest current match is used. A name that matches no MP, current or
former, is reported as `not_found` rather than silently skipped.

### Pricing (pay per event)

Charged event: `mp-checked`, once per MP successfully resolved and checked
in a run — whether or not a new interest was found. A `not_found` or
error result is never charged.

### What this Actor does NOT do (on purpose, not by oversight)

- **No House of Lords members.** The register and API cover MPs (the
  Commons); Lords have a separate register not covered here.
- **No historical interests before an MP's first run through this Actor.**
  The first run for a new MP is always a baseline snapshot, by design —
  reporting every existing interest as "new" the first time would be a
  false alarm, not a real change.
- **No sentiment, no wrongdoing judgement.** This Actor reports what MPs
  themselves registered, in Parliament's own words. It does not accuse,
  interpret motive, or flag anything as improper — that judgement is the
  user's, not this tool's.
- **No email/alerting built in.** This Actor produces a dataset; wiring
  its output to Slack, email or a webhook is done with Apify's own
  integrations or a downstream Actor.

### Data source

- UK Parliament Members API — `members-api.parliament.uk` (official,
  public, no key)
- UK Parliament Register of Interests API —
  `interests-api.parliament.uk` (official, public, no key)

Both are UK Parliament's own open data services, documented at
`https://interests-api.parliament.uk/index.html` and
`https://members-api.parliament.uk/index.html`.

# Actor input Schema

## `mpNames` (type: `array`):

Full names of the MPs to watch, e.g. "Rishi Sunak" or "Keir Starmer". Matched against the official UK Parliament Members register; the closest match is used.

## `mpNamesText` (type: `string`):

Alternative to the list above for pasting many names at once, e.g. from a spreadsheet column. One name per line or separated by commas; combined with mpNames and de-duplicated.

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

Leave empty to watch ALL registered interest categories. Otherwise pick which categories of the Register of Members' Financial Interests to check, e.g. just Shareholdings and Land and property.

## `maxConcurrency` (type: `integer`):

How many MPs to check in parallel against the official Parliament APIs. Higher is faster but more likely to hit rate limits; 3 is a safe default.

## Actor input object example

```json
{
  "mpNames": [
    "Keir Starmer"
  ],
  "mpNamesText": "",
  "categories": [],
  "maxConcurrency": 3
}
```

# 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 = {};

// Run the Actor and wait for it to finish
const run = await client.actor("hllerdgn80/uk-mp-financial-interests-watchlist").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 = {}

# Run the Actor and wait for it to finish
run = client.actor("hllerdgn80/uk-mp-financial-interests-watchlist").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 '{}' |
apify call hllerdgn80/uk-mp-financial-interests-watchlist --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,hllerdgn80/uk-mp-financial-interests-watchlist"
        }
    }
}
```

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/C7Pvg1N4exhYfdcO0/builds/M2sdsaLMtfFTqYemP/openapi.json
