Decision pipeline

Every 10 minutes we run a cycle that goes through 4 stages. Only items that clear all get saved as incidents.

  1. Collect. We poll RSS + Telegram + Reddit + ADL + Bellingcat in parallel. ~240 RSS feeds + ~80 subreddits + ~46 Telegram channels + ADL + Bellingcat + full-text scrapers across 8 LATAM countries. 800-1500 items per cycle, 31 matching languages.
  2. Junk filter. Drop Google Translate artifacts ("please select two distinct languages", etc.), widgets, site navigation, and texts that are too short.
  3. Keyword match. The item must mention at least one word from our lexicon (see below). This is the filter that colors items red in the LIVE feed.
  4. Classify. Matched items go to an automated classifier that extracts country + type + severity + ES/EN translations, with internal redundancy and a local rule-based backup to keep things running.

Lexicon — 31 languages

Keyword matching is the most visible filter. An item enters the antisemitism feed only if it contains at least one of these roots (case-insensitive, substring). We cover:

LanguageExample keywords
🇸🇦 العربية (Arabic)معاد للسامية, يهود, المحرقة, نازي
🇧🇬 Български (Bulgarian)антисемит, синагога, евреи, еврейск, холокост, нацист, свастика
🇨🇿 Čeština (Czech)antisemit, antisemitismus, synagoga, žid, žido, holokaust, šoa, nacista, hákový kříž
🇩🇰 Dansk (Danish)antisemit, synagoge, jøde, jøder, jødisk, holocaust, shoah, nazist, hagekors
🇩🇪 Deutsch (German)antisemit, synagoge, jüdisch, juden, holocaust, shoah, hakenkreuz, holocaustleugnung
🇬🇷 Ελληνικά (Greek)αντισημιτ, συναγωγή, εβραί, εβραϊκ, ιουδα, ολοκαύτωμα, σοά, ναζί, σβάστικα, κιπά
🇬🇧 Englishantisemit, synagogue, jewish, holocaust, shoah, nazi, swastika, yarmulke, kippah, tefillin
🇪🇸 Español (Spanish)antisemit, antisemita, sinagoga, judío, holocausto, shoah, nazi, neonazi, esvástica, kipá, daia, amia
🇪🇪 Eesti (Estonian)antisemit, sünagoog, juut, juudi, holokaust, natsi, haakrist
🇫🇷 Français (French)antisémit, synagogue, juif, juive, holocauste, shoah, svastika, croix gammée, kippa, crif
🇮🇱 עברית (Hebrew)אנטישמי, יהוד, בית כנסת, שואה, נאצי, כיפה
🇭🇷 Hrvatski (Croatian)antisemit, sinagoga, židov, židovsk, holokaust, nacist, kukasti križ
🇮🇸 Íslenska (Icelandic)andgyðing, gyðingahat, samkunduhús, gyðing, helför, nasist, hakakross
🇮🇹 Italiano (Italian)antisemit, sinagoga, ebreo, ebrei, olocausto, shoah, svastica, croce uncinata
🇱🇻 Latviešu (Latvian)antisemīt, sinagoga, ebrej, holokaust, nacist, kāškrust
🇲🇰 Македонски (Macedonian)антисемит, синагога, евреин, еврејск, холокауст, нацист, свастика
🇭🇺 Magyar (Hungarian)antiszemit, zsinagóga, zsidó, holokauszt, náci, horogkereszt
🇳🇱 Nederlands (Dutch)antisemit, synagoge, joods, jodendom, holocaust, hakenkruis, keppeltje
🇳🇴 Norsk (Norwegian)antisemitt, synagoge, jøde, jøder, jødisk, holocaust, nazist, hakekors
🇵🇱 Polski (Polish)antysemit, synagoga, żyd, żydow, żydowsk, holokaust, swastyka, jarmułka
🇵🇹 Português (Portuguese)antissemit, sinagoga, judeu, holocausto, suástica, quipá
🇷🇴 Română (Romanian)antisemit, sinagog, evreu, evrei, evreic, holocaust, nazist, svastică
🇷🇺 Русский (Russian)антисемит, синагог, еврей, иудей, холокост, нацис, свастик
🇷🇸 Српски / Srpski (Serbian)антисемит, синагога, јеврејин, холокауст / antisemit, jevrej, holokaust, nacist
🇸🇰 Slovenčina (Slovak)antisemit, synagóga, žid, žido, holokaust, šoa, nacista, hákový kríž
🇸🇮 Slovenščina (Slovenian)antisemit, antisemitizem, sinagoga, žid, judov, holokavst, šoa, nacist, kljukasti križ
🇦🇱 Shqip (Albanian)antisemit, antisemitizm, sinagogë, hebre, hebrenj, hebraik, holokaust, nazist, svastikë
🇫🇮 Suomi (Finnish)antisemitismi, synagoga, juutalais, holokaust, natsi, uusnatsi, hakaristi
🇸🇪 Svenska (Swedish)antisemit, synagoga, jude, judar, judisk, förintelsen, shoah, nazist, nynazist, hakkors, kippa
🇹🇷 Türkçe (Turkish)antisemit, antisemitik, sinagog, yahudi, yahudiler, holokost, şoa, nazi, gamalı haç
🇺🇦 Українська (Ukrainian)антисеміт, синагог, єврей, голокост, нацис, свастик

