v4

latestOpenAPI 3.1.0Proprietary2026-08-034715226.2 KB
features

List 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.

get/features

Query parameters

typestring

Feature type: cameras, rest_areas, weigh_stations, certified_scales, truck_repair, weather_stations, ev_charging, signs, road_conditions, etc. Required unless group is provided.

group'imagery' | 'weather' | 'road_conditions' | 'traffic_performance' | 'planned_events' | 'alerts_advisories' | 'wildfires' | 'trucking' | 'traveler_services' | 'fuel_charging' | 'borders' | 'ferries' | 'transit' | 'tolls' | 'static_infrastructure' | 'operations'

Feature group id. Convenience expansion to all feature_types in the group. See GET /features/groups.

When combined with radius_km, the radius is capped at 200 km — see that parameter.

jurisdictionstring

Filter by jurisdiction code (e.g., GA, ON, CA). Required on Free plan.

Auto-expansion: querying a state's primary code that has WZDx/CWZ or sub-state regional siblings (see GET /jurisdictions/groups) is expanded transparently to include all members. For example, ?jurisdiction=CA returns rows from CA, WZDX_CA, and 511SF.

To opt out, query a non-primary code directly (?jurisdiction=WZDX_CA returns WZDx-only rows) or pass a comma-separated list explicitly (?jurisdiction=CA,WZDX_CA), which bypasses expansion and matches each code literally.

limitinteger

Results per page (capped by plan)

offsetinteger

Pagination offset

bboxstring

Bounding box: minLng,minLat,maxLng,maxLat

latnumber

Latitude for radius search

lngnumber

Longitude for radius search

radius_kmnumber

Radius in km (used with lat/lng).

Capped at 200 when combined with group. A group expands to many feature types, and a wide radius over all of them cannot be served inside the request budget, so the combination returns 400 rather than timing out. Lower the radius, or query a single type — single-type radius searches have no limit.

active'true' | 'false'

Tri-state filter on is_active. true returns active only, false returns inactive (archived) only, omitted returns both.

starts_afterstring
Example:2026-08-01

Only features scheduled to start on or after this instant. Accepts an RFC3339 timestamp or a bare YYYY-MM-DD date (UTC midnight).

Matches against estimated_start_time where the source publishes a planned date, falling back to start_time otherwise. Features with no known start are excluded.

starts_beforestring
Example:2026-09-01

Only features scheduled to start on or before this instant. Accepts an RFC3339 timestamp or a bare YYYY-MM-DD date (UTC midnight).

Combine with ends_after to select everything whose scheduled window overlaps a period: ?starts_before=2026-09-01&ends_after=2026-08-01 returns every project active at some point during August 2026.

ends_afterstring
Example:2026-08-01

Only features scheduled to end on or after this instant. Accepts an RFC3339 timestamp or a bare YYYY-MM-DD date (UTC midnight).

Matches against estimated_end_time, falling back to end_time. A feature with a known start and no end is treated as open-ended and always matches. A feature with no dates at all never matches.

ends_beforestring
Example:2026-12-31

Only features scheduled to end on or before this instant. Accepts an RFC3339 timestamp or a bare YYYY-MM-DD date (UTC midnight).

Open-ended features (known start, no end) never match — they are not provably finished by any given date.

Response

Paginated features

has_moreboolean

Whether more features match beyond this page. Always exact, including past the total cap.

limitinteger
offsetinteger
totalinteger

Number of matching features, counted up to 10,000. A total of exactly 10000 means "10,000 or more", not exactly ten thousand — some layers run to millions of rows (truck_restrictions alone is ~1.5M in North America) and counting them exactly cannot be done within the request budget. Under the cap, total is exact.

has_more stays exact at any depth and is the reliable signal for "is there another page" — prefer it over comparing against total when paginating deep.

Example response

{
  "attribution": [
    {
      "attribution": "© Dirección General de Tráfico (DGT) — licensed under CC BY 4.0",
      "license": "CC-BY 4.0",
      "license_url": "https://creativecommons.org/licenses/by/4.0/",
      "source_code": "ESP",
      "source_name": "Spain — DGT National Access Point"
    }
  ]
}