# Fox News Liveblogs Scraper (`scrapyx/foxnews-liveblogs-scraper`) Actor

Collects Fox News live-news blogs and their full timelines: every update with its own headline, body text, author and timestamp, plus the liveblog's coverage window. Covers 1,353 live events back to June 2021, with date and keyword filtering.

- **URL**: https://apify.com/scrapyx/foxnews-liveblogs-scraper.md
- **Developed by:** [Ibnu Adzim](https://apify.com/scrapyx) (community)
- **Categories:** News
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $2.10 / 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.
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

## Fox News Liveblogs Scraper

Collects Fox News live-news blogs **and their full timelines**. For each live
event you get the liveblog itself and one row per update, with that update's
own headline, body text, author and timestamp.

The archive holds **1,353 live events going back to June 2021**, each with
roughly 12 to 53 updates, which is on the order of 40,000 timeline entries.

No login, no API key, no browser. Plain HTTP, Python only.

### What you get

One dataset, four kinds of row, told apart by `recordType`.

**`LIVEBLOG`** — one per live event: headline, description, URL, the coverage
window (when Fox opened and closed the blog), publish and modified dates,
the contributing authors, publisher, lead image, and how many updates the
timeline holds versus how many this run returned.

**`LIVEBLOG_UPDATE`** — one per timeline entry: its own headline, body text,
authors, publish and modified timestamps and image. Join it back to its parent
on `liveblogUrl`, and order it with `updateRank` or `updateDatePublished`.

**`SEARCH_SUMMARY`** — one per run: corpus size, how many liveblogs were
discovered after the date filter, how many were returned, how many pages were
fetched, how many updates were truncated, and how many rows each filter
dropped.

**`ERROR`** — one per URL that failed, so a failure can never look like an
empty result.

### Examples

The ten most recent live events with their complete timelines:

```json
{ "maxItems": 10 }
```

Headlines only, no timeline rows:

```json
{ "maxItems": 50, "includeUpdates": false }
```

The five latest updates from each of the twenty newest events:

```json
{ "maxItems": 20, "maxUpdatesPerLiveblog": 5 }
```

Everything Fox live-blogged in a past window:

```json
{ "maxItems": 100, "dateFrom": "2024-07-01", "dateTo": "2024-07-31" }
```

Live events that mention a term anywhere on their timeline:

```json
{ "maxItems": 10, "keywords": ["hurricane"] }
```

### Limits, stated plainly

**One page fetch per liveblog, always.** Unlike Fox's article feeds and video
sitemap, the liveblog sitemap carries no title, no body and no dates beyond
last-modified. There is no cheaper path, so `maxItems` is the real cost
control.

**The date filter is free, the keyword filter is not.** Dates come from the
sitemap, so a date-bounded run narrows the corpus before fetching anything and
pays only for what it returns. A keyword can be buried in any update, so
whether a liveblog matches is unknowable until its page is fetched. Keyword
runs therefore fetch more pages than they return liveblogs, and stop at eight
pages per requested item so a term that matches nothing cannot walk the whole
archive.

**The keyword filter runs here, not at Fox.** Fox exposes no search parameter.
It narrows what a run retrieved rather than widening what it can reach.

**Update caps keep the newest.** `maxUpdatesPerLiveblog` truncates from the
newest end, and `liveblogUpdatesAvailable` still reports the true total so you
always know what was left behind.

**Dates are the last-modified date.** That is the only date the sitemap
carries, so it is what the date filter compares. Each liveblog row also
carries its coverage window and publish date from the page itself.

**Articles and videos are separate Actors.** A liveblog is a parent plus a
timeline, which is a shape neither of those has.

### Blocking and proxies

No bot-mitigation gate was found on any Fox News surface during development:
the sitemap and the live-news pages answered cold across four different TLS
fingerprints, with no challenge, no cookie and no token. The Actor defaults to
Apify's shared **datacenter** proxy, included in your plan at no extra cost.
Residential is available in the proxy editor; Apify bills it per gigabyte.

### Politeness

`robots.txt` at foxnews.com sets no `Crawl-delay` and names no AI-crawler
group. It disallows the site search, the wires and the printer-friendly paths,
none of which this Actor touches: it reads the liveblog sitemap and public
live-news pages. Request starts are paced by `minRequestInterval`, which
defaults to a quarter second.

# Actor input Schema

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

How many liveblogs to return, newest first. Each one is a separate page fetch, so this directly controls run time. Fox's liveblog archive holds 1,353 live events going back to June 2021, and each carries a timeline of roughly 12 to 53 updates.

## `includeUpdates` (type: `boolean`):

Emit one row per update on each liveblog's timeline, with its own headline, body text, author and timestamp, alongside the liveblog row itself. Turn this off to get only the liveblog headers. It costs nothing extra either way, because the whole timeline arrives in the same page fetch.

## `maxUpdatesPerLiveblog` (type: `integer`):

Cap on timeline updates returned per liveblog, newest first. Leave at 0 to return every update the page carries. The summary row reports how many were truncated.

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

Optional lower bound, inclusive, as YYYY-MM-DD. This filters on the liveblog's last-modified date, which is the only date the sitemap carries, so it is applied before any page is fetched and costs nothing. Liveblogs with no usable date are excluded whenever a bound is set.

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

Optional upper bound, inclusive, as YYYY-MM-DD. Same pre-fetch filtering as 'Last updated from'.

## `keywords` (type: `array`):

Optional. Keep only liveblogs whose headline, description or ANY update on their timeline contains one of these words, matched case-insensitively. Because a match can be buried deep in a timeline, this is checked after each page is fetched, not before, so a keyword run fetches more pages than it returns liveblogs. This is filtering done by this Actor, not a search sent to Fox News, which offers no search parameter.

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

Upper bound on liveblog page requests in flight at once.

## `minRequestInterval` (type: `number`):

Shared pacing floor across every request this run makes. Fox News sets no Crawl-delay in robots.txt, so this default is this portfolio's own politeness baseline rather than a site requirement.

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

Apify Proxy on the shared datacenter pool. That is the default because it is included in your plan at no extra cost and this target needs nothing more: no bot-mitigation gate was seen on any Fox News surface during testing. Switch the group here to Residential only if you start seeing blocks, since Apify bills residential traffic per gigabyte.

## Actor input object example

```json
{
  "maxItems": 10,
  "includeUpdates": true,
  "maxUpdatesPerLiveblog": 0,
  "keywords": [],
  "maxConcurrency": 5,
  "minRequestInterval": 0.25,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

## `items` (type: `string`):

One row per scraped record. See the dataset's default view for field definitions.

# 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("scrapyx/foxnews-liveblogs-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 = {}

# Run the Actor and wait for it to finish
run = client.actor("scrapyx/foxnews-liveblogs-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 '{}' |
apify call scrapyx/foxnews-liveblogs-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,scrapyx/foxnews-liveblogs-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/JkLXNuDO22BGcbcvq/builds/NK5sVR8f3yRth7wSe/openapi.json
