NCS public API
Free, read-only JSON access to every published NCS incident, with links back to the original reporting. No key required.
Not an emergency service. NCS is an incident index and reporting aid—not an emergency service, official casualty register or prediction system. In an emergency, call 112. Records are compiled from published reports and may change as stories are corroborated, corrected or withdrawn.
Quick start
curl "https://nigeria-crisis-map-7zyk.vercel.app/api/incidents?state=Benue&since=2026-10-01"Endpoints
GET /api/incidents- Newest-first list of incidents, filtered by the parameters below.
GET /api/incidents/:id- One incident by id or story slug. Returns 404 if it does not exist or was withdrawn.
GET /api/meta- Accepted categories, states and statuses, plus
last_run_at: when the 4-hourly update last completed.
Query parameters
| Parameter | Meaning |
|---|---|
state | State name, case-insensitive ("benue", "Akwa Ibom", "FCT" or "Abuja"). |
lga | Local government area, case-insensitive exact match. |
category | One or more category slugs, comma-separated. |
status | developing, corroborated or corrected (comma-separated). Defaults to all three. |
since / until | YYYY-MM-DD (whole days in Nigeria time, WAT) or an ISO 8601 timestamp with timezone. Both inclusive. |
limit | Results per page, 1–100. Default 25. |
cursor | Pass pagination.next_cursor from the previous response to get the next page. |
Response
{
"data": [
{
"id": "4bc75adf-75a0-4821-b206-bcd5083bce82",
"title": "Gunmen kill 5 in Guma, Benue",
"category": "attack",
"status": "corroborated",
"state": "Benue",
"lga": "Guma",
"reported_at": "2026-10-02T08:00:00+00:00",
"updated_at": "2026-10-02T11:20:00+00:00",
"casualty_min": 6, "casualty_max": 8,
"fatalities_min": 5, "fatalities_max": 6,
"injured_min": 1, "injured_max": 2,
"kidnapped_min": 0, "kidnapped_max": 0,
"source_count": 2,
"sources": [
{ "publisher": "Premium Times", "url": "https://www.premiumtimesng.com/…", "published_at": "2026-10-02T08:00:00+00:00" },
{ "publisher": "Channels Television", "url": "https://www.channelstv.com/…", "published_at": "2026-10-02T09:00:00+00:00" }
],
"story_url": "https://nigeria-crisis-map-7zyk.vercel.app/story/gunmen-kill-5-in-guma-benue-1a2b3c4"
}
],
"pagination": { "limit": 25, "next_cursor": "eyJyZXBvcnRlZF9hdCI6…", "has_more": true },
"notice": { "attribution": "…", "disclaimer": "…", "docs": "/api" }
}Fields
| Field | Type | Description |
|---|---|---|
id | uuid | Stable incident identifier. |
title | string | Headline of the first source report (NCS never stores full article text). |
category | string | Crisis category slug, e.g. kidnapping, attack, flood. Full list at /api/meta. |
status | string | developing (one allowlisted source), corroborated (two or more independent sources) or corrected. |
state | string | Nigerian state or FCT. "Nigeria" means the source did not name a state. |
lga | string | null | Local government area when reported. |
reported_at | ISO 8601 | When the first source published the report. since/until filter on this field. |
updated_at | ISO 8601 | Last time NCS changed the record (new source, range or status). |
casualty_min / casualty_max | integer | People reported killed or injured. Ranges preserve disagreement between sources. |
fatalities_*, injured_*, kidnapped_* | integer | The same reported ranges broken down by impact type. |
source_count | integer | Number of distinct publishers supporting the record. |
sources[] | array | publisher, url (canonical link to the original report) and published_at for every supporting report. |
story_url | url | The NCS story page, which links to each source. |
Pagination
Results are ordered by reported_at, newest first. When has_more is true, repeat the request with cursor=<next_cursor>. Cursors stay valid as new incidents arrive, so you will not see duplicates or skip records while paging.
Limits, caching and errors
- Responses are cached for 5 minutes. Data updates every 4 hours, so polling more often gains nothing.
- Each client may make 60 uncached requests per minute. Over the limit you receive
429with aRetry-Afterheader. - Cross-origin
GETrequests are allowed from any website. - Invalid parameters return
400with anerrormessage explaining the accepted values.
Using the data responsibly
- Cite the original publishers in
sources[]when you reuse a figure. Every number comes from their reporting. - Show statuses. A developing record has one source and may change.
- Absence of incidents does not mean an area is safe. Read the methodology for known limitations.