If you spot a false positive or a missing keyword, let us know.

What is NOT antisemitism (per the pipeline)

An item with a keyword match is not automatically an incident. To be saved as an incident, it must also meet three conditions:

  • Describe something concrete. The classifier rejects generic templates like "antisemitic hate speech on social media", "antisemitic vandalism", "threat to Jewish community" — empty patterns. There must be place + actor + action.
  • Minimum 25 characters of description. Below that we drop tags, metadata, fragments.
  • The description must mention a keyword again. If the model paraphrases and loses the antisemitism angle, we drop it — that means the classification drifted off-topic.

Additionally, the Monitor does NOT classify as antisemitism:

  • Criticism of State of Israel policy per se (distinguished from attacks on Jews or Jewish institutions — IHRA line).
  • News where "Israel" appears as collateral topic, without context of aggression, legislation, speech or attack against Jews.
  • Statements by the State of Israel itself (classification rules drop these as not incidents).
  • Satirical, artistic or editorial content that does not describe a concrete fact.

Automated classification

Items that pass keyword matching are sent to a classifier that extracts the following fields against a strict schema:

country   → ISO-3166 alpha-2 code
type      → attack | vandalism | hate_speech | legislation | boycott |
            denial | threat
severity  → low | medium | high | critical
description_es / description_en → mutual translations of the SAME
            concrete fact, with place + actor + action
original_language → source language

The instructions identify concrete incidents — attacks on synagogues / Jewish cemeteries, physical assault, nazi vandalism, hate speech by public figures, discriminatory legislation, boycotts, Holocaust denial, threats — and reject cultural mentions (cinema, literature, anniversaries) and positive interfaith solidarity.

Fault tolerance

To avoid losing incidents when a classifier component is rate-limited or temporarily down, the system runs with internal redundancy:

  1. Primary model. Processes items in batches; on rate-limit rejection, backoff and retry with a secondary model.
  2. Failover to alternate models. If the primary stays unavailable or the payload doesn't fit, alternate models are invoked. All keep the same output schema.
  3. Local heuristic. If every automated model is down, a local classifier based on multilingual regex infers type (attack, vandalism, threat, etc.) and severity from the text, and detects country via an alias catalog. When country can't be inferred, the incident is marked as global. It does not translate — it uses the source text as the description, and items can be re-classified once a model returns.

Cross-source corroboration

When the same fact appears in more than one independent outlet, we mark it as verified. On the dashboard this is the "verified only" filter toggle; in the RSS feed only verified items are included by default.

The math is simple:

  • Each incident has a source_count field with the number of outlets that reported it. It increments every time dedup collapses another item to the same hash.
  • source_count >= 2verified (✓).
  • credibility_score is an additional weight that combines quantity of sources and quality (an ADL or Bellingcat report weighs more than a random Telegram channel).

Verified does NOT mean "fact-checked by us" — it means the event was reported by at least two distinct outlets we monitor. For academic or legal use, the same caveat applies: cross-check against the primary sources.

How the continental index is computed

