UNPKG

ws-dottie

Version:

Your friendly TypeScript companion for Washington State transportation APIs - WSDOT and WSF data with smart caching and React Query integration

1,102 lines 601 kB
{ "openapi": "3.0.0", "info": { "title": "Wsf Schedule API", "version": "1.0.0", "description": "Wsf Schedule API - Washington State Department of Transportation APIs" }, "servers": [ { "url": "https://www.wsdot.wa.gov/ferries/api/schedule/rest", "description": "Production server" } ], "components": { "schemas": { "RoadwayLocation": { "type": "object", "properties": { "Description": { "type": "string", "nullable": true, "description": "Human-readable description of the roadway location, such as interchange names or cross streets." }, "Direction": { "type": "string", "nullable": true, "description": "Traffic direction designation: N, S, B, NB, or SB, indicating which side of the highway is affected." }, "Latitude": { "type": "number", "description": "Latitude of the roadway location in decimal degrees." }, "Longitude": { "type": "number", "description": "Longitude of the roadway location in decimal degrees." }, "MilePost": { "type": "number", "description": "Milepost marker along the highway corridor, with 0 indicating route terminus." }, "RoadName": { "type": "string", "nullable": true, "description": "Highway or route designation code, such as '005' for I-5 or '090' for I-90." } }, "required": [ "Description", "Direction", "Latitude", "Longitude", "MilePost", "RoadName" ], "description": "Roadway location information including route, milepost, coordinates, and direction." }, "FetchCacheFlushDateScheduleOutput": { "type": "string", "description": "UTC datetime when static endpoint data was last updated, or undefined if no update has occurred.", "format": "date-time" }, "FetchRouteDetailsByTripDateAndRouteIdOutput": { "type": "object", "properties": { "RouteID": { "type": "number", "description": "Numeric ID of the route." }, "RouteAbbrev": { "type": "string", "nullable": true, "description": "Route abbreviation code for compact identification." }, "Description": { "type": "string", "nullable": true, "description": "Display name of the route." }, "RegionID": { "type": "number", "description": "Numeric ID of the WSF region associated with route." }, "VesselWatchID": { "type": "number", "description": "Numeric ID used to group routes for VesselWatch system." }, "ReservationFlag": { "type": "boolean", "description": "True if route supports advance vehicle reservations; otherwise false." }, "InternationalFlag": { "type": "boolean", "description": "True if route operates outside United States; otherwise false." }, "PassengerOnlyFlag": { "type": "boolean", "description": "True if route services only passengers without vehicles; otherwise false." }, "CrossingTime": { "type": "string", "nullable": true, "description": "Estimated crossing time in minutes as string, or null if unavailable.", "format": "date-time" }, "AdaNotes": { "type": "string", "nullable": true, "description": "ADA accessibility information in HTML format, or null if unavailable." }, "GeneralRouteNotes": { "type": "string", "nullable": true, "description": "Miscellaneous route information in HTML format, or null if unavailable." }, "SeasonalRouteNotes": { "type": "string", "nullable": true, "description": "Route notes specific to schedule season in HTML format, or null if unavailable." }, "Alerts": { "type": "array", "items": { "type": "object", "properties": { "BulletinID": { "type": "number", "description": "Numeric ID of the alert bulletin." }, "BulletinFlag": { "type": "boolean", "description": "True if alert is also used as bulletin; otherwise false." }, "CommunicationFlag": { "type": "boolean", "description": "True if alert is also used as communications announcement; otherwise false." }, "PublishDate": { "type": "string", "nullable": true, "description": "UTC datetime when the alert was published.", "format": "date-time" }, "AlertDescription": { "type": "string", "nullable": true, "description": "Brief route announcement text, or null if unavailable." }, "DisruptionDescription": { "type": "string", "nullable": true, "description": "Service disruption text associated with alert, or null if not disruption-specific." }, "AlertFullTitle": { "type": "string", "description": "Full title of the alert." }, "AlertFullText": { "type": "string", "nullable": true, "description": "Full HTML-formatted alert text, or null if unavailable." }, "IVRText": { "type": "string", "nullable": true, "description": "Alert text formatted for Interactive Voice Response systems, or null if unavailable." } }, "required": [ "BulletinID", "BulletinFlag", "CommunicationFlag", "PublishDate", "AlertDescription", "DisruptionDescription", "AlertFullTitle", "AlertFullText", "IVRText" ], "description": "Alert information including bulletin ID, flags, publish date, descriptions, and IVR text." }, "description": "Array of alerts associated with route." } }, "required": [ "RouteID", "RouteAbbrev", "Description", "RegionID", "VesselWatchID", "ReservationFlag", "InternationalFlag", "PassengerOnlyFlag", "CrossingTime", "AdaNotes", "GeneralRouteNotes", "SeasonalRouteNotes", "Alerts" ], "description": "Detailed route information including identification, flags, crossing time, notes, and alerts." }, "FetchScheduleByTripDateAndRouteIdOutput": { "type": "object", "properties": { "ScheduleID": { "type": "number", "description": "Numeric ID of the schedule season." }, "ScheduleName": { "type": "string", "description": "Display name of the schedule season." }, "ScheduleSeason": { "anyOf": [ { "type": "number", "enum": [ 0 ] }, { "type": "number", "enum": [ 1 ] }, { "type": "number", "enum": [ 2 ] }, { "type": "number", "enum": [ 3 ] } ], "description": "Code indicating season: 0 = Spring, 1 = Summer, 2 = Fall, 3 = Winter." }, "SchedulePDFUrl": { "type": "string", "description": "URL to the schedule PDF document." }, "ScheduleStart": { "type": "string", "description": "UTC datetime when the schedule season becomes effective.", "format": "date-time" }, "ScheduleEnd": { "type": "string", "description": "UTC datetime when the schedule season stops being effective.", "format": "date-time" }, "AllRoutes": { "type": "array", "items": { "type": "number" }, "description": "Array of route IDs included in this schedule." }, "TerminalCombos": { "type": "array", "items": { "type": "object", "properties": { "DepartingTerminalID": { "type": "number", "description": "Numeric ID of the departing terminal." }, "DepartingTerminalName": { "type": "string", "description": "Display name of the departing terminal.", "format": "date-time" }, "ArrivingTerminalID": { "type": "number", "description": "Numeric ID of the arriving terminal." }, "ArrivingTerminalName": { "type": "string", "description": "Display name of the arriving terminal." }, "SailingNotes": { "type": "string", "description": "Informational text for this terminal combination." }, "Annotations": { "type": "array", "items": { "type": "string" }, "description": "Array of annotation strings assigned to departures in Times list." }, "Times": { "type": "array", "items": { "type": "object", "properties": { "DepartingTime": { "type": "string", "description": "UTC datetime of the departure.", "format": "date-time" }, "ArrivingTime": { "type": "string", "nullable": true, "description": "UTC datetime of the arrival.", "format": "date-time" }, "LoadingRule": { "anyOf": [ { "type": "number", "enum": [ 1 ] }, { "type": "number", "enum": [ 2 ] }, { "type": "number", "enum": [ 3 ] } ], "description": "Code indicating traveler types: 1 = Passenger, 2 = Vehicle, 3 = Both." }, "VesselID": { "type": "number", "description": "Numeric ID of the vessel planned for this departure." }, "VesselName": { "type": "string", "description": "Display name of the vessel planned for this departure." }, "VesselHandicapAccessible": { "type": "boolean", "description": "True if vessel is ADA accessible; otherwise false." }, "VesselPositionNum": { "type": "number", "description": "Position number of the vessel servicing all stops in journey." }, "Routes": { "type": "array", "items": { "type": "number" }, "description": "Array of route IDs serviced by this departure." }, "AnnotationIndexes": { "type": "array", "items": { "type": "number" }, "description": "Array of indexes into Annotations array that apply to this departure." } }, "required": [ "DepartingTime", "ArrivingTime", "LoadingRule", "VesselID", "VesselName", "VesselHandicapAccessible", "VesselPositionNum", "Routes", "AnnotationIndexes" ], "description": "Scheduled departure detail with times, vessel, and loading rules." }, "description": "Array of scheduled departure details for this terminal combination." }, "AnnotationsIVR": { "type": "array", "items": { "type": "string" }, "description": "Array of annotation strings formatted for Interactive Voice Response systems." } }, "required": [ "DepartingTerminalID", "DepartingTerminalName", "ArrivingTerminalID", "ArrivingTerminalName", "SailingNotes", "Annotations", "Times", "AnnotationsIVR" ], "description": "Terminal combination schedule with terminal IDs and names, sailing notes, annotations, and departure times." }, "description": "Array of terminal combination schedules with departure times." } }, "required": [ "ScheduleID", "ScheduleName", "ScheduleSeason", "SchedulePDFUrl", "ScheduleStart", "ScheduleEnd", "AllRoutes", "TerminalCombos" ], "description": "Complete schedule information including season details, routes, and terminal combination schedules with departure times." }, "FetchScheduleValidDateRangeOutput": { "type": "object", "properties": { "DateFrom": { "type": "string", "description": "UTC datetime when data becomes available (earliest valid trip date).", "format": "date-time" }, "DateThru": { "type": "string", "description": "UTC datetime when data stops being available (latest valid trip date).", "format": "date-time" } }, "required": [ "DateFrom", "DateThru" ], "description": "Date range for which fares data is currently published and available." } }, "parameters": {} }, "paths": { "/activeseasons": { "get": { "summary": "List all active schedule seasons with dates and PDF URLs.", "operationId": "fetchActiveSeasons", "tags": [ "active-seasons" ], "x-codeSamples": [ { "lang": "JavaScript", "source": "import { fetchActiveSeasons } from 'ws-dottie/wsf-schedule/core';\n\nconst data = await fetchActiveSeasons({\n fetchMode: 'native',\n validate: true\n});\n\nconsole.log(data);" } ], "responses": { "200": { "description": "Success", "content": { "application/json": { "schema": { "type": "array", "items": { "type": "object", "properties": { "ScheduleID": { "type": "number", "description": "Numeric ID of the schedule season." }, "ScheduleName": { "type": "string", "description": "Display name of the schedule season." }, "ScheduleSeason": { "anyOf": [ { "type": "number", "enum": [ 0 ] }, { "type": "number", "enum": [ 1 ] }, { "type": "number", "enum": [ 2 ] }, { "type": "number", "enum": [ 3 ] } ], "description": "Code indicating season: 0 = Spring, 1 = Summer, 2 = Fall, 3 = Winter." }, "SchedulePDFUrl": { "type": "string", "description": "URL to printable schedule PDF document." }, "ScheduleStart": { "type": "string", "description": "UTC datetime when the schedule season becomes effective (typically 3:00 AM).", "format": "date-time" }, "ScheduleEnd": { "type": "string", "description": "UTC datetime when the schedule season stops being effective (typically 2:59 AM next day).", "format": "date-time" } }, "required": [ "ScheduleID", "ScheduleName", "ScheduleSeason", "SchedulePDFUrl", "ScheduleStart", "ScheduleEnd" ], "description": "Schedule season information including identifier, name, season code, PDF URL, and effective date range." } }, "examples": { "sampleResponse": { "summary": "Sample response", "description": "Example of a successful response from the API (showing first item of 2 total)", "value": [ { "ScheduleID": 193, "ScheduleName": "Fall 2025", "ScheduleSeason": 2, "SchedulePDFUrl": "http://www.wsdot.wa.gov/ferries/pdf/2025Fall.pdf", "ScheduleStart": "2025-09-21T07:00:00.000Z", "ScheduleEnd": "2025-12-27T08:00:00.000Z" } ] } } } } } } } }, "/sailings/{SchedRouteID}": { "get": { "summary": "List active sailings for specified scheduled route.", "operationId": "fetchSailingsByRouteID", "tags": [ "sailings" ], "x-codeSamples": [ { "lang": "JavaScript", "source": "import { fetchSailingsByRouteID } from 'ws-dottie/wsf-schedule/core';\n\nconst data = await fetchSailingsByRouteID({\n params: {\n \"SchedRouteID\": 2401\n },\n fetchMode: 'native',\n validate: true\n});\n\nconsole.log(data);" } ], "responses": { "200": { "description": "Success", "content": { "application/json": { "schema": { "type": "array", "items": { "type": "object", "properties": { "ScheduleID": { "type": "number", "description": "Numeric ID of the schedule season this sailing belongs to." }, "SchedRouteID": { "type": "number", "description": "Numeric ID of the scheduled route this sailing belongs to." }, "RouteID": { "type": "number", "description": "Numeric ID of the underlying route for sailing." }, "SailingID": { "type": "number", "description": "Numeric ID of the sailing." }, "SailingDescription": { "type": "string", "nullable": true, "description": "Human-readable title describing sailing, or null if unavailable." }, "SailingNotes": { "type": "string", "nullable": true, "description": "Informational text associated with sailing, or null if unavailable." }, "DisplayColNum": { "type": "number", "description": "Suggested number of columns for rendering departures on desktop webpage." }, "SailingDir": { "anyOf": [ { "type": "number", "enum": [ 1 ] }, { "type": "number", "enum": [ 2 ] } ], "description": "Code indicating direction: 1 = Westbound, 2 = Eastbound." }, "DayOpDescription": { "type": "string", "nullable": true, "description": "Days of operation grouping for sailing, or null if unavailable." }, "DayOpUseForHoliday": { "type": "boolean", "description": "True if sailing should apply for holidays; otherwise false." }, "ActiveDateRanges": { "type": "array", "nullable": true, "items": { "type": "object", "properties": { "DateFrom": { "type": "string", "description": "UTC datetime when the sailing date range becomes active (typically 3:00 AM).", "format": "date-time" }, "DateThru": { "type": "string", "description": "UTC datetime when the sailing date range stops being active (typically 2:59 AM next day).", "format": "date-time" }, "EventID": { "type": "number", "nullable": true, "description": "Numeric ID of the event associated with sailing date range, or null if none." }, "EventDescription": { "type": "string", "nullable": true, "description": "Human-readable explanation of sailing date range, or null if unavailable." } }, "required": [ "DateFrom", "DateThru", "EventID", "EventDescription" ], "description": "Active date range for sailing including start/end dates, event ID, and description." }, "description": "Array of date ranges detailing when sailing is active, or null if unavailable." }, "Journs": { "type": "array", "nullable": true, "items": { "type": "object", "properties": { "JourneyID": { "type": "number", "description": "Numeric ID of the journey." }, "ReservationInd": { "type": "boolean", "description": "True if journey contains reservable departures; otherwise false." }, "InternationalInd": { "type": "boolean", "description": "True if journey travels outside United States; otherwise false." }, "InterislandInd": { "type": "boolean", "description": "True if journey operates primarily between islands; otherwise false." }, "VesselID": { "type": "number", "description": "Numeric ID of the vessel planned to service journey." }, "VesselName": { "type": "string", "nullable": true, "description": "Display name of the vessel, or null if unavailable." }, "VesselHandicapAccessible": { "type": "boolean", "description": "True if vessel is ADA accessible; otherwise false." }, "VesselPositionNum": { "type": "number", "description": "Position number representing vessel servicing all stops in journey." }, "TerminalTimes": { "type": "array", "nullable": true, "items": { "type": "object", "properties": { "JourneyTerminalID": { "type": "number", "description": "Numeric ID of the terminal time within journey." }, "TerminalID": { "type": "number", "description": "Numeric ID of the terminal." }, "TerminalDescription": { "type": "string", "nullable": true, "description": "Display name of the terminal, or null if unavailable." }, "TerminalBriefDescription": { "type": "string", "nullable": true, "description": "Brief name for terminal, or null if unavailable." }, "Time": { "type": "string", "nullable": true, "description": "Departure or arrival time at terminal in UTC. Note: Date portion (1900-01-01) is placeholder, use time portion only. Null if journey does not stop at terminal.", "format": "date-time" }, "DepArrIndicator": { "anyOf": [ { "type": "number", "enum": [ 1 ] }, { "type": "number", "enum": [ 2 ] }, { "nullable": true } ], "description": "Code indicating stop type: 1 = Departure, 2 = Arrival. Null if journey does not stop at terminal." }, "IsNA": { "type": "boolean", "description": "True if journey does not interact with this terminal (skips it); otherwise false." }, "Annotations": { "type": "array", "nullable": true, "items": { "type": "object", "properties": { "AnnotationID": { "type": "number", "description": "Numeric ID of the annotation." }, "AnnotationText": { "type": "string", "nullable": true, "description": "Human-readable annotation content, or null if unavailable." }, "AnnotationIVRText": { "type": "string", "nullable": true, "description": "Annotation text formatted for Interactive Voice Response systems, or null if unavailable." }, "AdjustedCrossingTime": { "type": "number", "nullable": true, "description": "Adjusted crossing time override in minutes, or null if no override." }, "AnnotationImg": { "type": "string", "nullable": true, "description": "URL to image representing annotation, or null if unavailable." }, "TypeDescription": { "type": "string", "nullable": true, "description": "Logical grouping category for annotation, or null if unavailable." }, "SortSeq": { "type": "number", "description": "Display sort order; lower values appear first." } }, "required": [ "AnnotationID", "AnnotationText", "AnnotationIVRText", "AdjustedCrossingTime", "AnnotationImg", "TypeDescription", "SortSeq" ], "description": "Annotation information including ID, text, IVR text, crossing time override, image URL, type, and sort order." }, "description": "Array of informational annotations associated with terminal time, or null if none." } }, "required": [ "JourneyTerminalID", "TerminalID", "TerminalDescription", "TerminalBriefDescription", "Time", "DepArrIndicator", "IsNA", "Annotations" ], "description": "Terminal time information within journey including terminal identification, time, indicator, skip flag, and annotations." }, "description": "Array of terminal departures and arrivals made by same vessel, or null if unavailable." } }, "required": [ "JourneyID", "ReservationInd", "InternationalInd", "InterislandInd", "VesselID", "VesselName", "VesselHandicapAccessible", "VesselPositionNum", "TerminalTimes" ], "description": "Journey information including ID, indicators, vessel details, and terminal times." }, "description": "Array of journeys representing vessel stops at terminals, or null if unavailable." } }, "required": [ "ScheduleID", "SchedRouteID", "RouteID", "SailingID", "SailingDescription", "SailingNotes", "DisplayColNum", "SailingDir", "DayOpDescription", "DayOpUseForHoliday", "ActiveDateRanges", "Journs" ], "description": "Sailing information including IDs, description, direction, days of operation, holiday flag, active date ranges, and journeys." } }, "examples": { "sampleResponse": { "summary": "Sample response", "description": "Example of a successful response from the API (showing first item of 2 total)", "value": [ { "ScheduleID": 193, "SchedRouteID": 2401, "RouteID": 9, "SailingID": 7793, "SailingDescription": "Leave Westbound", "SailingNotes": "", "DisplayColNum": 0, "SailingDir": 1, "DayOpDescription": "Daily", "DayOpUseForHoliday": false, "ActiveDateRanges": [ { "DateFrom": "2025-09-21T07:00:00.000Z", "DateThru": "2025-12-27T08:00:00.000Z", "EventID": null, "EventDescription": null } ], "Journs": [ { "JourneyID": 166493, "ReservationInd": false, "InternationalInd": false, "InterislandInd": false, "VesselID": 38, "VesselName": "Yakima", "VesselHandicapAccessible": true, "VesselPositionNum": 2, "TerminalTimes": [ { "JourneyTerminalID": 236797, "TerminalID": 1, "TerminalDescription": "Anacortes", "TerminalBriefDescription": "Anacortes", "Time": "1900-01-01T12:05:00.000Z", "DepArrIndicator": 1, "IsNA": false, "Annotations": [] }, { "JourneyTerminalID": 236798, "TerminalID": 13, "TerminalDescription": "Lopez Island", "TerminalBriefDescription": "Lopez", "Time": "1900-01-01T08:00:00.000Z", "DepArrIndicator": null, "IsNA": true, "Annotations": [] }, { "JourneyTerminalID": 236799, "TerminalID": 18, "TerminalDescription": "Shaw Island", "TerminalBriefDescription": "Shaw", "Time": "1900-01-01T08:00:00.000Z", "DepArrIndicator": null, "IsNA": true, "Annotations": [] }, { "JourneyTerminalID": 236800, "TerminalID": 15, "TerminalDescription": "Orcas Island", "TerminalBriefDescription": "Orcas", "Time": "1900-01-01T08:00:00.000Z", "DepArrIndicator": null, "IsNA": true, "Annotations": [] }, { "JourneyTerminalID": 236801, "TerminalID": 10, "TerminalDescription": "Friday Harbor", "TerminalBriefDescription": "Friday Harbor", "Time": "1900-01-01T13:15:00.000Z", "DepArrIndicator": 2, "IsNA": false, "Annotations": [] } ] }, { "JourneyID": 166494, "ReservationInd": false, "InternationalInd": false, "InterislandInd": false, "VesselID": 2, "VesselName": "Chelan", "VesselHandicapAccessible": true, "VesselPositionNum": 1, "TerminalTimes": [ { "JourneyTerminalID": 236802, "TerminalID": 1, "TerminalDescription": "Anacortes", "TerminalBriefDescription": "Anacortes", "Time": "1900-01-01T13:30:00.000Z", "DepArrIndicator": 1, "IsNA": false, "Annotations": [] }, { "JourneyTerminalID": 236803, "TerminalID": 13, "TerminalDescription": "Lopez Island", "TerminalBriefDescription": "Lopez", "Time": "1900-01-01T08:00:00.000Z", "DepArrIndicator": null, "IsNA": true, "Annotations": [] }, { "JourneyTerminalID": 236804, "TerminalID": 18, "TerminalDescription": "Shaw Island", "TerminalBriefDescription": "Shaw", "Time": "1900-01-01T15:05:00.000Z", "DepArrIndicator": 1, "IsNA": false, "Annotations": [ { "AnnotationID": 13332, "AnnotationText": "Loads or unloads westbound traffic on eastbound sailing.", "AnnotationIVRText": "Loads or unloads westbound traffic on eastbound sailing.", "AdjustedCrossingTime": null, "AnnotationImg": "https://www.wsdot.wa.gov/ferries/images/legends/circle_red.gif", "TypeDescription": "Informational", "SortSeq": 20 } ] }, { "JourneyTerminalID": 236805, "TerminalID": 15, "TerminalDescription": "Orcas Island", "TerminalBriefDescription": "Orcas", "Time": "1900-01-01T14:25:00.000Z", "DepArrIndicator": 2, "IsNA": false, "Annotations": [] }, { "JourneyTerminalID": 236806, "TerminalID": 10, "TerminalDescription": "Friday Harbor", "TerminalBriefDescription": "Friday Harbor", "Time": "1900-01-01T08:00:00.000Z", "DepArrIndicator": null, "IsNA": true, "Annotations": [] } ] }, { "JourneyID": 166495, "ReservationInd": false, "InternationalInd": false, "InterislandInd": false, "VesselID": 69, "VesselName": "Samish", "VesselHandicapAccessible": true, "VesselPositionNum": 3, "TerminalTimes": [ { "JourneyTerminalID": 236807, "TerminalID": 1, "TerminalDescription": "Anacortes", "TerminalBriefDescription": "Anacortes", "Time": "1900-01-01T14:15:00.000Z", "DepArrIndicator": 1, "IsNA": false, "Annotations": [] }, { "JourneyTerminalID": 236808, "TerminalID": 13, "TerminalDescription": "Lopez Island", "TerminalBriefDescription": "Lopez", "Time": "1900-01-01T15:10:00.000Z", "DepArrIndicator": 1, "IsNA": false, "Annotations": [] }, { "JourneyTerminalID": 236809, "TerminalID": 18, "TerminalDescription": "Shaw Island", "TerminalBriefDescription": "Shaw", "Time": "1900-01-01T08:00:00.000Z", "DepArrIndicator": null, "IsNA": true, "Annotations": [] }, { "JourneyTerminalID": 236810, "TerminalID": 15, "TerminalDescription": "Orcas Island", "TerminalBriefDescription": "Orcas", "Time": "1900-01-01T08:00:00.000Z", "DepArrIndicator": null, "IsNA": true, "Annotations": [] }, { "JourneyTerminalID": 236811, "TerminalID": 10, "TerminalDescription": "Friday Harbor", "TerminalBriefDescription": "Friday Harbor", "Time": "1900-01-01T15:45:00.000Z", "DepArrIndicator": 2, "IsNA": false, "Annotations": [] } ] }, { "JourneyID": 166496, "ReservationInd": false, "InternationalInd": false, "InterislandInd": true, "VesselID": 66, "VesselName": "Salish", "VesselHandicapAccessible": true, "VesselPositionNum": 4, "TerminalTimes": [ { "JourneyTerminalID": 236812, "TerminalID": 1, "TerminalDescription": "Anacortes", "TerminalBriefDescription": "Anacortes", "Time": "1900-01-01T08:00:00.000Z", "DepArrIndicator": null, "IsNA": true, "Annotations": [] }, { "JourneyTerminalID": 236813, "TerminalID": 13, "TerminalDescri