GOV.UK logo

Open data · Live on Apify

UK Bank Holidays and Business Day Calculator

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.

About $1.81 for 1,000 calculations$0.0018 per calculation + $0.001 per run. One run gives up to 100 calculations. Apify bills you, not us.Free to try: the Apify free plan gives you $5 of usage every month, no credit card needed.

Run it on Apify Opens apify.com, the website where our tools run. Sign up free with Google or email, no card needed.

Apify links on this page are affiliate links. We may earn a commission. You pay the same price. Affiliate disclosure

What you get, for example

recordTypecalculation
calculationIdinvoice-due
divisionengland-and-wales

How to use it: 3 steps

  1. 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.
  2. 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-wales in UK divisions. Each start is one run.
  3. 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 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).

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 forPriceWhen
Start fee$0.001Charged 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
  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
TaskInputYou getKey fields
Invoice or payment due datecalculate + addBusinessDayscalculation rowresultDate, holidaysSkipped, calendarDays
SLA or notice period checkcalculate + endDatecalculation rowbusinessDays, weekendDaysSkipped, holidaysSkippedCount
Scotland vs England datesdivisions (several)one row per divisiondivision, resultDate
Holiday calendar or payroll importlist + yearsholiday rowsdate, title, isSubstituteDay, division
Company with own closure daysextraHolidays, weekendDaysboth modesholidaySource (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
  • 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

Troubleshooting

SymptomCheckAction
A row is partialcoverageWarning, uncoveredYearsThe 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")statusReasonFix that calculation, for example the date format YYYY-MM-DD or exactly one of addBusinessDays and endDate.
No rows in list modeRUN_SUMMARY.uncoveredRequestedYears, warningsThe years you asked for are not published. Choose a year from coverage.
A different date than another tooldivision, holidaysSkipped, weekendDaysCheck the division (Scotland and Northern Ireland have other holidays) and that the start date is not counted.
INVALID_INPUT (run failed)RUN_SUMMARY.messageCommon 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, httpGOV.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.

one 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. You need your Apify API token from Apify Console → Settings → API & Integrations.

Python · apify-client
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
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"]}'
LangChain · langchain-apify
# 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)
FieldTypeMeaning
recordTypestringholiday (list mode) or calculation (calculate mode). Use the Bank holidays / Calculations views.
statusstringcomplete; partial = calculation touches years GOV.UK has not published (see coverageWarning); error = invalid calculation entry (not charged).
statusReasonstringPlain-English reason for partial or error rows; null when complete.
errorCodestringINVALID_CALCULATION for error rows; null otherwise.
calculationIdstringYour id for the calculation, or its 1-based position in the list.
divisionstringGOV.UK division slug. Null only on invalid calculation rows.
divisionNamestringEngland and Wales, Scotland or Northern Ireland.
datestringHoliday date, YYYY-MM-DD.
yearintegerHoliday year.
dayOfWeekstringWeekday of the holiday date.
titlestringHoliday name as published by GOV.UK (or your custom title).
notesstringGOV.UK notes, e.g. "Substitute day"; empty string when none.
isSubstituteDaybooleanTrue when GOV.UK marks the date as a substitute day (the holiday fell on a weekend).
buntingbooleanGOV.UK bunting flag (celebratory holiday). Null for custom holidays.
holidaySourcestringgov.uk = published bank holiday; custom = from your extraHolidays.
sourceUrlstringhttps://www.gov.uk/bank-holidays.json; null for custom holidays.
fetchedAtstringWhen GOV.UK data was fetched (ISO 8601 UTC).
operationstringadd_business_days or count_business_days.
startDatestringStart date (YYYY-MM-DD). Never counted itself.
startDayOfWeekstringWeekday of startDate.
startIsBusinessDaybooleanWhether startDate is a business day in this division.
addBusinessDaysintegerN from the input (add mode); null in count mode.
endDatestringEnd date from the input (count mode); null in add mode.
resultDatestringAdd mode: the date N business days from startDate. Count mode: equals endDate.
resultDayOfWeekstringWeekday of resultDate.
resultIsBusinessDaybooleanWhether resultDate is a business day (count mode end dates may fall on a weekend/holiday).
businessDaysintegerBusiness days from startDate (excluded) to resultDate (included); negative when going back.
calendarDaysintegerresultDate minus startDate in calendar days.
weekendDaysSkippedintegerNon-working weekdays passed over.
holidaysSkippedCountintegerNumber of distinct holiday dates on working weekdays passed over (one date with two titles counts once).
holidaysSkippedarrayHolidays on working weekdays that were excluded: {date, title, source}. Holidays falling on a weekend are counted as weekend days.
weekendDaysarrayNon-working weekdays used for this calculation.
coverageWarningstringSet when part of the range is in a year GOV.UK has not published; only weekends and your extraHolidays were applied there.
uncoveredYearsarrayYears in the range that GOV.UK has not published for this division.
publishedYearsobjectFirst 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.

SettingName in the APITypeExample value
Modemodestring"list"
UK divisionsdivisionsarray["england-and-wales", "scotland", "northern-ireland"]
Years (list mode)yearsarray[2026]
Calculations (calculate mode)calculationsarray[{"id": "invoice-due", "startDate": "2026-12-24", "addBusinessDays": 10}, {"id": "sla-w…
Non-working weekdaysweekendDaysarray["saturday", "sunday"]
Extra holidays (company closures)extraHolidaysarray

Start on Apify

Make a free Apify account: you get $5 of free usage every month. Missing a tool? Suggest it. We read every idea, but we do not promise to build it.

Apify links on this page are affiliate links. We may earn a commission. You pay the same price. Affiliate disclosure