Phase 4 · Public surface

Public JSON REST API

The same 225k-row incident database that powers the lenses, served as a stable JSON API. Anonymous up to 60 req/min; an API key bumps you to 600 req/min.

Base URL

https://bpo-v2-api.zeshaq.workers.dev/observatory/data/v1

All endpoints return JSON. Send an API key as Authorization: Bearer <key> to lift your rate limit.

GET /v1/incidents

Paginated list of incidents matching the supplied filters.

Query params

  • startdate, enddate — ISO date YYYY-MM-DD
  • violentNonViolentV | NV
  • violenceType, actor, motive, crosscut — comma-separated id lists
  • limit (default 100, max 500), offset
curl -s "https://bpo-v2-api.zeshaq.workers.dev/observatory/data/v1/incidents?startdate=2024-01-01&limit=5"

GET /v1/totals

Filter-aware aggregates. Same query params as /incidents minus pagination.

{
  "incidents": 162315,
  "killed": 52900,
  "injured": 284765,
  "arrested": 416231
}

GET /v1/lookups/{kind}

Reference data for filter ids. kindviolencetype, actor, motive, crosscut, division, district, upazilla, source.

curl -s "https://bpo-v2-api.zeshaq.workers.dev/observatory/data/v1/lookups/violencetype"

Rate limits

  • Anonymous (no Authorization header): 60 req/min per IP
  • Keyed: 600 req/min per key (default)
  • 429 responses include a Retry-After: 60 header

Stability

Everything under /v1/ is version-stable: existing fields will not be removed or renamed inside v1. New fields may be added; clients should ignore unknown fields. Breaking changes ship as /v2/.

Attribution

If you publish results derived from this API, please cite:

Bangladesh Peace Observatory (CGS / Centre for Alternatives). Bangladesh Incident Database. https://peaceobservatory-ca.org/