The Antisemitism by continent · 30 days block above the feed is a two-dimensional index: each cell shows two independent scores — threat (negative) and hope (positive) — so a reader can tell at a glance how severe antisemitic activity is AND how robust the institutional/community response has been.

Both scores are absolute: each continent has its own numbers that move up and down independently of the others. Previously we used a single relative index (max-normalized to 0-100), but that pegged the most active continent at 100 every render and gave a false impression of a "permanent ceiling". Now each dimension lives in fixed categorical bands.

The two dimensions

DimensionMeasuresPolarityExample items
ThreatRecent antisemitic activitynegativeattack, vandalism, hate speech, discriminatory legislation, boycott, denial, threat
HopeInstitutional or community responsepositivejudicial conviction, protective law, vigil/march of support, institutional education program

The dimensions are orthogonal: a region can have high threat and high hope (a lot is happening, a lot is being responded to), or high threat and low hope (a lot is happening, weak institutional response), etc. They are NOT subtracted or averaged — they're displayed in parallel.

Formula (identical for both dimensions)

score(continent) = Σ [ severity_weight(item) × freshness(item) ]
     where
        severity_weight = { low: 1, medium: 2, high: 4, critical: 8 }
        freshness(item) = max(0, 1 - days_old / 30)   // linear decay

(rounded to 1 decimal)

For positive items (hope), severity is interpreted as scope: low=local, medium=regional, high=national, critical=international. A supreme-court ruling weighs more than a neighborhood vigil — but both contribute to the hope dimension.

Bands (fixed thresholds, same for both dimensions)

BandScore (raw)Threat readingHope reading
Calm0 – 5no antisemitic activity detectedno responses detected yet
Low5 – 301-5 low-severity incidents or 1-2 mediuminitial response
Moderate30 – 100sustained mid-level volumemoderate response
Elevated100 – 500many severe or very recent incidentsstrong response
Critical500+continental-scale severe cluster with sustained coveragesustained response

Important: in the hope dimension, the "Calm" band is not good news — it means NO institutional response was detected, possibly because the region didn't publish any, or because there were none. We label it as "no responses yet" in the UI to avoid confusion.

Example

If MENA gets 10 high incidents in the last week, contribution is 10 × 4 × ~0.8 = 32 → band Moderate. If LATAM has 2 low incidents from 25 days ago, contribution is 2 × 1 × ~0.16 = 0.32 → band Calm. If Europe accumulates ~200 mixed (high + medium) recent incidents, easily clears 500 → band Critical. The three numbers live independently; LATAM doesn't look "lower" because of MENA or Europe.

The dashboard's visual bar caps at 500 (a score of 500 fills the bar). Above 500 the bar stays full but the absolute number keeps growing in the label. Prevents an outlier continent from visually compressing the others.

Continent bucketing

ISO-3166 alpha-2 code in parentheses. Continents and countries alphabetical.

  • Asia (22): Afghanistan (AF), Bangladesh (BD), Cambodia (KH), China (CN), Hong Kong (HK), India (IN), Indonesia (ID), Japan (JP), Kazakhstan (KZ), Malaysia (MY), Mongolia (MN), Myanmar (MM), Nepal (NP), Pakistan (PK), Philippines (PH), Singapore (SG), South Korea (KR), Sri Lanka (LK), Taiwan (TW), Thailand (TH), Uzbekistan (UZ), Vietnam (VN).
  • Europe (41): Albania (AL), Austria (AT), Belarus (BY), Belgium (BE), Bosnia (BA), Bulgaria (BG), Croatia (HR), Cyprus (CY), Czech Republic (CZ), Denmark (DK), Estonia (EE), Finland (FI), France (FR), Germany (DE), Greece (GR), Hungary (HU), Iceland (IS), Ireland (IE), Italy (IT), Kosovo (XK), Latvia (LV), Lithuania (LT), Luxembourg (LU), Malta (MT), Moldova (MD), Montenegro (ME), Netherlands (NL), North Macedonia (MK), Norway (NO), Poland (PL), Portugal (PT), Romania (RO), Russia (RU), Serbia (RS), Slovakia (SK), Slovenia (SI), Spain (ES), Sweden (SE), Switzerland (CH), Ukraine (UA), United Kingdom (UK).
  • LATAM (20): Argentina (AR), Bolivia (BO), Brazil (BR), Chile (CL), Colombia (CO), Costa Rica (CR), Cuba (CU), Dominican Rep. (DO), Ecuador (EC), El Salvador (SV), Guatemala (GT), Haiti (HT), Honduras (HN), Mexico (MX), Nicaragua (NI), Panama (PA), Paraguay (PY), Peru (PE), Uruguay (UY), Venezuela (VE).
  • MENA (21): Algeria (DZ), Bahrain (BH), Egypt (EG), Iran (IR), Iraq (IQ), Israel (IL), Jordan (JO), Kuwait (KW), Lebanon (LB), Libya (LY), Morocco (MA), Oman (OM), Palestine (PS), Qatar (QA), Saudi Arabia (SA), Sudan (SD), Syria (SY), Tunisia (TN), Turkey (TR), UAE (AE), Yemen (YE).
  • North America (2): Canada (CA), USA (US).
  • Oceania (2): Australia (AU), New Zealand (NZ).
  • Sub-Saharan Africa (16): Angola (AO), Cameroon (CM), DRC (CD), Ethiopia (ET), Ghana (GH), Ivory Coast (CI), Kenya (KE), Mozambique (MZ), Namibia — coverage via regional feeds, Nigeria (NG), Rwanda (RW), Senegal (SN), South Africa (ZA), Tanzania (TZ), Uganda (UG), Zambia (ZM), Zimbabwe (ZW).

