Data Methodology
Track Antisemitism's 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.
1Incident 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.
- Deduplication: Articles are deduplicated by URL and content Fingerprinting.
- Language Detection: Non-English articles are detected and tagged for translation.
- Source Integrity: Each incident maintains a direct link back to the primary reporting outlet.
2Severity & Categorization
Incidents are categorized algorithmically based on NLP (Natural Language Processing) 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.
3Policy 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.
4Public 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 |
|---|---|---|
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.
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": "abc123def456",
"title": "Swastika found at university campus",
"description": "...",
"date": "2026-03-15",
"location": "New York",
"category": "Vandalism",
"severity_score": 6,
"severity_label": "ELEVATED",
"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 "Track Antisemitism" when using the data in publications
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.