Query, search, and download public datasets and civic information for the City of Raleigh. Use for live ArcGIS Hub catalog discovery, ArcGIS FeatureServer and MapServer queries, ImageServer imagery exports, official Raleigh geocoding, GoRaleigh transit feeds, guest-public development records, public RaleighNC.gov content, eSCRIBE public meetings, Raleigh fire reports and inspections, and the Raleigh-Wake ECC active incident feed. Do not use for private data, authenticated operations, payments, submissions, bulk crawling, or non-public portals.
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
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.
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.
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-dir for repeated use.
ImageServer: Never append /0 to an ImageServer root. Use the dedicated imagery commands.
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=1 to 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_description for records after 2026-01-01, replaced by incident_group_name, incident_subgroup_code, and incident_type_name. The fire commands 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-history station field is unpopulated for most records after early 2021; the past-month feed provides station_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-rfd on every invocation. Date fallback also requires --allow-rfd-fallback and 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/reports and year-based fire stats/reports read the official RaleighNC.gov publication indexes at runtime. Inline values are labeled official_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 --csaid directly. 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; set RALEIGH_DISABLE_INCIDENTS=1 to 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 --refresh or 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 protobuf runtime is unavailable. Install protobuf>=6.31.1,<7 first 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.