# Financial Ombudsman Decisions (`wildorigins/uk-fos-decisions`) Actor

🏷️ From $0.60 / 1K | Search 400,000 Financial Ombudsman Service final decisions. Filter by business, sector, outcome and date, and export references, summaries and PDF links.

- **URL**: https://apify.com/wildorigins/uk-fos-decisions.md
- **Developed by:** [Wild Origins](https://apify.com/wildorigins) (community)
- **Categories:** News, Automation
- **Stats:** 7 total users, 0 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.60 / 1,000 decisions

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

## Financial Ombudsman Decisions

Search and extract final decisions from the Financial Ombudsman Service, the UK's official dispute resolution body for financial complaints: reference, date, business, sector, outcome, summary and a link to the full PDF.

### 🏛️ What is the official way to read FOS decisions?

The Financial Ombudsman Service publishes every final decision in its [decisions database](https://www.financial-ombudsman.org.uk/businesses/resolving-complaint/ombudsman-decisions), a search form on its website. The database holds over 400,000 decisions and serves them ten to a page, each full decision a separate PDF. There is no export button, no bulk download and no published API, so answering a question like "how often was this lender upheld on motor finance this year" means paging through the site by hand and opening PDFs one at a time.

This Actor runs the same search and hands back the results as rows: business, sector, outcome, date, summary and the PDF link in columns you can sort, count and feed to other tools. One run replaces an afternoon of paging, and a scheduled run keeps a watch on new decisions without anyone visiting the site.

### 🔍 What does UK Financial Ombudsman Decisions do?

It runs a search against the FOS decisions database and returns every matching decision as a clean row of data, ready for a spreadsheet, a database or your own product.

- Filters by business name, for example "Barclays", "Revolut" or "Aviva"
- Filters by outcome, upheld or not upheld
- Filters by financial sector, such as banking, insurance, investments or PPI
- Filters by keyword or product type
- Filters by date range
- Paginates automatically through results

Over 400,000 final decisions are publicly available, covering banking, insurance, mortgages, investments, pensions, consumer credit and PPI.

### 📊 What data can I extract from the FOS?

One row per decision:

| | Field | Description |
|---|---|---|
| 🔢 | `reference` | Decision reference number, for example DRN-6014203 |
| 📅 | `date` | Date the decision was issued, ISO 8601 |
| 📅 | `dateRaw` | The date exactly as the ombudsman printed it, for example "29 Jun 2026" |
| ⚖️ | `outcome` | "Upheld" or "Not upheld" |
| 🏢 | `business` | The financial business the complaint was about |
| 🗂️ | `sector` | Financial sector, for example Banking, Insurance or Investments |
| 📝 | `summary` | Complaint description excerpt |
| 📊 | `pageCount` | Length of the full decision document in pages |
| 🔗 | `pdfUrl` | Direct link to the full decision PDF |
| 🔗 | `sourceUrl` | Search results page this was found on |
| 📅 | `scrapedAt` | Timestamp of when the data was collected |

### 💡 Why scrape Financial Ombudsman decisions?

**Claims triage.** A claims firm checking how often a specific lender has been upheld on motor finance commission before taking on a book of cases, counting outcomes instead of guessing.

**Complaint handling.** A complaints manager reading how ombudsmen have ruled on a complaint type, for example disputed fraud reimbursements, before deciding whether to defend or settle the one on their desk.

**Firm monitoring.** A compliance officer running a weekly search for new decisions naming their firm, so the first they hear of an upheld complaint is not a colleague forwarding the PDF.

**Precedent research.** A paralegal pulling every upheld pension transfer decision from the last two years, with references and PDF links in one spreadsheet for case preparation.

**Uphold rate analysis.** An analyst measuring uphold rates by sector or by business over time, using the labelled `outcome` field on each row.

**Dispute datasets.** A researcher building a corpus of anonymised dispute narratives, each with a labelled outcome, from the `summary` and `outcome` fields.

### 🚀 How do I use UK Financial Ombudsman Decisions?

1. Click **Try for free**.
2. Enter a `keyword` or product type, for example `motor finance commission`.
3. Narrow it with `businessName`, `sector`, `outcome` and a `dateFrom` and `dateTo` range.
4. Set `maxResults` to cap the run, up to 500.
5. Click **Start**, then download the results as JSON, CSV or Excel, or pull them from the API.

### ⬇️ Input

```json
{
  "keyword": "motor finance commission",
  "sector": "banking-credit-mortgages",
  "outcome": "upheld",
  "maxResults": 50
}
```

| Field | Type | Default | What it does |
|---|---|---|---|
| `keyword` | string | | Search by keyword or product type, e.g. "motor finance", "fraud scam" |
| `businessName` | string | | Filter by a specific financial business, e.g. "Barclays", "Revolut" |
| `sector` | string | all sectors | Restrict to one sector, e.g. `banking-credit-mortgages`, `insurance`, `ppi` |
| `outcome` | string | both | `upheld` or `not-upheld` |
| `dateFrom` | string | | Only decisions issued on or after this date (DD/MM/YYYY) |
| `dateTo` | string | | Only decisions issued on or before this date (DD/MM/YYYY) |
| `maxResults` | integer | `50` | Maximum number of decisions to return, up to 500 |

### ⬆️ Output

#### Table view

Results arrive as a Decisions table you can sort and filter in the Console, with the business, sector, outcome and date lined up for scanning.

#### JSON

A typical row:

```json
{
  "reference": "DRN-6416620",
  "business": "Barclays Bank UK PLC",
  "sector": "Banking and Payments",
  "outcome": "Upheld",
  "date": "2026-06-15",
  "dateRaw": "15 Jun 2026",
  "summary": "The complaint Mr H complains that Barclays Bank UK PLC, trading as Barclaycard, incorrectly amended his email address which led to him no...",
  "pageCount": 3,
  "pdfUrl": "https://www.financial-ombudsman.org.uk/decision/DRN-6416620.pdf",
  "scrapedAt": "2026-08-10T13:07:57.049Z"
}
```

Download it from the run as JSON, CSV or Excel, or read it straight from the API.

### Sectors available

- Banking, credit and mortgages
- Investment and pensions
- Insurance, excluding PPI
- Payment protection insurance (PPI)
- Claims Management Ombudsman decisions
- Funeral plans

### Scale and volume

The FOS database contains over 400,000 decisions published since April 2013, with new decisions added regularly. This Actor paginates automatically through results and can retrieve up to 500 decisions per run.

For monitoring, run it on a schedule, daily or weekly, with a narrow date range so you only pick up new decisions.

### ⏱️ How long does a run take?

Measured on real runs, so you know what normal looks like and can tell it apart from a run that has stalled.

| Decisions returned | Typical run time |
|---|---|
| 3 | 4 to 6 seconds |
| 50 | 12 to 20 seconds |
| 500, the per run cap | about 3 minutes |

The FOS database serves ten decisions to a page, so a run is paced by pagination: every fifty decisions is five more page loads against the ombudsman's own search. That is why the 500 decision cap is minutes rather than seconds while a fifty decision monitoring run is over before you have switched tabs. Narrowing by business, sector, outcome or date does not slow a run down, it usually speeds it up by leaving fewer pages to walk. The first few seconds of any run are the container starting rather than the work.

A run is never silently stuck. Each page is logged as it is read, and decisions are written to the dataset as they are parsed rather than held back to the end, so a run that hits its time limit still leaves everything it had already collected. A search that matches nothing ends successfully with an empty dataset and the reason in its status message.

**Set the run timeout to suit the size of the ask.** This Actor's default is 3600 seconds, which is comfortably more than the largest run in the table above (500 decisions takes about 5 minutes). You are charged per delivered result rather than per minute, so a generous timeout costs you nothing and a tight one risks losing the run's work. Lower it only if you want a hard ceiling on how long a scheduled run may sit.

### 💰 How much does it cost?

**$0.001 per decision returned**, plus the standard **$0.00005** Apify charges once when a run starts. There is no monthly rental, so you pay only for what a run actually returns.

So a search that returns **50 decisions** costs **$0.05005**. A weekly monitoring run over a narrow date range that picks up 20 new decisions costs **$0.02005**, and a full run at the 500 decision cap costs **$0.50005**. A run that finds nothing costs $0.00005.

Paid Apify plans pay less per decision: **$0.00085** on Bronze, **$0.0007** on Silver, **$0.0006** on Gold, **$0.0005** on Platinum and **$0.0004** on Diamond, which is 40 percent of the list price. That full 500 decision run is **$0.20005** on Diamond.

Set `maxResults` to cap what a run can cost before it starts, up to 500 per run. The Apify listing always shows the current rates.

### 🔌 Integrations

Send results straight to Google Sheets, Slack, Airtable, Zapier, Make or your own webhook using [Apify integrations](https://docs.apify.com/platform/integrations). You can also trigger a run whenever something happens in another tool.

AI agents can call this Actor through the [Apify MCP server](https://mcp.apify.com). An agent connected to mcp.apify.com can discover `spookyweb/uk-fos-decisions`, pass a business name, sector, outcome and date range as tool arguments, and read the decision rows back as structured output. So a question like "what has the ombudsman upheld against this lender this year" can be answered by an agent end to end, without anyone writing API code.

### 🔗 Using UK Financial Ombudsman Decisions with the Apify API

```bash
curl -X POST "https://api.apify.com/v2/acts/spookyweb~uk-fos-decisions/run-sync-get-dataset-items?token=YOUR_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"keyword": "motor finance commission", "sector": "banking-credit-mortgages", "outcome": "upheld", "maxResults": 50}'
```

Or with the Apify client:

```js
import { ApifyClient } from 'apify-client';

const client = new ApifyClient({ token: 'YOUR_TOKEN' });
const run = await client.actor('spookyweb/uk-fos-decisions').call({
  keyword: 'motor finance commission',
  sector: 'banking-credit-mortgages',
  outcome: 'upheld',
  maxResults: 50,
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
```

Full detail is in the [Apify API reference](https://docs.apify.com/api/v2), and every run is also callable from the [Python](https://docs.apify.com/api/client/python) and [JavaScript](https://docs.apify.com/api/client/js) clients.

### ❓ FAQ

#### How many decisions are there?

Over 400,000 published since April 2013, with more added continually. A single run returns up to 500, so a large corpus is built from several runs split by date range, business or sector.

#### Can I filter to one business?

Yes, set `businessName` to the business as the FOS names it, for example `Barclays` or `Revolut`. Combine it with `outcome` to see only the complaints that were upheld against that firm.

#### What does uphold rate mean?

The FOS records each final decision as upheld or not upheld, meaning the ombudsman either agreed with the complainant or did not. An uphold rate is that ratio across a set of decisions, so filter to a business or sector, pull both outcomes, and count. The `outcome` field is the label you count on.

#### Is the full decision text available?

The full decision is a PDF, and `pdfUrl` links straight to it. The `summary` field carries the opening of the complaint description so you can triage without downloading anything, and `pageCount` tells you how long the full document is.

#### How current is it?

The Actor reads the live FOS database, so a run returns what is published at that moment. New decisions are added regularly. For monitoring, set a narrow `dateFrom` and schedule the run daily or weekly.

#### Are complainants named?

No. The FOS anonymises complainants before publication, which is why the summaries read "Mr H" rather than a full name. The business is named, because the ombudsman names it deliberately.

### ⚖️ Is it legal to scrape Financial Ombudsman decisions?

The Financial Ombudsman Service publishes final decisions as a public record, under its transparency obligations in the Financial Services and Markets Act 2000. The businesses are named by the ombudsman, and complainants are already anonymised by the FOS before publication. This Actor reads only those published decisions, and it never logs in.

Data comes from the publicly accessible [FOS decisions database](https://www.financial-ombudsman.org.uk/businesses/resolving-complaint/ombudsman-decisions). Apify's [ethical scraping guide](https://blog.apify.com/is-web-scraping-legal/) covers the wider picture.

### 👍 Your feedback

Found a bug, or want a field that is not here yet? Open an issue on the Actor's Issues tab. Requests that make the data more useful get built, and problems get fixed quickly.

### 🔎 You might also like

| Actor | What it does |
|---|---|
| [UK FCA Enforcement Notices](https://apify.com/spookyweb/uk-fca-enforcement-notices) | FCA final, decision and warning notices with firm names and penalty amounts |
| [UK Case Law Search and Monitor](https://apify.com/spookyweb/uk-case-law-search-monitor) | Court judgments and tribunal decisions from Find Case Law, with full text and change monitoring |
| [UK ICO Enforcement Actions](https://apify.com/spookyweb/uk-ico-enforcement-actions) | ICO fines, reprimands, enforcement notices and prosecutions with fine amounts and sectors |

# Actor input Schema

## `keyword` (type: `string`):

Search by keyword or financial product type, e.g. 'motor finance', 'PPI', 'fraud scam', 'pension'

## `businessName` (type: `string`):

Filter by a specific financial business, e.g. 'Barclays', 'Revolut', 'Aviva'

## `sector` (type: `string`):

Restrict to one financial sector, for example banking-credit-mortgages or insurance. Leave blank to return decisions across every sector the Ombudsman publishes.

## `outcome` (type: `string`):

Filter by whether the complaint was upheld or not.

## `dateFrom` (type: `string`):

Only return decisions issued on or after this date.

## `dateTo` (type: `string`):

Only return decisions issued on or before this date.

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

Maximum number of decisions to return. Default 50, max 500. Note: each page contains 10 results.

## Actor input object example

```json
{
  "keyword": "motor finance commission",
  "businessName": "Revolut",
  "sector": "",
  "outcome": "",
  "dateFrom": "01/01/2024",
  "dateTo": "31/12/2024",
  "maxResults": 50
}
```

# Actor output Schema

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

One row per item: Financial Ombudsman final decisions.

# 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("wildorigins/uk-fos-decisions").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("wildorigins/uk-fos-decisions").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 wildorigins/uk-fos-decisions --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,wildorigins/uk-fos-decisions"
        }
    }
}
```

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/e7gxai65qY9A54YFH/builds/3Zlt0i7Jf6Iq6JGi6/openapi.json
