# UK Bank Holidays and Business Day Calculator

> UK bank holidays from GOV.UK for England and Wales, Scotland and Northern Ireland. Add or count working days with your own closure dates.

URL: https://cliqtomedia.com/actors/uk-bank-holidays-business-days/

Category: Government & open data · Status: live on Apify Store · Apify page: https://apify.com/cliqtomedia/uk-bank-holidays-business-days?fpr=cliqto

Get UK bank holidays from GOV.UK for each part of the UK. Add working days to a date, or count them between two dates. Add your own office closure days too.

## How to use it: 3 steps

1. **Make a free Apify account.** Apify is the cloud platform where our tools run. The free plan gives you $5 of usage every month, no credit card needed. You pay Apify, not us.
2. **Paste your input and press Start.** No code needed: you fill in a form (the input). It already has a working example. For example: `england-and-wales` in UK divisions. Each start is one run.
3. **Download the results.** When the run ends, the results are in a table (the dataset). Open Output, press Export and pick Excel or CSV. JSON and the API are there too.

## What it does

UK Bank Holidays & Business Day Calculator lists UK bank holidays from GOV.UK for England and Wales, Scotland and Northern Ireland. It also adds or counts business days for your dates, with substitute days, custom weekends and your own closure dates. You get one clean row per holiday or per calculation.

- `list`: one row per bank holiday, division and year. Substitute days (for example Boxing Day moved to Monday 28 December 2026) are marked with `isSubstituteDay`.
- `calculate`: up to 100 calculations per run. Each calculation either adds a number of business days to a start date (`addBusinessDays`, negative goes back in time) or counts business days between two dates (`endDate`). You get one row per calculation and division, with the result date and the holidays it skipped.

### Good for

- Find an invoice due date or a payment date "N working days" after a date.
- Check an SLA or a notice period: how many business days are between two dates.
- Compare Scotland, Northern Ireland and England and Wales for the same date.
- Get the list of UK bank holidays for a calendar, a payroll system or a test fixture.
- Use a Friday–Saturday weekend or add your own office closure days.

### Not a good fit

- Other countries, local holidays or regional events. Only the three GOV.UK divisions are used.
- Years that GOV.UK has not published yet (now 2019–2028). The Actor never invents future holidays: see partial results.
- Court deadlines or legal time limits (for example Civil Procedure Rules). Check legal rules with a lawyer.
- Business hours or time zones. The Actor works with calendar dates (`YYYY-MM-DD`).

## Price

Pay per event. Apify bills you, not us.

| What you pay for | Price | When |
|---|---|---|
| Start fee | $0.001 | Charged once per run. This tool uses 1 GB of memory or less by default; more memory costs more. |
| Calculation row | $0.0018 (from $0.0015 on paid Apify plans) | One business-day calculation result for one UK division (complete or partial row) saved to the Dataset. Error rows are free. |
| Holiday row | $0.0002 (from $0.00017 on paid Apify plans) | One bank holiday (or your extra holiday) for one UK division saved to the Dataset in list mode. |

- One calculation: about $0.0028.
- 1,000 calculations: about $1.81 (10 runs of up to 100).
- Every day 100 calculations, for 30 days: about $5.43 a month.
- 100 calculations once a week (4 runs a month): about $0.72 a month.

Free to try: the Apify free plan gives you $5 of usage every month, no credit card needed.

Prices checked on 24 October 2026. Current price: https://apify.com/cliqtomedia/uk-bank-holidays-business-days?fpr=cliqto

## Questions

### Is the start date counted?

No. One working day after Thursday is Friday. The end date is counted.

### What if a holiday is on a weekend?

GOV.UK moves it to a weekday. The tool uses the GOV.UK dates.

### Can I use a Friday and Saturday weekend?

Yes. You can set custom weekend days.

### Does Wales have its own list?

No. Wales uses the England and Wales calendar.

### Do I need an API key or a GOV.UK account?

No. The GOV.UK feed is open and free. You only need your Apify account.

### Does the Actor count the start date?

No. `+1` business day from Thursday is Friday. When you count between two dates, the start date is not counted and the end date is counted.

### Why are Scotland and England different?

They have different bank holidays. For example, Scotland has 2 January, St Andrew's Day and, in 2026, the one-off World Cup bank holiday (15 June); Northern Ireland has St Patrick's Day and 12 July. Wales uses the England and Wales calendar.

### How fresh is the data?

Each run reads GOV.UK live. Each row has `fetchedAt`, and `RUN_SUMMARY.source` keeps the read time. GOV.UK can also add one-off holidays; the next run picks them up.

## Data fields

