Transparency Protocol
Data Methodology
Our mission is to provide accurate, real-time intelligence on antisemitic activity. To maintain integrity, the platform is fully transparent about how data is sourced, categorized, and analyzed.
Incident Sourcing
The platform aggregates incidents from a wide array of publicly available news media. Articles are fetched from multiple global news APIs, including the ADL Incident Tracker and various regional reporting bureaus.
- Semantic deduplication: Beyond exact URL/title matching, a MinHash/LSH similarity engine merges paraphrased coverage of the same real-world event across outlets. Pairs scoring ≥0.75 on a composite of text similarity, shared named entities, date proximity (±2 days), and geographic proximity merge automatically; 0.50–0.75 pairs go to an analyst review queue. One event, N attached sources.
- Corroboration: Every confirmed cross-outlet merge counts as independent corroboration — it raises the record's credibility grade and feeds each outlet's reliability track record. Outlets sharing a parent organization or carrying wire copy do not count as independent.
- Stable identifiers: Every published incident carries a permanent
AIT-YYYY-NNNNNid. Records are never silently rewritten — post-publication changes stream through the public corrections feed. - Language Detection: Non-English articles are detected and tagged for translation.
- Source Integrity: Each incident maintains direct links back to every reporting outlet, plus a SHA-256 evidence-vault snapshot of the primary source.
Severity & Categorization
Incidents are categorized algorithmically based on NLP analysis of the article text. The following categories are used:
Direct physical violence or attempted harm.
Targeted verbal or written abuse.
Property damage or antisemitic graffiti.
Specific, credible threats of violence.
Intelligence Grading Doctrine
Every record is graded by a deterministic engine that encodes professional analytic tradecraft — no machine-learning APIs, every judgment reproducible and auditable.
- NATO Admiralty System: source reliability (A–F) and item credibility (1–6) are assessed by separate functions sharing no inputs. Reliability comes from each outlet's evolving track record (40% structural baseline, 60% empirical accuracy from corroboration and detected retractions — published in full at
/api/v1/sources). Credibility 1 (“Confirmed”) requires at least two independent outlets. - ICD-203 estimative language:probabilities are stored as numbers and rendered with the IC standard vocabulary (“likely (55–80%)”), and every confidence call ships with its drivers (“because”) and what evidence would change it.
- Negation-aware classification:signals are matched at word boundaries with NegEx-style scoping, so “no weapons were found” or “debunked as a hoax” suppress rather than trigger severity. Every fired rule records the exact text span — the evidence ledger shown in the analyst workbench.
- Triple taxonomy coding:each incident is coded to CST's six-tier scale (UK), ADL audit categories, and FBI NIBRS offense + bias-motivation codes (Anti-Jewish = 12) so the dataset reconciles against any published official statistic.
- Competing hypotheses: reports grading doubtful are run through an ACH matrix (hate incident / non-bias crime / hoax / misattribution) ranked by weighted inconsistency — disconfirmation, not confirmation, drives the call.
- Human-on-the-loop with audit: analysts can override any machine grade, but only with a stated rationale; overrides and all post-publication changes are written to a SHA-256 hash-chained audit log and surfaced through the corrections feed.
Policy Correlation Analysis
The Policy Impact Analysis measures the observable shift in incident rates following the enactment of a specific piece of legislation.
The 6-Month Window Rule
The analysis compares the total number of incidents in the 6 months before a law is passed against the 6 months after its enactment. Results are normalized to account for general reporting trends.
Public API Reference
All incident data is available via a free, public REST API. No authentication required. CORS is enabled for cross-origin requests from any domain.
/api/v1/incidentsReturns paginated incident data with optional filters. Supports JSON and CSV output.
Query Parameters
| Parameter | Type | Description |
|---|---|---|
q | string | Full-text search over title, description, and location (SQLite FTS5). |
category | string | Filter by category (e.g. "Harassment", "Physical Assault", "Vandalism", "Threats"). |
location | string | Partial match on location (case-insensitive). |
since | date | Include incidents on or after this date (YYYY-MM-DD). |
until | date | Include incidents on or before this date (YYYY-MM-DD). |
severity_min | int | Minimum severity score (1–10). |
severity_max | int | Maximum severity score (1–10). |
status | string | "verified" or "pending_review". |
sort | string | "date" (default) or "severity". |
page | int | Page number (default: 1). |
limit | int | Results per page (default: 50, max: 500). |
format | string | "json" (default) or "csv". |
/api/v1/statsReturns aggregate statistics: total counts, breakdowns by category, location, month, and verification status. No parameters required.
Institutional Data Egress
/api/v1/exportBulk export of the full verified dataset — no pagination cap, stable AIT ids, citable metadata header. ?format=csv|jsonl|stix and ?preset=full|nibrs (NIBRS-aligned columns for police cross-walks). Licensed CC BY 4.0.
/api/v1/correctionsAppend-only corrections & amendments feed: every post-publication change (merges, status changes, grade overrides) with rationale. Poll with ?since= to keep re-published copies honest.
/api/v1/sourcesThe living source-reliability registry: every outlet’s Admiralty grade with the structural baseline and empirical track record (confirmed / contradicted / retractions) that produced it.
/api/v1/graphIntelligence graph: ?around=<object_id>&depth=1..3 returns the typed object/link neighborhood (events, actors, organizations, institutions, locations, sources).
/taxii2/TAXII 2.1 discovery. Verified incidents as STIX 2.1 incident objects with per-record confidence mapped from Admiralty grading — subscribe natively from OpenCTI, ThreatConnect, or any TAXII client.
/api/v1/stixOne-shot STIX 2.1 bundle download (Incident SDOs carrying the official OASIS Incident Core Extension, city-level Location SDOs, court-record-verified threat actors only). ?limit= and ?since= filters. Companion MISP taxonomy at /taxonomies/antisemitism/machinetag.json.
/api/v1/official-statsOfficial government anti-Jewish hate-crime series, normalized to one shape: FBI Crime Data Explorer (national + state, incl. provisional partial-year figures), NY DCJS county data, and Statistics Canada quarterly preliminary counts. ?source=&jurisdiction=&from=&to=&format=json|csv. Reconcile OSINT counts against authoritative baselines.
/api/v1/prosecutionsFederal prosecution milestones for antisemitism-related cases, discovered from DOJ press releases and tracked end-to-end (Arrested → Charged → Indicted → Guilty Plea → Convicted → Sentenced). ?status=&defendant=&format=json|csv.
/api/v1/advisoriesDHS National Terrorism Advisory System bulletins mirrored from the official feed — the national threat-posture overlay. An empty list means DHS currently has no active advisories.
/api/gdelt-liveLive GeoJSON layer of worldwide media mentions carrying GDELT’s machine-coded REL_ANTISEMITISM theme (65 languages, 15-minute cadence, rolling 7-day window). Media mentions — NOT verified incidents. ?hours=1..168.
Data Dictionary — /api/v1/export (full preset)
| Field | Type | Definition |
|---|---|---|
public_id | string | Permanent citable id (AIT-YYYY-NNNNN). Never reused, never rewritten. |
date / location / lat / lng | mixed | Event date (ISO 8601) and city-level geography. Coordinates are never finer than city/district. |
category | string | Platform category (Physical Assault, Vandalism, Threats, Harassment, Propaganda, Other). |
cst_category | enum | CST six-tier code: EXTREME_VIOLENCE, ASSAULT, DAMAGE, THREATS, ABUSIVE, LITERATURE, OTHER. |
adl_category | enum | ADL audit category: Assault, Vandalism, Harassment. |
nibrs_offense / nibrs_bias_code | string / int | FBI NIBRS offense code crosswalk and bias-motivation code (12 = Anti-Jewish). |
severity_score / severity_label | int / enum | 1–10 scale; CRITICAL ≥ 9, HIGH 7–8, MEDIUM 4–6, LOW ≤ 3. |
admiralty / reliability / credibility | string / char / int | Combined Admiralty code (e.g. B2) and its two axes. Credibility 1 requires ≥2 independent outlets. |
confidence / probability_term | enum / string | ICD-203 confidence (high/moderate/low) and word of estimative probability with its percentage band. |
corroborating_outlets | int | Count of independent outlets attached to this event by the dedup engine. |
evidence_sha256 | hex | SHA-256 of the archived primary-source snapshot in the evidence vault. |
Code Examples
# Get all incidents as JSON curl "https://antisemitic-incidents-tracker.onrender.com/api/v1/incidents" # Filter by location and date range curl "https://antisemitic-incidents-tracker.onrender.com/api/v1/incidents?location=new+york&since=2025-01-01&limit=100" # Download as CSV curl -o incidents.csv "https://antisemitic-incidents-tracker.onrender.com/api/v1/incidents?format=csv&limit=500"
import requests
response = requests.get(
"https://antisemitic-incidents-tracker.onrender.com/api/v1/incidents",
params={"category": "Physical Assault", "limit": 100}
)
data = response.json()
print(f"Total: {data['meta']['total']} incidents")
for incident in data["data"]:
print(f" {incident['date']} - {incident['title']}")const res = await fetch(
"https://antisemitic-incidents-tracker.onrender.com/api/v1/incidents?location=california&sort=severity"
);
const { meta, data } = await res.json();
console.log(`Page ${meta.page} of ${meta.totalPages}`);
data.forEach(inc => console.log(inc.title, inc.severity_label));Example JSON Response
{
"meta": {
"total": 487,
"page": 1,
"pageSize": 50,
"totalPages": 10,
"lastUpdated": "2026-04-05T15:00:00.000Z"
},
"data": [
{
"id": "AIT-2026-00421",
"internal_id": "abc123def456",
"title": "Swastika found at university campus",
"description": "...",
"date": "2026-03-15",
"location": "New York, NY, USA",
"lat": 40.71, "lng": -74.01,
"category": "Vandalism",
"severity_score": 6,
"severity_label": "MEDIUM",
"threat_priority": "MEDIUM",
"admiralty": "B2",
"corroborating_outlets": 3,
"source": "JTA",
"url": "https://...",
"status": "verified"
}
]
}Usage Guidelines
- No API key required — all data is public and free to use.
- Responses are cached for 5 minutes (300s) for performance.
- Maximum 500 results per request — use pagination for larger datasets.
- CORS is enabled — you can call from any frontend application.
- Please credit “Antisemitic Incidents Tracker” when using the data in publications.
Disclosure
Known Limitations
The data is limited by what is reported in the media. Many incidents go undocumented, meaning these metrics represent a floor rather than a ceiling of activity.