# UK NHS Prescribing Data: GP Drug Trends for All 4 Nations (`seaf999ield/uk-nhs-prescribing-data`) Actor

Monthly GP prescribing for any drug or BNF code across the UK (NHSBSA England, Public Health Scotland, NHS Wales, Northern Ireland BSO): items, quantity and cost by nation, region, ICB or health board, and practice, plus biggest month on month movers.

- **URL**: https://apify.com/seaf999ield/uk-nhs-prescribing-data.md
- **Developed by:** [RustonRoad](https://apify.com/seaf999ield) (community)
- **Categories:** Business, Open source
- **Stats:** 2 total users, 1 monthly users, 0.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

Pay per event

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 NHS Prescribing Data API: GP Drug Trends for England, Scotland, Wales & NI

**Monthly GP prescribing for any medicine, across all four UK nations, in one clean dataset.** Type a drug name (`semaglutide`, `tirzepatide`, `apixaban`), a brand (`Mounjaro`, `Ozempic`) or a BNF code, and get items, quantity, net ingredient cost and actual cost by nation, NHS region, ICB or health board, sub ICB location, or individual GP practice. The actor also finds the **biggest movers**: the areas or practices with the largest month on month change.

- Official open data only: NHSBSA (England), Public Health Scotland, NHS Wales Shared Services Partnership and the Business Services Organisation (Northern Ireland).
- No API key, no login, no 8 GB monthly CSV downloads on your side.
- One normalised schema for all four nations.

### What you get

| Record | What it contains |
|---|---|
| `trend` | One row per drug × area (or practice) × month: items, quantity, net ingredient cost (NIC), actual cost, cost per item, and change vs the previous month |
| `mover` | Areas or practices with the largest change in items between the two latest months, with % change, cost change, direction, a `newPrescriber` flag and a one line `alert` |
| `summary` | One per drug: latest month per nation, totals, month on month and period change, top 5 areas, biggest riser and faller |

#### Real sample: tirzepatide (Mounjaro), largest area in each nation, from a test run on 23 Oct 2026

| nation | month | areaName | items | quantity | netIngredientCost | actualCost | vs prev month |
|---|---|---|---|---|---|---|---|
| England | Aug 2026 | NHS North East and North Cumbria ICB | 22,571 | 23,330 | £5,106,687 | £5,090,554 | down 5.0% |
| Scotland | Jul 2026 | NHS Greater Glasgow and Clyde | 5,390 | 6,152 | £1,382,969 | n/a | +2.7% |
| Wales | Jul 2026 | Betsi Cadwaladr University Health Board | 4,960 | 5,149 | £1,088,993 | £1,034,387 | +9.8% |
| Northern Ireland | Aug 2026 | Belfast (LCG area) | 2,370 | 2,469 | £516,465 | £516,465 | down 7.2% |

#### Real sample: biggest movers (rank 1 per nation, same run)

| nation | drug | area | previous items | items | change |
|---|---|---|---|---|---|
| England | tirzepatide | NHS Greater Manchester ICB | 18,493 | 17,113 | down 1,380 (down 7.5%) |
| Scotland | semaglutide | NHS Lothian | 4,764 | 5,010 | +246 (+5.2%) |
| Wales | tirzepatide | Swansea Bay University Health Board | 3,723 | 4,256 | +533 (+14.3%) |
| Northern Ireland | tirzepatide | Western | 2,127 | 1,826 | down 301 (down 14.2%) |

Latest month national totals in the same run: tirzepatide **342,252 items / £80.2m NIC in England (Aug 2026)**, 22,881 items in Wales and 14,268 in Scotland (Jul 2026), 9,352 in Northern Ireland (Aug 2026).

**Sample trend item (JSON)**

```json
{"recordType": "trend", "drug": "tirzepatide", "bnfCodes": ["0601023AZ"], "bnfChemicalNames": ["Tirzepatide"], "nation": "Wales",
 "level": "icb", "month": "2026-07", "regionCode": "W92000004", "regionName": "Wales", "areaCode": "7A1",
 "areaName": "Betsi Cadwaladr University Health Board", "items": 4960, "quantity": 5149.0, "netIngredientCost": 1088993.0,
 "actualCost": 1034387.0, "costPerItem": 219.56, "itemsChangeVsPrevMonth": 442, "itemsChangePctVsPrevMonth": 9.8,
 "source": "NHS Wales Shared Services Partnership (NWSSP), GP Prescribing Data Extract",
 "attribution": "Contains public sector information licensed under the Open Government Licence v3.0. Source: NHS Wales Shared Services Partnership, GP Prescribing Data Extract."}
```

### Use cases

- **GLP 1 and weight loss jab tracking:** follow Mounjaro (tirzepatide), Wegovy and Ozempic (semaglutide) uptake month by month, by ICB or health board, and see where prescribing is rising fastest.
- **Market access and brand teams:** check uptake after a NICE decision or a formulary change, compare ICBs and health boards, and find the high prescribing practices.
- **Generics and wholesalers:** size volumes and spend for a molecule before or after loss of exclusivity, and spot switching between presentations.
- **Analysts, investors and journalists:** a reproducible monthly feed for charts and stories without downloading the raw files.
- **Med comms and CROs:** target areas by prescribing density.

### Input

| Field | What it does | Default |
|---|---|---|
| Drugs or BNF codes | Chemical or brand names, a 9 character BNF chemical code (`0601023AW`), a presentation code prefix, or a shorter section prefix (`0601023`) | semaglutide, tirzepatide |
| Nations | `all`, or any of `england`, `scotland`, `wales`, `northern_ireland` | all |
| Level | `national`, `region`, `icb`, `subicb`, `practice` | icb |
| Area filter | Match on region, ICB or health board, sub ICB, practice name or code, or postcode prefix | none |
| Months | Latest N published months per nation (or give exact months) | 6 |
| Mode | `both`, `trend` or `movers` | both |
| Movers level, per nation, minimum items, direction | Tune the movers list | ICB, 20, 20 items, both |
| Max trend rows | Hard cap. The biggest prescribers come first, so a cap keeps the rows that matter | 5,000 |
| Combine drugs | Add all drugs into one series (e.g. a GLP 1 total) | off |

**Example: Mounjaro by GP practice in Greater Manchester, last 6 months, with the top 20 practice movers**

```json
{"drugs": ["tirzepatide"], "nations": ["england"], "level": "practice", "areaFilter": ["Greater Manchester"], "months": 6, "moversLevel": "practice", "topMovers": 20}
```

**Example: GLP 1 total by health board and ICB across the UK**

```json
{"drugs": ["semaglutide", "tirzepatide", "liraglutide", "dulaglutide"], "combineDrugs": true, "nations": ["all"], "level": "icb", "months": 12}
```

#### How geography maps across the nations

| Level | England | Scotland | Wales | Northern Ireland |
|---|---|---|---|---|
| region | NHS England region | Scotland | Wales | Northern Ireland |
| icb | Integrated Care Board | Health board | Health board | Local Commissioning Group area |
| subicb | Sub ICB location | Health and Social Care Partnership | Locality (code only) | LCG area |
| practice | Practice or cost centre | GP practice | GP practice | GP practice |

### Pricing (pay per event)

| Event | Price | Per 1,000 |
|---|---|---|
| Run start (`apify-actor-start`) | $0.02 per run | |
| `result-row`: one monthly trend row | $0.002 | **$2 per 1,000 rows** |
| `mover-alert`: one biggest mover record | $0.01 | $10 per 1,000 |

Summary records carry no charge.

Examples:

- Semaglutide and tirzepatide, all four nations, ICB and health board level, 3 months, 5 movers per nation (the test run above: 380 rows and 40 movers): **about $1.18**.
- One drug, England, ICB level, 6 months: roughly 230 rows, so **about $0.50** plus movers.
- One drug, every GP practice in England, 1 month: about 6,100 rows, **about $12**. Use `areaFilter` or `maxRows` to keep practice level runs small.

### Data sources, licence and attribution

Contains public sector information licensed under the [Open Government Licence v3.0](https://www.nationalarchives.gov.uk/doc/open-government-licence/version/3/).

| Nation | Source | Latest month on 23 Oct 2026 |
|---|---|---|
| England | NHS Business Services Authority (NHSBSA), English Prescribing Dataset (EPD), via the NHSBSA Open Data Portal | August 2026 |
| Scotland | Public Health Scotland, Prescriptions in the Community (data by prescriber location) | July 2026 |
| Wales | NHS Wales Shared Services Partnership, GP Prescribing Data Extract | July 2026 |
| Northern Ireland | Business Services Organisation, GP Prescribing Data, via OpenDataNI | August 2026 |

Every row carries its own `source` and `attribution` fields. This actor is independent. It is **not affiliated with or endorsed by** NHSBSA, Public Health Scotland, NWSSP, BSO, the NHS or any government department. The data contains no patient level information. It covers organisations (practices and NHS areas) only.

### Notes and known limits

- **Nations publish at different times:** England and Northern Ireland are about 2 months behind, Scotland and Wales about 3. "Latest 6 months" means the latest 6 for each nation. UK total rows only appear for months that all four nations have published.
- **Costs are not identical across nations.** England and Wales publish NIC and actual cost. Northern Ireland publishes gross and actual cost (reported here as NIC and actual cost). Scotland publishes gross ingredient cost only (`actualCost` is null).
- **Items are dispensed items** in the community. Hospital only and private prescriptions are not included. Monthly totals move with the number of dispensing days in the month.
- England includes non practice cost centres (for example community diabetes services) and a small "UNIDENTIFIED" bucket. Scotland includes a small number of unallocated prescriber codes.
- Practices that merge or change name keep their code, so movers are matched on code.
- Wales locality names and NI sub areas are not published in the source files, so they come back as codes or LCG names.

### FAQ

**How is this different from OpenPrescribing?** OpenPrescribing is an excellent public website for England. This actor gives you a machine readable feed for all four UK nations at once, with movers and summaries, that you can schedule and push into Sheets, BI tools or a webhook.

**Can I search by brand name?** Yes. Brand names that appear in BNF presentation names (Mounjaro, Ozempic, Wegovy, Rybelsus) resolve to the underlying chemical, so all brands and generics of that chemical are counted.

**How do I get alerts when new data lands?** Schedule a monthly run around the 25th with `mode: movers`. Each run compares the two latest months.

**Does it include patient data?** No. The sources publish aggregate counts by practice and area only.

*Keywords: NHS prescribing data API, English Prescribing Dataset, EPD, GP prescribing data, OpenPrescribing alternative, Mounjaro prescribing, semaglutide prescribing, GLP 1 prescriptions UK, ICB prescribing, Scotland prescriptions in the community, Wales GP prescribing, Northern Ireland GP prescribing.*

# Actor input Schema

## `drugs` (type: `array`):

Chemical names (e.g. semaglutide, tirzepatide, apixaban), brand names found in BNF presentation names (e.g. Mounjaro, Ozempic), or BNF codes: a 9-character chemical code (0601023AW), a longer presentation code prefix, or a shorter section or paragraph prefix (0601023 = all drugs in that paragraph). Each entry is reported separately unless 'Combine drugs' is on.

## `nations` (type: `array`):

Which UK nations to include. Each nation publishes on its own timetable, so the latest month differs (see README).

## `level` (type: `string`):

Geography of the monthly trend rows. In Scotland and Wales 'icb' means health board, in Northern Ireland the Local Commissioning Group area.

## `areaFilter` (type: `array`):

Optional. Keep only areas or practices whose region, ICB, health board, sub-ICB, practice name, code or postcode prefix matches any entry, e.g. 'Greater Manchester', 'Lothian', 'Cardiff', 'Belfast', 'M14', 'P84004'.

## `months` (type: `integer`):

Number of latest published months per nation.

## `monthList` (type: `array`):

Override 'Months' with exact months, e.g. 2026-03, 2026-08.

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

Movers compare the latest month with the month before, for each nation.

## `moversLevel` (type: `string`):

Where to look for movers. Defaults to the trend level (or ICB if the trend level is national or region).

## `topMovers` (type: `integer`):

Areas or practices with the largest absolute change in items.

## `minItems` (type: `integer`):

Ignore movers with fewer items than this in both months (filters out noise from tiny practices).

## `moverDirection` (type: `string`):

Risers, fallers or both.

## `maxRows` (type: `integer`):

Hard cap on trend rows (the biggest prescribers come first, so a cap keeps the most important rows). Practice level for all of England is about 6,000 to 7,000 rows per drug per month.

## `combineDrugs` (type: `boolean`):

Add all drugs together into one series (e.g. semaglutide + tirzepatide as 'GLP-1 total').

## `includeUkTotal` (type: `boolean`):

At national level with all four nations, add 'United Kingdom' rows for months that every nation has published.

## Actor input object example

```json
{
  "drugs": [
    "semaglutide",
    "tirzepatide"
  ],
  "nations": [
    "all"
  ],
  "level": "icb",
  "months": 6,
  "mode": "both",
  "topMovers": 20,
  "minItems": 20,
  "moverDirection": "both",
  "maxRows": 5000,
  "combineDrugs": false,
  "includeUkTotal": true
}
```

# Actor output Schema

## `trend` (type: `string`):

No description

## `movers` (type: `string`):

No description

## `runSummary` (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 = {
    "drugs": [
        "semaglutide",
        "tirzepatide"
    ],
    "nations": [
        "all"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("seaf999ield/uk-nhs-prescribing-data").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 = {
    "drugs": [
        "semaglutide",
        "tirzepatide",
    ],
    "nations": ["all"],
}

# Run the Actor and wait for it to finish
run = client.actor("seaf999ield/uk-nhs-prescribing-data").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 '{
  "drugs": [
    "semaglutide",
    "tirzepatide"
  ],
  "nations": [
    "all"
  ]
}' |
apify call seaf999ield/uk-nhs-prescribing-data --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,seaf999ield/uk-nhs-prescribing-data"
        }
    }
}
```

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/G0YiiQdELtyz44E0V/builds/ZaXcFtFvxMxbQiSZS/openapi.json