- `recordType` (string): holiday (list mode) or calculation (calculate mode). Use the Bank holidays / Calculations views.
- `status` (string): complete; partial = calculation touches years GOV.UK has not published (see coverageWarning); error = invalid calculation entry (not charged).
- `statusReason` (string): Plain-English reason for partial or error rows; null when complete.
- `errorCode` (string): INVALID_CALCULATION for error rows; null otherwise.
- `calculationId` (string): Your id for the calculation, or its 1-based position in the list.
- `division` (string): GOV.UK division slug. Null only on invalid calculation rows.
- `divisionName` (string): England and Wales, Scotland or Northern Ireland.
- `date` (string): Holiday date, YYYY-MM-DD.
- `year` (integer): Holiday year.
- `dayOfWeek` (string): Weekday of the holiday date.
- `title` (string): Holiday name as published by GOV.UK (or your custom title).
- `notes` (string): GOV.UK notes, e.g. "Substitute day"; empty string when none.
- `isSubstituteDay` (boolean): True when GOV.UK marks the date as a substitute day (the holiday fell on a weekend).
- `bunting` (boolean): GOV.UK bunting flag (celebratory holiday). Null for custom holidays.
- `holidaySource` (string): gov.uk = published bank holiday; custom = from your extraHolidays.
- `sourceUrl` (string): https://www.gov.uk/bank-holidays.json; null for custom holidays.
- `fetchedAt` (string): When GOV.UK data was fetched (ISO 8601 UTC).
- `operation` (string): add_business_days or count_business_days.
- `startDate` (string): Start date (YYYY-MM-DD). Never counted itself.
- `startDayOfWeek` (string): Weekday of startDate.
- `startIsBusinessDay` (boolean): Whether startDate is a business day in this division.
- `addBusinessDays` (integer): N from the input (add mode); null in count mode.
- `endDate` (string): End date from the input (count mode); null in add mode.
- `resultDate` (string): Add mode: the date N business days from startDate. Count mode: equals endDate.
- `resultDayOfWeek` (string): Weekday of resultDate.
- `resultIsBusinessDay` (boolean): Whether resultDate is a business day (count mode end dates may fall on a weekend/holiday).
- `businessDays` (integer): Business days from startDate (excluded) to resultDate (included); negative when going back.
- `calendarDays` (integer): resultDate minus startDate in calendar days.
- `weekendDaysSkipped` (integer): Non-working weekdays passed over.
- `holidaysSkippedCount` (integer): Number of distinct holiday dates on working weekdays passed over (one date with two titles counts once).
- `holidaysSkipped` (array): Holidays on working weekdays that were excluded: {date, title, source}. Holidays falling on a weekend are counted as weekend days.
- `weekendDays` (array): Non-working weekdays used for this calculation.
- `coverageWarning` (string): Set when part of the range is in a year GOV.UK has not published; only weekends and your extraHolidays were applied there.
- `uncoveredYears` (array): Years in the range that GOV.UK has not published for this division.
- `publishedYears` (object): First and last year GOV.UK has published for this division: {first, last}.

## Input settings

- `mode` (string): <b>list</b>: one row per bank holiday. <b>calculate</b>: one row per calculation and division (add N business days, or count business days between two dates).
- `divisions` (array): GOV.UK publishes three separate calendars (Wales uses England and Wales). Leave empty for all three. In calculate mode each calculation runs once per selected division.
- `years` (array): Years to list, e.g. [2026, 2027]. Leave empty for every year GOV.UK has published (currently 2019–2028). Years GOV.UK has not published are reported in the run summary, never invented.
- `calculations` (array): Up to 100 objects. Each needs <code>startDate</code> (YYYY-MM-DD) and exactly one of <code>addBusinessDays</code> (whole number from -2000 to 2000; negative goes back in time; 0 moves to the next business day if the start is not one) or <code>endDate</code> (counts business days after startDate up to and including endDate). Optional: <code>id</code> (your label) and <code>division</code> (otherwise every selected division). The start date is never counted: +1 from Friday is the next business day. A wrong entry becomes a free error row; the others still run.
- `weekendDays` (array): Days that are never business days. Default Saturday and Sunday. Use e.g. Friday and Saturday for another work week. Cannot contain all seven days.
- `extraHolidays` (array): Your own non-working dates, added on top of GOV.UK bank holidays: either "2026-12-31" or {"date": "2026-12-31", "title": "Office closed", "divisions": ["scotland"]}. Up to 500. Shown with holidaySource = custom.

## Step by step on Apify

1. Open the Input tab. The form already has List bank holidays, all three divisions and the year 2026.
2. Click Start.
3. Open the Bank holidays view in the Output tab. Check `division`, `date`, `title` and `isSubstituteDay`.
4. To calculate dates, choose Calculate business days in Mode. The form already has two example calculations. Click Start and open the Business-day calculations view. Check `resultDate` and `businessDays`.

