Antisemitic Incident Tracker
Transparency Protocol

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:

Physical Assault

Direct physical violence or attempted harm.

Harassment

Targeted verbal or written abuse.

Vandalism

Property damage or antisemitic graffiti.

Threats

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.

GET/api/v1/incidents

Returns paginated incident data with optional filters. Supports JSON and CSV output.

Query Parameters

ParameterTypeDescription
categorystringFilter by category (e.g., "Harassment", "Physical Assault", "Vandalism", "Threats")
locationstringPartial match on location (case-insensitive)
sincedateInclude incidents on or after this date (YYYY-MM-DD)
untildateInclude incidents on or before this date (YYYY-MM-DD)
severity_minintMinimum severity score (1-10)
severity_maxintMaximum severity score (1-10)
statusstring"verified" or "pending_review"
sortstring"date" (default) or "severity"
pageintPage number (default: 1)
limitintResults per page (default: 50, max: 500)
formatstring"json" (default) or "csv"
GET/api/v1/stats

Returns aggregate statistics: total counts, breakdowns by category, location, month, and verification status. No parameters required.

Code Examples

cURL
# 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"
Python
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']}")
JavaScript
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.

Last Updated: April 5, 2026