UK Economic Calendar: ONS Release Dates for CPI, GDP & Jobs
Pricing
from $1.40 / 1,000 calendar row returneds
UK Economic Calendar: ONS Release Dates for CPI, GDP & Jobs
Scheduled and past UK statistics releases from the official ONS calendar: title, exact UTC release moment, London date and time, reference period, confirmed or provisional status, cancellations, summary and links. Filter by keyword, status and date window.
Pricing
from $1.40 / 1,000 calendar row returneds
Rating
0.0
(0)
Developer
Samat Makatov
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
2 days ago
Last modified
Categories
Share
Scheduled and past UK statistics releases from the official ONS calendar: title, exact UTC release moment, London date and time, reference period, confirmed or provisional status, cancellations, summary and links. Filter by keyword, status and date window.
Every row is one publication of the Office for National Statistics — what it is called, the period it covers, the exact moment it goes live (in UTC and in UK wall-clock time), whether that date is confirmed or still provisional, and the page it will appear on. About 400 entries are scheduled ahead, 9 000 have already been published and 300 were dropped; you pick a window, a keyword and a status. Built for trading desks, macro researchers, newsrooms, data pipelines and agents that need the UK release schedule as data instead of a web page. Read straight from the publisher's own keyless JSON: no API key, no proxy, no browser. It is a calendar of when, not a feed of how much — actual, forecast and previous figures are not part of this source.
Use cases
- Timing a model or a trade around a print: ask for the next consumer price inflation, GDP and labour market
releases and schedule the refresh on the exact minute —
hoursUntilReleasecounts down,releaseDateUtcis the moment to fire. - Editorial and content calendars: everything ONS publishes in the next 30 days with UK weekday, time and summary, so a newsroom planner or a "what's coming" widget fills itself.
- Pipelines that wait for a file: watch a keyword with
onlyNew: trueon a schedule and get a row only when something changes — a new date, a postponement, or a cancellation that means the file will never arrive. - Agents and chat tools:
mode: "nextRelease"answers "when is the next UK inflation figure" with one row per topic, small enough to hand to a model together withfields. - Event studies and backtests: past releases with
dateFrom/dateTogive the publication moment as it happened, so a study or a replay lines up with the minute the data became public. - Wiring a release to its data: with
includeDetailseach row carries the datasets, bulletins and API datasets that publication points to, the ONS enquiries contact and the next-release date as ONS states it.
Input
Nothing is required. With the defaults a run returns the next 30 scheduled releases of the coming 90 days that match the prefilled keyword.
| Field | Type | Default | Allowed values / notes |
|---|---|---|---|
mode | string | calendar | calendar = one row per release in a window; nextRelease = one row per topic, the next release still ahead. See Modes |
query | string | — (prefilled consumer price inflation) | Free-text keyword over titles and summaries, or a time series ID. Empty = every release in the window. Used in calendar mode |
topics | string[] | — (prefilled CPI / GDP / labour market) | One keyword per topic, one row each. Used in nextRelease mode |
releaseStatus | string | upcoming | upcoming, published, cancelled, all. See Statuses |
confirmation | string | any | any, confirmed, provisional. See Confirmed vs provisional |
dateFrom | string | — | Earliest release date, YYYY-MM-DD, UK calendar date, inclusive |
dateTo | string | — | Latest release date, YYYY-MM-DD, inclusive |
withinDays | integer | 90 | 1–1095. Used only when both dates are empty. See Date windows |
censusOnly | boolean | false | Keep only entries ONS tags as census output (a handful at a time) |
sortOrder | string | soonest | soonest, latest, relevance (needs a keyword) |
includeDetails | boolean | false | One extra request per row for the release page's own data. See Details |
onlyNew | boolean | false | Output only entries not seen by an earlier run with the same filters. See Monitoring with onlyNew |
maxItems | integer | 30 | 1–1000 |
fields | string[] | all | Keep only these output fields, in this order |
Reference
Modes
| Mode | What one row is | Notes |
|---|---|---|
calendar | A release inside the window | Uses query, releaseStatus, confirmation, the dates, censusOnly, sortOrder |
nextRelease | A topic from topics | The next matching release still ahead; date filters do not apply. A topic with nothing scheduled yields a row with found: false and a note instead of disappearing |
Statuses
releaseStatus | Which part of the calendar | Rows today |
|---|---|---|
upcoming | Scheduled, not published yet | ~400 |
published | Already out, back to 2016 | ~9 000 |
cancelled | Dropped from the calendar | ~320 |
all | The three lists merged; each row keeps its own status | — |
Confirmed vs provisional
ONS confirms a date roughly four weeks ahead. Until then the entry carries a provisional date — sometimes a day,
sometimes only a month — and it can still move. isProvisional is the flag, provisionalDateText is the date exactly
as ONS printed it ("19 January 2028 9:30am", "January 2028", or empty). confirmation: "confirmed" keeps the dates
that are safe to plan against, "provisional" keeps the ones worth watching.
Date windows
dateFrom / dateTo are UK calendar dates and both are inclusive. When both are empty, withinDays builds the
window from today:
| Status | Window from withinDays |
|---|---|
upcoming | today → today + N |
published | today − N → today |
cancelled, all | today − N → today + N (cancellations mostly sit in the past) |
The window that was actually used is in the run's status message and in the SUMMARY record. In nextRelease mode
there is no window: it always looks from now to the end of the calendar.
Finding a keyword
The search runs over release titles and summaries and ranks by relevance, so a keyword pulls in neighbours: a
search for consumer price inflation also returns "Consumer trends". Use the wording of a release title
(public sector finances, private rent and house prices, labour market, retail sales, deaths registered), or a
time series ID such as D7G7. In nextRelease mode the topic is ranked against the titles of the matches, including
initials — gross domestic product therefore answers with a "GDP …" release — and the earliest match wins a tie.
Details
includeDetails: true reads each release's own page data and adds nextReleaseText, isNationalStatistic,
isWelshStatistic, contactName, contactEmail, contactTelephone, cancellationNotice, relatedDatasets,
relatedDocuments and relatedApiDatasets. That is one extra request per row, so keep maxItems small. Fields ONS
leaves blank come back as null or an empty list; a release page that cannot be read leaves the calendar fields
untouched and the run says so.
Monitoring with onlyNew
onlyNew remembers release page plus release moment in the actor's own key-value store, one history per filter
set. A rescheduled or postponed release therefore counts as new, and a scheduled task emits exactly the changes to the
calendar. The first run returns everything it finds; a run with nothing new ends successfully with zero rows.
Examples
When do UK price statistics land? (trading desk)
{ "mode": "calendar", "query": "inflation", "releaseStatus": "upcoming", "withinDays": 180, "sortOrder": "soonest", "maxItems": 12 }
Everything ONS publishes in the next 30 days (newsroom planner)
{ "mode": "calendar", "releaseStatus": "upcoming", "withinDays": 30, "sortOrder": "soonest", "maxItems": 40 }
One answer per indicator, for an agent or a dashboard
{ "mode": "nextRelease", "topics": ["consumer price inflation", "gross domestic product", "labour market overview"], "maxItems": 5 }
When did each past release actually go live? (backtest)
{ "mode": "calendar", "query": "public sector finances", "releaseStatus": "published", "dateFrom": "2026-01-01", "dateTo": "2026-08-31", "sortOrder": "latest", "maxItems": 12 }
What is only pencilled in? (long-horizon planning)
{ "mode": "calendar", "releaseStatus": "upcoming", "confirmation": "provisional", "withinDays": 730, "sortOrder": "latest", "maxItems": 20 }
What was dropped from the calendar? (pipeline owner)
{ "mode": "calendar", "releaseStatus": "cancelled", "dateFrom": "2026-01-01", "dateTo": "2026-12-31", "sortOrder": "latest", "maxItems": 15 }
Release → datasets, bulletins and contact (analyst)
{ "mode": "calendar", "query": "private rent and house prices", "releaseStatus": "published", "withinDays": 365, "includeDetails": true, "sortOrder": "latest", "maxItems": 6 }
Output
One real row from a cloud run (query: "inflation", releaseStatus: "upcoming"):
{"releaseTitle": "Consumer price inflation, UK: September 2026","referencePeriod": "September 2026","releaseDateUtc": "2026-10-21T06:00:00.000Z","releaseDateLondon": "2026-10-21","releaseTimeLondon": "07:00","dayOfWeek": "Wednesday","status": "upcoming","isProvisional": false,"provisionalDateText": null,"isPostponed": false,"isCensus": false,"hoursUntilRelease": 652.9,"summary": "Price indices percentage changes and weights for the different measures of consumer price inflation.","dateChanges": [],"uri": "/releases/consumerpriceinflationukseptember2026","url": "https://www.ons.gov.uk/releases/consumerpriceinflationukseptember2026","fetchedAt": "2026-09-24T01:06:13.477Z"}
| Field | Type | Meaning |
|---|---|---|
releaseTitle | string | Title as ONS publishes it |
referencePeriod | string | null | The period the release is about, derived from the title; null when the title carries none |
releaseDateUtc | string | The release moment, ISO 8601 UTC (…Z) |
releaseDateLondon | string | UK calendar date, YYYY-MM-DD (derived) |
releaseTimeLondon | string | UK wall-clock time, HH:MM — in practice 07:00 or 09:30 (derived) |
dayOfWeek | string | Weekday in the UK (derived) |
status | string | upcoming, published or cancelled |
isProvisional | boolean | true while ONS has not confirmed the date |
provisionalDateText | string | null | The provisional date exactly as ONS printed it |
isPostponed | boolean | ONS moved this release |
isCensus | boolean | Tagged as census output |
hoursUntilRelease | number | null | Hours left, one decimal; null for published and cancelled rows |
summary | string | null | The release's own summary line |
dateChanges | array | { previousDateUtc, note } per move, when ONS records one |
matchedTopic | string | nextRelease mode: the topic that produced the row |
found | boolean | nextRelease mode: false on a row that says nothing is scheduled |
uri | string | Path of the release page |
url | string | Full link to the release page |
fetchedAt | string | Run time, ISO 8601 UTC |
With includeDetails: true each row also carries nextReleaseText, isNationalStatistic, isWelshStatistic,
contactName, contactEmail, contactTelephone, cancellationNotice (array), relatedDatasets, relatedDocuments
and relatedApiDatasets (arrays of { title, url }).
A SUMMARY record in the run's key-value store repeats the mode, the window that was used, how many entries the
calendar held for each list, how many rows each filter dropped and the source note.
Dataset views: Release calendar (the table), Still ahead (topic, hours until, weekday, provisional date), Release details (next release, contact, linked datasets and bulletins, date changes).
Use it from code / agents
curl -X POST "https://api.apify.com/v2/acts/yadroo~ons-release-calendar/run-sync-get-dataset-items?token=$APIFY_TOKEN" \-H "Content-Type: application/json" \-d '{"mode":"nextRelease","topics":["consumer price inflation","gross domestic product"],"fields":["matchedTopic","releaseTitle","releaseDateUtc","hoursUntilRelease"],"maxItems":5}'
import { ApifyClient } from 'apify-client';const client = new ApifyClient({ token: process.env.APIFY_TOKEN });const run = await client.actor('yadroo/ons-release-calendar').call({mode: 'calendar',releaseStatus: 'upcoming',withinDays: 30,maxItems: 40,});const { items } = await client.dataset(run.defaultDatasetId).listItems();
from apify_client import ApifyClientclient = ApifyClient(os.environ["APIFY_TOKEN"])run = client.actor("yadroo/ons-release-calendar").call(run_input={"mode": "calendar","query": "public sector finances","releaseStatus": "published","dateFrom": "2026-01-01","dateTo": "2026-08-31","maxItems": 12,})items = client.dataset(run["defaultDatasetId"]).list_items().items
fields trims every row to the keys you name, which keeps a calendar answer small enough to paste into a prompt.
MCP: add https://mcp.apify.com to Claude / Cursor / any MCP client and call the yadroo/ons-release-calendar tool with the same JSON input.
Pricing
Pay per event: $0.001 to start a run plus $0.002 per dataset row on the free tier (lower on paid tiers: $0.0018 bronze, $0.0016 silver, $0.0014 gold and above). Typical runs:
| Run | Rows | Cost |
|---|---|---|
Next release per indicator (nextRelease, 3 topics) | 3 | $0.007 |
| Default run: one keyword, 90 days | 30 | $0.061 |
| A month of the whole calendar | ~60 | $0.121 |
Six published releases with includeDetails | 6 | $0.013 |
Compute is included in practice: the actor runs at 256 MB without a browser, and a calendar run of 30 rows takes a few seconds and one request.
Limits & FAQ
- The schedule, not the numbers. ONS publishes the calendar without actual, forecast or previous values, so those
are not in the output. The figures live in the datasets and bulletins each release links to (
includeDetails). - ONS only. Other UK publishers (the Bank of England, HMRC, DWP, the devolved statistical offices) keep their own calendars and are not in this source, even when ONS links to their data.
- Dates move, and that is the point. Anything more than about four weeks out is usually provisional
(
isProvisional: true); postponements arrive asisPostponedwith the previous date indateChanges. Provisional entries reach roughly two years ahead and no further, so a longer window simply returns fewer rows. provisionalDateTextis often empty. ONS prints it for some provisional entries and not for others. The working moment inreleaseDateUtcis always there.referencePeriodis parsed from the title, because ONS does not publish it as a field. It covers the common shapes (September 2026,April to June 2026,year ending March 2026,2025,week ending 18 September 2026) and staysnullwhen a title carries no period — a missing period rather than an invented one.- Keyword search is relevance-based. It reads titles and summaries, so results can include neighbouring releases;
filter further on
releaseTitleif you need an exact family. This is also whynextReleaseranks the matches against the topic instead of taking the first one. - UK time is derived, never assumed. ONS states the release moment in UTC, which is
08:30Zfor a 09:30 summer release and09:30Zfor the same release in winter.releaseTimeLondonapplies the real daylight-saving rules — do not rebuild it with a fixed offset. - Paging. The list endpoint serves up to 1000 entries per request and the actor stops as soon as
maxItemsrows are collected. Entries sharing a release moment can swap places between pages, so paging is deduplicated by release page. - Empty results are not silent. A run whose filters match nothing ends with a message naming the keyword, window and
status instead of an empty success — except with
onlyNew, where zero rows is the normal "nothing changed" answer. - Beta endpoint. The JSON search lives on a host ONS labels "beta". If its shape changes, the run fails with a message naming the endpoint rather than returning half-filled rows.
- Politeness and blocks. A calendar run makes one request, a detail run one more per row with at most four in
flight. There is no login, no captcha and no anti-bot wall involved;
www.ons.gov.ukserves norobots.txt(it answers 404), so there is nothing to honour there and the actor stays modest anyway. - Licence and credit. The output contains public sector information from the Office for National Statistics,
licensed under the Open Government Licence v3.0. Every row links to the ONS page it came from. The only contact data
is the enquiries mailbox ONS publishes on a release page, and only with
includeDetails.
Made by Yadroo. Sibling actors: bls-release-calendar, world-bank-indicators, uk-planning-applications, sec-company-financials, fx-rates.