Skip to page content
SAVRN
Search Plan a project

telegram-news-ua-dataset · Dataset Card

telegram-news-ua-dataset: Dataset Card

Written by Aisberg.public.organization, published under cc-by-4.0, revision 2288ffc38e63, read 2026-10-19. Shown as written; SAVRN's own facts about this dataset are on its page.

Aisberg Telegram News UA

A continuously updated, de-identified corpus of Ukrainian Telegram news and the discussion around it, published by the Ukrainian non-profit Aisberg (ГО «АЙЗБЕРГ»). It comes in two layers. The first is the raw monthly stream: every post from a fixed set of public news channels, with its reactions and its comment thread. The second is the analysis behind every report Aisberg publishes: posts from different channels grouped into one event, the manipulation techniques found in the coverage, who published first and by how many minutes, view and reaction curves over the first hour, comment sentiment, and a fact-check with a ten-label verdict and the full evidence chain behind it.

Free to use under CC BY 4.0, no registration, updated as the pipeline runs.

Links: Website · Methodology and limitations · Report dashboard · Telegram channel · How the fact-checker works

At a glance

Coverage August 2025 to August 2026, one file per calendar month; October 2025 is missing
Posts in the monthly files 221,084, each with its comment thread
Analysed events 3,639 cluster files, one per published report, growing with every report
Fact-checked claims 3,600 all time, with the evidence behind every verdict
Languages Mostly Ukrainian; Russian and English appear in posts, comments and evidence
Update cadence Cluster files within minutes of each report; a new monthly file in the first days of the next month
Licence CC BY 4.0
Live figures site/stats.json is rewritten every six hours

Figures as of 16 September 2026.

Quick start

from datasets import load_dataset

REPO = "aisbergpublicorganization/telegram-news-ua-dataset"

# One month of posts with their comment threads
aug = load_dataset(REPO, "monthly", split="2026_08")
aug[0]["channel"], aug[0]["reactions"], len(aug[0]["comments"])

# Every month in one split
posts = load_dataset(REPO, "all", split="train")

# Index of analysed events: cluster_id, published_at, keywords, post_count
index = load_dataset(REPO, "clusters_index", split="train")

Cluster files are nested JSON, one file per event, so they are read directly:

import json
from huggingface_hub import hf_hub_download

path = hf_hub_download(REPO, "clusters/cl_1789573201942_0.json", repo_type="dataset")
cluster = json.load(open(path, encoding="utf-8"))

cluster["summary"]                          # generated summary of the event
cluster["manipulations"]["methods"]         # techniques found in the coverage
cluster["factcheck"]["verdict"]             # one of ten labels
[(e["source_name"], e["stance"], e["published_at"]) for e in cluster["factcheck"]["evidence"][:5]]

The same file is rendered by the report dashboard: https://aisbergpublicorganization-dashboard.hf.space/?cluster=cl_1789573201942_0. A dashboard link and a cluster file always describe the same event, so you can cite the file and link the dashboard.

With pandas: pd.read_json("hf://datasets/aisbergpublicorganization/telegram-news-ua-dataset/data/08_2026.jsonl", lines=True).

What is in the dataset

Layer 1: monthly snapshots, data/MM_YYYY.jsonl

The raw stream. One JSON object per post, one file per month, UTF-8, one record per line. The record shape has been identical since the first release, so scripts written for one month work for all of them.

Field Type Description
channel string Display name of the public channel that published the post
post_text_redacted string Post text with personal strings replaced by [email], [phone], [mention], [url]
reactions object Aggregated emoji reactions, emoji to count
comments list Comment thread: user_name (stable pseudonym user_<hash>), text (redacted the same way), time (epoch milliseconds, truncated to UTC midnight)
date integer Publication date as epoch milliseconds, truncated to UTC midnight
{"channel": "Інсайдер ЗСУ",
"post_text_redacted": "Люди загинули намагаючись добігти до укриття... [url]",
"reactions": {"": 507, "": 137, "": 86, "": 25},
"comments": [{"user_name": "user_d331531ff3", "text": "Схоже що це доросла людина і дитина", "time": 1785542400000}],
"date": 1785542400000}

