UK Economic Calendar: ONS Release Dates for CPI, GDP & Jobs avatar

UK Economic Calendar: ONS Release Dates for CPI, GDP & Jobs

Pricing

from $1.40 / 1,000 calendar row returneds

Go to Apify Store
UK Economic Calendar: ONS Release Dates for CPI, GDP & Jobs

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

Samat Makatov

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

4 days ago

Last modified

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, over 9 000 have already been published (back to February 2016) 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.

Need it tailored to your workflow? Missing a field, a filter, another source or a different output format? Open an issue and describe what you need — we read every request and adapt the actor.

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 — hoursUntilRelease counts down, releaseDateUtc is 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: true on 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 with fields.
  • Event studies and backtests: past releases with dateFrom/dateTo give 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 includeDetails each 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. The Console form prefills the keyword consumer price inflation; an API call without query reads every release in the window.

FieldTypeDefaultAllowed values / notes
modestringcalendarcalendar = one row per release in a window; nextRelease = one row per topic, the next release still ahead. See Modes
querystring— (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
topicsstring[]— (prefilled CPI / GDP / labour market)One keyword per topic, one row each. Used in nextRelease mode
releaseStatusstringupcomingupcoming, published, cancelled, all. See Statuses
confirmationstringanyany, confirmed, provisional. See Confirmed vs provisional
dateFromstring—Earliest release date, YYYY-MM-DD, UK calendar date, inclusive
dateTostring—Latest release date, YYYY-MM-DD, inclusive
withinDaysinteger901–1095. Used only when both dates are empty. See Date windows
censusOnlybooleanfalseKeep only entries ONS tags as census output (a handful at a time)
sortOrderstringsoonestsoonest, latest, relevance (needs a keyword)
includeDetailsbooleanfalseOne extra request per row for the release page's own data, no extra charge; caps maxItems at 200. See Details
onlyNewbooleanfalseOutput only entries no earlier run with the same filters (window included) delivered. See Monitoring with onlyNew
maxItemsinteger301–1000 (200 with includeDetails); with onlyNew, new rows only
fieldsstring[]allKeep only these output fields, in this order. releaseTitle (calendar) or matchedTopic + found (nextRelease) always stay. A name that is not an output field is reported and skipped; a list with none at all stops the run

Reference

Modes

ModeWhat one row isNotes
calendarA release inside the windowUses query, releaseStatus, confirmation, the dates, censusOnly, sortOrder
nextReleaseA topic from topicsThe 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

releaseStatusWhich part of the calendarRows today
upcomingScheduled, not published yet~400
publishedAlready out, back to February 2016~9 100
cancelledDropped from the calendar~320
allThe 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:

StatusWindow from withinDays
upcomingtoday → today + N
publishedtoday − N → today
cancelled, alltoday − 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, and the run keeps to the ONS bot policy (200 requests a minute per client): request starts at least 400 ms apart, at most two in flight, and a Retry-After from ONS pauses every request, not only the one that got it. A details run therefore takes about half a second per row and is capped at 200 rows (maxItems above 200 is lowered, and the run says so). Details add no charge: a row with details is billed as one row, like any other. 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. If ONS asks the run to pause for longer than it has left (a block can last up to an hour), the run stops reading release pages, keeps the rows it has finished and says so in its status.

Monitoring with onlyNew

onlyNew remembers release page plus release moment in a key-value store of your account (ons-release-calendar-state), one history per filter set — keyword, status, confirmation, census filter, topics and the date window (withinDays: 7 and withinDays: 365 are two histories). A rescheduled or postponed release therefore counts as new, and a scheduled task emits exactly the changes to the calendar. Entries delivered before do not count towards maxItems: the run pages on until it has maxItems new rows or the list ends. Only rows that were really stored are remembered, so a run cut short by your spending limit or the timeout leaves the rest for the next run. The first run returns everything it finds; a run with nothing new ends successfully with zero rows. A nextRelease topic with nothing scheduled is reported once (found: false) and again only after a release for it has turned up.

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 }

