Monitly API Documentation

API Overview

Monitly provides one unified API for official statistics and economic indicators from multiple sources (Eurostat, DataBank, national government portals). With one consistent JSON format and a single set of filters, you can query up-to-date data and integrate it directly into your products — all through one API family.

Endpoints

GET/api/datasets
List datasets

Returns lightweight catalog with only id, dataset_name, last_update.

Request
GET /api/datasets
Example
GET /api/datasets?country=PL
Response
{
  "data": [
    {
      "id": 168,
      "dataset_name": "House price index (2015 = 100) - quarterly data",
      "last_update": "2025-07-04T11:00:00+0200"
    }
  ],
  "pagination": { "page": 0, "limit": 100, "total": 1234, "hasMore": true }
}
GET/api/datasets/:id
Dataset details + wide data

Returns dataset (selected fields; no nulls) and data in organized wide format: per series block with countries and rows [{ period, values, unit? }].

Request
GET /api/datasets/:id
Example
GET /api/datasets/2973
Response
{
  "dataset": { "id": 2973, "dataset_code": "lfsi_long_q", "dataset_name": "Labour market transitions - quarterly data", "last_update": "2025-06-12", "source_name": "Eurostat" },
  "data": [
    { "series_key": { "dim1_value": "Quarterly", "dim2_value": "Current prices, ..." }, "countries": ["Austria","Poland"], "rows": [{ "period": "Q1/1995", "values": { "Austria": 41537.8, "Poland": 79099.8 } }] }
  ]
}
GET/api/datasets/:id/meta
Dataset metadata only

Returns only dataset metadata: id, dataset_code, dataset_name, description, source_name, source_url, metadata_url, version, dim1_label..dim8_label, oldest_period, latest_period, last_update, available_geo. Null keys are omitted.

Request
GET /api/datasets/:id/meta
Example
GET /api/datasets/2973/meta
Response
{
  "id": 2973,
  "dataset_code": "lfsi_long_q",
  "dataset_name": "Labour market transitions - quarterly data",
  "description": "...",
  "source_name": "Eurostat",
  "source_url": "https://ec.europa.eu/eurostat/...",
  "metadata_url": "https://ec.europa.eu/eurostat/...",
  "version": "1.0",
  "dim1_label": "Time frequency",
  "dim2_label": "Unit of measure",
  "dim3_label": "Seasonal adjustment",
  "dim4_label": "National accounts indicator",
  "oldest_period": "Q1/1995",
  "latest_period": "Q2/2025",
  "last_update": "2025-06-12",
  "available_geo": ["EU27_2020", "PL", "AT"]
}
GET/api/datasets/:id/latest
Latest period data only

Returns only the most recent data point for the dataset with countries and dimensions. Optimized for getting the latest available data without filtering through historical periods.

Request
GET /api/datasets/:id/latest
Response
{
  "dataset": {
    "id": 2973,
    "name": "Labour market transitions - quarterly data",
    "source": "Eurostat",
    "dimensions": {
      "dim1_label": "Time frequency",
      "dim2_label": "Unit of measure",
      "dim3_label": "Seasonal adjustment",
      "dim4_label": "National accounts indicator"
    }
  },
  "latest_period": {
    "period": "Q2/2025",
    "countries": {
      "Austria": "41537.8",
      "Poland": "79099.8",
      "Germany": "125000.0"
    },
    "dimensions": {
      "dim1_value": "Quarterly",
      "dim2_value": "Current prices, million units of national currency",
      "dim3_value": "Seasonally and calendar adjusted data",
      "dim4_value": "Gross domestic product at market prices"
    }
  }
}
GET/api/datasets/:id/data
Filtered data
Query params
  • dim1..dim8: exact labels from dataset (repeat param for multiple values)
  • country: repeat for multiple (e.g. country=Austria&country=Poland)
  • period_from, period_to: e.g. Q1/1995 (URL-encoded)
Request
GET /api/datasets/:id/data?dim1=Quarterly
Example
GET /api/datasets/4720/data?dim1=Quarterly&country=Austria&country=Poland
Response
{
  "data": [
    { "series_key": { "dim1_value": "Quarterly" }, "countries": ["Austria","Poland"], "rows": [{ "period": "Q1/1995", "values": { "Austria": 41537.8, "Poland": 79099.8 } }] }
  ],
  "meta": {
    "id": 2973,
    "dataset_code": "lfsi_long_q",
    "dataset_name": "Labour market transitions - quarterly data",
    "description": "...",
    "source_name": "Eurostat",
    "source_url": "https://ec.europa.eu/eurostat/...",
    "metadata_url": "https://ec.europa.eu/eurostat/...",
    "version": "1.0",
    "dim1_label": "Time frequency",
    "oldest_period": "Q1/1995",
    "latest_period": "Q2/2025",
    "last_update": "2025-06-12"
  }
}
POST/api/charts/generate-png
Generate chart PNG

Generates a PNG image of a chart from dataset data. Supports line charts, bar charts, and world maps with customizable styling and dimensions.

Chart Types
  • "line" - Time series with smooth curves
  • "bar" - Categorical data comparison
  • "map" - World choropleth maps
  • "horizontal-bar" - Country comparison through horizontal bars