Incidents without a detectable country appear in the timeline marked as global, but don't enter the continental index — they have no continent to sum to.

What the index is NOT

  • It is NOT an absolute ranking of "where more Jews are at risk". A continent with less media coverage will show a low score even if the reality is worse.
  • It does NOT measure perception or public opinion. Only incidents classified by the pipeline — see section above.
  • It does NOT sum years: the 30-day window caps the horizon, and the decay makes an incident from 29 days ago barely count. For historical analysis, use /api/incidents?since=… directly.
  • It is NOT per-capita. ADL/CST publish stats normalized by Jewish population; we don't, because population estimates vary. This score is pure weighted volume.

Sources monitored

Every incident we save has a clickable source_url field. Sources, alphabetical:

  • ADL — direct feed from the Anti-Defamation League.
  • Bellingcat — OSINT investigations on extremism.
  • Newswires RSS — ~240 outlets in 31 languages. Regions and outlets alphabetical:
    • Africa: allAfrica (general + Ethiopia + Ghana + Kenya + Nigeria), BBC Africa, BBC Afrique (Francophone), Borkena (Ethiopia), Daily Maverick, eNCA (SA), Mail & Guardian, News24 (SA — Top + Local), Premium Times (Nigeria), Reporter Ethiopia, South African Jewish Report, Standard Media (KE), The Citizen (SA), The Namibian, This Day (NG).
    • Asia-Pacific: ABC Australia, Asia Sentinel, Australian Jewish News, Bangkok Post, Channel News Asia, China Daily, Dawn (Pakistan), Express Tribune (Pakistan), Geo News, Global Times, Hindustan Times, HKFP (Hong Kong Free Press), India Today, Japan Times, Korea Herald, Korea Times, Malay Mail, Mint, NDTV, Nikkei Asia, RNZ, SBS, SCMP, Scroll.in, SMH, Straits Times, The Conversation AU, The Daily Star (Bangladesh), The Hindu, Times of India, TOI World, Xinhua, Yonhap.
    • Balkans: Balkan Insight, Danas (RS), Delo (SI), ERT News, Greek Reporter, Index.hr, Koha (Kosovo), N1 Serbia, Naftemporiki, Neos Kosmos (diaspora), Politika (RS), RTV Slovenia, Telegrafi, To Vima, tportal (HR), Vijesti (ME).
    • Baltics: 15min Lithuania, Baltic Times, ERR Estonia, LSM Latvia (EN+LV), Postimees (ET).
    • Europe: 7sur7 (BE), ABC Spain, ANSA, BBC World, Corriere, Corriere Esteri, Der Standard (AT), DW, Economist, El Mundo, Euronews (EN+ES), France Info, FT, Gazeta Wyborcza, Guardian, Le Monde, Le Temps (CH), Libération, NOS (NL), Notes from Poland, OKO.press, Politico EU, Repubblica, Spiegel, SRF (CH), Tagesschau, The Independent, TVN24, VRT (BE), Zeit.
    • Eastern Europe / CEE: České noviny, Deník N (CS), Denník N (SK), Digi24 (RO), HotNews, Hungary Today, iDNES, Republika (MK), Seznam Zprávy, Sofia Globe (BG), Telex (HU), Ziarul de Gardă (MD).
    • Russia / ex-USSR: Astana Times (KZ), Civil.ge (Georgia), JAMnews (Caucasus), Meduza (RU exiled), Moscow Times, NV Ukraine (EN), Ukrainska Pravda, RBC (RU), TASS (EN+RU).
    • Jewish press / antisemitism monitors: ADL, ADL Antisemitism Uncovered, AJC, Algemeiner, Amadeu Antonio Stiftung (DE), Arutz Sheva, Campaign Against Antisemitism (UK), Combat Antisemitism Movement, Forward, Haaretz (HE+EN), Hope Not Hate (UK), i24News, Israel Hayom, JCPA, Jerusalem Post, Jewish Chronicle UK, Jewish Insider, Jewish Journal, Jewish News UK, Jewish Press, Jewish Standard NJ, JNS, JTA, Moment, NGO Monitor, Times of Israel, YNet.
    • LATAM: 14ymedio, Agência Brasil, AMIA (AR), Aristegui, Ámbito, BBC Brasil, BBC Mundo, Chequeado, CIPER (Chile), Clarín, Confidencial (Nicaragua), Cronista, El Comercio PE, El Deber BO, El Mundo SV, El País (Spain), El País UY, El Tiempo CO, Emol, Enlace Judío MX, Estadão, Expansión MX, Folha, France 24 (ES), G1 Globo, InSight Crime, Infobae, JOTA, La Jornada, La Nación AR, La Prensa PA, La Tercera, Los Tiempos, Página Siete, Perfil, Prensa Libre GT, RPP Perú, Río Negro, TN Argentina, Tiempo Argentino, UOL, Veja.
    • MENA: Al Jazeera (EN+AR), Al-Monitor, Anadolu Agency (Turkey), Arab News, Asharq Al-Awsat, Daily Sabah, Egypt Independent, Egyptian Streets, Fanack, Hürriyet, Hürriyet Daily News, Mehr News, Middle East Eye, Middle East Monitor, Morocco World News, Tehran Times, The National UAE.
    • Nordic: Aftonbladet, Dagens Nyheter, DR (DK), Helsingin Sanomat, NRK (NO), RÚV (IS), SVT, Yle Finland (EN).
    • North America: ABC News, B'nai Brith Canada, Canadian Jewish News (CJN), CBC, Fox News, Globe and Mail, National Post, Newsweek, NYT, WSJ.

    The source catalog is updated periodically. New sources enter the scanning cycle automatically.

  • News API (LATAM full-text) — Consumes noticias.kavnes.com/search, an in-house API serving full-text scraped from mainstream outlets across 8 LATAM countries (Argentina, Uruguay, Chile, Peru, Paraguay, Bolivia, Colombia, Mexico). Adds depth beyond the RSS top-15 — pulls full articles from Clarín, La Nación, Infobae, El Día, T13, Cooperativa, Diario Popular, etc.
  • Reddit — ~80 subreddits. Dedicated: r/antisemitism, r/Holocaust, r/HolocaustHistory, r/IsraelPalestine, r/Israel, r/Jews, r/JewsOfConscience, r/Judaism, r/jewishevents. Aggregators: r/africa, r/asia, r/EuropeanPolitics, r/europe, r/geopolitics, r/MiddleEastNews, r/news, r/politics, r/worldnews, r/worldpolitics. Country/region (alpha): r/argentina, r/australia, r/austria, r/bangladesh, r/bosnia, r/brasil, r/bulgaria, r/Chile, r/china, r/colombia, r/croatia, r/czech, r/denmark, r/deutschland, r/egypt, r/Estonia, r/Ethiopia, r/Finland, r/france, r/germany, r/greece, r/hungary, r/iceland, r/india, r/indonesia, r/iran, r/ireland, r/italy, r/japan, r/Kenya, r/korea, r/latinamerica, r/latvia, r/lebanon, r/lithuania, r/malaysia, r/mexico, r/Netherlands, r/newzealand, r/Nigeria, r/norway, r/pakistan, r/palestine, r/peru, r/philippines, r/poland, r/polska, r/Romania, r/russia, r/serbia, r/slovakia, r/slovenia, r/southafrica, r/spain, r/sweden, r/syria, r/turkey, r/ukpolitics, r/ukraine, r/unitedkingdom, r/uruguay, r/venezuela.
  • Telegram — ~46 public channels with /s/ preview (alpha). Outlets: @algemeiner, @alertacolombia, @alertamundialnews, @animalpolitico, @cibercuba, @ClarinCom, @cnnbrasil, @crhoy, @cronicauno, @cubanosporelmundo, @diariolibre, @elcomercioperu, @eldestapeweb, @elheraldohn, @estadao, @fastcheckcl, @folha, @g1noticias, @infobae, @jerusalem_post, @kann_news, @kyivindependent, @kyivpost_official, @laprensani, @lemonde_fr, @lenouvelliste, @meduzalive, @nexta_tv, @NHK_WORLD, @pagina12, @primiciasec, @rainews, @revistaistoe, @scmp_news, @sinembargomx, @spiegel_online, @tehran_times, @Times_of_Israel, @walla_il, @welt_de. Antisemitism monitors: @adlofficial, @jtanews, @stopantisemitism, @worldjewishcongress. OSINT: @bellingcat, @OSINTdefender.

