openapi: 3.1.0 info: title: ITU DataHub API version: '2' summary: Undocumented public JSON API behind the ITU DataHub ICT statistics portal. description: >- ITU publishes **no** OpenAPI, no reference documentation, and no terms of programmatic use for this API. This document is an API Evangelist **observed-behaviour** description: every path, parameter, status code and response shape below was recorded from live, anonymous HTTP calls against `https://api.datahub.itu.int/v2` on 2026-07-25/26. Nothing here is invented — where a behaviour was not observed it is simply absent. The route templates were recovered from the DataHub Next.js client bundle (`datahub.itu.int/_next/static/chunks/*.js`), which hardcodes the base URL `https://api.datahub.itu.int/v2`, and each recovered route was then called to confirm it exists and to capture its real response. Treat this surface as an internal backend that happens to be public rather than as a supported product API: it can change without notice. No authentication of any kind is required. No API key, no `Referer`, no `Origin`, no `User-Agent`. `Access-Control-Allow-Origin: *` is returned on every response. The service runs on AWS API Gateway behind CloudFront (`x-amzn-requestid`, `x-amz-cf-id` response headers). contact: name: ITU ICT Data & Analytics Division email: indicators@itu.int url: https://datahub.itu.int/ license: name: ITU Terms of Use url: https://www.itu.int/en/about/Pages/terms-of-use.aspx x-apievangelist-provenance: method: derived derived_from: live anonymous HTTP probes + the public DataHub client bundle probed: '2026-07-26' provider_published_spec: false note: >- Derived by API Evangelist from observed responses. ITU has not published, reviewed, or endorsed this description. externalDocs: description: ITU DataHub portal (the only human surface for this API) url: https://datahub.itu.int/ servers: - url: https://api.datahub.itu.int/v2 description: Production (AWS API Gateway + CloudFront). Anonymous. tags: - name: Reference description: Country and region reference data. - name: Indicators description: The indicator dictionary — categories, definitions, units and coverage. - name: Data description: Indicator time series, by indicator, country and region aggregate. - name: Dashboards description: Curated DataHub dashboard definitions. - name: IDI description: ICT Development Index composite scores. - name: UMC description: Universal and Meaningful Connectivity targets and scores. - name: Methodology description: Dataset provenance and the owning ITU divisions. paths: /country/all: get: operationId: listCountries tags: [Reference] summary: List all countries description: >- Returns the full ITU country reference list — 200-plus economies with their ITU CountryID, ISO 3166-1 alpha-3 code, short and long names, and every regional grouping the country belongs to (ITU/BDT classification, UN M49, World Bank income group). responses: '200': description: The full country list. content: application/json: schema: type: array items: { $ref: '#/components/schemas/Country' } examples: aruba: summary: First element of the live response value: - CountryID: 4 IsoCode: ABW ShortName: Aruba LongName: Aruba Regions: - { id: 330, regionCode: DEV, class: UN M49 Developed-developing, classID: 92, region: Developing } - { id: 650, regionCode: OE, class: ITU/BDT & Other Classification, classID: 177, region: Other Economies } - { id: 701, regionCode: World, class: World, no regions, classID: 187, region: World } - { id: 2115, regionCode: HI2023, class: WB_Income2023, classID: 1310, region: High Income } /region/all: get: operationId: listRegions tags: [Reference] summary: List all regions description: >- Returns every regional grouping used across DataHub — the ITU/BDT classification (Africa, Americas, Arab States, Asia & Pacific, CIS, Europe), UN M49 groupings including LDC/LLDC/SIDS, and World Bank income classes by year. responses: '200': description: The region list. content: application/json: schema: type: array items: { $ref: '#/components/schemas/Region' } examples: arabStates: value: - { className: ITU/BDT Classification, regionCode: ARB, regionName: Arab States, regionID: 3 } /dictionaries/getcategories: get: operationId: getIndicatorCategories tags: [Indicators] summary: Get the indicator dictionary description: >- Returns the complete DataHub indicator dictionary as a category / sub-category / item tree. Each leaf item carries the `codeID` used by the data endpoints, its label, the owning `databaseID`, and whether it is a collection indicator. responses: '200': description: The indicator dictionary tree. content: application/json: schema: type: array items: { $ref: '#/components/schemas/IndicatorCategory' } /dictionaries/getbyid/{codeID}: get: operationId: getIndicatorById tags: [Indicators] summary: Get one indicator definition description: >- Returns the full metadata record for a single indicator — label, description, units, answer type, start and end year, category placement, the list of countries with data (`availableCountries`), sibling and disaggregation series, and the landing page. parameters: - $ref: '#/components/parameters/codeID' responses: '200': description: The indicator definition. content: application/json: schema: type: array items: { $ref: '#/components/schemas/IndicatorDefinition' } '500': $ref: '#/components/responses/UnknownIdentifier' /data/bycode/{codeID}: get: operationId: getDataByCode tags: [Data] summary: Get an indicator time series for every country description: >- Returns the full observed time series for one indicator across every country — one record per country-year, each with the value, the reporting source, and any data note. Responses are large (the Internet-users series returns roughly 1.1 MB). parameters: - $ref: '#/components/parameters/codeID' responses: '200': description: >- The time series. An unknown `codeID` returns HTTP 200 with an empty array rather than a 404 — observed on `codeID=999999999`. content: application/json: schema: type: array items: { $ref: '#/components/schemas/DataPoint' } examples: internetUsersAruba: summary: First element of the live response for codeID 11624 value: - codeID: 11624 shortName: Aruba dataID: 4790044 dataNote: '' dataYear: 2000 code: i99H dataSource: Servicio di Telecomunicacion di Aruba (SETAR). answer: - { value: '15.4428229480349', id: 4790044 } countryID: 4 isoCode: ABW /data/bycode/{codeID}/byiso/{iso}: get: operationId: getDataByCodeAndIso tags: [Data] summary: Get an indicator time series for one country description: >- Returns the observed time series for one indicator filtered to a single country by its ISO 3166-1 alpha-3 code. The country-scoped form of `getDataByCode`, and the practical way to use this API without downloading the whole series. parameters: - $ref: '#/components/parameters/codeID' - $ref: '#/components/parameters/iso' responses: '200': description: >- The country time series. An unrecognised ISO code returns HTTP 200 with an empty array — observed on `iso=ZZZ`. content: application/json: schema: type: array items: { $ref: '#/components/schemas/DataPoint' } examples: internetUsersUSA: value: - codeID: 11624 shortName: United States answer: - { value: '43.0791626375201', id: 4792974 } dataID: 4792974 code: i99H isoCode: USA dataNote: '' dataYear: 2000 countryID: 244 dataSource: ITU estimate. /aggregation/bycodeid/{codeID}/byregionid/{regionID}: get: operationId: getRegionalAggregate tags: [Data] summary: Get a regional aggregate series for an indicator description: >- Returns the ITU-computed regional aggregate for one indicator and one region — one record per year with the aggregate value and, where applicable, the percentage form. parameters: - $ref: '#/components/parameters/codeID' - $ref: '#/components/parameters/regionID' responses: '200': description: The regional aggregate series. content: application/json: schema: type: array items: { $ref: '#/components/schemas/AggregatePoint' } examples: arabStates2005: value: - { codeID: 11624, code: i99H, regionID: 647, regionName: Arab States, classID: 177, dataYear: 2005, dataID: 71287, databaseID: 1, answer: [{ value: 8.6 }], answersPercentage: [{ value: 8.6 }], createDate: '2024-04-24T18:20:23.000Z', updateDate: '2025-11-17T13:13:18.000Z', numberOfAnswer: null, internalNote: null } /dashboard/all: get: operationId: listDashboards tags: [Dashboards] summary: List DataHub dashboards description: >- Returns every curated DataHub dashboard with its name, category, description, and the full set of indicator codes it renders including each code's disaggregations, units, visibility and coverage years. responses: '200': description: The dashboard definitions. content: application/json: schema: type: array items: { $ref: '#/components/schemas/Dashboard' } /idi/dashboard/all: get: operationId: getIdiStructure tags: [IDI] summary: Get the ICT Development Index structure description: >- Returns the IDI composite tree — the index, its Universal connectivity and Meaningful connectivity pillars, and the underlying indicators each pillar scores. responses: '200': description: The IDI structure. content: application/json: schema: type: array items: { $ref: '#/components/schemas/IdiNode' } /idi/dashboard/version: get: operationId: listIdiVersions tags: [IDI] summary: List available IDI editions description: Returns the list of IDI edition years available in DataHub. responses: '200': description: The edition years. content: application/json: schema: type: array items: { type: integer } examples: editions: value: [2023, 2024, 2025, 2026] /idi/data/bycountryid/{countryID}: get: operationId: getIdiByCountry tags: [IDI] summary: Get IDI scores for one country description: >- Returns the IDI pillar and indicator scores for a single country, keyed by the ITU `CountryID` from `listCountries` (not the ISO code). parameters: - $ref: '#/components/parameters/countryID' responses: '200': description: >- The country's IDI scores. Returns HTTP 200 with an empty array where no scores exist for the supplied identifier. content: application/json: schema: type: array items: { $ref: '#/components/schemas/IdiScore' } /idi/region/byregionid/{regionID}: get: operationId: getIdiByRegion tags: [IDI] summary: Get IDI scores for one region description: Returns the IDI pillar and indicator scores aggregated for a single region. parameters: - $ref: '#/components/parameters/regionID' responses: '200': description: The region's IDI scores. content: application/json: schema: type: array items: { $ref: '#/components/schemas/IdiScore' } examples: arabStates: value: - { regionID: 3, dataID: 2026003005, codeID: 5, score: 56.355555555555554, dataYear: 2026 } /umc/dashboard/all: get: operationId: getUmcDashboard tags: [UMC] summary: Get the Universal and Meaningful Connectivity dashboard description: >- Returns every UMC indicator with its target definition — the target name, description, minimum and maximum target values, units, source, and the topic and macro it rolls into. responses: '200': description: The UMC indicator and target definitions. content: application/json: schema: type: array items: { $ref: '#/components/schemas/UmcIndicator' } /umc/topic/all: get: operationId: listUmcTopics tags: [UMC] summary: List UMC topics description: Returns the six UMC topics — People, Homes, Businesses, Affordability, Schools, Infrastructure. responses: '200': description: The topic list. content: application/json: schema: type: array items: { $ref: '#/components/schemas/UmcTopic' } examples: topics: value: - { topicID: 1, label: People } - { topicID: 2, label: Homes } - { topicID: 3, label: Businesses } - { topicID: 4, label: Affordability } - { topicID: 5, label: Schools } - { topicID: 6, label: Infrastructure } /umc/macro/all: get: operationId: listUmcMacros tags: [UMC] summary: List UMC macro categories description: Returns the two UMC macro categories — Universal connectivity and Meaningful connectivity. responses: '200': description: The macro list. content: application/json: schema: type: array items: { $ref: '#/components/schemas/UmcMacro' } examples: macros: value: - { macroID: 1, label: Universal connectivity } - { macroID: 2, label: Meaningful connectivity } /umc/target/all: get: operationId: listUmcTargets tags: [UMC] summary: List UMC target bands description: >- Returns the UMC scoring bands used to colour the dashboard — No data, Limited, Satisfactory, Advanced, Target met — with the numeric range each band covers. responses: '200': description: The target bands. content: application/json: schema: type: array items: { $ref: '#/components/schemas/UmcTarget' } examples: bands: value: - { targetID: 0, min: -1, max: -1, label: No data } - { targetID: 1, min: 0, max: 50, label: Limited } - { targetID: 2, min: 50, max: 75, label: Satisfactory } - { targetID: 3, min: 75, max: 95, label: Advanced } - { targetID: 4, min: 95, max: 100, label: Target met } /umc/bycountryid/{countryID}: get: operationId: getUmcByCountry tags: [UMC] summary: Get UMC scores for one country description: >- Returns every UMC indicator scored for a single country, keyed by the ITU `CountryID`, with the observed value alongside the target definition it is measured against. parameters: - $ref: '#/components/parameters/countryID' responses: '200': description: The country's UMC scores. content: application/json: schema: type: array items: { $ref: '#/components/schemas/UmcCountryScore' } /methodology/dataset: get: operationId: listDatasets tags: [Methodology] summary: List the source datasets behind DataHub description: >- Returns the ITU datasets that feed DataHub — short name, type (quantitative or qualitative), the owning ITU division and its contact email, whether the dataset is publicly visible, and whether it has frozen public data. responses: '200': description: The dataset inventory. content: application/json: schema: type: array items: { $ref: '#/components/schemas/Dataset' } examples: wti: value: - { datasetID: 1, datasetShortName: WTI, datasetType: Quantitative, teamShortName: IDA, teamName: ICT DATA & ANALYTICS DIVISION, email: indicators@itu.int, publiclyVisible: true, hasFrozenPublicData: true } components: parameters: codeID: name: codeID in: path required: true description: The DataHub indicator identifier, from `getIndicatorCategories`. schema: { type: integer } example: 11624 iso: name: iso in: path required: true description: ISO 3166-1 alpha-3 country code, from `listCountries`. schema: { type: string, minLength: 3, maxLength: 3 } example: USA countryID: name: countryID in: path required: true description: The ITU numeric country identifier, from `listCountries`. schema: { type: integer } example: 244 regionID: name: regionID in: path required: true description: The region identifier, from `listRegions`. schema: { type: integer } example: 3 responses: UnknownIdentifier: description: >- Observed on an unknown identifier. The body is a plain-text runtime error string, not JSON and not RFC 9457 problem+json — e.g. `Cannot set properties of undefined (setting 'availableCountries')`. content: text/plain: schema: { type: string } MissingRoute: description: >- AWS API Gateway returns this for any path that is not a configured route, including the `/v2` base path itself. It is not an authentication requirement — every configured route answers anonymously. content: application/json: schema: type: object properties: message: { type: string, const: Missing Authentication Token } schemas: Country: type: object description: A country or economy in the ITU reference list. properties: CountryID: { type: integer, description: ITU numeric country identifier. } IsoCode: { type: string, description: ISO 3166-1 alpha-3 code. } ShortName: { type: string } LongName: { type: string } Regions: type: array items: { $ref: '#/components/schemas/CountryRegion' } CountryRegion: type: object description: A regional grouping membership for a country. properties: id: { type: integer } regionCode: { type: string } class: { type: string, description: The classification family, e.g. "ITU/BDT & Other Classification". } classID: { type: integer } region: { type: string } Region: type: object properties: className: { type: string } regionCode: { type: string } regionName: { type: string } regionID: { type: integer } IndicatorCategory: type: object properties: category: { type: string } categorySort: { type: integer } subCategory: type: array items: { $ref: '#/components/schemas/IndicatorSubCategory' } IndicatorSubCategory: type: object properties: subCategory: { type: string } subCategorySort: { type: integer } items: type: array items: { $ref: '#/components/schemas/IndicatorItem' } IndicatorItem: type: object properties: codeID: { type: integer } label: { type: string } databaseID: { type: integer } seriesType: { type: string } indicatorSort: { type: integer } external: { type: boolean } isCollection: { type: boolean } IndicatorDefinition: type: object description: The full metadata record for one indicator. properties: codeID: { type: integer } code: { type: string, description: The ITU short indicator code, e.g. "i99H". } label: { type: string } codeDesc: { type: string } units: { type: string } unitsType: { type: string } alternativeUnits: {} answerType: { type: string } startYear: { type: integer } endYear: { type: integer } category: { type: string } categorySort: { type: integer } indicatorCategory: { type: string } indicatorCategorySort: { type: integer } subCategory: { type: string } subCategorySort: { type: integer } databaseID: { type: integer } codeVisibility: { type: string, description: e.g. "Public/Free". } seriesType: { type: string } archive: { type: boolean } external: { type: boolean } indicatorSort: { type: integer } disaggregation: { type: array, items: { type: object } } disaggregationSort: { type: integer } sibling: { type: array, items: { type: object } } availableCountries: { type: array, items: { type: object } } landingPage: { type: string } Question: { type: string } Comment: { type: string } DataPoint: type: object description: One country-year observation of an indicator. properties: dataID: { type: integer } codeID: { type: integer } code: { type: string } countryID: { type: integer } isoCode: { type: string } shortName: { type: string } dataYear: { type: integer } dataSource: { type: string, description: The reporting source, e.g. a national regulator or "ITU estimate.". } dataNote: { type: string } answer: type: array description: The observed value. Values are returned as strings on this endpoint. items: type: object properties: value: { type: string } id: { type: integer } AggregatePoint: type: object description: One region-year aggregate of an indicator, computed by ITU. properties: dataID: { type: integer } codeID: { type: integer } code: { type: string } regionID: { type: integer } regionName: { type: string } classID: { type: integer } databaseID: { type: integer } dataYear: { type: integer } answer: { type: array, items: { type: object, properties: { value: { type: number } } } } answersPercentage: { type: array, items: { type: object, properties: { value: { type: number } } } } numberOfAnswer: { type: [integer, 'null'] } internalNote: { type: [string, 'null'] } createDate: { type: string, format: date-time } updateDate: { type: string, format: date-time } Dashboard: type: object properties: dashboardID: { type: integer } dashboardName: { type: string } dashboardCategory: { type: string } dashboardDesc: { type: string } archive: { type: boolean } dashboardCodes: { type: array, items: { type: object } } IdiNode: type: object description: A node in the ICT Development Index composite tree. properties: codeID: { type: integer } code: { type: string } label: { type: string } codeDesc: { type: string } children: { type: array, items: { $ref: '#/components/schemas/IdiNode' } } IdiScore: type: object properties: dataID: { type: integer } codeID: { type: integer } regionID: { type: integer } score: { type: number } dataYear: { type: integer } UmcIndicator: type: object properties: codeID: { type: integer } code: { type: string } label: { type: string } indicatorLabel: { type: string } codeDesc: { type: string } units: { type: string } source: { type: string } archive: { type: boolean } topicID: { type: integer } macroID: { type: integer } targetName: { type: string } targetDesc: { type: string } targetMinValue: { type: number } targetMaxValue: { type: number } createDate: { type: integer, description: Epoch milliseconds. } updateDate: { type: integer, description: Epoch milliseconds. } UmcCountryScore: type: object properties: codeID: { type: integer } code: { type: string } label: { type: string } units: { type: string } source: { type: string } archive: { type: boolean } topicID: { type: integer } topicTarget: { type: string } macroID: { type: integer } macroTarget: { type: string } targetName: { type: string } targetDesc: { type: string } targetMinValue: { type: number } targetMaxValue: { type: number } rawMinValue: { type: number } rawMaxValue: { type: number } answer: { type: array, items: { type: object } } UmcTopic: type: object properties: topicID: { type: integer } label: { type: string } UmcMacro: type: object properties: macroID: { type: integer } label: { type: string } UmcTarget: type: object properties: targetID: { type: integer } min: { type: number } max: { type: number } label: { type: string } Dataset: type: object properties: datasetID: { type: integer } datasetShortName: { type: string } datasetType: { type: string, enum: [Quantitative, Qualitative] } teamShortName: { type: string } teamName: { type: string } email: { type: string, format: email } publiclyVisible: { type: boolean } hasFrozenPublicData: { type: boolean }