Every API here is available over the APIs.io API and to AI agents over MCP.
MCP server
One button, every client — Claude, Cursor, VS Code and the rest.
https://apis.io/mcp
Tools for apis
7 MCP tools reach this
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.
All 92 tools →
Call it yourself
curl for this page
This API
curl "https://apis.io/api/v1/apis/dtn-pavement-conditions-api"
All apis
curl "https://apis.io/api/v1/apis?limit=25"
Discovery needs no key. Ratings and market analysis are Pro.
Get an API 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: Pavement Conditions API
version: 2.0.2
description: "The Pavement Conditions API v2 offers users pavement temperature and condition details for road segments in a specified area with enhanced GeoJSON support and pagination. DTN supplies road data on segments across North America and Europe, allowing users to request data for a geographic area or specific roadway within the database.\n\n**What's New in v2.0.2:**\n- Route Generation \n \n — A new `GET /v2/directions` endpoint generates route geometry via the Mapbox Directions API.\n\n- Query Pavement Conditions Along a Route or Route-Based Filtering (RB Filter)\n\n - Pavement data can be filtered using either `startPoint` and `endPoint` coordinates or a GeoJSON geometry provided in the request body.\n - When `startPoint` and `endPoint` are supplied to the `v2/logistics` or `v2/pavement/conditions` endpoints, a route is automatically generated internally via the Mapbox API.\n - Pagination is determined by the number of route `segments` when RB Filter is active.\n - Each paginated response includes a `statistics` object summarizing covered, uncovered, and total segment counts.\n - Results may be optionally narrowed by a weather `parameter` filter.\n - Results may also be optionally narrowed by Estimated Time of Arrival (`etaFilter`).\n\n- Added pavementValidEndTime in returned data\n\n**Authentication**: This API uses Bearer token authentication. When obtaining your access token, use the following audience values:\n- **Production**: `https://pavement-condition.prd.wx.zones.dtn.com`\n- **Staging**: `https://pavement-condition.stg.wx.zones.dtn.com`"
contact:
name: Ben Hershey
url: https://pavement-condition.prd.wx.zones.dtn.com
email: ben.hershey@dtn.com
servers:
- url: https://pavement-condition.prd.wx.zones.dtn.com/v2
description: Production server
- url: https://pavement-condition.stg.wx.zones.dtn.com/v2
description: Staging server
tags:
- name: Pavement Conditions
description: Pavement condition data endpoints
paths:
/pavement/conditions:
get:
tags:
- Pavement Conditions
summary: Get Pavement Conditions
description: "Retrieves pavement conditions for road segments in GeoJSON FeatureCollection format. Returns up to 1000 records by default.\nData is grouped by segment ID with pagination metadata included in the response.\n\n**Query modes:**\n- By bounding box (`bbox`) — returns all segments within the area\n- By route (`startPoint` + `endPoint`) — uses Mapbox Directions API to generate a route, then returns segments along it\n\n**Filtering options:**\n- Pavement data can be filtered using either `startPoint` and `endPoint` coordinates or a bounding box (`bbox`).\n - Results may be optionally narrowed by a weather `parameter` filter.\n - Results may also be optionally narrowed by Estimated Time of Arrival (`etaFilter`).\n\n**Return Data:**\n\n| Field Name | Description | Imperial Unit | Metric Unit |\n| ---------- | ----------- | ------------- | ----------- |\n| id | Database table primary key ID | N/A | N/A |\n| segmentId | Road segment identifier (string) | N/A | N/A |\n| lat | Latitude for center point of road segment | Degrees | Degrees |\n| lon | Longitude for center point of road segment | Degrees | Degrees |\n| timestamp | Date/time for when the output variables are valid (UTC) | N/A | N/A |\n| pavementCreationTime | Date/time when the pavement model was run (UTC) | N/A | N/A |\n| pavementValidTime | Date/time for when the output variables are valid (UTC) | N/A | N/A |\n| pavementValidEndTime | Date/time for when the pavement forecast validity period ends (UTC) | N/A | N/A |\n| airTemp | Air temperature | Fahrenheit | Celsius |\n| visibility | Visibility distance | mi | km |\n| windDirection | Wind direction relative to true North (range from 0 to 360) | Degrees | Degrees |\n| windGust | Wind gust speed | mi/hr | km/hr |\n| windSpeed | Wind speed | mi/hr | km/hr |\n| iceRate | Ice precipitation rate | in/hr | mm/hr |\n| liquidRate | Liquid precipitation rate | in/hr | mm/hr |\n| snowRate | Snow precipitation rate | in/hr | mm/hr |\n| mobilityIndex | Mobility of vehicles compared to expected traffic patterns (100% mobility means traffic movement is expected to be unaffected by the conditions) | Percent | Percent |\n| pavementTemperature | Temperature of the road surface | Fahrenheit | Celsius |\n| blowingSnowAlertLevel | Level of blowing snow intensity (2 - Lowest, 5 - Highest) | N/A | N/A |\n| compactedSnowDepth | Depth of compacted snow on the road | in | mm |\n| frostDepth | Depth of frost on the road | in | mm |\n| iceDepth | Depth of ice on the road | in | mm |\n| liquidDepth | Depth of liquid on the road | in | mm |\n| snowDepth | Depth of snow on the road | in | mm |\n| unbondedIceDepth | Depth of ice on the road that is not bonded to the road surface | in | mm |\n| pavementCondition | Classification of the road condition. Possible conditions are dry, slush, chemical_wet, damp, wet, frost, ice, snow, compacted_snow | N/A | N/A |\n| crashRiskIndex | Crash risk factor compared to average conditions (ex: 2.0 means the risk of crash is two times the average) | N/A | N/A |\n| crashRiskUncertainty | One standard deviation on the crash risk factor (statistical error) | N/A | N/A |\n| roadName | Name of the road or highway | N/A | N/A |\n| osmClass | OpenStreetMap road classification (e.g., motorway, trunk, primary) | N/A | N/A |\n| geometry | GeoJSON geometry representing the road segment (LineString or MultiLineString) | N/A | N/A |\n| createdAt | Record creation timestamp | N/A | N/A |\n| updatedAt | Record last update timestamp | N/A | N/A |\n\n**Sample Requests:**\n\n1. **Get default data (1000 records):**\n ```\n GET /v2/pavement/conditions\n ```\n\n2. **Get data for specific geographic area (US):**\n ```\n GET /v2/pavement/conditions?bbox=-156.1317111,19.6270521,-155.9317111,19.8270521\n ```\n\n3. **Get data for European area:**\n ```\n GET /v2/pavement/conditions?bbox=3.555,49.470,6.262,50.849\n ```\n\n4. **Get specific page:**\n ```\n GET /v2/pavement/conditions?bbox=-156.1317111,19.6270521,-155.9317111,19.8270521&limit=1000&page=2\n ```\n\n5. **Filter by time range:**\n ```\n GET /v2/pavement/conditions?bbox=-156.1317111,19.6270521,-155.9317111,19.8270521&startTime=2025-12-04T20:00:00.000Z&endTime=2025-12-05T20:00:00.000Z\n ```\n\n6. **Get data in metric units:**\n ```\n GET /v2/pavement/conditions?units=metric\n ```\n\n7. **Route-based filtering with departure time:**\n ```\n GET /v2/pavement/conditions?startPoint=-93.3905,45.1310&endPoint=-93.2695,45.1420&departAt=2026-03-13T15:00:00.000Z\n ```\n\n8. **Route-based filtering with arrival time:**\n ```\n GET /v2/pavement/conditions?startPoint=-93.3905,45.1310&endPoint=-93.2695,45.1420&arriveAt=2026-03-13T16:00:00.000Z\n ```\n\n9. **Route-based with ETA filter (single forecast per segment):**\n ```\n GET /v2/pavement/conditions?startPoint=-93.3905,45.1310&endPoint=-93.2695,45.1420&departAt=2026-03-13T15:00:00.000Z&etaFilter=true\n ```\n\n10. **Route-based with parameter filter:**\n ```\n GET /v2/pavement/conditions?startPoint=-93.3905,45.1310&endPoint=-93.2695,45.1420&departAt=2026-03-13T15:00:00.000Z¶meter=crashRiskIndex,mobilityIndex\n ```\n"
operationId: getPavementConditionsV2
parameters:
- name: bbox
in: query
description: 'Bounding box coordinates to filter results by geographic area.
Format: `minLongitude,minLatitude,maxLongitude,maxLatitude`
'
required: false
schema:
type: string
example: -156.1317111,19.6270521,-155.9317111,19.8270521
- name: limit
in: query
description: Maximum number of records to return. Default is 1000.
required: false
schema:
type: integer
default: 1000
example: 1000
- name: page
in: query
description: Page number for pagination. Default is 1.
required: false
schema:
type: integer
default: 1
example: 1
- name: startTime
in: query
description: 'Filter records with timestamp greater than or equal to this value.
Format: ISO 8601 (YYYY-MM-DDTHH:mm:ss.sssZ)
'
required: false
schema:
type: string
format: date-time
example: '2025-12-04T20:00:00.000Z'
- name: endTime
in: query
description: 'Filter records with timestamp less than or equal to this value.
Format: ISO 8601 (YYYY-MM-DDTHH:mm:ss.sssZ)
'
required: false
schema:
type: string
format: date-time
example: '2025-12-05T20:00:00.000Z'
- name: units
in: query
description: Unit system for response values. Default is imperial.
required: false
schema:
type: string
enum:
- metric
- imperial
default: imperial
example: imperial
- name: startPoint
in: query
description: 'Starting point coordinates for Mapbox route generation.
Format: `longitude,latitude`
'
required: false
schema:
type: string
example: -93.3905,45.1310
- name: endPoint
in: query
description: 'Ending point coordinates for Mapbox route generation.
Format: `longitude,latitude`
'
required: false
schema:
type: string
example: -93.2695,45.1420
- name: departAt
in: query
description: 'Departure time for the route. Mutually exclusive with `arriveAt`.
When provided, the response includes per-feature `arrivalTime` and top-level `properties.arrivalTimeUTC`.
Format: ISO 8601 (YYYY-MM-DDTHH:mm:ss.sssZ)
'
required: false
schema:
type: string
format: date-time
example: '2026-03-13T15:00:00.000Z'
- name: arriveAt
in: query
description: 'Desired arrival time at the destination. Mutually exclusive with `departAt`.
When provided, the response includes per-feature `departureTime` and top-level `properties.departureTimeUTC`.
Format: ISO 8601 (YYYY-MM-DDTHH:mm:ss.sssZ)
'
required: false
schema:
type: string
format: date-time
example: '2026-03-13T16:00:00.000Z'
- name: bufferMeters
in: query
description: Buffer distance in meters around the route for spatial query. Default is 5.
required: false
schema:
type: integer
default: 5
example: 5
- name: etaFilter
in: query
description: 'When true, filters condition data to only return the record matching the segment''s arrival time window.
Requires `departAt` and either `startPoint`/`endPoint` or duration in body.
'
required: false
schema:
type: boolean
default: false
example: true
- name: parameter
in: query
description: 'Comma-separated list of field names to include in the response data.
When provided, only the specified fields are returned per condition record.
Use the /v2/parameters endpoint to see valid options.
'
required: false
schema:
type: string
example: crashRiskIndex,mobilityIndex
responses:
'200':
description: Successful response with GeoJSON FeatureCollection and pagination metadata.
content:
application/json:
schema:
$ref: '#/components/schemas/PavementConditionsResponse'
examples:
pavementConditions:
value:
pagination:
total: 26496
limit: 10
nextOffset: 10
geojson:
type: FeatureCollection
features:
- type: Feature
id: SL-100727058
geometry:
type: MultiLineString
coordinates:
- - - 5.0157406
- 49.7305403
- - 5.0144574
- 49.7288971
- - 5.0137122
- 49.7278154
- - - 4.9970947
- 49.6874619
- - 4.9966223
- 49.6868132
- - 4.9960744
- 49.6862484
properties:
segmentId: SL-100727058
roadName: null
osmClass: R-N-58-000
data:
- id: 6638317100
lat: 49.70771017429127
lon: 5.0404408386138515
timestamp: '2026-06-14T15:00:00.000Z'
pavementCreationTime: '2026-06-15T15:39:49.000Z'
pavementValidTime: '2026-06-14T15:00:00.000Z'
pavementValidEndTime: '2026-06-14T16:00:00.000Z'
airTemp: 19.05
visibility: 36.04
windDirection: 309
windGust: 34.92
windSpeed: 15.84
iceRate: 0
liquidRate: 0
snowRate: 0
mobilityIndex: 100
pavementTemperature: 34.69
blowingSnowAlertLevel: 2
compactedSnowDepth: 0
frostDepth: 0
iceDepth: 0
liquidDepth: 0
snowDepth: 0
unbondedIceDepth: 0
pavementCondition: dry
crashRiskIndex: 0.97
crashRiskUncertainty: 0
createdAt: '2026-06-15T15:53:04.676Z'
updatedAt: '2026-06-15T15:53:04.676Z'
'400':
description: Bad Request - Invalid units parameter
content:
application/json:
schema:
type: object
properties:
error:
type: string
example:
error: Invalid unit. Allowed values are "metric" or "imperial".
'401':
$ref: '#/components/responses/UnauthorizedResponse'
'403':
$ref: '#/components/responses/ForbiddenResponse'
'503':
description: Service Unavailable - Data partition temporarily unavailable for the requested region.
content:
application/problem+json:
schema:
$ref: '#/components/schemas/Error'
example:
type: service-unavailable
title: Backend or Database Unavailable
status: 503
detail: 'No active partition available for domain: EuropeV2. No metadata entry found for key=active_folder_EuropeV2'
instance: urn:dtn:one-transport-api:/v2/pavement/conditions:requestId:b0d7ac21-459c-45a5-ab6f-e09cea96cf9e
error: No metadata entry found for key=active_folder_EuropeV2
security:
- clientCredentials: []
post:
tags:
- Pavement Conditions
summary: Get Pavement Conditions by Route
description: "Retrieves pavement conditions along a route in GeoJSON FeatureCollection format.\nSupports two modes:\n\n**Option 1 - Mapbox waypoints (query params):**\nProvide `startPoint` and `endPoint` to automatically generate a route via Mapbox Directions API.\nOptionally provide `departAt` or `arriveAt` (mutually exclusive) for per-segment timing.\n\n**Option 2 - Direct route (body):**\nProvide a GeoJSON LineString or FeatureCollection in the request body.\n\n**Filtering options:**\n- Pavement data can be filtered using either `startPoint` and `endPoint` coordinates or a GeoJSON geometry provided in the request body.\n - Results may be optionally narrowed by a weather `parameter` filter.\n - Results may also be optionally narrowed by Estimated Time of Arrival (`etaFilter`).\n\nQuery parameters take priority over the request body when both are provided.\n\n**Timing behavior:**\n- When `departAt` is provided: each feature includes `arrivalTime` and the response includes `properties.arrivalTimeUTC` (departAt + route duration)\n- When `arriveAt` is provided: each feature includes `departureTime` and the response includes `properties.departureTimeUTC` (arriveAt - route duration)\n\n**Sample Requests:**\n\n1. **Route via Mapbox with departure time:**\n ```\n POST /v2/pavement/conditions?startPoint=-93.3905,45.1310&endPoint=-93.2695,45.1420&departAt=2026-03-13T15:00:00.000Z\n ```\n\n2. **Route via Mapbox with arrival time:**\n ```\n POST /v2/pavement/conditions?startPoint=-93.3905,45.1310&endPoint=-93.2695,45.1420&arriveAt=2026-03-13T16:00:00.000Z\n ```\n\n3. **Direct route via body:**\n ```\n POST /v2/pavement/conditions\n Body: { \"type\": \"LineString\", \"coordinates\": [[-93.39, 45.13], [-93.27, 45.14]] }\n ```\n"
operationId: getConditionsByRoute
parameters:
- name: departAt
in: query
description: 'Departure time for the route. Mutually exclusive with `arriveAt`.
When provided, the response includes per-feature `arrivalTime` and top-level `properties.arrivalTimeUTC`.
Format: ISO 8601 (YYYY-MM-DDTHH:mm:ss.sssZ)
'
required: false
schema:
type: string
format: date-time
example: '2026-03-13T15:00:00.000Z'
- name: arriveAt
in: query
description: 'Desired arrival time at the destination. Mutually exclusive with `departAt`.
When provided, the response includes per-feature `departureTime` and top-level `properties.departureTimeUTC`.
Format: ISO 8601 (YYYY-MM-DDTHH:mm:ss.sssZ)
'
required: false
schema:
type: string
format: date-time
example: '2026-03-13T16:00:00.000Z'
- name: bufferMeters
in: query
description: Buffer distance in meters around the route for spatial query. Default is 5.
required: false
schema:
type: integer
default: 5
example: 5
- name: limit
in: query
description: 'Maximum number of records to return. Default is 100 for route-based requests.
Maximum allowed is 300 for route-based requests.
'
required: false
schema:
type: integer
default: 100
maximum: 300
example: 100
- name: page
in: query
description: Page number for pagination. Default is 1.
required: false
schema:
type: integer
default: 1
example: 1
- name: startTime
in: query
description: 'Filter records with timestamp greater than or equal to this value.
Format: ISO 8601 (YYYY-MM-DDTHH:mm:ss.sssZ)
'
required: false
schema:
type: string
format: date-time
example: '2025-12-04T20:00:00.000Z'
- name: endTime
in: query
description: 'Filter records with timestamp less than or equal to this value.
Format: ISO 8601 (YYYY-MM-DDTHH:mm:ss.sssZ)
'
required: false
schema:
type: string
format: date-time
example: '2025-12-05T20:00:00.000Z'
- name: units
in: query
description: Unit system for response values. Default is imperial.
required: false
schema:
type: string
enum:
- metric
- imperial
default: imperial
example: imperial
- name: etaFilter
in: query
description: 'When true, filters condition data to only return the record matching the segment''s arrival time window.
Requires `departAt` and either `startPoint`/`endPoint` or duration in body.
'
required: false
schema:
type: boolean
default: false
example: true
- name: parameter
in: query
description: 'Comma-separated list of field names to include in the response data.
When provided, only the specified fields are returned per condition record.
Use the /v2/parameters endpoint to see valid options.
'
required: false
schema:
type: string
example: crashRiskIndex,mobilityIndex
requestBody:
description: 'GeoJSON route geometry. Required when `startPoint`/`endPoint` query params are not provided.
Accepts a LineString or FeatureCollection with LineString features.
'
required: false
content:
application/json:
schema:
oneOf:
- $ref: '#/components/schemas/LineStringRoute'
- $ref: '#/components/schemas/FeatureCollectionRoute'
examples:
lineString:
summary: LineString route
value:
type: LineString
coordinates:
- - -93.3905
- 45.131
- - -93.35
- 45.135
- - -93.2695
- 45.142
featureCollection:
summary: FeatureCollection route
value:
type: FeatureCollection
features:
- type: Feature
geometry:
type: LineString
coordinates:
- - -93.3905
- 45.131
- - -93.2695
- 45.142
responses:
'200':
description: Successful response with GeoJSON FeatureCollection, pagination metadata, and route timing properties.
content:
application/json:
schema:
$ref: '#/components/schemas/RouteConditionsResponse'
examples:
departAtResponse:
summary: Response with departAt (shows arrivalTimeUTC)
value:
pagination:
total: 50
limit: 1000
nextOffset: 50
geojson:
type: FeatureCollection
features:
- type: Feature
id: 40341366
geometry:
type: LineString
coordinates:
- - -93.3905
- 45.131
- - -93.35
- 45.135
properties:
routeId: 40341366
roadName: I-94
osmClass: motorway
arrivalTime: '2026-03-13T15:05:00.000Z'
data:
- id: 1001
lat: 45.131
lon: -93.3905
timestamp: '2026-03-13T15:00:00.000Z'
airTemp: 32.5
pavementCondition: wet
properties:
arrivalTimeUTC: '2026-03-13T15:30:00.000Z'
arriveAtResponse:
summary: Response with arriveAt (shows departureTimeUTC)
value:
pagination:
total: 50
limit: 1000
nextOffset: 50
geojson:
type: FeatureCollection
features:
- type: Feature
id: 40341366
geometry:
type: LineString
coordinates:
- - -93.3905
- 45.131
- - -93.35
- 45.135
properties:
routeId: 40341366
roadName: I-94
osmClass: motorway
departureTime: '2026-03-13T15:25:00.000Z'
data:
- id: 1001
lat: 45.131
lon: -93.3905
timestamp: '2026-03-13T15:00:00.000Z'
airTemp: 32.5
pavementCondition: wet
properties:
departureTimeUTC: '2026-03-13T15:00:00.000Z'
'400':
description: Bad Request - Invalid parameters
content:
application/json:
schema:
type: object
properties:
error:
type: string
examples:
mutuallyExclusive:
value:
error: Cannot use both departAt and arriveAt
invalidBody:
value:
error: Body must be a LineString or FeatureCollection
invalidDepartureTime:
value:
error: '''departureTime'' is not a valid parameter. Use ''departAt'' instead.'
'401':
$ref: '#/components/responses/UnauthorizedResponse'
'403':
$ref: '#/components/responses/ForbiddenResponse'
'404':
description: No conditions found along the route
content:
application/json:
schema:
type: object
properties:
error:
type: string
example:
error: No conditions found along route(s)
'502':
description: Bad Gateway - External service (Mapbox) failure or unreachable
content:
application/problem+json:
schema:
$ref: '#/components/schemas/Error'
'503':
description: Service Unavailable - Data partition temporarily unavailable
content:
application/problem+json:
schema:
$ref: '#/components/schemas/Error'
security:
- clientCredentials: []
components:
schemas:
LineStringRoute:
type: object
required:
- type
- coordinates
properties:
type:
type: string
enum:
- LineString
coordinates:
type: array
minItems: 2
items:
type: array
minItems: 2
items:
type: number
RouteConditionsResponse:
type: object
properties:
pagination:
type: object
properties:
total:
type: integer
description: Total number of records available
limit:
type: integer
description: Maximum number of records per page
nextOffset:
type: integer
description: Offset for the next page
geojson:
type: object
properties:
type:
type: string
enum:
- FeatureCollection
features:
type: array
items:
type: object
properties:
type:
type: string
enum:
- Feature
id:
type: integer
description: Route ID
geometry:
type: object
properties:
type:
type: string
enum:
- LineString
coordinates:
type: array
items:
type: array
items:
type: number
properties:
type: object
properties:
routeId:
type: integer
roadName:
type: string
osmClass:
type: string
arrivalTime:
type: string
format: date-time
description: Estimated arrival time at this segment (present when departAt is used)
departureTime:
type: string
format: date-time
description: Estimated departure time from this segment (present when arriveAt is used)
data:
type: array
items:
type: object
properties:
id:
type: integer
lat:
type: number
lon:
type: number
timestamp:
type: string
format: date-time
pavementCreationTime:
type: string
format: date-time
pavementValidTime:
type: string
format: date-time
pavementValidEndTime:
type: string
format: date-time
airTemp:
type: number
visibility:
type: number
windDirection:
type: number
windGust:
type: number
windSpeed:
type: number
iceRate:
type: number
liquidRate:
type: number
snowRate:
type: number
mobilityIndex:
type: number
pavementTemperature:
type: number
blowingSnowAlertLevel:
type: integer
compactedSnowDepth:
type: number
frostDepth:
type: number
iceDepth:
type: number
liquidDepth:
type: number
snowDepth:
type: number
unbondedIceDepth:
type: number
pavementCondition:
type: string
crashRiskIndex:
type: number
crashRiskUncertainty:
type: number
createdAt:
type: string
format: date-time
updatedAt:
type: string
format: date-time
properties:
type:
# --- truncated at 32 KB (51 KB total) ---
# Full source: https://raw.githubusercontent.com/api-evangelist/dtn/refs/heads/main/openapi/dtn-pavement-conditions-api-openapi.yml