Customization Options
  • seriesColors - Custom colors per series
  • customLegendLabels - Custom series names
  • customTitle - Override chart title
  • width/height - Image dimensions
  • includeTitle/includeSource - Show/hide title and source
  • highlightLatest - Highlight latest data point in red
  • showValues/showBorders - Map options
  • showLegend - Show/hide map legend (default: true)
  • includeDate - Include date in map title (default: true)
  • mapLocation - Force map region: "europe", "asia", "africa", "north-america", "south-america", "oceania".
  • additionalText - Additional text displayed on the left side of the map
  • mapTransform - Map positioning: {"x": 0, "y": 0, "scale": 1} (translate and scale map)
  • format - Response format: "json" (base64), "png" (returns PNG URL + base64), or "jpeg" (returns JPEG URL + base64)
Note: If colors, radius, borders, etc. are not specified, the API will use your organization's chart settings as fallback.
Request
POST /api/charts/generate-png
Example
{
  "datasetId": 2973,
  "chartType": "line",
  "selectedDimensions": {
    "country": ["Austria", "Poland"]
  },
  "seriesColors": {
    "Austria": "#ff6b6b",
    "Poland": "#4ecdc4"
  },
  "customTitle": "GDP Growth Comparison",
  "width": 800,
  "height": 400,
  "format": "json",
  "highlightLatest": false
}
Response
{
  "success": true,
  "base64": "iVBORw0KGgoAAAANSUhEUgAA..."
}
Response Preview
House Price Index Map Preview
The API returns a base64-encoded or ready-to-use PNG/JPEG image that can be directly embedded in web pages or saved as a file.

Conventions

Pagination
page, limit, hasMore
  • page: 0-based.
  • limit: default 100 per page (recommended ≤ 1000).
  • Always sorted by id ascending.
  • Response includes pagination: { page, limit, total, hasMore }.
URL examples
GET /api/datasets?page=0&limit=100
GET /api/datasets?page=2&limit=100
Auth & rate limits
API keys
  • Public endpoints; CORS enabled.
  • Unauthenticated users: 3 requests/day.
  • Registered users: 10 requests/day.
  • Pro accounts: unlimited.
Using your API key
X-API-Key: <your_api_key>
Content-Type: application/json

Errors

400Bad Request
Invalid parameters

Invalid request parameters or malformed data.

Response
{
  "statusCode": 400,
  "statusMessage": "Dataset ID is required"
}
401Unauthorized
Invalid API key

Invalid or missing API key.

Response
{
  "statusCode": 401,
  "statusMessage": "Invalid API key"
}
404Not Found
Resource not found

Dataset or resource not found.

Response
{
  "statusCode": 404,
  "statusMessage": "Dataset not found"
}
429Rate Limit Exceeded
Daily limit exceeded

Daily API request limit exceeded. Limits reset at midnight UTC.

Response
{
  "statusCode": 429,
  "statusMessage": "Daily API limit exceeded. Limit: 3 requests per day. Upgrade to Pro for unlimited access."
}
Daily Limits:
  • Anonymous users: 3 requests/day
  • Registered users: 10 requests/day
  • Pro accounts: Unlimited
500Server Error
Internal error

Internal server error or database connection issue.

Response
{
  "statusCode": 500,
  "statusMessage": "Internal server error"
}

Filters

Dimensions
dim1..dim8
  • Exact label match (case-sensitive).
  • Multiple values: repeat the parameter (e.g. dim1=Quarterly&dim1=Annual).
  • Encode commas/spaces, e.g. Current%20prices%2C%20million%20units....
GET /api/datasets/4720/data?dim1=Quarterly
GET /api/datasets/4720/data?dim1=Quarterly&dim1=Annual
GET /api/datasets/4720/data?dim2=Current%20prices%2C%20million%20units%20of%20national%20currency
Countries
country
  • Repeat country to select multiple.
  • Names must match dataset labels.
  • Also available on /api/datasets to filter catalog by available countries (e.g. ?country=PL).
GET /api/datasets/4720/data?country=Austria&country=Poland
GET /api/datasets?country=PL
Periods
period_from, period_to, latest
  • Yearly (1995), quarterly (Q1/1995), monthly (01/2000) as present in dataset.
  • Inclusive range: period_from, period_to.
  • Latest period only: latest=true (returns only the most recent data point).
  • Encode slashes: Q1%2F1995.
GET /api/datasets/4720/data?period_from=Q1%2F1995&period_to=Q1%2F2025
GET /api/datasets/4720/data?period_from=1995&period_to=2010
GET /api/datasets/4720/latest
Followed Data
followed

Filter data to only include dimensions and countries that your organization is tracking.

  • Automatically applies organization's tracked dimensions and countries
  • Works with period filters (period_from, period_to)
GET /api/datasets/4720/data?followed=true
GET /api/datasets/4720/data?followed=true&period_from=2020
Combined
All filters

Combine dimensions, countries, period range, and followed data to narrow results.

GET /api/datasets/4720/data
  ?followed=true
  &dim1=Quarterly
  &dim2=Current%20prices%2C%20million%20units%20of%20national%20currency
  &country=Austria&country=Poland
  &period_from=Q1%2F1995&period_to=Q1%2F2025