# Financial Times News Scraper (`khadinakbar/financial-times-news-scraper`) Actor

Scrape Financial Times (ft.com) headlines, standfirsts, authors, sections and images from public RSS feeds and Bing News keyword search. Honest metadata — no paywall bypass. MCP-ready.

- **URL**: https://apify.com/khadinakbar/financial-times-news-scraper.md
- **Developed by:** [Khadin Akbar](https://apify.com/khadinakbar) (community)
- **Categories:** News, MCP servers
- **Stats:** 1 total users, 0 monthly users, 0.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $3.00 / 1,000 article founds

This Actor is paid per event and usage. You are charged both the fixed price for specific events and for Apify platform usage.

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 Times News Scraper

Finance monitors, PR teams, and AI research agents use this Actor to extract **Financial Times (ft.com)** headline metadata — title, standfirst, authors, section, image, and publish time — from public FT RSS section feeds, with optional Bing News `site:ft.com` keyword discovery and public Open Graph URL enrich. Built for structured monitoring on Apify (API, schedules, datasets). Full article body remains behind the reader’s FT subscription; this Actor returns honest metadata and standfirsts only (`bodyText` is always `null`).

### Best fit for this Actor

- Monitor Markets, Companies, World, Technology, Climate, Opinion, and other public FT RSS sections on a schedule
- Filter by keyword or recency window across selected sections
- Discover articles by topic via Bing News `site:ft.com` (FT public site search is out of scope)
- Enrich specific `ft.com/content/{uuid}` URLs from public OG/meta when HTML is reachable

Best fit when you need FT **metadata and standfirsts**. For multi-publisher news monitoring, continue with [Google News Scraper](https://apify.com/khadinakbar/google-news-scraper). For Bloomberg section headlines and tickers, use [Bloomberg News Scraper](https://apify.com/khadinakbar/bloomberg-news-scraper).

### Practical scenario

A markets researcher selects sections `home` and `markets`, sets `maxItems` to `10`, and schedules the run hourly. Each run returns the latest FT headlines with standfirsts and canonical `/content/{uuid}` URLs. The researcher filters rows where the standfirst mentions “oil” or “Fed”, then opens those URLs for full reading under their FT subscription. The Actor is the discovery layer; the subscription remains the reading layer.

### Quick start input

```json
{
  "sections": ["home", "markets", "companies"],
  "maxItems": 10,
  "searchKeywords": [],
  "sinceHours": 0
}
```

### Input reference

| Field | What it controls |
| --- | --- |
| `sections[]` | FT RSS sections (prefill: home + markets) |
| `searchKeywords[]` | Optional headline/standfirst filter |
| `searchQuery` | Bing News `site:ft.com` topic search |
| `articleUrls[]` | Optional ft.com URLs → public OG enrich |
| `sinceHours` | Recency filter (0 = all current feed items) |
| `maxItems` | Hard cap on billed articles (default 50, prefill 10) |
| `proxyConfiguration` | Optional; enable Residential when URL enrich needs a clearer HTML path |

### What data you receive

One dataset item is one FT article metadata row.

```json
{
  "title": "Slide in oil prices drives rebound in battered government bonds",
  "summary": "Brent crude falls amid speculation about spare capacity…",
  "url": "https://www.ft.com/content/18f9e0ac-b7d9-4648-803f-3e894990c626",
  "authors": [],
  "publishedAt": "2026-09-21T10:55:57.000Z",
  "section": "home",
  "keywords": [],
  "textAvailability": "RSS_SUMMARY",
  "sourceMode": "rss",
  "bodyText": null,
  "scrapedAt": "2026-09-21T12:00:00.000Z"
}
```

| Field | Meaning |
| --- | --- |
| `title` / `summary` | Headline and standfirst/snippet |
| `url` / `canonicalUrl` | Canonical `/content/{uuid}` link |
| `authors` / `publishedAt` | Byline and ISO publish time when exposed |
| `section` / `keywords` | Section label and tags |
| `imageUrl` | Lead image when present |
| `textAvailability` | `RSS_SUMMARY` | `SEARCH_SNIPPET` | `PUBLIC_SNIPPET` | `PAYWALLED` |
| `sourceMode` | `rss` | `search` | `url` |
| `bodyText` | Always `null` in v1 (honest subscription-body contract) |

Download JSON, CSV, or Excel from the run dataset. Key-value `OUTPUT` / `RUN_SUMMARY` use outcomes `COMPLETE`, `PARTIAL`, `VALID_EMPTY`, `INVALID_INPUT`, `UPSTREAM_FAILED`, or `CONFIG_ERROR`.

### Use through the API

```bash
curl "https://api.apify.com/v2/acts/khadinakbar~financial-times-news-scraper/runs?token=YOUR_APIFY_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"sections":["home","markets"],"maxItems":10}'
```

Read rows from the run `defaultDatasetId` after status is SUCCEEDED. Check key-value `OUTPUT.outcome` for the terminal contract above.

### Use with AI agents through Apify MCP

> Scrape the latest Financial Times Markets and International home headlines. Cap at ten articles. Return title, standfirst, URL, publish time, and section. Keep the request metadata-only.

Inspect `OUTPUT.outcome`, keep `url` / `guid` as provenance, and keep `maxItems` small. Client setup: <https://mcp.apify.com>. Tool name after publish: `apify--financial-times-news-scraper`.

### Connect the workflow

This Actor is a focused FT metadata monitor. When you need headlines across many publishers for the same keyword, then continue with [Google News Scraper](https://apify.com/khadinakbar/google-news-scraper). When the story is Bloomberg-specific markets coverage with tickers, use [Bloomberg News Scraper](https://apify.com/khadinakbar/bloomberg-news-scraper) beside or instead of FT sections.

### Pricing

This Actor uses Pay per event plus Apify platform usage. Open the live Pricing tab for current event details, and use Apify's run cost controls to keep the workflow aligned with your budget.

- `apify-actor-start`: $0.00005 per run
- `article-found`: $0.003 per saved article row

A quality prefill that returns ten articles bills one start event plus ten `article-found` events (~$0.03005 before platform usage). Invalid input and empty matches charge no `article-found` events.

### Best results

- Prefer RSS sections for reliability; use `searchQuery` when you need a topic outside a single section feed.
- Keep `maxItems` low for cheap canaries; raise only after a successful small run.
- Treat URL enrich as optional — enable Residential proxy when FT article HTML needs a clearer path.
- Re-check important stories on ft.com under your own subscription before redistribution.

### Design note

In my testing, FT section RSS (`?format=rss`) and home feeds returned stable headline/standfirst payloads without proxy, while article HTML often needed Residential for OG enrich and full body remained subscription-gated. Keyword discovery therefore uses Bing News `site:ft.com` rather than FT site search. That is why `bodyText` stays null and `textAvailability` is an honest enum aligned with public metadata.

### Responsible use

Use public FT feed and search metadata for lawful monitoring and research. Follow Financial Times terms, copyright policy, and applicable law. FT robots.txt and copyright policy describe AI/ML training and commercial redistribution expectations — contact content.licensing@ft.com for licensing queries. You are responsible for compliance.

"FT" and "Financial Times" are trademarks of The Financial Times Ltd. This independent Actor is not affiliated with, associated with, or endorsed by The Financial Times Ltd. Bing is a trademark of Microsoft Corporation. This independent Actor is not affiliated with, associated with, or endorsed by Microsoft.

# Changelog

This Actor's version history is a separate document: https://apify.com/khadinakbar/financial-times-news-scraper/changelog.md

# Actor input Schema

## `sections` (type: `array`):

Financial Times public RSS sections to scrape (headlines, standfirsts, images, publish times). Select one or more. Defaults to International home + Markets. Returns public feed metadata — not full paywalled article body text.

## `searchKeywords` (type: `array`):

Optional case-insensitive keywords. Keep only articles whose headline, standfirst, or keywords contain at least one term (e.g. \['Fed','oil']). Leave empty to keep all items from selected sections.

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

Optional topic search via Bing News RSS filtered to ft.com. Use this instead of FT site search (robots.txt disallows /search). Returns headline + snippet + URL. Leave empty to skip.

## `articleUrls` (type: `array`):

Optional list of ft.com /content/{uuid} URLs. Each URL is enriched from public Open Graph / meta tags only when HTML is reachable. Often blocked by Cloudflare without Residential proxy. Does not bypass the FT paywall or return subscription-only full text.

## `sinceHours` (type: `integer`):

Optional recency window. If set to e.g. 24, only articles with publishedAt within the last 24 hours are kept. Use 0 (default) for all currently returned feed/search items.

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

Hard cap on articles scraped and billed across all sources. Each accepted article is one billable article-found event. Defaults to 50. Set lower for cheap test runs.

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

Optional Apify proxy. Official FT RSS feeds normally work without one. Enable Residential only if HTML URL enrich is Cloudflare-blocked.

## Actor input object example

```json
{
  "sections": [
    "home",
    "markets"
  ],
  "searchKeywords": [],
  "searchQuery": "",
  "articleUrls": [],
  "sinceHours": 0,
  "maxItems": 10,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# Actor output Schema

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

Dataset items containing FT article headlines, standfirsts, authors, sections, keywords, image metadata, publish times, source URLs, textAvailability, and scrape timestamps.

## `summary` (type: `string`):

Machine-readable run summary with selected sections, filters, feed/search counts, dataset item count, charged article count, estimated event cost, and status message.

## `runSummary` (type: `string`):

Alias containing the same terminal outcome at RUN\_SUMMARY.

# 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 = {
    "sections": [
        "home",
        "markets"
    ],
    "searchKeywords": [],
    "searchQuery": "",
    "articleUrls": [],
    "sinceHours": 0,
    "maxItems": 10,
    "proxyConfiguration": {
        "useApifyProxy": false
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("khadinakbar/financial-times-news-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 = {
    "sections": [
        "home",
        "markets",
    ],
    "searchKeywords": [],
    "searchQuery": "",
    "articleUrls": [],
    "sinceHours": 0,
    "maxItems": 10,
    "proxyConfiguration": { "useApifyProxy": False },
}

# Run the Actor and wait for it to finish
run = client.actor("khadinakbar/financial-times-news-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 '{
  "sections": [
    "home",
    "markets"
  ],
  "searchKeywords": [],
  "searchQuery": "",
  "articleUrls": [],
  "sinceHours": 0,
  "maxItems": 10,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}' |
apify call khadinakbar/financial-times-news-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,khadinakbar/financial-times-news-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/3pqzg1Y6WzZM4ceLY/builds/t2DVhMYwrKqeVhOTk/openapi.json