Dedup and persistence

Dedup runs in two layers to collapse the same news reported by multiple outlets into a single row (with its source_count incremented — see corroboration):

  1. Exact hash: each incident gets a sha1(country|type|description_prefix_120). If two classifications produce identical hashes, they merge automatically.
  2. Fuzzy second-pass: when the hash misses, we compare the description against the last 50 incidents of the same country and type from the past 48h. We use normalized Levenshtein distance (edit_distance / max_length, on lowercase + diacritic-stripped + article-stripped text). Similarity ≥ 85% (ratio ≤ 0.15) triggers a merge. This catches cases where two outlets phrase the same event slightly differently — "Assault outside synagogue..." vs "Assault outside a synagogue..." — variations the hash alone can't group.

For short texts (< 30 normalized characters) the threshold tightens to 7.5%, because each word weighs much more — "Synagogue attacked in Berlin" vs "...in London" has high apparent similarity but they're distinct events. The 48h cap prevents two similar-but-time-separated events from being wrongly merged.

Storage is append-only with automatic daily backups — we don't delete history. Incidents only grow in source_count and credibility_score as corroborations arrive.

Historical coverage

Our live monitoring started on 23 April 2026: from that date forward the pipeline ingests incidents as they're published. Every chart on /explore marks that cutoff with a dashed vertical line.

