OPENWATCH
Sign In
API v1

OpenWatch API

Programmatic access to Nigeria's security incident database. Real-time data, trend analysis, and daily intelligence briefs.

Base URL
https://api.openwatch.ng

Plans

FreeCommunity

20 requests / day

  • Last 30 days of incidents
  • Trend data (daily / weekly / monthly)
  • Daily intelligence briefs
  • Filter by type, state, date, confidence
  • CORS enabled

No API key required. Rate limited by IP.

Popular
ProDeveloper

$20 / month

  • 500 requests / day
  • Last 120 days of incidents
  • Everything in Free
  • API key authentication
  • Higher rate limits
TeamOrganizations

$149 / month

  • 5,000 requests / day
  • Full archive (2009 → present)
  • Everything in Pro
  • Crisis Watch + Daily Brief JSON
  • 24-hour email support
EnterpriseCustom

Custom pricing

  • Everything in Team, unlimited requests
  • Webhooks (real-time push on new incidents)
  • Bulk historical export (CSV / JSON)
  • Raw embedding vectors
  • Custom alert filters (region / type / severity)
  • 4-hour SLA + dedicated support
Contact sebiomoa@gmail.com

Authentication

The free tier requires no authentication. Simply make GET requests to any endpoint.

Enterprise customers authenticate via API key in the Authorization header:

curl -H "Authorization: Bearer ow_live_YOUR_KEY" \ https://api.openwatch.ng/incidents

Rate Limiting

Free: 20 requests/day per IP, last 30 days of data. Pro: 500 requests/day per key, last 120 days. Team: 5,000 requests/day per key, full archive. Enterprise: unlimited. All limits reset at midnight UTC.

Every response includes rate limit headers:

HeaderDescription
X-RateLimit-LimitMaximum requests per day
X-RateLimit-RemainingRequests remaining today
Retry-AfterSeconds until reset (only on 429)

When you exceed the limit, the API returns 429 Too Many Requests.

Endpoints

GET/incidents

Returns a paginated list of verified security incidents. Results exclude retracted incidents.

Parameters

NameTypeDescription
typestringIncident type code (see reference below)
statestringNigerian state name (case-insensitive)
statusstringbreaking, developing, confirmed, or archived
min_confidencenumberMinimum confidence score (0–1)
date_fromstringStart date (YYYY-MM-DD)
date_tostringEnd date (YYYY-MM-DD)
sortstringdate (default), confidence, or sources
orderstringdesc (default) or asc
pagenumberPage number (default 1)
per_pagenumberResults per page, max 100 (default 25)

Example

curl "https://api.openwatch.ng/incidents?state=Lagos&type=KDN&per_page=5"

Response

{
  "data": [
    {
      "id": "89e83872-3db8-...",
      "incident_type": "KDN",
      "state": "Lagos",
      "lga": "Ikeja",
      "summary": "Three individuals were kidnapped...",
      "severity": "high",
      "confidence_score": 0.92,
      "status": "confirmed",
      "incident_date": "2026-03-15",
      "source_count": 3,
      "latitude": 6.601,
      "longitude": 3.351,
      "first_reported_at": "2026-03-15T10:30:00Z"
    }
  ],
  "pagination": {
    "page": 1,
    "per_page": 5,
    "total": 42,
    "total_pages": 9
  }
}
GET/incidents/{id}

Returns a single incident with full details and linked source articles.

Parameters

NameTypeDescription
iduuidIncident UUID (path parameter)

Example

curl "https://api.openwatch.ng/incidents/89e83872-3db8-4bb0-91c5-0bc5fbc732a1"

Response

{
  "id": "89e83872-3db8-...",
  "incident_type": "KDN",
  "summary": "Three individuals were kidnapped...",
  "confidence_score": 0.92,
  "status": "confirmed",
  ...
  "sources": [
    {
      "added_at": "2026-03-15T10:30:00Z",
      "raw_posts": {
        "text": "Breaking: Gunmen abduct three...",
        "url": "https://example.com/article",
        "author": "Daily Post",
        "published_at": "2026-03-15T09:15:00Z",
        "sources": {
          "name": "Daily Post",
          "type": "news",
          "tier": 1
        }
      }
    }
  ]
}
GET/trends

Returns incident counts aggregated by time period and type. Useful for charts and dashboards.

Parameters

NameTypeDescription
typestringFilter by incident type code
statestringFilter by Nigerian state
periodstringdaily (default), weekly, or monthly
date_fromstringStart date (YYYY-MM-DD)
date_tostringEnd date (YYYY-MM-DD)

Example

curl "https://api.openwatch.ng/trends?period=daily&state=Borno&date_from=2026-03-01"

Response

{
  "data": {
    "period": "daily",
    "series": [
      {
        "date": "2026-03-01",
        "total": 12,
        "by_type": { "TER": 5, "KDN": 3, "BOM": 2, "ARB": 2 }
      },
      {
        "date": "2026-03-02",
        "total": 8,
        "by_type": { "TER": 4, "KDN": 2, "CMV": 2 }
      }
    ]
  }
}
GET/brief

Returns an AI-generated daily intelligence summary. Omit the date parameter to get the most recent brief.

Parameters

NameTypeDescription
datestringSpecific date (YYYY-MM-DD), or omit for latest

Example

curl "https://api.openwatch.ng/brief?date=2026-03-18"

Response

{
  "brief": {
    "brief_date": "2026-03-18",
    "headline": "Borno suffers multiple attacks...",
    "summary": "Today's security incidents in Nigeria...",
    "hotspots": ["Borno", "Kaduna", "Oyo"],
    "threat_level": "critical",
    "incident_count": 20,
    "fatality_count": 434,
    "top_types": [
      { "type": "TER", "count": 10 },
      { "type": "KDN", "count": 4 }
    ],
    "key_developments": ["..."],
    "generated_at": "2026-03-18T17:16:36Z"
  }
}

Incident Types

CodeType
KDNKidnapping
ARBArmed Robbery
TERTerrorism
BOMBombing
CMVCommunal Violence
PRTProtest
SCMScam / Fraud
ASNAssassination
CTRCattle Rustling
PIRPiracy
MSPMissing Person
OTHOther

Statuses

breakingdevelopingconfirmedarchivedretracted

Errors

StatusMeaning
200Success
401Invalid API key
404Resource not found
405Method not allowed (only GET supported)
429Rate limit exceeded
500Internal server error

Error Response

{ "error": "Rate limit exceeded", "limit": 20, "resets": "midnight UTC" }