# Eurostat Data Revision Monitor (`highbrow_qualification_z7w/eurostat-data-revision-monitor`) Actor

Monitor official Eurostat datasets for revisions, new observations, and structure changes. Get a stateful change feed for GDP and unemployment time series—without building polling, snapshots, and comparison logic.

- **URL**: https://apify.com/highbrow\_qualification\_z7w/eurostat-data-revision-monitor.md
- **Developed by:** [Roman Bublyk](https://apify.com/highbrow_qualification_z7w) (community)
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.001 / actor start

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

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

## Eurostat Data Revision Monitor

**Eurostat data revision monitoring and forward-looking vintage-data history from official APIs.**

Eurostat Data Revision Monitor turns two supported official Eurostat API series into a stateful change feed. It detects new observations, published-value revisions, official observation-flag changes, confidentiality-status changes, and compatible structural changes after a user-defined baseline.

Eurostat's main database serves the latest dataset state. This Actor preserves what changed between its own successful runs, so a team does not have to operate polling, snapshots, comparison logic, state storage, and failure handling in an internal service.

> **MVP scope:** monthly unemployment rate and quarterly GDP growth for up to 20 Eurostat geographies. Revision history starts at the first successful run for each `stateKey`.

### Why this exists

A current-value API response alone cannot answer operational questions such as:

- Was a Eurostat GDP or unemployment observation revised since the last retrieval?
- Is a period genuinely new, or did an existing value or official flag change?
- Did the returned series structure change and put a downstream pipeline at risk?
- Which value did a dashboard, forecast, or backtest use after monitoring began?

This Actor is deliberately not described as a complete historical Eurostat vintage database. It creates a forward-looking, auditable change history for the exact supported series and geographies configured from the baseline onward.

### What it monitors today

| Profile | Official Eurostat dataset | Fixed dimensions | Per-run selection |
|---|---|---|---|
| `monthly_unemployment_rate` | `UNE_RT_M` | `freq=M`, `s_adj=SA`, `age=TOTAL`, `unit=PC_ACT`, `sex=T` | 1–20 `geo` codes; 1–120 monthly periods |
| `quarterly_gdp_growth` | `NAMQ_10_GDP` | `freq=Q`, `unit=CLV_PCH_PRE`, `s_adj=SCA`, `na_item=B1GQ` | 1–20 `geo` codes; 1–120 quarterly periods |

The default geographies are `DE`, `FR`, `IT`, `ES`, and `NL`. See the [API contract](docs/api.md) for input, output, and scheduling semantics.

### Event contract

| Change type | Meaning |
|---|---|
| `BASELINE_OBSERVATION` | Initial state captured on the first successful run for a `stateKey`. |
| `NEW_OBSERVATION` | A new observation appeared after an existing baseline. |
| `OBSERVATION_REVISED` | Value, `OBS_FLAG`, or `CONF_STATUS` changed. |
| `SERIES_STRUCTURE_CHANGED` | The returned SDMX structure fingerprint changed between successful runs. |
| `UNCHANGED` | The observation was checked and did not change; omitted by default. |

Each run also emits `source-health` records and one `run-summary` record. A source retrieval failure is reported in those records; it is **not** emitted as a change event.

### Why use an Actor instead of building it internally?

The official API remains free and is the source of truth. The Actor is an operational layer around it.

| Internal build | Eurostat Data Revision Monitor |
|---|---|
| Build and operate scheduler, snapshots, storage, retry policy, and API diagnostics. | Run on an Apify schedule with managed state and a structured Dataset. |
| Define and test value, flag, metadata, and failure semantics. | Use a documented, stable change-event contract. |
| Risk mistaking a failed response for deleted data. | Failed profiles retain their prior state and report source health; no removal is inferred. |
| Maintain before/after evidence for model, dashboard, or forecast review. | Capture values, flags, dimensions, source URL, retrieval time, and state snapshot ID. |

### Safe monitoring semantics

- The first successful run is a baseline, not retroactive revision history.
- The rolling-lookback MVP intentionally does **not** emit `OBSERVATION_REMOVED`: an older period can simply leave the configured window.
- A profile returning no usable data, an unexpected CSV shape, or a request error does not overwrite its previous state.
- Reuse one `stateKey` only for the same profiles, geographies, and lookback configuration. Use a new key when changing that monitoring scope.
- The Actor compares source changes; it does not explain their economic meaning and is not investment advice.

### SEO and discovery

Relevant search intents include **Eurostat data revisions**, **Eurostat revision history**, **Eurostat vintage data**, **Eurostat API monitoring**, **point-in-time macro data**, **GDP revisions**, **unemployment revisions**, and **macro data backtesting**.

The claim is intentionally narrow: this is a revision-monitoring and forward-looking vintage-data layer, not a replacement for Eurostat's specialised vintage products or a global all-time archive.

### Data source and reuse

The Actor queries official Eurostat SDMX 3.0 dissemination endpoints. Eurostat remains the authoritative publisher. Review applicable Eurostat data-reuse terms and any dataset-level exceptions before commercial redistribution or downstream publication.

### Documentation

- [API contract: inputs, outputs, event semantics, and examples](docs/api.md)
- [MVP architecture and safety invariants](docs/architecture.md)

### Roadmap

1. Expand only after validating each additional profile's dimensions, revision semantics, and source contract.
2. Add further macroeconomic domains without weakening the current state and failure guarantees.
3. Prepare a separately scoped public demonstration repository after production publication.

***

This repository is private development work for the production Actor.

# Actor input Schema

## `profiles` (type: `array`):

Select one or both validated MVP profiles.

## `geos` (type: `array`):

Eurostat geo codes, for example DE, FR, IT, ES, NL. Maximum 20 per run.

## `lookbackPeriods` (type: `integer`):

Latest periods rechecked for revisions per series. 24 means 24 months for unemployment and 24 quarters for GDP.

## `stateKey` (type: `string`):

Reuse the same key on scheduled runs to compare with the prior successful snapshot.

## `onlyChanges` (type: `boolean`):

When enabled, unchanged observations are omitted from the Dataset.

## Actor input object example

```json
{
  "profiles": [
    "monthly_unemployment_rate",
    "quarterly_gdp_growth"
  ],
  "geos": [
    "DE",
    "FR",
    "IT",
    "ES",
    "NL"
  ],
  "lookbackPeriods": 24,
  "stateKey": "default",
  "onlyChanges": true
}
```

# Actor output Schema

## `eventStream` (type: `string`):

Default Dataset containing observation-change-event, series-structure-event, source-health and run-summary records.

## `lastRunSummary` (type: `string`):

Operational outcome of the latest run, including counts and source errors.

## `latestSourceHealth` (type: `string`):

Per-profile retrieval state, observed structure and source URL for the latest run.

# 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 = {};

// Run the Actor and wait for it to finish
const run = await client.actor("highbrow_qualification_z7w/eurostat-data-revision-monitor").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 = {}

# Run the Actor and wait for it to finish
run = client.actor("highbrow_qualification_z7w/eurostat-data-revision-monitor").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 '{}' |
apify call highbrow_qualification_z7w/eurostat-data-revision-monitor --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,highbrow_qualification_z7w/eurostat-data-revision-monitor"
        }
    }
}
```

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/HjPC6pANa5PH8wCx1/builds/gQVblJzXmd3TZN6LF/openapi.json
