# UK Economic Calendar: ONS Release Dates for CPI, GDP & Jobs (`yadroo/ons-release-calendar`) Actor

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.

- **URL**: https://apify.com/yadroo/ons-release-calendar.md
- **Developed by:** [Samat Makatov](https://apify.com/yadroo) (community)
- **Categories:** Business, News, Developer tools
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.40 / 1,000 calendar row returneds

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

## 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.

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 — `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 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](#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](#statuses) |
| `confirmation` | string | `any` | `any`, `confirmed`, `provisional`. See [Confirmed vs provisional](#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](#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](#details) |
| `onlyNew` | boolean | `false` | Output only entries not seen by an earlier run with the same filters. See [Monitoring with onlyNew](#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)**

```json
{ "mode": "calendar", "query": "inflation", "releaseStatus": "upcoming", "withinDays": 180, "sortOrder": "soonest", "maxItems": 12 }
```

**Everything ONS publishes in the next 30 days (newsroom planner)**

```json
{ "mode": "calendar", "releaseStatus": "upcoming", "withinDays": 30, "sortOrder": "soonest", "maxItems": 40 }
```

**One answer per indicator, for an agent or a dashboard**

```json
{ "mode": "nextRelease", "topics": ["consumer price inflation", "gross domestic product", "labour market overview"], "maxItems": 5 }
```

**When did each past release actually go live? (backtest)**

```json
{ "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)**

```json
{ "mode": "calendar", "releaseStatus": "upcoming", "confirmation": "provisional", "withinDays": 730, "sortOrder": "latest", "maxItems": 20 }
```

**What was dropped from the calendar? (pipeline owner)**

```json
{ "mode": "calendar", "releaseStatus": "cancelled", "dateFrom": "2026-01-01", "dateTo": "2026-12-31", "sortOrder": "latest", "maxItems": 15 }
```

**Release → datasets, bulletins and contact (analyst)**

```json
{ "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"`):

```json
{
  "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

```bash
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}'
```

```js
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();
```

```python
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 (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 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. 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.uk` serves no `robots.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](https://apify.com/yadroo/bls-release-calendar),
[world-bank-indicators](https://apify.com/yadroo/world-bank-indicators),
[uk-planning-applications](https://apify.com/yadroo/uk-planning-applications),
[sec-company-financials](https://apify.com/yadroo/sec-company-financials),
[fx-rates](https://apify.com/yadroo/fx-rates).

# Actor input Schema

## `mode` (type: `string`):

`calendar` lists releases in the selected window, newest or soonest first. `nextRelease` answers "when is the next one" for each entry of `topics`: one row per topic, the earliest release still ahead that matches it. Date filters are ignored in `nextRelease`.

## `query` (type: `string`):

Free-text search over release titles and summaries, e.g. "consumer price inflation", "gross domestic product", "public sector finances", or a time series ID such as "D7G7". Empty = every release in the window. Used in `calendar` mode.

## `topics` (type: `array`):

One keyword per topic; each returns one row — the next release still ahead that matches it. A topic that has nothing scheduled returns a row with `found: false` instead of disappearing. Used in `nextRelease` mode.

## `releaseStatus` (type: `string`):

Which part of the calendar to read. `all` reads the three lists and merges them; every row says which one it came from in `status`.

## `confirmation` (type: `string`):

ONS confirms a date about four weeks ahead; entries further out carry a provisional date (a month, sometimes a day) that can still move. `confirmed` keeps only finalised entries — the ones safe to trade or publish against; `provisional` keeps the rest, useful for planning the year ahead.

## `dateFrom` (type: `string`):

Earliest release date, YYYY-MM-DD. Set `dateFrom` and `dateTo` to read a fixed window, e.g. past releases of one bulletin. Leave both empty to use `withinDays`.

## `dateTo` (type: `string`):

Latest release date, YYYY-MM-DD. Provisional entries reach roughly two years ahead; a window beyond that simply returns fewer rows and the run says so.

## `withinDays` (type: `integer`):

Used only when `dateFrom` and `dateTo` are both empty: the next N days for `upcoming`, the last N days for `published`, and N days either side of today for `cancelled` and `all` (ONS keeps a cancelled entry on the calendar long after the date it was due). 30 for a monthly planning run, 730 to see every provisional date ONS has pencilled in.

## `censusOnly` (type: `boolean`):

Keep only releases ONS tags as census output. Off by default; the calendar holds a few of them at a time.

## `sortOrder` (type: `string`):

`relevance` only makes sense together with a keyword. `nextRelease` always sorts its own matches by release moment.

## `includeDetails` (type: `boolean`):

Fetch each release's own page data for the next-release text, the accredited-official-statistics flag, the ONS enquiries contact, cancellation and date-change notices and the linked datasets, bulletins and API datasets. One extra request per row, so keep `maxItems` small when this is on.

## `onlyNew` (type: `boolean`):

Remember release page plus release moment in this actor's key-value store and output only entries missing from the previous run. A rescheduled or postponed release counts as new, so a scheduled task emits exactly the calendar changes. The first run outputs everything it finds.

## `maxItems` (type: `integer`):

Stop after this many rows. The whole upcoming list is about 400 entries; a month of it is about 60.

## `fields` (type: `array`):

Keep only these output fields, in this order, e.g. \["releaseTitle", "releaseDateUtc", "isProvisional"]. Empty = all fields of the mode.

## Actor input object example

```json
{
  "mode": "calendar",
  "query": "consumer price inflation",
  "topics": [
    "consumer price inflation",
    "gross domestic product",
    "labour market overview"
  ],
  "releaseStatus": "upcoming",
  "confirmation": "any",
  "withinDays": 90,
  "censusOnly": false,
  "sortOrder": "soonest",
  "includeDetails": false,
  "onlyNew": false,
  "maxItems": 30
}
```

# Actor output Schema

## `results` (type: `string`):

No description

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "query": "consumer price inflation",
    "topics": [
        "consumer price inflation",
        "gross domestic product",
        "labour market overview"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("yadroo/ons-release-calendar").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {
    "query": "consumer price inflation",
    "topics": [
        "consumer price inflation",
        "gross domestic product",
        "labour market overview",
    ],
}

# Run the Actor and wait for it to finish
run = client.actor("yadroo/ons-release-calendar").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "query": "consumer price inflation",
  "topics": [
    "consumer price inflation",
    "gross domestic product",
    "labour market overview"
  ]
}' |
apify call yadroo/ons-release-calendar --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,yadroo/ons-release-calendar"
        }
    }
}
```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/AskcVAgo6Nz3IcErI/builds/ehmWPCaqlhvzAhz1n/openapi.json