## Use cases

| Task | Input | You get | Key fields |
|---|---|---|---|
| Invoice or payment due date | `calculate` + `addBusinessDays` | calculation row | `resultDate`, `holidaysSkipped`, `calendarDays` |
| SLA or notice period check | `calculate` + `endDate` | calculation row | `businessDays`, `weekendDaysSkipped`, `holidaysSkippedCount` |
| Scotland vs England dates | `divisions` (several) | one row per division | `division`, `resultDate` |
| Holiday calendar or payroll import | `list` + `years` | holiday rows | `date`, `title`, `isSubstituteDay`, `division` |
| Company with own closure days | `extraHolidays`, `weekendDays` | both modes | `holidaySource` (`custom`), `holidaysSkipped` |

## Tips

- Pick the right region. Scotland and Northern Ireland have their own holidays.
- Use a negative number to go back in time from a date.
- Add your own closure days, like a Christmas shutdown.

## Limits



- Up to 100 calculations per run. Each one runs once per selected division, so 100 calculations × 3 divisions give 300 rows. In our tests this took about 3 seconds.
- `addBusinessDays` from −2000 to 2000; `startDate` and `endDate` at most 36,600 days apart; dates from 1900 to 2100.
- Up to 500 `extraHolidays` and 50 `years`.
- Bank holidays exist only for the years GOV.UK publishes (now 2019–2028). GOV.UK adds new years about a year or two ahead and can remove old years. Every run reads the current list.
- The Actor reads GOV.UK once per run. If GOV.UK is down, the run fails with `ERROR` instead of giving an empty or wrong result.

## Sample result

```json
{
  "recordType": "calculation",
  "status": "complete",
  "calculationId": "invoice-due",
  "division": "england-and-wales",
  "operation": "add_business_days",
  "startDate": "2026-12-24",
  "addBusinessDays": 10,
  "endDate": null,
  "resultDate": "2027-01-12",
  "resultDayOfWeek": "tuesday",
  "businessDays": 10,
  "calendarDays": 19,
  "weekendDaysSkipped": 6,
  "holidaysSkippedCount": 3,
  "holidaysSkipped": [
    { "date": "2026-12-25", "title": "Christmas Day", "source": "gov.uk" },
    { "date": "2026-12-28", "title": "Boxing Day", "source": "gov.uk" },
    { "date": "2027-01-01", "title": "New Year’s Day", "source": "gov.uk" }
  ],
  "coverageWarning": null,
  "uncoveredYears": [],
  "publishedYears": { "first": 2019, "last": 2028 }
}
```

## Use it from code

Actor ID: `cliqtomedia/uk-bank-holidays-business-days`

```python
from apify_client import ApifyClient

client = ApifyClient("YOUR_APIFY_TOKEN")
run = client.actor("cliqtomedia/uk-bank-holidays-business-days").call(run_input={
    "mode": "list",
    "divisions": [
        "england-and-wales",
        "scotland",
        "northern-ireland"
    ]
})
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item)
```

```bash
curl -X POST "https://api.apify.com/v2/acts/cliqtomedia~uk-bank-holidays-business-days/run-sync-get-dataset-items?token=YOUR_APIFY_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"mode": "list", "divisions": ["england-and-wales", "scotland", "northern-ireland"]}'
```

```python
# pip install langchain-apify
# set APIFY_TOKEN in your environment
from langchain_apify import ApifyActorsTool

tool = ApifyActorsTool("cliqtomedia/uk-bank-holidays-business-days")
result = tool.invoke({"run_input": {"mode": "list", "divisions": ["england-and-wales", "scotland", "northern-ireland"]}})
print(result)
```

run-sync waits up to 300 seconds; for longer runs start a run and use a webhook. LlamaIndex and MCP: https://cliqtomedia.com/actors/ai-agents/

## Similar tools

- [EU TED Tenders Scraper & Monitor](https://cliqtomedia.com/actors/eu-ted-tenders-scraper/)
- [UK Postcode Lookup](https://cliqtomedia.com/actors/gb-postcode-lookup/)
- [USAspending Federal Awards & Recipient Monitor](https://cliqtomedia.com/actors/usaspending-federal-awards-monitor/)
- [VIN Decoder & Vehicle Recalls](https://cliqtomedia.com/actors/vin-decoder-vehicle-recalls/)
- [FDA Recalls & Enforcement Monitor](https://cliqtomedia.com/actors/fda-recalls-enforcement-monitor/)
- [NASA POWER Historical Weather & Solar Data](https://cliqtomedia.com/actors/nasa-power-climate-data/)