The series before 2026-04-23 is a backfill: we went back in time applying the same full set of sources we monitor today to the historical window shown. It is not the case that some years have more sources than others — the catalog is consistent across the full retroactive window, so volume differences between years reflect actual media coverage (and archive accessibility), not changes in our method.

How to access the data

Seven ways to consume the Monitor depending on your use case:

  • Web dashboardantisemitismo.kavnes.com. Live visualization with continental index, LIVE feed, filters and timeline. For general browsing.
  • Browsable archive/archive. Full-text search (FTS5) over the entire history, filters by country / type / severity / date range / verified, and CSV export of the results. For historical research or specific citations. For bulk downloads or the full historical dataset: contact first (micaela@kavnes.com).
  • Weekly email digest — Free subscription with double opt-in (from the home page). Arrives Fridays 9am ART with a brief editorial narrative, the week's top incidents ranked by credibility, and the updated continental index. No spam, one-click unsubscribe.
  • RSS feed/rss (subscription instructions) or /incidents.rss (raw XML for readers). Default includes verified incidents only (≥2 sources), threat dimension. Accepts query-string filters: ?country=AR, ?type=attack, ?severity=high, ?lang=en, ?verified=0 for all, ?polarity=positive for a responses & initiatives feed, ?polarity=all for mixed.
  • Embeddable widget/embed. Ready-to-paste iframe showing the live continental index. Designed for journalists / NGOs / blogs who want to cite the index with attribution. Refreshes itself every minute, no cookies, CSP frame-ancestors *. The widget must keep the attribution to the Monitor visible — white-labeling is not allowed.
  • JSON API — for programmatic use: /api/incidents, /api/index/continent, /api/countries, /api/search, /api/stream. Full endpoint documentation with params, curl examples and response shapes. Default: 60 req/min, 2000 req/day per IP, 10 req/min on search/CSV. For sustained programmatic use (research, NGOs, newsroom integrations) write to micaela@kavnes.com and we'll issue an API key (x-api-key header) with no cap. It's free — we just want to know what's being built.
  • Per-source track recordAPI endpoint /api/sources: aggregate stats per outlet (incidents contributed, corroboration rate, countries covered). Only includes outlets that already produced an incident; the full catalogue of ~370 monitored sources is documented in the Monitored sources section below.