Use this layer for corpus work: language modelling, sentiment baselines, engagement statistics, discourse analysis.

Layer 2: per-event analysis, clusters/cl_*.json

One file per published report, uploaded the moment the report goes out. This is the layer that does not exist elsewhere: it records how a story moved across channels and what the automated verification found. Top-level keys:

Key What it holds
cluster_id, published_at, telegram_post_link Identity of the report and the link to the published post
summary, keywords, sentiment, post_type, entities Generated summary, extracted keywords, sentiment label, post type (news, air raid, strike, weather), named entities with counts
manipulations methods (techniques found in the coverage, from a fixed set of twelve), summary, source_link
smell_race Publication chronology: which channel published first and how far behind each of the others followed
posts The grouped posts: channel, redacted text, link, delay_seconds after the first post, views and reactions sampled at 15, 30, 45 and 60 minutes (snapshots, reaction_snapshots), per-post manipulation methods
reactions_stat Emoji breakdown per channel and post
comment_analysis Bot ratio and breakdown, sentiment and audience-state breakdowns, tone per entity, flagged accounts and coordinated campaigns, per-post detail
factcheck The verification: claim, claim_type, sub_claims, search_queries, evidence[] (each with url, source_name, published_at, country, source_confidence, freshness_score, relevance_score, combined_score, stance, stance_confidence), verdict, confidence, analysis, reasoning_steps, primary_source
editorial_insight One-line analytical note that accompanies the report
jinsa_candidates, black_pr_candidates Signals for paid positive framing and coordinated negative campaigns

clusters/clusters.jsonl is an append-only index of these files (cluster_id, published_at, keywords, post_count) and is exposed as the clusters_index configuration.

Fact-check verdicts use ten labels: True, Mostly True, Partly True, Missing Context, Misleading, Manipulated, False, Unverifiable, Opinion, Satire. Half of all claims come back Unverifiable, and that verdict is published rather than converted into a judgement: at the moment a claim starts circulating, independent reporting often does not exist yet. Distribution as of 16 September 2026, 3,600 claims: Unverifiable 50%, True 35%, Mostly True 10%, Partly True 2%, Misleading 2%, Manipulated 1%, False under 1%.

Use this layer for narrative-level work: spread dynamics, cross-channel timing, audience reaction, verification research, and for re-scoring the evidence with your own weights.

Layer 3: Russian-channel mirror, ru_mirror/cl_*.json

Since September 2026, for events that a small fixed set of Russian state-aligned channels also covered, a companion file records that coverage next to the Ukrainian cluster: ru_posts, ru_channels, a structured framing comparison of the two accounts, and ru_comment_analysis. It exists for comparison of framing only and covers a minority of events; it is shown in the dashboard as the "Україна / Росія" tab.

Machine-readable extras

File Purpose
data/manifest.json The published months, with coverage range and gaps
site/stats.json Headline numbers, rewritten every six hours
site/latest.json The twelve most recent reports with summary, verdict and links

Coverage

Month File Size
August 2025 (collection start) data/08_2025.jsonl 18.4 MB
September 2025 data/09_2025.jsonl 48.2 MB
November 2025 data/11_2025.jsonl 24.0 MB
December 2025 data/12_2025.jsonl 64.3 MB
January 2026 data/01_2026.jsonl 36.3 MB
February 2026 data/02_2026.jsonl 29.2 MB
March 2026 data/03_2026.jsonl 70.0 MB
April 2026 data/04_2026.jsonl 65.7 MB
May 2026 data/05_2026.jsonl 65.2 MB
June 2026 data/06_2026.jsonl 41.5 MB
July 2026 data/07_2026.jsonl 153.6 MB
August 2026 data/08_2026.jsonl 148.0 MB

October 2025 is missing: collection was down that month and no data exists to backfill. Next: the September 2026 file is published in early October 2026, once the month is complete.

Months before March 2026 contain some collection-downtime days; from March 2026 onward coverage is complete and continuous. A published month is never rewritten.

How the data is produced

