# UK Health Security Outbreak Monitor (`hllerdgn80/uk-health-security-outbreak-monitor`) Actor

Reads UKHSA's official 'Outbreaks under monitoring' weekly reports via GOV.UK's public Content API: disease/pathogen, location, status, reporting date, epidemiological summary and UK risk assessment. Official govuk source; no other Store Actor covers this feed.

- **URL**: https://apify.com/hllerdgn80/uk-health-security-outbreak-monitor.md
- **Developed by:** [Halil Erdogan](https://apify.com/hllerdgn80) (community)
- **Security:** Limited permissions
- **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 Health Security Outbreak Monitor

Reads the UK Health Security Agency's (UKHSA) official **"Outbreaks under
monitoring"** weekly reports directly from GOV.UK's public Content API
(`www.gov.uk/api/content/...`) - no HTML scraping, no login, no key.

Each week UKHSA's epidemic intelligence team publishes a short structured
report on disease events it is tracking worldwide: disease/pathogen, country
or region, whether it is a new or updated signal, the reporting date window,
a plain-English epidemiological summary (with links to WHO/ECDC/national
sources), and an explicit assessment of the risk to the UK population. This
Actor turns those weekly govspeak pages into one dataset row per
disease/pathogen signal.

### Why this Actor

No other Apify Store Actor reads UKHSA's own "outbreaks under monitoring"
feed. It is not the same as the well-covered WHO "Disease Outbreak News"
feed - it is UKHSA's own UK-focused risk read on global events, including
signals WHO has not (yet) issued a DON for.

### Input

| Field | Type | Default | Notes |
|---|---|---|---|
| `year` | integer (select) | `2026` | Which yearly index publication to read (`2026` or `2025`). |
| `maxWeeks` | integer | `8` | How many of the most recent weekly reports to fetch (newest first). |
| `watchLabel` | string | - | Optional tag copied onto every row, useful when scheduling. |
| `maxItems` | integer | `500` | Safety cap on total rows pushed. |

### Output (one row per disease signal)

```json
{
  "type": "outbreak_signal",
  "watch_label": "daily-run",
  "report_title": "Outbreaks under monitoring: week 38 (week ending 20 September 2026)",
  "week_label": "The following signal relates to an ongoing outbreak, with data as of 21 September 2026",
  "disease": "Bundibugyo virus disease ( BVD )",
  "location": "Multi-country",
  "status": "Update",
  "reporting_date": "15 May to 21 September 2026",
  "summary": "On 15 May 2026, an outbreak of Ebola disease caused by Bundibugyo virus was declared...",
  "further_information": "Ebola: overview, history, origins and transmission ...",
  "source_url": "https://www.gov.uk/government/publications/outbreaks-under-monitoring-in-2026/outbreaks-under-monitoring-week-38-week-ending-20-september-2026",
  "report_updated_at": "2026-09-24T15:30:06+01:00",
  "row_status": "ok",
  "message": null,
  "scraped_at": "2026-09-28T12:00:00Z"
}
```

If a weekly report page has no disease-signal tables (a quiet week), one
`weekly_report_no_signals` row is pushed instead, so you can tell "checked,
nothing new" apart from "failed to fetch". If a page fails to fetch, one
`error` row is pushed (free of charge) with `row_status` describing the
failure kind (`not_found`, `fetch_failed`, `bad_json`, ...).

### Source and legality

GOV.UK's Content API (`https://www.gov.uk/api/content/...`) is a documented,
public JSON API (see `content-api.publishing.service.gov.uk`) that mirrors
the same content shown on the public GOV.UK page - it is not a bypass of any
access control. `www.gov.uk/robots.txt` does not disallow `/api/` or the
publication paths this Actor reads. No login, no API key, and no rate limit
is stated for this API; the Actor makes a small, sequential number of
requests per run (one for the year index, one per weekly report) and retries
politely on transient failures.

### Use cases

- Travel-health and occupational-health teams tracking global disease
  signals UKHSA itself has flagged as relevant to the UK.
- Journalists and researchers building a timeline of an ongoing outbreak
  (e.g. tracking the Bundibugyo virus disease case count across weeks).
- Insurance, logistics and NGO teams needing an early, UK-government-vetted
  read on emerging outbreaks before mainstream press coverage.

# Actor input Schema

## `year` (type: `integer`):

Which UKHSA 'Outbreaks under monitoring' yearly index to read (2026 or 2025; each year is a separate GOV.UK publication with one weekly report part per week).

## `maxWeeks` (type: `integer`):

How many of the most recent weekly report parts to fetch and parse (newest first).

## `watchLabel` (type: `string`):

Optional free-text tag copied onto every output row (and onto any error row), so you can tell runs apart when you schedule this Actor repeatedly.

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

Stop after pushing this many rows in total (safety cap). A single weekly report typically has 1-5 disease-signal rows.

## Actor input object example

```json
{
  "year": 2026,
  "maxWeeks": 8,
  "maxItems": 500
}
```

# 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-health-security-outbreak-monitor").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-health-security-outbreak-monitor").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-health-security-outbreak-monitor --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,hllerdgn80/uk-health-security-outbreak-monitor"
        }
    }
}
```

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/IamlK51TbtWqM3EZL/builds/sNn7qn67MYOgGb0g5/openapi.json
