Imported from magnus919/agent-skills (
raleigh/SKILL.md). Install upstream withnpx skills add magnus919/agent-skills --skill raleigh. Copyright stays with the author (MIT).
Raleigh Civic Data
A read-only CLI for the City of Raleigh's public civic data and services. It discovers datasets from the live ArcGIS Hub catalog, queries ArcGIS layers, exports imagery, geocodes and reverse-geocodes addresses, reads GoRaleigh GTFS and GTFS-Realtime feeds, searches the guest-public Permit and Development Portal, lists public RaleighNC.gov content, and extracts public eSCRIBE meetings.
All operations are read-only and use fixed endpoint contracts. HTTPS is required except for explicitly acknowledged RFD report lookups, whose upstream site supports only plain HTTP. No API key, sign-in, payment, or submission flow is implemented.
Quick Start
# List live datasets
scripts/raleigh catalog
# Search the catalog
scripts/raleigh search "food inspection"
# Show a dataset's live metadata
scripts/raleigh info "Raleigh Dog Parks"
# Query records
scripts/raleigh query "Food Inspections" --where "SCORE < 70" --limit 20
# Export to CSV
scripts/raleigh download "Raleigh Dog Parks" -f csv -o dog_parks.csv
Commands
Dataset discovery
| Command | Purpose | Example |
|---|---|---|
catalog |
List live Hub datasets | scripts/raleigh catalog --json |
search |
Search catalog metadata | scripts/raleigh search "building permit" --limit 10 |
info |
Show a dataset by title or ID | scripts/raleigh info "Raleigh Dog Parks" --json |
query |
Query records with filters | scripts/raleigh query "Food Inspections" --where "SCORE<70" --limit 20 |
download |
Export to CSV, GeoJSON, or JSON | scripts/raleigh download "Parcels" -f geojson -o parcels.geojson |
categories |
List categories from the catalog | scripts/raleigh categories |
catalog-check |
Validate cached endpoints | scripts/raleigh catalog-check --sample 10 |
Imagery
| Command | Purpose | Example |
|---|---|---|
imagery catalog |
List ImageServer services | scripts/raleigh imagery catalog --json |
imagery info |
Show service metadata | scripts/raleigh imagery info Orthos2025 |
imagery export |
Export bounded image | scripts/raleigh imagery export Orthos2025 --bbox=-78.7,35.7,-78.6,35.8 --size 400,400 -o ortho.jpg |
imagery identify |
Identify pixel value at point | scripts/raleigh imagery identify Orthos2025 --point=-78.65,35.75 |
imagery statistics |
Compute extent statistics | scripts/raleigh imagery statistics Orthos2025 --bbox=-78.7,35.7,-78.6,35.8 |
imagery catalog lists only publicly readable services. Folders whose
listing requires a token (currently Imagery and Utilities) are skipped
and reported as restricted rather than failing the command; the daily live
canary tracks them the same way.
Geocoding
| Command | Purpose | Example |
|---|---|---|
geocode |
Forward geocode | scripts/raleigh geocode "222 W Hargett St" |
reverse-geocode |
Reverse geocode | scripts/raleigh reverse-geocode --lat 35.78 --lon -78.64 |
suggest |
Address autocomplete | scripts/raleigh suggest "222 W Har" |
geocode-batch |
Batch geocode CSV | scripts/raleigh geocode-batch addresses.csv --address-field address -o out.csv |
Batch output preserves every original CSV column and adds input_id,
match_address, score, lat, lon, and status. If an input already uses
one of those names, the added result column receives a geocode_ prefix.
Transit
| Command | Purpose | Example |
|---|---|---|
transit routes |
List routes | scripts/raleigh transit routes --json |
transit stops |
List stops | scripts/raleigh transit stops --near 35.78,-78.64 --limit 10 |
transit schedule |
Schedule for a route | scripts/raleigh transit schedule --route 1 --date 20260723 |
transit arrivals |
Arrivals for a stop | scripts/raleigh transit arrivals --stop S1 |
transit vehicles |
Live vehicle positions | scripts/raleigh transit vehicles --json |
transit alerts |
Service alerts | scripts/raleigh transit alerts |
transit trip-updates |
Live trip updates | scripts/raleigh transit trip-updates --json |
transit download-gtfs |
Save static feed | scripts/raleigh transit download-gtfs |
Development records
| Command | Purpose | Example |
|---|---|---|
development search |
Search public records | scripts/raleigh development search permits --query "2024-001" |
development search project |
Search public projects | scripts/raleigh development search project --query "downtown" |
development permit |
Permit details | scripts/raleigh development permit BP-2024-001 |
development inspections |
Inspections for a record | scripts/raleigh development inspections --record BP-2024-001 |
development code-cases |
Code cases | scripts/raleigh development code-cases --query "nuisance" |
development licenses |
Licenses | scripts/raleigh development licenses --query "coffee" |
Civic content
| Command | Purpose | Example |
|---|---|---|
news |
RaleighNC.gov news | scripts/raleigh news --limit 10 |
events |
Events | scripts/raleigh events --from 2026-07-01 --to 2026-07-31 |
projects |
Projects | scripts/raleigh projects --search "park" |
places |
Places | scripts/raleigh places --search "library" |
services |
Services | scripts/raleigh services --search "trash" |
directory |
Directory entries | scripts/raleigh directory --search "parks" |
alerts |
Public alerts | scripts/raleigh alerts |
rss |
RSS feed | scripts/raleigh rss --limit 10 |
Police incidents
| Command | Purpose | Example |
|---|---|---|
police incidents |
Query NIBRS incidents (June 2014–present) | scripts/raleigh police incidents --since 7d --category burglary |
police recent |
Query CrimeMapper past-90-day feed | scripts/raleigh police recent --days 30 --district Downtown |
police previous-day |
Query previous-day incidents | scripts/raleigh police previous-day --json |
police history |
Query historical incidents (SRS or NIBRS) | scripts/raleigh police history --reporting-system srs --since 30d |
police stats |
Official published statistics availability and document links | scripts/raleigh police stats --year 2025 |
police reports |
Official annual and quarterly report links | scripts/raleigh police reports --year 2025 --quarter 4 |
Fire incidents
| Command | Purpose | Example |
|---|---|---|
fire incidents |
Query RFD incidents (full history 2007–present or past month) | scripts/raleigh fire incidents --since 30d --group Fire |
fire response-times |
Compute labeled response durations | scripts/raleigh fire response-times --since 1y --group Fire |
fire protection |
Wake County MAR fire-protection proximity lookup | scripts/raleigh fire protection --address "222 W Hargett St" |
fire stats |
Official published incident totals and sprinkler-save statistics | scripts/raleigh fire stats --year 2026 |
fire reports |
Published aggregate-report links or exact incident-report lookup | scripts/raleigh fire reports --year 2025 --quarter 1 |
fire reports --date |
Exact ArcGIS incident-report summary, with optional guarded RFD fallback | scripts/raleigh fire reports --date 2026-07-24 |
fire inspections |
Business/address inspection lookup through fragile RFD HTML | scripts/raleigh fire inspections --business "Example" --acknowledge-insecure-rfd |
Active incidents (RWECC)
| Command | Purpose | Example |
|---|---|---|
incidents active |
Currently active public incidents from RWECC | scripts/raleigh incidents active --agency raleigh-fire |
incidents active --json |
JSON output with source metadata | scripts/raleigh incidents active --agency raleigh-police --json |
Public meetings
| Command | Purpose | Example |
|---|---|---|
meetings upcoming |
Upcoming meetings | scripts/raleigh meetings upcoming --json |
meetings list |
Filter by body/year | scripts/raleigh meetings list --body "City Council" --year 2026 |
meetings search |
Search meetings | scripts/raleigh meetings search "budget" |
meetings show |
Meeting details | scripts/raleigh meetings show 37126a80-175a-4b38-974d-a7006bc7db85 |
meetings download-agenda |
Download agenda | scripts/raleigh meetings download-agenda 37126a80-175a-4b38-974d-a7006bc7db85 -o agenda.pdf |
meetings download-minutes |
Download minutes | scripts/raleigh meetings download-minutes 37126a80-175a-4b38-974d-a7006bc7db85 -o minutes.pdf |
Output Flags
| Flag | Effect |
|---|---|
--json |
JSON output |
--refresh |
Bypass catalog cache |
--cache-dir DIR |
Use a custom cache directory |
--timeout SECONDS |
HTTP timeout (default 30) |
References
| Reference | Load when | File |
|---|---|---|
| API contracts and endpoints | Building custom queries | references/api-reference.md |
| Imagery and ImageServer details | Working with aerial photography or raster services | references/imagery-reference.md |
| GTFS and GTFS-Realtime | Transit commands | references/transit-reference.md |
| Guest development portal | Permit and development records | references/development-reference.md |
| Civic content | JSON:API and RSS | references/civic-content-reference.md |
| Public meetings | eSCRIBE extraction | references/meetings-reference.md |
| Police incidents | RPD data sources, field schemas, and privacy caveats | references/police-reference.md |
| Fire incidents | RFD data sources, 2026 schema transition, durations, and privacy caveats | references/fire-reference.md |
| Fire reports and inspections | ArcGIS-first contract, RFD forms, insecure transport, and exclusions | references/fire-reports-reference.md |
| Published police and fire statistics | Official page contract, report indexes, structured totals, and privacy boundary | references/public-safety-statistics-reference.md |
| Active incidents (RWECC) | Undocumented feed contract, schema guard, and disable switch | references/incidents-reference.md |
Pitfalls
- Live catalog: The catalog is discovered from the Hub at runtime. Cache it with
--cache-dirfor repeated use. - ImageServer: Never append
/0to an ImageServer root. Use the dedicatedimagerycommands. - MapServer tables: Some layers are tabular (
type: Table). The CLI automatically omits geometry for non-spatial layers. - WHERE clauses: Strings must be single-quoted:
NAME='Millbrook-Exchange'. - ArcGIS dates: Returned as Unix milliseconds; divide by 1000 for standard timestamps.
- Guest development portal: Uses an undocumented public application API. The adapter is isolated and may change if the upstream UI changes; set
RALEIGH_DISABLE_DEVELOPMENT=1to disable it independently. - Civic relationships: Public content commands accept
--relationship FIELD=ID; text, date, and relationship matching is client-side after bounded pagination. - eSCRIBE: HTML-based extraction with a weaker compatibility contract than structured APIs.
- Police incidents: Locations are block-level and may be randomized or redacted. Empty coordinates are suppressed, not presented as points. This data does not include arrests, convictions, or dispositions. The CrimeMapper 90-day feed is not in the curated Hub catalog and is resolved by item ID.
- Fire incidents: RFD deprecated
incident_type/incident_type_descriptionfor records after 2026-01-01, replaced byincident_group_name,incident_subgroup_code, andincident_type_name. Thefirecommands normalize both eras into stable_keys without fabricating cross-era mappings, and preserve raw fields in JSON. Incident types 300–399 and 661 are excluded by RFD for EMS/privacy. The full-historystationfield is unpopulated for most records after early 2021; the past-month feed providesstation_name. - Fire reports and inspections: Report summaries use the structured ArcGIS past-month layer first. RFD fallback, narratives, and inspection searches cross unencrypted HTTP and require
--acknowledge-insecure-rfdon every invocation. Date fallback also requires--allow-rfd-fallbackand only runs after ArcGIS returns no records. Empty searches, redirects, unexpected markup, and schema drift fail closed. Invoice links are neither followed nor exposed. - Published public-safety statistics:
police stats/reportsand year-basedfire stats/reportsread the official RaleighNC.gov publication indexes at runtime. Inline values are labeledofficial_published_statistics; PDF links are returned without extracting their contents. These outputs are not recomputed from incident rows. RFD medical totals remain aggregate-only and must never be joined to or used to infer incident records excluded for privacy. - Fire protection: The Wake County MAR Fire Protection table is a non-spatial table keyed by CSAID. Address input is composed through the Raleigh locator and the Wake County MAR Addresses layer; if the address cannot be resolved to a unique CSAID, supply
--csaiddirectly. Distances are source-provided road-network values; the source does not advertise units. This data does not expose hydrant locations, only nearest-hydrant distance. It must not be used for emergency response. - Active incidents (RWECC): Uses an undocumented public application endpoint (
incidents.rwecc.com/getdata). The adapter is isolated and may break if the upstream contract changes; setRALEIGH_DISABLE_INCIDENTS=1to disable it independently. This is a filtered active feed, NOT all 911 calls and NOT authoritative emergency status. An empty response does not prove zero incidents. Cache lifetime is 90 seconds. - URL allowlist: Only fixed public hosts are dereferenced; arbitrary URLs are rejected.
- Transit realtime: Requires
google.protobuf>=6.31.1,<7. The vendored GTFS-Realtime binding was generated with protoc 31.1 and does not replace the runtime.
Safety Boundaries
- Read-only operations only. No auth, write, payment, submission, or private-data endpoints.
- All remote hosts and paths are fixed. The general client remains HTTPS-only; the isolated RFD adapter permits only four documented plain-HTTP read contracts after explicit acknowledgement.
- Cached data is refreshed with
--refreshor when the cache expires. - Report stale or unavailable endpoints via
catalog-check.
When not to use
- Do not use this skill for private, authenticated, or non-public city data. It cannot sign in, pay fees, submit forms, or access internal systems.
- Do not use it for non-Raleigh jurisdictions. The host allowlist is fixed to City of Raleigh and GoRaleigh endpoints.
- Do not rely on it for write operations, real-time emergency dispatch, or legally authoritative records. Data is read-only and may be cached.
- Do not use it when the task requires GTFS-Realtime and a compatible
protobufruntime is unavailable. Installprotobuf>=6.31.1,<7first or stick to static GTFS commands. - For general web scraping, research outside Raleigh civic data, or interactive browser tasks, use a more appropriate skill instead.