The data we generate (classification, translations, scores) is licensed under CC BY-NC 4.0. Academic, journalistic, educational and NGO use: free with attribution. Commercial use (data resale, product integration, corporate dashboards, large-scale automation) is not allowed without prior authorization — request it by writing to micaela@kavnes.com. We don't charge — we just want to know who's using it for what. The original news text belongs to the respective outlets.

Honest limitations

  • Biased classification. Automated models carry inherited biases. Severity classification is especially noisy — use as indicator, not absolute truth.
  • False negatives. An attack using euphemistic language (e.g. "zionist" without mentioning Jews) may not trigger the lexicon.
  • False positives. The heuristic sometimes flags analytical articles that mention "antisemitism" without a concrete fact. The validator filters them but not always.
  • Coverage bias. If an incident doesn't appear in any outlet we monitor, it doesn't exist for the Monitor. Small communities or countries with censored press are underrepresented.
  • Imperfect translation. ES and EN descriptions are model output, not human translation. For citation purposes, always go back to the original source (source_url field).
  • Fuzzy dedup false-collapses. The second-pass that merges descriptions with ≥ 85% similarity (see dedup) has a low but non-zero error rate. Genuinely distinct events with very similar phrasing and the same country+type within 48h can collapse to one row. Merged incidents stay traceable via additional_sources, but the visible description will be a single one.
  • Source metrics measure volume, not accuracy. The /api/sources endpoint measures how many incidents each outlet contributes and how often others confirm. It does NOT measure real accuracy (that would require manual ground-truth). A "tier 5" outlet can be just as reliable as a "tier 10" in its niche.

How to cite this work

The Global Antisemitism Monitor is a public, free resource. If you use it in a story, report, paper or publication, please cite it like this:

Short citation (general)

Global Antisemitism Monitor (2026). antisemitismo.kavnes.com
[accessed: YYYY-MM-DD]

Citing a specific incident

Each incident has a stable-ID permalink. Cite as:

Global Antisemitism Monitor (2026). "Attack on synagogue in Villa Crespo."
antisemitismo.kavnes.com/inc/1234 [accessed: YYYY-MM-DD]
Primary source: {original outlet URL}

Always also cite the primary source (source_url) — the Monitor is an aggregator, not a reporter. Our classification is heuristic/AI and can be wrong. For academic or legal use, verify against the original outlet.

Citing the continental index

Global Continental Antisemitism Index, Global Antisemitism Monitor (2026).
antisemitismo.kavnes.com/methodology#continental-index
Window: last 30 days. Absolute weighted score, categorical band.

BibTeX format

@misc{monitor_antisemitism_2026,
  title  = {Global Antisemitism Monitor},
  author = {Kavnes, LLC},
  year   = {2026},
  url    = {https://antisemitismo.kavnes.com},
  note   = {Accessed: YYYY-MM-DD}
}

Data license

The metadata we generate (classification, translation, score) can be used freely with attribution for non-commercial use (CC BY-NC 4.0). For commercial use, request a license at micaela@kavnes.com. The original text of each news item belongs to the respective outlet — respect their license when reproducing content.

Contact

Inquiries, corrections, collaborations or source suggestions:

micaela@kavnes.com

If you see a misclassified incident or an antisemitism news item we missed, send the link and we'll review manually. Requests that include the primary source URL get priority.