How to use it: 3 steps
- Make a free Apify accountApify 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.
- Paste your input and press StartNo code needed: you fill in a form (the input). It already has a working example. For example:
england-and-walesin UK divisions. Each start is one run. - Download the resultsWhen 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.
This tool is an Apify Actor: a small program that runs on Apify. You can also run it on a schedule, for example every Monday. New to it? Read how it works, step by step and the 8 words you need first.
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 withisSubstituteDay.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).
Who uses it
Finance teams
Find an invoice due date N working days later.
HR and payroll
Import holiday dates for each UK region.
Developers and QA
Get a clean holiday list for tests and calendars.
Price
Pay per event: you pay for each result the tool saves, plus a small start fee for each run. The price includes Apify platform costs. Apify bills you, not us. Prices below are for the Apify free plan.
| 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. |
Examples
- 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. That is enough for about 2,700 calculations.
Prices checked on 24 October 2026. See the current price on Apify.
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.
Details
Step by step on Apify
- Open the Input tab. The form already has List bank holidays, all three divisions and the year 2026.
- Click Start.
- Open the Bank holidays view in the Output tab. Check
division,date,titleandisSubstituteDay. - 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
resultDateandbusinessDays.
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 for better results
- 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 and good to know
- 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
addBusinessDaysfrom −2000 to 2000;startDateandendDateat most 36,600 days apart; dates from 1900 to 2100- Up to 500
extraHolidaysand 50years - 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
ERRORinstead of giving an empty or wrong result
Troubleshooting
| Symptom | Check | Action |
|---|---|---|
A row is partial | coverageWarning, uncoveredYears | The date range reaches a year GOV.UK has not published. Use the result as an estimate, or run again after GOV.UK publishes that year. |
An error row (errorCode: "INVALID_CALCULATION") | statusReason | Fix that calculation, for example the date format YYYY-MM-DD or exactly one of addBusinessDays and endDate. |
No rows in list mode | RUN_SUMMARY.uncoveredRequestedYears, warnings | The years you asked for are not published. Choose a year from coverage. |
| A different date than another tool | division, holidaysSkipped, weekendDays | Check the division (Scotland and Northern Ireland have other holidays) and that the start date is not counted. |
INVALID_INPUT (run failed) | RUN_SUMMARY.message | Common causes: calculate mode without calculations, more than 100 calculations, every calculation is wrong (the free error rows show why), all seven days in weekendDays. Only the start is charged. |
ERROR (run failed) | RUN_SUMMARY.message, warnings, http | GOV.UK did not answer or sent data in an unknown format. No rows are written or charged. Run again later. |
For developers
Sample result
One result from a real test run, in JSON. Real values change from run to run. In Excel or CSV each field is a column.
{
"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. You need your Apify API token from Apify Console → Settings → API & Integrations.
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)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"]}'# 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)The cURL call waits for the results, up to 300 seconds. For longer runs, start a run (/runs) and get the results with a webhook or by checking the run. Apify API docs. LlamaIndex, MCP for AI agents and the JavaScript client: AI agents & MCP.
Data fields (35)
| Field | Type | Meaning |
|---|---|---|
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 (6)
The main fields of the input form. With the API you send them as JSON.
| Setting | Name in the API | Type | Example value |
|---|---|---|---|
| Mode | mode | string | "list" |
| UK divisions | divisions | array | ["england-and-wales", "scotland", "northern-ireland"] |
| Years (list mode) | years | array | [2026] |
| Calculations (calculate mode) | calculations | array | [{"id": "invoice-due", "startDate": "2026-12-24", "addBusinessDays": 10}, {"id": "sla-w… |
| Non-working weekdays | weekendDays | array | ["saturday", "sunday"] |
| Extra holidays (company closures) | extraHolidays | array |
