Search ILOSTAT labour indicators, query and compare series, build country profiles, run SQL.
Maintain this server? Claim it
Call this server's tools from your browser. Nothing to install.
Requests go through mcptry because browsers can't call most MCP servers directly. Header values are sent to the server for that request only and are never stored or logged.
Tool list from our last check. Connect live to refresh it.
Compare reference areas on one ILOSTAT dataset and one slice — a sex code plus breakdown codes, defaulting to the dataset's totals — giving each area's value at a common period or at its latest non-projected period, optional change over N years, and a rank, with each value's period, source, status, and basis (reported, modelled_estimate, or projection). A change carries the earlier value's source, basis, status, and notes, and flags whether the source or basis differs or the series breaks between the two values. Areas without a value are listed separately with the reason, and the response flags mixed periods and mixed bases rather than hiding them. Select areas by code list, by group (X01 for every country, an ILO region or subregion, or a World Bank income group), or both; X-coded aggregates require a dataset with aggregates.
One dataset ID (UNE_DEAP_SEX_AGE_RT_A), as ilostat_search_indicators returns it; case-insensitive, a DF_ prefix (the SDMX dataflow form) stripped, a bare indicator code resolved when it has one frequency.
Sex code SEX_T, SEX_M, SEX_F, or SEX_O; T/M/F/O and total/both/male/female/other are accepted. Defaults to SEX_T on a dataset with a sex breakdown; refused on one without.
Row order: value_desc (default), value_asc, or ref_area. rank is always by value, highest first.
A common period, YYYY, YYYYQn, or YYYYMmm matching the dataset frequency (2024-Q2 and 2025-03 are normalized). Omit to compare each area at its latest period.
First breakdown code, case-insensitive. Defaults to the dataset's total code; required when the breakdown has no total (deciles); refused on a dataset without the breakdown. ilostat_describe_indicator lists the dataset's codes and marks its totals.
Second breakdown code; same defaults and rules as classif1.
Reference areas (up to 300): ISO3 codes (USA) or X-coded aggregates (X01 World); case-insensitive, ILO_GEO_ forms accepted. At least one of ref_areas or area_group is required.
X01 for every country, an ILO region or subregion, or a World Bank income group (X06, X56, X02, …); expands to its member countries. The group's own aggregate is compared only when listed in ref_areas. ilostat_list_reference topic area_groups lists the codes.
Adds each value's change from the same sub-period this many years earlier, in the dataset unit.
Latest mode: an area's latest value must fall within this many years of the current year.
Latest mode: let projections (ILO modelled values after the cutoff) be an area's latest value.
Compare reference areas on one ILOSTAT dataset and one slice — a sex code plus breakdown codes, defaulting to the dataset's totals — giving each area's value at a common period or at its latest non-projected period, optional change over N years, and a rank, with each value's period, source, status, and basis (reported, modelled_estimate, or projection). A change carries the earlier value's source, basis, status, and notes, and flags whether the source or basis differs or the series breaks between the two values. Areas without a value are listed separately with the reason, and the response flags mixed periods and mixed bases rather than hiding them. Select areas by code list, by group (X01 for every country, an ILO region or subregion, or a World Bank income group), or both; X-coded aggregates require a dataset with aggregates.
| Argument | Type | Description |
|---|---|---|
| sex | string | Sex code SEX_T, SEX_M, SEX_F, or SEX_O; T/M/F/O and total/both/male/female/other are accepted. Defaults to SEX_T on a dataset with a sex breakdown; refused on one without. |
| sort | string | Row order: value_desc (default), value_asc, or ref_area. rank is always by value, highest first. |
| period | string | A common period, YYYY, YYYYQn, or YYYYMmm matching the dataset frequency (2024-Q2 and 2025-03 are normalized). Omit to compare each area at its latest period. |
| classif1 | string | First breakdown code, case-insensitive. Defaults to the dataset's total code; required when the breakdown has no total (deciles); refused on a dataset without the breakdown. ilostat_describe_indicator lists the dataset's codes and marks its totals. |
| classif2 | string | Second breakdown code; same defaults and rules as classif1. |
| ref_areas | array | Reference areas (up to 300): ISO3 codes (USA) or X-coded aggregates (X01 World); case-insensitive, ILO_GEO_ forms accepted. At least one of ref_areas or area_group is required. |
| area_group | string | X01 for every country, an ILO region or subregion, or a World Bank income group (X06, X56, X02, …); expands to its member countries. The group's own aggregate is compared only when listed in ref_areas. ilostat_list_reference topic area_groups lists the codes. |
| dataset_id* | string | One dataset ID (UNE_DEAP_SEX_AGE_RT_A), as ilostat_search_indicators returns it; case-insensitive, a DF_ prefix (the SDMX dataflow form) stripped, a bare indicator code resolved when it has one frequency. |
| change_years | integer | Adds each value's change from the same sub-period this many years earlier, in the dataset unit. |
| lookback_years | integer | Latest mode: an area's latest value must fall within this many years of the current year. |
| include_projections | boolean | Latest mode: let projections (ILO modelled values after the cutoff) be an area's latest value. |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"dataset_id"
],
"properties": {
"sex": {
"enum": [
"SEX_T",
"SEX_M",
"SEX_F",
"SEX_O"
],
"type": "string",
"description": "Sex code SEX_T, SEX_M, SEX_F, or SEX_O; T/M/F/O and total/both/male/female/other are accepted. Defaults to SEX_T on a dataset with a sex breakdown; refused on one without."
},
"sort": {
"enum": [
"value_desc",
"value_asc",
"ref_area"
],
"type": "string",
"default": "value_desc",
"description": "Row order: value_desc (default), value_asc, or ref_area. rank is always by value, highest first."
},
"period": {
"type": "string",
"pattern": "^\\d{4}(Q[1-4]|M(0[1-9]|1[0-2]))?$",
"description": "A common period, YYYY, YYYYQn, or YYYYMmm matching the dataset frequency (2024-Q2 and 2025-03 are normalized). Omit to compare each area at its latest period."
},
"classif1": {
"type": "string",
"maxLength": 64,
"description": "First breakdown code, case-insensitive. Defaults to the dataset's total code; required when the breakdown has no total (deciles); refused on a dataset without the breakdown. ilostat_describe_indicator lists the dataset's codes and marks its totals."
},
"classif2": {
"type": "string",
"maxLength": 64,
"description": "Second breakdown code; same defaults and rules as classif1."
},
"ref_areas": {
"type": "array",
"items": {
"type": "string",
"pattern": "^[A-Z0-9]{3}$"
},
"maxItems": 300,
"description": "Reference areas (up to 300): ISO3 codes (USA) or X-coded aggregates (X01 World); case-insensitive, ILO_GEO_ forms accepted. At least one of ref_areas or area_group is required."
},
"area_group": {
"type": "string",
"pattern": "^[A-Z0-9]{3}$",
"description": "X01 for every country, an ILO region or subregion, or a World Bank income group (X06, X56, X02, …); expands to its member countries. The group's own aggregate is compared only when listed in ref_areas. ilostat_list_reference topic area_groups lists the codes."
},
"dataset_id": {
"type": "string",
"pattern": "^[A-Z0-9_]+$",
"maxLength": 64,
"description": "One dataset ID (UNE_DEAP_SEX_AGE_RT_A), as ilostat_search_indicators returns it; case-insensitive, a DF_ prefix (the SDMX dataflow form) stripped, a bare indicator code resolved when it has one frequency."
},
"change_years": {
"type": "integer",
"maximum": 30,
"minimum": 1,
"description": "Adds each value's change from the same sub-period this many years earlier, in the dataset unit."
},
"lookback_years": {
"type": "integer",
"default": 10,
"maximum": 50,
"minimum": 1,
"description": "Latest mode: an area's latest value must fall within this many years of the current year."
},
"include_projections": {
"type": "boolean",
"default": false,
"description": "Latest mode: let projections (ILO modelled values after the cutoff) be an area's latest value."
}
},
"additionalProperties": false
}Describe the df_<id> dataframes staged by ilostat_query_indicator and ilostat_compare_geographies or stored by ilostat_dataframe_query register_as: the tool and parameters that produced each, the datasets it holds (label, last update, and the unit with its measure, type, and multiplier — values stay in the published scale the multiplier names), coverage, basis counts, attribution, creation and expiry times, row count, and column schema. Pass name for one dataframe. Without it, every staged dataframe is listed, except on a deployment whose callers share one canvas, where listing is off and only the exact name works. Read the schema here before writing SQL for ilostat_dataframe_query.
| Argument | Type | Description |
|---|---|---|
| name | string | One dataframe name as the producing tool returned it (df_XXXXX_XXXXX: letters and digits, five in each part; case-insensitive, as in SQL). Omit to list every staged dataframe; a deployment whose callers share one canvas refuses the listing and needs the name. |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"properties": {
"name": {
"type": "string",
"pattern": "^df_[A-Z0-9]{5}_[A-Z0-9]{5}$",
"description": "One dataframe name as the producing tool returned it (df_XXXXX_XXXXX: letters and digits, five in each part; case-insensitive, as in SQL). Omit to list every staged dataframe; a deployment whose callers share one canvas refuses the listing and needs the name."
}
},
"additionalProperties": false
}Run a single-statement SELECT against the df_<id> dataframes staged by ilostat_query_indicator and ilostat_compare_geographies or stored by an earlier register_as. Inspect a dataframe with ilostat_dataframe_describe first; its column schema is what the SQL has to match. Read-only: writes, DDL, DROP, COPY, PRAGMA, ATTACH, file references, file-reading table functions, and functions that read engine settings or name a table from a string are rejected, and system catalogs (information_schema, pg_catalog, sqlite_master, duckdb_*) are denied. Breakdown versions overlap (AGE_YTHADULT_*, AGE_AGGREGATE_*, AGE_10YRBANDS_*), so filter to one version before summing. Optional register_as stores the result as a new dataframe with a fresh TTL.
| Argument | Type | Description |
|---|---|---|
| sql* | string | One SELECT over df_<id> tables (DuckDB SQL: joins, aggregates, window functions, CTEs), at most 20,000 characters. BIGINT results such as COUNT or SUM of integers serialize as strings; CAST to DOUBLE for inline arithmetic. |
| preview | integer | Rows returned inline; defaults to row_limit, and a larger value is applied as row_limit. Inline rows also stop at a size budget (applied_limits.preview_chars). Set lower when register_as keeps the full result. |
| row_limit | integer | Cap on rows materialized; defaults to 1,000, or the per-call cap when that is lower. The per-call cap is 10,000, or the lower cap the deployment sets; a larger value, up to 1,000,000, is applied as that cap. A query matching more stops at the cap and row_count_capped is true; register_as keeps the full result. |
| register_as | string |
Explain one ILOSTAT dataset before comparing numbers: its definition, unit and multiplier, frequency variants and coverage, the sex and breakdown codes in use across its frequencies (the total code of each breakdown marked), the reference areas it covers, whether it carries World/regional/income-group aggregates, and how its observations are classed as reported, modelled, or projected. Accepts a dataset ID (UNE_DEAP_SEX_AGE_RT_A) or a bare indicator code (UNE_DEAP_SEX_AGE_RT), which describes every frequency. An unknown code returns found: false with guidance.
| Argument | Type | Description |
|---|---|---|
| dataset_id* | string | One dataset ID (indicator code plus _A, _Q, or _M, e.g. UNE_DEAP_SEX_AGE_RT_A) or a bare indicator code (UNE_DEAP_SEX_AGE_RT), as ilostat_search_indicators returns them. Case-insensitive; a DF_ prefix (the SDMX dataflow form) is stripped. |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"dataset_id"
],
"properties": {
"dataset_id": {
"type": "string",
"pattern": "^[A-Z0-9_]+( *[+,] *[A-Z0-9_]+)*$",
"maxLength": 200,
"description": "One dataset ID (indicator code plus _A, _Q, or _M, e.g. UNE_DEAP_SEX_AGE_RT_A) or a bare indicator code (UNE_DEAP_SEX_AGE_RT), as ilostat_search_indicators returns them. Case-insensitive; a DF_ prefix (the SDMX dataflow form) is stripped."
}
},
"additionalProperties": false
}Build a headline labour-market profile for one reference area: labour force participation, employment-to-population ratio, unemployment and youth unemployment rates, youth NEET rate, informal employment rate, employment level, labour income share, and working poverty rate. Each indicator shows its latest reported value (from a national or institutional source, with its source and notes) and, separately, its latest ILO modelled estimate that is not a projection, each with its dataset, period, and status — a missing reported value stays missing and is never filled from the model. Accepts a country (ISO3, e.g. KEN) or an X-coded aggregate (X01 World, regions, income groups), for which only modelled values exist.
| Argument | Type | Description |
|---|---|---|
| sex | string | SEX_T (default), SEX_M, or SEX_F; T/M/F and total/both/male/female are accepted. Indicators without a sex breakdown (labour income share) are unaffected. |
| ref_area* | string | One reference area with annual data: an ISO3 country code (KEN) or an X-coded aggregate (X01 World, X06, X02); ILO_GEO_ forms accepted, case-insensitive. ilostat_list_reference topic ref_areas lists them. |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"ref_area"
],
"properties": {
"sex": {
"enum": [
"SEX_T",
"SEX_M",
"SEX_F"
],
"type": "string",
"default": "SEX_T",
"description": "SEX_T (default), SEX_M, or SEX_F; T/M/F and total/both/male/female are accepted. Indicators without a sex breakdown (labour income share) are unaffected."
},
"ref_area": {
"type": "string",
"pattern": "^[A-Z0-9]{3}$",
"description": "One reference area with annual data: an ISO3 country code (KEN) or an X-coded aggregate (X01 World, X06, X02); ILO_GEO_ forms accepted, case-insensitive. ilostat_list_reference topic ref_areas lists them."
}
},
"additionalProperties": false
}Decode ILOSTAT's code vocabulary: reference areas (ISO3 countries and X-coded aggregates, with World Bank income group and ILO region), the groups that area_group accepts (X01 for every country, ILO regions and subregions, World Bank income groups; exact-code lookups list their member countries), databases, subjects, sex codes, breakdown codes for classif1/classif2 with their classification types, per-country data sources, observation status flags, note codes, and frequencies. Filter by text or look up exact codes; long topics page with a cursor. These are ILOSTAT-wide vocabularies; ilostat_describe_indicator lists the sex and breakdown codes one dataset actually uses.
| Argument | Type | Description |
|---|---|---|
| codes | array | Exact codes to look up (up to 100; case-insensitive, and ILO_GEO_ forms accepted for ref_areas and area_groups). Codes the topic lacks are listed in not_found. With topic area_groups, each group found also lists its member countries. |
| limit | integer | Entries per page, at most 500; a larger value, up to 10,000, is applied as 500 and the notice says so. |
| topic* | string | Vocabulary to list: ref_areas, area_groups (the X codes area_group accepts), databases, subjects, sexes, classifications (classif1/classif2 codes), classification_types, sources, obs_status, notes, or frequencies. |
| cursor | string | Opaque continuation token: the previous page's next_cursor, passed unchanged. |
| filter | string |
Fetch observations for up to 3 ILOSTAT datasets per call, filtered by reference area or area group, sex, breakdown codes (classif1, classif2), source, and period; datasets past the first 3 come back as remaining_dataset_ids for another call. Rows keep their source, observation status, decoded notes, and a basis — reported, modelled_estimate, or projection — and the response echoes every filter applied, including the best-source default. Codes are checked against ILOSTAT's dictionaries before the request is sent: ilostat_list_reference lists valid codes and ilostat_describe_indicator lists the codes a dataset actually uses. A result larger than the inline preview is staged in full as a df_<id> dataframe for SQL through ilostat_dataframe_describe and ilostat_dataframe_query when this deployment enables dataframes. A request with no filters at all is refused when the dataset exceeds the row ceiling, and a filtered request that still exceeds it is refused with guidance to narrow it.
| Argument | Type | Description |
|---|---|---|
| sex | array | Sex codes SEX_T, SEX_M, SEX_F, SEX_O; T/M/F/O and total/both/male/female/other are accepted. |
| time | string | One exact period: YYYY (on a quarterly or monthly dataset, every period of that year), YYYYQn, or YYYYMmm; 2024-Q2, 2024 Q2, and 2025-03 are normalized. Not combinable with time_from, time_to, or latest_only. |
| sources | array | Source codes (e.g. BA:453); ilostat_list_reference topic sources with ref_area lists an area's sources. Without source_selection, setting sources switches it to all, since a secondary source matches nothing under best. |
| time_to | string |
Search ILOSTAT's catalog of labour-statistics indicators by plain-language terms and filters. Each hit is one indicator with its datasets — one per available frequency (annual, quarterly, monthly) — plus breakdowns, coverage years, number of reference areas, source database, and last update; pass a dataset ID to ilostat_describe_indicator for its units and breakdown codes, then to ilostat_query_indicator or ilostat_compare_geographies for values. Every search term must match a word or word prefix in the indicator's label, subject, database, breakdown names, code, or definition; a term that matches no word or word prefix anywhere in the catalog matches the words sharing its stem instead (informality finds informal, unionization finds union), and the notice names it. British and American spellings (labour/labor) match alike. The measure filter lists every indicator of one measured quantity, as ilostat_describe_indicator's related indicators count them. Facet counts reflect all applied filters.
| Argument | Type | Description |
|---|---|---|
| limit | integer | Hits per page, at most 50; a larger value, up to 1,000, is applied as 50 and the notice says so. |
| query | string | Plain-language terms, e.g. "youth unemployment" or "informal employment rate". Case, accents, and punctuation are ignored, labor matches labour, and a trailing plural s is tolerated; a term no catalog word starts with is matched by its stem (-ity, -ization, -ive, -ment, -ing, -ed, -ly, and a plural s dropped, -ies read as y). Omit to browse by filters (results then order by indicator code). |
| cursor | string | Opaque continuation token: the previous page's next_cursor, passed unchanged. |
| measure |
| Store the result as a new dataframe under this name (df_XXXXX_XXXXX: letters and digits, five in each part; stored uppercased after df_) with a fresh TTL, to chain analyses. A result over 1,000,000 rows is refused, and storing one can evict the oldest dataframes, which evicted names. |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"sql"
],
"properties": {
"sql": {
"type": "string",
"maxLength": 20000,
"minLength": 1,
"description": "One SELECT over df_<id> tables (DuckDB SQL: joins, aggregates, window functions, CTEs), at most 20,000 characters. BIGINT results such as COUNT or SUM of integers serialize as strings; CAST to DOUBLE for inline arithmetic."
},
"preview": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": 0,
"description": "Rows returned inline; defaults to row_limit, and a larger value is applied as row_limit. Inline rows also stop at a size budget (applied_limits.preview_chars). Set lower when register_as keeps the full result."
},
"row_limit": {
"type": "integer",
"maximum": 1000000,
"minimum": 1,
"description": "Cap on rows materialized; defaults to 1,000, or the per-call cap when that is lower. The per-call cap is 10,000, or the lower cap the deployment sets; a larger value, up to 1,000,000, is applied as that cap. A query matching more stops at the cap and row_count_capped is true; register_as keeps the full result."
},
"register_as": {
"type": "string",
"pattern": "^df_[A-Z0-9]{5}_[A-Z0-9]{5}$",
"description": "Store the result as a new dataframe under this name (df_XXXXX_XXXXX: letters and digits, five in each part; stored uppercased after df_) with a fresh TTL, to chain analyses. A result over 1,000,000 rows is refused, and storing one can evict the oldest dataframes, which evicted names."
}
},
"additionalProperties": false
}| Text filter: every word must match a word or word prefix of the code or label (case, accents, and punctuation ignored; labor matches labour). Omit to list the whole topic. |
| ref_area | string | Topic sources only: list the sources of this reference area (ISO3 or X code; case-insensitive, ILO_GEO_ forms accepted). |
| classification_type | string | Topic classifications only: keep codes of this classification type, the code prefix (AGE, ECO, EDU, …). |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"topic"
],
"properties": {
"codes": {
"type": "array",
"items": {
"type": "string",
"maxLength": 64
},
"maxItems": 100,
"description": "Exact codes to look up (up to 100; case-insensitive, and ILO_GEO_ forms accepted for ref_areas and area_groups). Codes the topic lacks are listed in not_found. With topic area_groups, each group found also lists its member countries."
},
"limit": {
"type": "integer",
"default": 50,
"maximum": 10000,
"minimum": 1,
"description": "Entries per page, at most 500; a larger value, up to 10,000, is applied as 500 and the notice says so."
},
"topic": {
"enum": [
"ref_areas",
"area_groups",
"databases",
"subjects",
"sexes",
"classifications",
"classification_types",
"sources",
"obs_status",
"notes",
"frequencies"
],
"type": "string",
"description": "Vocabulary to list: ref_areas, area_groups (the X codes area_group accepts), databases, subjects, sexes, classifications (classif1/classif2 codes), classification_types, sources, obs_status, notes, or frequencies."
},
"cursor": {
"type": "string",
"maxLength": 256,
"description": "Opaque continuation token: the previous page's next_cursor, passed unchanged."
},
"filter": {
"type": "string",
"maxLength": 200,
"description": "Text filter: every word must match a word or word prefix of the code or label (case, accents, and punctuation ignored; labor matches labour). Omit to list the whole topic."
},
"ref_area": {
"type": "string",
"pattern": "^[A-Z0-9]{3}$",
"description": "Topic sources only: list the sources of this reference area (ISO3 or X code; case-insensitive, ILO_GEO_ forms accepted)."
},
"classification_type": {
"type": "string",
"maxLength": 32,
"description": "Topic classifications only: keep codes of this classification type, the code prefix (AGE, ECO, EDU, …)."
}
},
"additionalProperties": false
}| Last year (YYYY), not before time_from. |
| classif1 | array | Codes of the first breakdown (e.g. AGE_YTHADULT_YGE15); case-insensitive. ilostat_describe_indicator lists the codes a dataset uses. |
| classif2 | array | Codes of the second breakdown, for datasets that have one; case-insensitive. ilostat_describe_indicator lists them. |
| ref_areas | array | Reference areas (up to 300): ISO3 country codes (USA) or X-coded aggregates (X01 World); case-insensitive, ILO_GEO_ forms accepted. Aggregates need a dataset with has_aggregates true. Omit for every area. |
| time_from | string | First year (YYYY); upstream filters by year only. |
| area_group | string | X01 for every country, an ILO region or subregion, or a World Bank income group (X06, X56, X02, …); expands to its member countries, unioned with ref_areas. ilostat_list_reference topic area_groups lists the codes. |
| dataset_ids* | array | Dataset IDs, up to 100 — an indicator code plus _A, _Q, or _M (UNE_DEAP_SEX_AGE_RT_A), as ilostat_search_indicators returns them. Case-insensitive; a DF_ prefix (the SDMX dataflow form) is stripped, a bare indicator code resolves when it has one frequency, an element holding + or , joined IDs is split, and duplicates are dropped. Every ID is checked; the first 3 distinct datasets are queried and the rest come back as remaining_dataset_ids for another call. |
| latest_only | boolean | Only each series' latest period — a series is one dataset, reference area, sex, classif1, and classif2 code — with every row at that period (one per source under source_selection all or secondary; the latest quarter or month on sub-annual datasets); combines with time_from/time_to. When the request's full history is too large or too slow to read in one call, it falls back to the latest period per area and dataset, which can miss a series that ends earlier; applied_filters.latest_mode says which ran, and the notice says so. time_from or classif1 narrow it back under; sex or fewer ref_areas alone may still read too much and fall back. |
| source_selection | string | best (default): the preferred source per area and period; all: secondary sources too, each row flagged best_source; secondary: secondary sources only. Defaults to all when sources is set. |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"dataset_ids"
],
"properties": {
"sex": {
"type": "array",
"items": {
"enum": [
"SEX_T",
"SEX_M",
"SEX_F",
"SEX_O"
],
"type": "string"
},
"maxItems": 4,
"description": "Sex codes SEX_T, SEX_M, SEX_F, SEX_O; T/M/F/O and total/both/male/female/other are accepted."
},
"time": {
"type": "string",
"pattern": "^\\d{4}(Q[1-4]|M(0[1-9]|1[0-2]))?$",
"description": "One exact period: YYYY (on a quarterly or monthly dataset, every period of that year), YYYYQn, or YYYYMmm; 2024-Q2, 2024 Q2, and 2025-03 are normalized. Not combinable with time_from, time_to, or latest_only."
},
"sources": {
"type": "array",
"items": {
"type": "string",
"maxLength": 64
},
"maxItems": 100,
"description": "Source codes (e.g. BA:453); ilostat_list_reference topic sources with ref_area lists an area's sources. Without source_selection, setting sources switches it to all, since a secondary source matches nothing under best."
},
"time_to": {
"type": "string",
"pattern": "^\\d{4}$",
"description": "Last year (YYYY), not before time_from."
},
"classif1": {
"type": "array",
"items": {
"type": "string",
"maxLength": 64
},
"maxItems": 100,
"description": "Codes of the first breakdown (e.g. AGE_YTHADULT_YGE15); case-insensitive. ilostat_describe_indicator lists the codes a dataset uses."
},
"classif2": {
"type": "array",
"items": {
"type": "string",
"maxLength": 64
},
"maxItems": 100,
"description": "Codes of the second breakdown, for datasets that have one; case-insensitive. ilostat_describe_indicator lists them."
},
"ref_areas": {
"type": "array",
"items": {
"type": "string",
"pattern": "^[A-Z0-9]{3}$"
},
"maxItems": 300,
"description": "Reference areas (up to 300): ISO3 country codes (USA) or X-coded aggregates (X01 World); case-insensitive, ILO_GEO_ forms accepted. Aggregates need a dataset with has_aggregates true. Omit for every area."
},
"time_from": {
"type": "string",
"pattern": "^\\d{4}$",
"description": "First year (YYYY); upstream filters by year only."
},
"area_group": {
"type": "string",
"pattern": "^[A-Z0-9]{3}$",
"description": "X01 for every country, an ILO region or subregion, or a World Bank income group (X06, X56, X02, …); expands to its member countries, unioned with ref_areas. ilostat_list_reference topic area_groups lists the codes."
},
"dataset_ids": {
"type": "array",
"items": {
"type": "string",
"pattern": "^[A-Z0-9_]+$",
"maxLength": 64
},
"maxItems": 100,
"minItems": 1,
"description": "Dataset IDs, up to 100 — an indicator code plus _A, _Q, or _M (UNE_DEAP_SEX_AGE_RT_A), as ilostat_search_indicators returns them. Case-insensitive; a DF_ prefix (the SDMX dataflow form) is stripped, a bare indicator code resolves when it has one frequency, an element holding + or , joined IDs is split, and duplicates are dropped. Every ID is checked; the first 3 distinct datasets are queried and the rest come back as remaining_dataset_ids for another call."
},
"latest_only": {
"type": "boolean",
"default": false,
"description": "Only each series' latest period — a series is one dataset, reference area, sex, classif1, and classif2 code — with every row at that period (one per source under source_selection all or secondary; the latest quarter or month on sub-annual datasets); combines with time_from/time_to. When the request's full history is too large or too slow to read in one call, it falls back to the latest period per area and dataset, which can miss a series that ends earlier; applied_filters.latest_mode says which ran, and the notice says so. time_from or classif1 narrow it back under; sex or fewer ref_areas alone may still read too much and fall back."
},
"source_selection": {
"enum": [
"best",
"all",
"secondary"
],
"type": "string",
"description": "best (default): the preferred source per area and period; all: secondary sources too, each row flagged best_source; secondary: secondary sources only. Defaults to all when sources is set."
}
},
"additionalProperties": false
}| string |
| Measure code, exactly as ilostat_describe_indicator's measure.code gives it (e.g. EMP_TEMP_NB); case-insensitive. Keeps every indicator measuring that quantity, under any breakdown. |
| subject | string | Subject code, e.g. LUU (unemployment and labour underutilization); case-insensitive. ilostat_list_reference topic subjects lists them. |
| database | string | Source database code, e.g. LFS or ILOEST (the ILO modelled estimates); case-insensitive. ilostat_list_reference topic databases lists them. |
| breakdown | string | Classification type the indicator is broken down by, e.g. AGE, ECO, GEO, SEX; case-insensitive. ilostat_list_reference topic classification_types lists them. |
| frequency | string | Keep only datasets of this frequency: A annual, Q quarterly, M monthly. Narrows each hit's datasets; an indicator with none left drops out. |
| aggregates_only | boolean | Keep only datasets carrying World, regional, or income-group rows, dropping indicators with none. |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"properties": {
"limit": {
"type": "integer",
"default": 10,
"maximum": 1000,
"minimum": 1,
"description": "Hits per page, at most 50; a larger value, up to 1,000, is applied as 50 and the notice says so."
},
"query": {
"type": "string",
"maxLength": 500,
"description": "Plain-language terms, e.g. \"youth unemployment\" or \"informal employment rate\". Case, accents, and punctuation are ignored, labor matches labour, and a trailing plural s is tolerated; a term no catalog word starts with is matched by its stem (-ity, -ization, -ive, -ment, -ing, -ed, -ly, and a plural s dropped, -ies read as y). Omit to browse by filters (results then order by indicator code)."
},
"cursor": {
"type": "string",
"maxLength": 256,
"description": "Opaque continuation token: the previous page's next_cursor, passed unchanged."
},
"measure": {
"type": "string",
"maxLength": 32,
"description": "Measure code, exactly as ilostat_describe_indicator's measure.code gives it (e.g. EMP_TEMP_NB); case-insensitive. Keeps every indicator measuring that quantity, under any breakdown."
},
"subject": {
"type": "string",
"maxLength": 32,
"description": "Subject code, e.g. LUU (unemployment and labour underutilization); case-insensitive. ilostat_list_reference topic subjects lists them."
},
"database": {
"type": "string",
"maxLength": 32,
"description": "Source database code, e.g. LFS or ILOEST (the ILO modelled estimates); case-insensitive. ilostat_list_reference topic databases lists them."
},
"breakdown": {
"type": "string",
"maxLength": 32,
"description": "Classification type the indicator is broken down by, e.g. AGE, ECO, GEO, SEX; case-insensitive. ilostat_list_reference topic classification_types lists them."
},
"frequency": {
"enum": [
"A",
"Q",
"M"
],
"type": "string",
"description": "Keep only datasets of this frequency: A annual, Q quarterly, M monthly. Narrows each hit's datasets; an indicator with none left drops out."
},
"aggregates_only": {
"type": "boolean",
"default": false,
"description": "Keep only datasets carrying World, regional, or income-group rows, dropping indicators with none."
}
},
"additionalProperties": false
}