CityAlert.live History API
Historical aggregates and year archives
Historical aggregates and year archives
Every API here is available over the APIs.io API and to AI agents over MCP.
One button, every client — Claude, Cursor, VS Code and the rest.
https://apis.io/mcp
find_apisBrowse and filter every API in the catalog.get_api_artifactsOne API's artifacts, grouped by type.get_openapiThe primary OpenAPI for this API.find_similar_apisAPIs that look like this one.apis_io_searchSTART HERE — APIs, providers and tags for one query, each with its total.resolveTurn a domain, URL or GitHub org into the provider it belongs to.find_cohortsEvery scored population of providers in the catalog.curl "https://apis.io/api/v1/apis/cityalert-live:cityalert-live-history-api"
curl "https://apis.io/api/v1/apis?limit=25"
Calls without X-API-Key need no key. Calls with it need a paid plan — get a key.
Free tier, no form to fill in. Signing in shares your email address with us — we store it to create your key and to recognise you if you sign in with another provider. See our Privacy Policy and Terms.
A second provider on the same verified email joins the account you already have.
openapi: 3.2.0
info:
title: Cityalert Live History API
version: 1.0.0
contact:
url: https://cityalert.live/contact
license:
name: CC BY 4.0
url: https://creativecommons.org/licenses/by/4.0/
description: 'Operations tagged history across 2 of this provider''s published API definitions: cityalert-live-openapi.json, cityalert-live-openapi.json. Each path carries the servers of the definition it was published in.'
servers:
- url: https://cityalert.live
tags:
- name: History
description: Historical aggregates and year archives
paths:
/api/archive:
get:
tags:
- History
operationId: queryArchive
summary: Historical incident archive (paid)
description: Every incident every feed has ever returned, queryable backwards in time — the monetizable surface. Requires `x-api-key` on a Developer or Pro plan; per-plan daily limits apply (Developer 5,000/day, Pro 50,000/day).
security:
- apiKey: []
parameters:
- name: source
in: query
description: Feed key, e.g. 'usgs', 'vpd', 'zwaailicht'
schema:
type: string
- name: region
in: query
description: Focus-region key (see GET /api/regions)
schema:
type: string
- name: category
in: query
schema:
type: string
enum:
- crime
- fire
- disaster
- weather
- unrest
- health
- infra
- alert
- report
- name: bbox
in: query
description: Bounding box as minLon,minLat,maxLon,maxLat
schema:
type: string
pattern: ^-?\d+(\.\d+)?(,-?\d+(\.\d+)?){3}$
- name: from
in: query
description: ISO 8601 lower bound on the incident's occurred time
schema:
type: string
format: date-time
- name: to
in: query
description: ISO 8601 upper bound on the incident's occurred time
schema:
type: string
format: date-time
- name: limit
in: query
schema:
type: integer
minimum: 1
maximum: 5000
default: 500
responses:
'200':
description: Archive rows, newest first
content:
application/json:
schema:
type: object
properties:
incidents:
type: array
items:
type: object
properties:
id:
type: string
description: Stable incident identifier (source-prefixed)
source:
type: string
description: Feed key that produced the incident
category:
type: string
enum:
- crime
- fire
- disaster
- weather
- unrest
- health
- infra
- alert
- report
group:
type: string
enum:
- violent
- property
- vehicle-crime
- drug
- weapons
- sexual
- fraud
- disorder
- traffic
- police-ops
- crime-other
- wildfire
- structure-fire
- vehicle-fire
- alarm
- hazmat
- rescue
- fire-other
- earthquake
- flood
- storm
- tsunami
- volcano
- landslide
- disaster-other
- wind
- winter
- heat
- rain
- marine
- fog
- air-quality
- weather-other
- protest
- conflict
- unrest-other
- ems
- outbreak
- health-other
- collision
- outage
- road
- transit
- water
- infra-other
- evacuation
- amber
- shelter
- civil
- alert-other
- suspicious
- missing-person
- noise
- welfare
- hazard
- report-other
description: Normalized subtype within the category (e.g. 'collision', 'wildfire', 'missing-person') — assigned by the central classifier; every incident has one
type:
type: string
description: Source-specific incident type, e.g. 'earthquake' or 'Break and Enter'
title:
type: string
description:
type: string
lat:
type: number
lon:
type: number
time:
type: string
format: date-time
description: Reported time, ISO 8601
severity:
type: string
enum:
- low
- medium
- high
- critical
url:
type: string
format: uri
region:
type: string
description: Focus-region key when the point falls inside one
nhood:
type: string
description: Neighbourhood/area label when the feed provides one
status:
type: string
enum:
- pending
- active
- resolved
- hidden
description: Community-report verification state (manual reports only)
occurred:
type: string
format: date-time
description: When the incident occurred (ISO 8601)
first_seen:
type: string
format: date-time
last_seen:
type: string
format: date-time
times_seen:
type: integer
count:
type: integer
from:
type:
- string
- 'null'
format: date-time
to:
type:
- string
- 'null'
format: date-time
'400':
description: Invalid bbox or date range
content:
application/json:
schema:
type: object
properties:
error:
type: string
'401':
description: Missing or invalid x-api-key
content:
application/json:
schema:
type: object
properties:
error:
type: string
'403':
description: Key plan too low (Developer/Pro required)
content:
application/json:
schema:
type: object
properties:
error:
type: string
'429':
description: Daily plan limit reached
content:
application/json:
schema:
type: object
properties:
error:
type: string
servers:
- url: https://cityalert.live
/api/trends:
get:
tags:
- History
operationId: getTrends
summary: Historical aggregates — crime YoY, quakes by region, GDACS by year
responses:
'200':
description: Aggregate trend payload
content:
application/json:
schema:
type: object
properties:
generatedAt:
type: string
format: date-time
crime:
type:
- object
- 'null'
history:
type: object
quakes:
type: array
items:
type: object
gdacs:
type: array
items:
type: object
reports:
type: object
snapshot:
type: object
errors:
type: array
items:
type: string
servers:
- url: https://cityalert.live
/api/crime-year:
get:
tags:
- History
operationId: getCrimeYear
summary: Full-year incident GeoJSON + neighbourhood ranking
description: Returns a full year of incident-level data for regions with history (Vancouver VPD back to 2003; other cities via police portals or the media-scrape log).
parameters:
- name: year
in: query
required: true
schema:
type: integer
minimum: 2003
- name: region
in: query
schema:
type: string
default: vancouver
responses:
'200':
description: Year archive
content:
application/json:
schema:
type: object
properties:
year:
type: integer
region:
type: string
label:
type: string
caveat:
type: string
byNeighbourhood:
type: array
items:
type: object
properties:
name:
type: string
count:
type: integer
lat:
type: number
lon:
type: number
geojson:
type: object
properties:
type:
type: string
enum:
- FeatureCollection
features:
type: array
items:
type: object
properties:
type:
type: string
enum:
- Feature
geometry:
type: object
properties:
type:
type: string
enum:
- Point
coordinates:
type: array
items:
type: number
minItems: 2
maxItems: 2
properties:
type: object
required:
- id
- source
- category
- type
- title
- lat
- lon
- time
- severity
properties:
id:
type: string
description: Stable incident identifier (source-prefixed)
source:
type: string
description: Feed key that produced the incident
category:
type: string
enum:
- crime
- fire
- disaster
- weather
- unrest
- health
- infra
- alert
- report
group:
type: string
enum:
- violent
- property
- vehicle-crime
- drug
- weapons
- sexual
- fraud
- disorder
- traffic
- police-ops
- crime-other
- wildfire
- structure-fire
- vehicle-fire
- alarm
- hazmat
- rescue
- fire-other
- earthquake
- flood
- storm
- tsunami
- volcano
- landslide
- disaster-other
- wind
- winter
- heat
- rain
- marine
- fog
- air-quality
- weather-other
- protest
- conflict
- unrest-other
- ems
- outbreak
- health-other
- collision
- outage
- road
- transit
- water
- infra-other
- evacuation
- amber
- shelter
- civil
- alert-other
- suspicious
- missing-person
- noise
- welfare
- hazard
- report-other
description: Normalized subtype within the category (e.g. 'collision', 'wildfire', 'missing-person') — assigned by the central classifier; every incident has one
type:
type: string
description: Source-specific incident type, e.g. 'earthquake' or 'Break and Enter'
title:
type: string
description:
type: string
lat:
type: number
lon:
type: number
time:
type: string
format: date-time
description: Reported time, ISO 8601
severity:
type: string
enum:
- low
- medium
- high
- critical
url:
type: string
format: uri
region:
type: string
description: Focus-region key when the point falls inside one
nhood:
type: string
description: Neighbourhood/area label when the feed provides one
status:
type: string
enum:
- pending
- active
- resolved
- hidden
description: Community-report verification state (manual reports only)
'400':
description: Invalid year or region without history
content:
application/json:
schema:
type: object
properties:
error:
type: string
'404':
description: No data for that year
content:
application/json:
schema:
type: object
properties:
error:
type: string
servers:
- url: https://cityalert.live
components:
securitySchemes:
apiKey:
type: apiKey
in: header
name: x-api-key
description: Paid API key (ca_…) — see /developers for plan tiers
x-refined-from:
- cityalert-live-openapi.json
- cityalert-live-openapi.json