CityAlert.live Community API
User-submitted reports, votes and dashboards
User-submitted reports, votes and dashboards
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-community-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 Community 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 community 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: Community
description: User-submitted reports, votes and dashboards
paths:
/api/reports:
get:
tags:
- Community
operationId: listReports
summary: Community-submitted incident reports
responses:
'200':
description: Community reports
content:
application/json:
schema:
type: object
properties:
reports:
type: array
items:
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)
post:
tags:
- Community
operationId: createReport
summary: Submit a community incident report
description: Rate-limited to 5 reports/hour per IP. New reports start as 'pending' and are confirmed by community votes before appearing as active.
requestBody:
required: true
content:
application/json:
schema:
type: object
required:
- title
- lat
- lon
properties:
title:
type: string
maxLength: 200
lat:
type: number
minimum: -90
maximum: 90
lon:
type: number
minimum: -180
maximum: 180
category:
type: string
enum:
- crime
- fire
- disaster
- weather
- unrest
- health
- infra
- alert
- report
default: report
severity:
type: string
enum:
- low
- medium
- high
- critical
default: medium
description:
type: string
maxLength: 2000
responses:
'201':
description: Report created (status 'pending')
content:
application/json:
schema:
type: object
properties:
report:
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: Validation error
content:
application/json:
schema:
type: object
properties:
error:
type: string
'403':
description: Blocked
content:
application/json:
schema:
type: object
properties:
error:
type: string
'429':
description: Rate limited
content:
application/json:
schema:
type: object
properties:
error:
type: string
servers:
- url: https://cityalert.live
/api/reports/{id}/vote:
post:
tags:
- Community
operationId: voteReport
summary: Vote on a community report (confirm / resolve / flag)
description: 'Community verification: 3 confirms activates a report, 2 resolves marks it resolved, 3 flags hides it. Rate-limited to 30 votes/hour per IP.'
parameters:
- name: id
in: path
required: true
schema:
type: string
requestBody:
required: true
content:
application/json:
schema:
type: object
required:
- kind
properties:
kind:
type: string
enum:
- confirm
- resolve
- flag
responses:
'200':
description: Vote recorded
content:
application/json:
schema:
type: object
'400':
description: Invalid kind or report state
content:
application/json:
schema:
type: object
properties:
error:
type: string
'403':
description: Blocked
content:
application/json:
schema:
type: object
properties:
error:
type: string
'429':
description: Rate limited
content:
application/json:
schema:
type: object
properties:
error:
type: string
servers:
- url: https://cityalert.live
/api/dashboards:
get:
tags:
- Community
operationId: getDashboard
summary: Fetch a shared dashboard config by id
parameters:
- name: id
in: query
required: true
schema:
type: string
responses:
'200':
description: Dashboard config
content:
application/json:
schema:
type: object
'404':
description: Not found
content:
application/json:
schema:
type: object
properties:
error:
type: string
post:
tags:
- Community
operationId: createDashboard
summary: Create a shareable dashboard
description: Returns {id, token}; the token is the write credential — share the URL, keep the token private.
requestBody:
required: true
content:
application/json:
schema:
type: object
required:
- config
properties:
name:
type: string
maxLength: 100
config:
type: object
responses:
'200':
description: Created dashboard
content:
application/json:
schema:
type: object
properties:
id:
type: string
token:
type: string
'400':
description: Invalid config
content:
application/json:
schema:
type: object
properties:
error:
type: string
put:
tags:
- Community
operationId: updateDashboard
summary: Update a dashboard (requires its token)
requestBody:
required: true
content:
application/json:
schema:
type: object
required:
- id
- token
- config
properties:
id:
type: string
token:
type: string
name:
type: string
maxLength: 100
config:
type: object
responses:
'200':
description: Updated
content:
application/json:
schema:
type: object
'400':
description: Missing fields
content:
application/json:
schema:
type: object
properties:
error:
type: string
'403':
description: Bad token
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