Posts are captured from public channels the moment they appear and re-measured four times over the following hour, so the view and reaction curves are measurements, not estimates. Posts about the same event are grouped with multilingual sentence embeddings and density-based clustering; a story that only one channel ran usually stays unclustered and is not reported on. Each cluster gets a generated summary, keyword extraction, sentiment classification and a scan for a fixed set of manipulation techniques. Factual claims are decomposed into atomic sub-claims, searched in the language of the country the story is rooted in, weighed by source authority, freshness and relevance, classified for stance by a dedicated model, and given one of the ten verdicts with the whole evidence chain kept. The published report, the dashboard and the cluster file are produced in the same run and cannot drift apart.

The pipeline is automated end to end; the system is reviewed, not every individual report. The full description, including the parts that are weak, is on the methodology page.

Personal and sensitive information

This is discussion data from a country at war, so de-identification is not a formality.

  • User IDs and usernames are replaced with salted pseudonyms (user_<hash>), stable across the whole dataset so conversation structure survives.
  • Emails, phone numbers, mentions and URLs are replaced with the tokens [email], [phone], [mention], [url], in posts and in comments.
  • Timestamps in the monthly files are truncated to the day.
  • Internal Telegram identifiers are removed; channel names are kept on purpose, because who published first and who amplified whom is the research question, and channels are public broadcasters, not private individuals.

Pseudonymisation is not anonymity. Someone who already holds the original public messages can re-link some comments by matching text. Treat this as de-identified research data, not as a privacy guarantee for the people in it, and do not use it to identify, profile or target individual commenters.

Bias, risks and limitations

  • The sample is a fixed set of channels, not Telegram. Findings describe the monitored channels, not the Ukrainian information space as a whole, and the channel set shapes what can be seen.
  • Single-source stories fall out. Clustering needs corroboration across channels, so absence from the analysis layer is not evidence that a story did not happen.
  • Labels are model output. Summaries, manipulation flags, sentiment and verdicts are produced by language and classification models without a human editor per report. Use them as signals to examine, not as ground truth.
  • Verdicts depend on what search engines return at the moment of checking. A claim can be checkable one day and unverifiable the next for reasons unrelated to its truth.
  • Coordination and bot signals are statistical. A high score is a reason to look closer, not a finding that a campaign exists.
  • The Russian mirror is comparative and partial. It covers a small set of channels and only the events they also reported.
  • Ukrainian dominates; Russian and English are present but not balanced.

Intended uses

Research and reporting on disinformation, propaganda techniques, narrative spread and audience reaction; benchmarks for Ukrainian-language sentiment, summarisation, stance and claim detection; fact-checking methodology research, including re-scoring the published evidence; media-literacy teaching material built on real examples. Commercial use is allowed under the licence with attribution.

Out of scope: re-identifying commenters, building profiles of individuals, or presenting the model labels as verified findings about a person or an outlet without independent checking.

Citation

@misc{aisberg_telegram_news_ua,
  title        = {Aisberg Telegram News UA: de-identified Ukrainian Telegram news, discussion and fact-checking data},
  author       = {{Aisberg Public Organization}},
  year         = {2026},
  howpublished = {\url{https://huggingface.co/datasets/aisbergpublicorganization/telegram-news-ua-dataset}},
  note         = {Documentation at \url{https://aisberg.live/data/}. Licence CC BY 4.0.}
}

If you publish something built on this data, tell us at [email protected]. We keep a list of uses and it helps the project continue.

Custom extracts and collaboration

The working corpus behind this release is larger and finer-grained than the public files: full snapshot series, per-post view and reaction curves, comment threading, channel-level aggregates, and analysis outputs that do not fit the monthly format. Researchers, journalists, fact-checking organisations and NGOs whose question the public files do not cover can write to [email protected] with the period, channels, fields and intended publication; for non-commercial research a custom extract is free.

The fact-checking pipeline also runs on claims supplied from outside: send a claim set and get back verdicts with full evidence chains. Details on the fact-checking page.

About Aisberg

Aisberg (ГО «АЙЗБЕРГ», registered Ukrainian non-profit, ЄДРПОУ 46034329) monitors the Ukrainian Telegram information space with an automated pipeline and publishes what it measures: real-time reports in the Telegram channel, an interactive dashboard for every report, and this open dataset. The method and its limitations are published together at aisberg.live.

Contact: [email protected] · Maintainer: Illia Riznyk · LinkedIn