# US Rail Accident, Derailment & Grade Crossing Tracker (FRA) (`kindred_feathergrass/us-rail-accident-derailment-tracker`) Actor

Search and summarize official US Federal Railroad Administration train accident, derailment and grade crossing incident reports. No login, no proxy.

- **URL**: https://apify.com/kindred_feathergrass/us-rail-accident-derailment-tracker.md
- **Developed by:** [Ryan Fiske](https://apify.com/kindred_feathergrass) (community)
- **Security:** Limited permissions
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $2.50 / 1,000 incident records

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

## US Rail Accident, Derailment & Grade Crossing Tracker (FRA)

Get clean, filterable data on **US train accidents, derailments and highway-rail grade crossing crashes** straight from the official Federal Railroad Administration (FRA) safety database. No login, no proxy, no scraping of websites. Just fast, structured results in JSON, CSV or Excel.

Over 225,000 train accident records and 250,000 grade crossing incident records, refreshed by the FRA regularly.

### Who uses this

- **Insurance and risk teams** checking a railroad's accident history, damage costs and causes.
- **Lawyers and investigators** looking for derailments, hazmat releases and similar prior incidents.
- **Journalists and researchers** who need counts by railroad, state, year or cause.
- **Cities, counties and safety groups** reviewing crashes at local grade crossings.
- **Analysts and investors** tracking railroad safety trends (BNSF, Union Pacific, CSX, Norfolk Southern, CPKC and 1,000+ others).

### What you can do

- Search **train accidents and derailments** (FRA Form 54) or **grade crossing incidents** (FRA Form 57).
- Filter by **state, railroad, date range, accident type, cause, minimum damage cost**.
- Keep only incidents with **deaths or injuries**, or with a **hazmat release**.
- Get **summary tables** grouped by railroad, state, year, cause or accident type, with incident counts, total damage, deaths and injuries.
- Run on a **schedule** and compare with last month to spot new incidents.

### Example inputs

Derailments in Ohio since February 2023 with at least $100,000 damage:

```json
{
  "dataset": "equipment_accidents",
  "states": ["OH"],
  "accidentTypes": ["Derailment"],
  "dateFrom": "2023-02-01",
  "minTotalDamage": 100000,
  "maxResults": 200
}
```

Which causes are behind accidents in Minnesota, ranked by count:

```json
{
  "dataset": "equipment_accidents",
  "states": ["MN"],
  "outputMode": "summary",
  "groupBy": "cause",
  "maxResults": 25
}
```

Deadly or injury crashes at grade crossings in Texas since 2024:

```json
{
  "dataset": "grade_crossing_incidents",
  "states": ["TX"],
  "onlyWithCasualties": true,
  "dateFrom": "2024-01-01",
  "maxResults": 500
}
```

### Example output (one record)

```json
{
  "dataset": "equipment_accidents",
  "reportId": "NS171466202608",
  "date": "2026-08-09",
  "railroad": "Norfolk Southern Railway Company",
  "accidentType": "Derailment",
  "state": "OH",
  "county": "MARION",
  "latitude": 40.667163,
  "longitude": -83.085043,
  "trainSpeedMph": 36,
  "primaryCause": "Broken plate",
  "totalDamageUsd": 225466,
  "totalKilled": 0,
  "totalInjured": 0,
  "hazmatCarsReleased": 0,
  "url": "https://safetydata.fra.dot.gov/Officeofsafety/Publicsite/FORM54/F54Report.aspx?..."
}
```

Each record includes a link to the official FRA report.

### Output fields

**Train accidents (Form 54):** date, time, railroad, parent railroad, accident type, state, county, station, subdivision, milepost, latitude, longitude, equipment type, train speed, gross tonnage, weather, track type, primary and contributing cause, equipment/track/total damage (USD), people killed and injured, hazmat cars, hazmat cars released, persons evacuated, derailed car counts, optional narrative, link to FRA report.

**Grade crossing incidents (Form 57):** date, time, railroad, state, county, city, road name, crossing ID, public or private, vehicle type, what the road user was doing, equipment struck, train speed, warning devices, weather, visibility, view obstruction, killed, injured, vehicle damage, hazmat, optional narrative, link to FRA report.

Summary rows: group, incidents, total damage (USD), total killed, total injured.

### Good to know

- **One row per train or equipment involved.** An accident with two trains can show up as two rows with the same `reportId`. Exact duplicate rows are removed for you.
- **Data lag.** The FRA refreshes the data regularly (the portal showed updates as recent as this week). The newest incidents are usually a few weeks old.
- **Damage and cause values are as reported by the railroads** and can be amended later by the FRA. Always check the linked FRA report for legal or insurance use.
- **No personal data.** Driver age and gender fields in Form 57 are deliberately left out. Narratives are off by default.
- Some very old records have no coordinates (shown empty).

### Pricing

Pay per result. You only pay for what you receive.

| Event | Price |
|---|---|
| Incident record | $2.50 per 1,000 records |
| Summary row | $0.01 per row |

A typical run (a few hundred records) costs well under $1.

### Data source and legal

Data comes from the US Department of Transportation's open data portal (data.transportation.gov), published by the FRA Office of Safety under the "Public Domain U.S. Government" license. This Actor is not affiliated with or endorsed by the FRA or any railroad. Information is provided as is, without warranty.

### Tips

- Use a **Socrata app token** (free at data.transportation.gov) only if you run very large jobs many times a day.
- Schedule a monthly run with `dateFrom` set to the first of last month to track new incidents.
- Export to CSV or Excel straight from the dataset tab.

Found a bug or need another field? Open an issue on the Actor page.

# Actor input Schema

## `dataset` (type: `string`):

Train accidents and derailments (FRA Form 54), or highway-rail grade crossing incidents (FRA Form 57).

## `outputMode` (type: `string`):

Individual incident records, or a summary table grouped by one field (counts, damage cost, deaths and injuries).

## `groupBy` (type: `string`):

Only used when Output is Summary table. 'cause' and 'accidentType' work for Form 54 only. 'highwayUser' works for Form 57 only.

## `states` (type: `array`):

Two-letter US state codes, for example MN, OH, TX. Leave empty for all states.

## `railroads` (type: `array`):

Railroad names or codes. Matches part of the name, for example 'BNSF', 'Norfolk Southern', 'UP', 'CSX'. Leave empty for all railroads.

## `dateFrom` (type: `string`):

Earliest incident date, format YYYY-MM-DD.

## `dateTo` (type: `string`):

Latest incident date, format YYYY-MM-DD.

## `accidentTypes` (type: `array`):

For example Derailment, Head on collision, Rear end collision, Fire/violent rupture, Highway-rail crossing. Leave empty for all types.

## `causeContains` (type: `string`):

Keep only incidents whose primary cause text contains this word, for example 'wheel', 'rail', 'brake', 'bearing'.

## `minTotalDamage` (type: `integer`):

Keep only incidents with at least this much reported equipment and track damage.

## `onlyWithCasualties` (type: `boolean`):

Keep only incidents where at least one person was killed or injured.

## `onlyHazmatRelease` (type: `boolean`):

Keep only incidents where at least one hazardous materials car released its contents.

## `includeNarrative` (type: `boolean`):

Add the free-text narrative written by the railroad, when there is one.

## `maxResults` (type: `integer`):

Stop after this many records or summary rows. You are only charged for results you receive.

## `socrataAppToken` (type: `string`):

Optional free token from data.transportation.gov that raises rate limits. Not needed for normal use.

## Actor input object example

```json
{
  "dataset": "equipment_accidents",
  "outputMode": "records",
  "groupBy": "railroad",
  "states": [
    "OH"
  ],
  "onlyWithCasualties": false,
  "onlyHazmatRelease": false,
  "includeNarrative": false,
  "maxResults": 100
}
```

# Actor output Schema

## `results` (type: `string`):

No description

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "states": [
        "OH"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("kindred_feathergrass/us-rail-accident-derailment-tracker").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = { "states": ["OH"] }

# Run the Actor and wait for it to finish
run = client.actor("kindred_feathergrass/us-rail-accident-derailment-tracker").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "states": [
    "OH"
  ]
}' |
apify call kindred_feathergrass/us-rail-accident-derailment-tracker --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,kindred_feathergrass/us-rail-accident-derailment-tracker"
        }
    }
}
```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/vmIJjFYDb6Ae53W44/builds/aworhKVRIGH0aQTrt/openapi.json
