# MoneySavingExpert Best-Buy Tables Scraper (`crawlerbros/moneysavingexpert-scraper`) Actor

Scrape MoneySavingExpert's best-buy comparison tables for personal loans, savings accounts, and ISAs - real lender names, rates, deposit limits, and apply links from the UK's most trusted money-saving site.

- **URL**: https://apify.com/crawlerbros/moneysavingexpert-scraper.md
- **Developed by:** [Crawler Bros](https://apify.com/crawlerbros) (community)
- **Categories:** Automation, Developer tools, Agents
- **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

## MoneySavingExpert Best-Buy Tables Scraper

Scrape **MoneySavingExpert.com** — the UK's most trusted personal finance site — for its famous best-buy comparison tables. Pull live personal loan rates, easy-access and fixed-rate savings, cash ISAs, regular savers, Junior ISAs, Lifetime ISAs, and children's savings accounts, complete with provider names, interest rates, deposit limits, and direct apply links. HTTP-only, no login or cookies required.

### What this actor does

- **Eight product categories (modes):** personal loans, easy-access savings, fixed-rate savings, cash ISAs, regular savings, Junior Cash ISAs, Lifetime ISAs (Cash), and children's savings accounts
- **Rich per-deal data:** provider, rate/APR, a parsed numeric rate value, deposit limits, access conditions, and a direct apply link for every deal
- **Filters:** by provider name, loan amount bracket, fix-length/access term, and minimum rate
- **Sorting:** by rate (highest/lowest first) or provider name A–Z
- **Empty fields are omitted** — only fields with actual data appear in each record

### Output per deal

Every record includes these common fields:

- `provider` — lender or savings provider name
- `rate` — interest rate or APR as published, e.g. `"5.9% rep APR"`, `"4.9%"`
- `rateValue` — numeric headline rate parsed from `rate` (e.g. `5.9`) for easy sorting/filtering
- `category` — product category: `loans`, `savings`, `savingsFixed`, `savingsISA`, `savingsRegular`, `savingsJuniorISA`, `savingsLifetimeISA`, or `savingsChildren`
- `recordType` — `loanDeal` or `savingsDeal`
- `applyUrl` — direct link to apply or check eligibility
- `sourceUrl` — the MoneySavingExpert page the deal was scraped from
- `scrapedAt` — UTC timestamp when the data was collected

**Loan deals** (`recordType: loanDeal`) additionally include:

- `loanAmountBracket` — the loan amount range this rate applies to, e.g. `"£7,500 – £15,000"`
- `note` — any special condition, e.g. `"Must have a Clubcard"`

**Savings deals** (`recordType: savingsDeal`) additionally include, where applicable to that account type:

- `term` — fix length or access type: `Easy Access`, `1 Year`, `2 Years`, `3 Years`, `5 Years`, `Short Fix / Notice`, or `Regular Saver`
- `accessInfo` — when interest is paid/accessible, e.g. `"At maturity"`, `"Monthly"`
- `minDeposit`, `maxDeposit` — minimum/maximum deposit allowed, e.g. `"£1"`, `"£250,000"`
- `earlyWithdrawalPenalty` — penalty for withdrawing early (cash ISAs), e.g. `"90 days' interest"`
- `maxMonthlyDeposit` — maximum monthly deposit cap and typical resulting interest (regular savers)
- `canSkipMonths` — whether a monthly payment can be skipped without penalty (regular savers)
- `penaltyFreeWithdrawals` — whether withdrawals are allowed without losing the bonus rate (regular savers)
- `howToOpen` — how to open the account, e.g. `"Online"`, `"Branch"`
- `transferInAllowed` — whether an existing Junior ISA can be transferred in (Junior Cash ISAs)
- `fscsProtection` — maximum deposit protection level, e.g. `"£120,000"` (Junior Cash ISAs, Lifetime ISAs)
- `accountType` — `"Easy Access"` or `"Regular Saver"` (children's savings)
- `givesDebitCard` — whether a debit card is included (children's easy-access accounts)
- `ageAndHowToOpen` — eligible age range and how to open (children's easy-access accounts)
- `monthlyDeposit` — min/max monthly deposit, e.g. `"£1/£150"` (children's regular savers)
- `minMaxAgeToOpen` — eligible age range to open (children's regular savers)
- `withdrawalsAllowed` — whether withdrawals are allowed without losing the rate (children's regular savers)
- `note` — any special condition or caveat MSE highlights for the account

### Input

| Field | Type | Default | Description |
|---|---|---|---|
| `mode` | string | `loans` | Product category: `loans`, `savings`, `savingsFixed`, `savingsISA`, `savingsRegular`, `savingsJuniorISA`, `savingsLifetimeISA`, or `savingsChildren` |
| `providerFilter` | string | – | Filter by provider/lender name (case-insensitive substring), e.g. `"Santander"`, `"M&S Bank"`, `"Marcus"` |
| `loanAmountFilter` | string | – | Filter loans to one amount bracket (mode=`loans` only): `under2k`, `2k-3k`, `3k-5k`, `5k-7.5k`, `7.5k-15k`, `15k-20k`, `20k-25k`, `over25k` |
| `termFilter` | string | – | Filter savings/ISA results by fix length or access type: `Easy Access`, `1 Year`, `2 Years`, `3 Years`, `5 Years`, `Short Fix / Notice`, or `Regular Saver` |
| `sortBy` | string | `default` | Order results: `default` (MSE table order), `rateDesc`, `rateAsc`, or `providerAsc` |
| `minRateFilter` | number | `0` | Only return deals whose headline rate/APR is at least this percentage. `0` = no minimum |
| `maxItems` | integer | `50` | Maximum number of records to return (1–500) |

#### Example: cheapest personal loans over £7,500

```json
{
  "mode": "loans",
  "loanAmountFilter": "7.5k-15k",
  "sortBy": "rateAsc",
  "maxItems": 20
}
```

#### Example: best easy-access savings from a specific provider

```json
{
  "mode": "savings",
  "providerFilter": "Marcus",
  "termFilter": "Easy Access",
  "maxItems": 10
}
```

#### Example: top 2-year fixed cash ISAs above 4%

```json
{
  "mode": "savingsISA",
  "termFilter": "2 Years",
  "minRateFilter": 4,
  "sortBy": "rateDesc"
}
```

#### Example: children's regular saver accounts

```json
{
  "mode": "savingsChildren",
  "termFilter": "Regular Saver",
  "sortBy": "rateDesc",
  "maxItems": 20
}
```

### Use cases

- **Personal finance comparison sites** — mirror MSE's editorial best-buy picks into your own product tables
- **Fintech and price-comparison apps** — feed live loan/savings rates into a rate-tracking dashboard
- **Financial advisors** — quickly pull current best rates for client recommendations
- **Parents and guardians** — compare Junior ISAs and children's savings accounts side by side
- **Market research** — track how UK lender/provider rates shift over time by re-running on a schedule
- **Personal budgeting tools** — surface the best available savings rate for a user's deposit amount

### FAQ

**Is this free to use?**
Yes. MoneySavingExpert's comparison pages are publicly accessible without an account, and this actor requires no API keys or cookies.

**What lenders are covered for loans?**
M\&S Bank, TSB, Santander, Tesco Bank, Zopa, First Direct, Nationwide, Bank of Scotland/Halifax/Lloyds, and other lenders featured in MSE's editorial loan tables — coverage follows whichever lenders MSE currently lists.

**What is the loan amount bracket filter?**
MSE publishes loan rates in brackets (e.g. Under £2,000, £3k–£5k, £7.5k–£15k) because rates differ by borrowing amount. Use `loanAmountFilter` to restrict results to one bracket, or leave it blank to get all brackets.

**How many records are returned?**
Typically 3–5 lenders per loan bracket (around 30 records total across all brackets for loans). Savings, ISA, and children's pages typically list 10–25 accounts each.

**What's the difference between easy-access and regular savings accounts?**
Easy-access accounts let you deposit any amount and withdraw freely. Regular savings ("regular saver") accounts require a fixed monthly deposit and often carry higher rates in exchange for restrictions such as needing a linked current account or losing the bonus rate on withdrawal — use `savingsRegular` mode (or `termFilter: "Regular Saver"` in `savingsChildren` mode) to see these.

**Does the data include every UK lender or provider?**
No. MSE publishes editorial best-buy selections — the top-rated deals chosen by its research team, not a full market comparison.

**How fresh is the data?**
Data is scraped live on each run, reflecting whatever MSE's tables show at that moment. MSE updates its tables regularly as rates change.

**Can I filter by provider name?**
Yes, set `providerFilter` to any substring, e.g. `"Santander"` returns only Santander deals across all brackets/terms.

**Can I filter cash ISAs or fixed savings by fix length?**
Yes, use `termFilter`. The `savingsISA` mode covers both easy-access and fixed-rate (1/2/3/5-year) cash ISAs; the `savingsFixed` mode covers 1/2/3/5-year fixes plus shorter fix/notice accounts — set `termFilter` to isolate one term.

**Can I sort or filter by interest rate?**
Yes. Use `sortBy` (`rateDesc`, `rateAsc`, or `providerAsc`) to order results, and `minRateFilter` to drop deals below a given rate. Combine `minRateFilter` with `sortBy: rateDesc` to see the best qualifying deals first.

**Do you cover Junior ISAs and Lifetime ISAs?**
Yes. Use `savingsJuniorISA` for the best cash Junior ISA rates (with transfer-in eligibility and deposit protection level), or `savingsLifetimeISA` for the best cash Lifetime ISA rates. `termFilter` doesn't apply to these two modes since they aren't offered in multiple fix lengths.

**Do you cover children's savings accounts?**
Yes. Use `savingsChildren` for the top easy-access and regular-saver accounts for under-18s, including debit card availability, eligible age range, and monthly deposit caps.

**Is this affiliated with MoneySavingExpert?**
No, this is an independent third-party actor that reads MoneySavingExpert's publicly accessible comparison pages.

# Actor input Schema

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

Which product category to scrape from MoneySavingExpert best-buy tables.

## `providerFilter` (type: `string`):

Filter results by provider/lender name (case-insensitive substring match). E.g. 'Santander', 'M\&S Bank', 'Marcus'.

## `loanAmountFilter` (type: `string`):

Filter loan results to a specific amount bracket. Leave blank for all brackets.

## `termFilter` (type: `string`):

Filter savings/ISA results to a specific fix length or access type. Applies to savings, savingsFixed, and savingsISA modes (savingsISA pages list both easy-access and fixed-rate ISAs); in savingsChildren mode, 'Easy Access' selects only the easy-access children's accounts and 'Regular Saver' selects only the regular-saver children's accounts. Leave blank for all terms.

## `sortBy` (type: `string`):

Order results by interest rate/APR (parsed from the headline percentage in each deal's rate) or alphabetically by provider name. Default keeps MoneySavingExpert's own best-buy table order.

## `minRateFilter` (type: `number`):

Only return deals whose headline rate/APR is at least this percentage (parsed from the same leading percentage figure used for sorting, decimals allowed e.g. 4.5). Leave at 0 for no minimum.

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

Maximum number of records to return (1–500). Default: 50.

## Actor input object example

```json
{
  "mode": "loans",
  "loanAmountFilter": "",
  "termFilter": "",
  "sortBy": "default",
  "minRateFilter": 0,
  "maxItems": 50
}
```

# Actor output Schema

## `deals` (type: `string`):

Dataset containing all scraped best-buy deals from MoneySavingExpert.

# 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": "loans",
    "loanAmountFilter": "",
    "termFilter": "",
    "sortBy": "default",
    "minRateFilter": 0,
    "maxItems": 50
};

// Run the Actor and wait for it to finish
const run = await client.actor("crawlerbros/moneysavingexpert-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": "loans",
    "loanAmountFilter": "",
    "termFilter": "",
    "sortBy": "default",
    "minRateFilter": 0,
    "maxItems": 50,
}

# Run the Actor and wait for it to finish
run = client.actor("crawlerbros/moneysavingexpert-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": "loans",
  "loanAmountFilter": "",
  "termFilter": "",
  "sortBy": "default",
  "minRateFilter": 0,
  "maxItems": 50
}' |
apify call crawlerbros/moneysavingexpert-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,crawlerbros/moneysavingexpert-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/XfhXljUfNaPo3rtqk/builds/tY3Bz3Pax723UuyRh/openapi.json