Past, scheduled and dropped in one table (data engineer)

{ "mode": "calendar", "query": "labour market", "releaseStatus": "all", "withinDays": 400, "sortOrder": "latest", "maxItems": 12 }

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"
}
FieldTypeMeaning
releaseTitlestringTitle as ONS publishes it
referencePeriodstring | nullThe period the release is about, derived from the title; null when the title carries none
releaseDateUtcstringThe release moment, ISO 8601 UTC (…Z)
releaseDateLondonstringUK calendar date, YYYY-MM-DD (derived)
releaseTimeLondonstringUK wall-clock time, HH:MM — in practice 07:00 or 09:30 (derived)
dayOfWeekstringWeekday in the UK (derived)
statusstringupcoming, published or cancelled
isProvisionalbooleantrue while ONS has not confirmed the date
provisionalDateTextstring | nullThe provisional date exactly as ONS printed it
isPostponedbooleanONS moved this release
isCensusbooleanTagged as census output
hoursUntilReleasenumber | nullHours left, one decimal; null for published and cancelled rows
summarystring | nullThe release's own summary line
dateChangesarray{ previousDateUtc, note } per move, when ONS records one
matchedTopicstringnextRelease mode: the topic that produced the row
foundbooleannextRelease mode: false on a row that says nothing is scheduled
uristringPath of the release page
urlstringFull link to the release page
fetchedAtstringRun 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 (hours until, weekday, provisional date), Next release per topic (the nextRelease answer: topic, found, release, moment, note), Release details (next release, contact, linked datasets and bulletins, date changes). The run's output links the dataset items and the SUMMARY record.

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 ApifyClient
client = 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. Bronze −10 %, Silver −20 %, Gold and above −30 % on the row price ($0.0018 / $0.0016 / $0.0014); the start event is the same on every plan; platform usage is included. includeDetails adds no charge of its own — a row with details is one row. Typical runs:

RunRowsCost
Next release per indicator (nextRelease, 3 topics)3$0.007
Default run: one keyword, 90 days30$0.061
A month of the whole calendar~60$0.121
Six published releases with includeDetails6$0.013

A calendar run of 30 rows takes a few seconds and one request; it runs at 256 MB without a browser. Set Maximum cost per run and the run stops there: it never stores a row you have not paid for, and the status says "Stopped at your spending limit: N rows delivered".

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 as isPostponed with the previous date in dateChanges. Provisional entries reach roughly two years ahead and no further, so a longer window simply returns fewer rows.
  • provisionalDateText is often empty. ONS prints it for some provisional entries and not for others. The working moment in releaseDateUtc is always there.
  • referencePeriod is 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 stays null when 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 releaseTitle if you need an exact family. This is also why nextRelease ranks 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:30Z for a 09:30 summer release and 09:30Z for the same release in winter. releaseTimeLondon applies 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 maxItems rows are collected (with onlyNew, maxItems new rows). 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 valid filters match nothing in the window ends successfully with zero rows and a status naming the keyword, window and filters, with what to widen. A keyword that matches no ONS release at all — in any list, at any date — is almost surely misspelt: that run fails and says so. With onlyNew, zero rows is the normal "nothing changed" answer.
  • Spending limit and timeout. Rows are stored and billed as they are read. At your maximum cost per run the run stops with "Stopped at your spending limit: N rows delivered"; near the run timeout it stops starting new requests, keeps what it has read and ends with "Stopped before the run timeout". Either way it ends SUCCEEDED and the SUMMARY record has the counts.
  • 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 per 1000 entries, a detail run one more per row. Every request identifies the actor in its User-Agent, as the ONS bot policy asks, and keeps to its pace (at most 150 a minute, two in flight, Retry-After honoured by all of them); no proxy, no browser disguise. There is no login, no captcha and no anti-bot wall involved; www.ons.gov.uk serves no robots.txt (it answers 404).
  • 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.