---
title: "List features"
method: GET
path: "/features"
tags: ["features"]
---

# List features

`GET /features`

Paginated features filtered by type or group. Either `type` or `group` is required.
Free plan requires jurisdiction parameter.

Time-bounded feature types (`future_construction`, `alerts`, `special_events`,
`truck_restrictions`, …) additionally support the scheduled-window filters
`starts_after` / `starts_before` / `ends_after` / `ends_before`.

## Query parameters

- `type` string
- `group` 'imagery' | 'weather' | 'road_conditions' | 'traffic_performance' | 'planned_events' | 'alerts_advisories' | 'wildfires' | 'trucking' | 'traveler_services' | 'fuel_charging' | 'borders' | 'ferries' | 'transit' | 'tolls' | 'static_infrastructure' | 'operations'
- `jurisdiction` string
- `limit` integer
- `offset` integer
- `bbox` string
- `lat` number
- `lng` number
- `radius_km` number
- `active` 'true' | 'false'
- `starts_after` string
- `starts_before` string
- `ends_after` string
- `ends_before` string

## Response `200`

Paginated features

- PagedFeatures
  - `attribution` SourceCredit[] — Required data-source credits for the sources present in `data`. Present only for sources whose license mandates a displayed credit. See `GET /data-sources` for the full catalogue.
    - `attribution` string — The exact credit string this source's license requires you to display.
    - `license` string
    - `license_url` string, uri
    - `source_code` string — Jurisdiction or program code (e.g. `ESP`, `OSM`, `EIA`).
    - `source_name` string
  - `data` Feature[]
    - `description` string
    - `direction` string, nullable
    - `end_time` string, date-time, nullable
    - `estimated_end_time` string, date-time, nullable
    - `estimated_start_time` string, date-time, nullable
    - `feature_type` string
    - `geometry` object, nullable — Full GeoJSON geometry when the feature is a line or polygon; NULL for point-only features (read latitude/longitude instead).
    - `has_details` boolean — `true` when this feature's `(source, feature_type)` pair has a registered lazy-load detail function — calling `GET /features/{id}/details` or batching via `POST /features/details/batch` will return strictly richer data than what's in the list row (multi-view camera URLs, EV connector availability, sign message text, etc.). `false` means the list row already carries everything the source publishes, and the detail call would be a no-op. Not set on the `/features/geojson` path (that JSON is built in Postgres for performance — call `/features` for the hint).
    - `id` string
    - `is_active` boolean
    - `jurisdiction` string
    - `last_updated` string, date-time
    - `latitude` number
    - `longitude` number
    - `name` string
    - `properties` object — Type-specific fields (JSONB)
    - `road_name` string, nullable
    - `source` string
    - `source_id` string — Upstream-provided identifier, before our synthetic `id` prefix.
    - `start_time` string, date-time, nullable — Populated for time-bounded feature types (future_construction, alerts, special_events, truck_restrictions, etc.). NULL for permanent features.
  - `has_more` boolean
  - `limit` integer
  - `offset` integer
  - `total` integer

## Other responses

- `400` — Missing type parameter
- `403` — Plan limit exceeded

---

[API](https://skmtc.dev/road511/apis/road511-traffic-api.md) · [All operations](https://skmtc.dev/road511/apis/road511-traffic-api/llms.txt) · [OpenAPI document](https://skmtc-service-production.skmtc.workers.dev/v1/apis/road511/road511-traffic-api/revisions/be5f6cd4179b/schema)
