{"info":{"name":"DTN Aviation API TAF collection","schema":"https://schema.getpostman.com/json/collection/v2.1.0/collection.json","description":"Terminal Aerodrome Forecast ([TAF](https://en.wikipedia.org/wiki/TAF)) data describe forecasted weather conditions at airfields.\n\nA reported TAF may contain multiple forecasts for different periods as far out as 30 hours in the future for the applicable station.  Furthermore each forecast may have separate forecast information for multiple layers and have multiple weather codes.\n\nEach station/forecast/layer/weather combination is a separate object in the API response data.  Thus from a single \"TAF\" (one report from one station at a given time) there can be a considerable number of objects in the API response.  E.g., a TAF for one station at one time may provide 4 forecast periods with 1, 3, 4, and 2 layers and 1 weather code for each forecast period except the last with two layers.  In that case there would be a total of 12 features available ( (1 layer * 1 weather) + (3 * 1) + (4 * 1) + (2 * 2) ).  Which of those would be in a response involving that station depends on the other parameters used in the request.\n\nThis TAF collection includes requests categorization in:\n- Authorization\n- health-check\n- TAFs\n    - Example TAF: should all succeed though perhaps not provide data\n    - Invalid requests: should all fail because of some problem in request parameters\n    - Sandbox TAF: starting point for requests utilizing any possible parameters\n"},"auth":{"type":"bearer","bearer":[{"key":"token","value":"{{token}}","type":"string"}]},"event":[{"listen":"prerequest","script":{"type":"text/javascript","exec":[""]}},{"listen":"test","script":{"type":"text/javascript","exec":[""]}}],"variable":[{"key":"version","value":"v1"}],"item":[{"name":"Authorization","item":[{"name":"Generate Authorization Token","event":[{"listen":"prerequest","script":{"exec":[""],"type":"text/javascript","packages":{}}},{"listen":"test","script":{"exec":["var jsonData = JSON.parse(responseBody);","pm.environment.set(\"token\", jsonData.data.access_token);"],"type":"text/javascript","packages":{}}}],"protocolProfileBehavior":{"disabledSystemHeaders":{"accept":true,"content-type":true}},"request":{"auth":{"type":"noauth"},"method":"POST","header":[{"key":"Accept","value":"application/json"},{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n    \"grant_type\": \"client_credentials\",\n    \"client_id\": \"{{client_id}}\",\n    \"client_secret\": \"{{client_secret}}\",\n    \"audience\": \"{{audience}}\"\n}"},"url":{"raw":"{{auth_url}}/v1/tokens/authorize","host":["{{auth_url}}"],"path":["v1","tokens","authorize"]},"description":"- For authorization token request.\n- Requires No Auth for its own Auth Type.\n- Environment sets structure for automatically placing details from received token.\n- Make request any time previous token has expired."},"response":[]}],"description":"- For encompassing the authorization token request.\n- Requires No Auth for its own Auth Type.\n- Environment sets structure for automatically placing details from received token.\n- Make request any time previous token has expired.","auth":{"type":"noauth"},"event":[{"listen":"prerequest","script":{"type":"text/javascript","exec":[""]}},{"listen":"test","script":{"type":"text/javascript","exec":[""]}}]},{"name":"health-check","description":"- For encompassing the health-check request.\n- Uses inherited Auth Type set for collection.\n- Request is to validate API is functional and will show API version.","item":[{"name":"health-check","request":{"method":"GET","header":[{"key":"Accept","value":"application/json"}],"url":{"raw":"{{api_url}}/v1/health-check","host":["{{api_url}}"],"path":["v1","health-check"]},"description":"- For health-check request.\n- Uses inherited Auth Type set for collection.\n- Request is to validate API is functional and will show API version."},"response":[]}]},{"name":"TAFs","event":[{"listen":"prerequest","script":{"type":"text/javascript","exec":["var moment = require('moment');","pm.environment.set('timestamp_minus_31h', moment().subtract(31,'hours'))","pm.environment.set('timestamp_minus_30h', moment().subtract(30,'hours'))","pm.environment.set('timestamp_minus_29h', moment().subtract(29,'hours'))","pm.environment.set('timestamp_minus_28h', moment().subtract(28,'hours'))","pm.environment.set('timestamp_minus_27h', moment().subtract(27,'hours'))","pm.environment.set('timestamp_minus_26h', moment().subtract(26,'hours'))","pm.environment.set('timestamp_minus_25h', moment().subtract(25,'hours'))","pm.environment.set('timestamp_minus_24h', moment().subtract(24,'hours'))","pm.environment.set('timestamp_minus_23h', moment().subtract(23,'hours'))","pm.environment.set('timestamp_minus_22h', moment().subtract(22,'hours'))","pm.environment.set('timestamp_minus_21h', moment().subtract(21,'hours'))","pm.environment.set('timestamp_minus_20h', moment().subtract(20,'hours'))","pm.environment.set('timestamp_minus_19h', moment().subtract(19,'hours'))","pm.environment.set('timestamp_minus_18h', moment().subtract(18,'hours'))","pm.environment.set('timestamp_minus_17h', moment().subtract(17,'hours'))","pm.environment.set('timestamp_minus_16h', moment().subtract(16,'hours'))","pm.environment.set('timestamp_minus_15h', moment().subtract(15,'hours'))","pm.environment.set('timestamp_minus_14h', moment().subtract(14,'hours'))","pm.environment.set('timestamp_minus_13h', moment().subtract(13,'hours'))","pm.environment.set('timestamp_minus_12h', moment().subtract(12,'hours'))","pm.environment.set('timestamp_minus_11h', moment().subtract(11,'hours'))","pm.environment.set('timestamp_minus_10h', moment().subtract(10,'hours'))","pm.environment.set('timestamp_minus_9h', moment().subtract(9,'hours'))","pm.environment.set('timestamp_minus_8h', moment().subtract(8,'hours'))","pm.environment.set('timestamp_minus_7h', moment().subtract(7,'hours'))","pm.environment.set('timestamp_minus_6h', moment().subtract(6,'hours'))","pm.environment.set('timestamp_minus_5h', moment().subtract(5,'hours'))","pm.environment.set('timestamp_minus_4h', moment().subtract(4,'hours'))","pm.environment.set('timestamp_minus_3h', moment().subtract(3,'hours'))","pm.environment.set('timestamp_minus_2h', moment().subtract(2,'hours'))","pm.environment.set('timestamp_minus_1h', moment().subtract(1,'hour'))","pm.environment.set('timestamp_minus_10m', moment().subtract(10,'minutes'))","pm.environment.set('timestamp_minus_5m', moment().subtract(5,'minutes'))","pm.environment.set('timestamp_minus_2m', moment().subtract(2,'minutes'))","pm.environment.set('timestamp_minus_1m', moment().subtract(1,'minute'))","pm.environment.set('timestamp_current', moment())","pm.environment.set('timestamp_plus_1h', moment().add(1,'hour'))","pm.environment.set('timestamp_plus_2h', moment().add(2,'hours'))","pm.environment.set('timestamp_plus_3h', moment().add(3,'hours'))","pm.environment.set('timestamp_plus_4h', moment().add(4,'hours'))","pm.environment.set('timestamp_plus_5h', moment().add(5,'hours'))","pm.environment.set('timestamp_plus_6h', moment().add(6,'hours'))","pm.environment.set('timestamp_plus_7h', moment().add(7,'hours'))","pm.environment.set('timestamp_plus_8h', moment().add(8,'hours'))","pm.environment.set('timestamp_plus_9h', moment().add(9,'hours'))","pm.environment.set('timestamp_plus_10h', moment().add(10,'hours'))","pm.environment.set('timestamp_plus_11h', moment().add(11,'hours'))","pm.environment.set('timestamp_plus_12h', moment().add(12,'hours'))","pm.environment.set('timestamp_plus_13h', moment().add(13,'hours'))","pm.environment.set('timestamp_plus_14h', moment().add(14,'hours'))","pm.environment.set('timestamp_plus_15h', moment().add(15,'hours'))","pm.environment.set('timestamp_plus_16h', moment().add(16,'hours'))","pm.environment.set('timestamp_plus_17h', moment().add(17,'hours'))","pm.environment.set('timestamp_plus_18h', moment().add(18,'hours'))","pm.environment.set('timestamp_plus_19h', moment().add(19,'hours'))","pm.environment.set('timestamp_plus_20h', moment().add(20,'hours'))","pm.environment.set('timestamp_plus_21h', moment().add(21,'hours'))","pm.environment.set('timestamp_plus_22h', moment().add(22,'hours'))","pm.environment.set('timestamp_plus_23h', moment().add(23,'hours'))","pm.environment.set('timestamp_plus_24h', moment().add(24,'hours'))","pm.environment.set('timestamp_plus_25h', moment().add(25,'hours'))","pm.environment.set('timestamp_plus_26h', moment().add(26,'hours'))","pm.environment.set('timestamp_plus_27h', moment().add(27,'hours'))","pm.environment.set('timestamp_plus_28h', moment().add(28,'hours'))","pm.environment.set('timestamp_plus_29h', moment().add(29,'hours'))","pm.environment.set('timestamp_plus_30h', moment().add(30,'hours'))","pm.environment.set('timestamp_plus_31h', moment().add(31,'hours'))","","pm.collectionVariables.set(\"endpoint\", \"tafs\");"]}},{"listen":"test","script":{"type":"text/javascript","exec":[""]}}],"item":[{"name":"Example TAF","event":[{"listen":"prerequest","script":{"type":"text/javascript","exec":[""]}},{"listen":"test","script":{"type":"text/javascript","exec":["var jsonData = pm.response.json()","","if (pm.response.code == 400) {","    jsonData.errors.forEach(function(error){","        console.log(`parameter '${error.parameter}' value '${error.value}' error: ${error.message}`)","    })","}","","pm.test(\"Status test\", function () {","    pm.response.to.have.status(200);","});","","pm.test(\"JSON expectations\", function () {","    var jsonData = pm.response.json();","    pm.expect(jsonData.type).to.eql(\"FeatureCollection\");","    pm.expect(jsonData.features).to.be.an(\"array\");","});","","pm.test(\"Feature evaluation\", function () {","    jsonData.features.forEach(function(feature){","        pm.expect(feature.type).to.eql(\"Feature\");","        pm.expect(feature.geometry.type).to.eql(\"Point\");","        pm.expect(feature.properties.ogcFeatureId).to.be.a(\"number\");","        pm.expect(feature.properties.forecastNumber).to.be.a(\"number\");","        pm.expect(typeof(feature.properties.layerNumber) == 'number' || feature.properties.layerNumber == null).to.be.true;","        pm.expect(feature.properties.stationId).to.be.a(\"string\");","        pm.expect(feature.properties.rawTxt).to.be.a(\"string\");","        pm.expect(feature.properties.flightCategory).to.be.oneOf([\"VFR\",\"MVFR\",\"IFR\",\"LIFR\"]);","        pm.expect(feature.properties.flightCode).to.be.oneOf([1,2,3,4]);","        pm.expect(feature.properties.issueDateTime).to.match(/^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}.\\d{3}Z$/);","        pm.expect(feature.properties.validDateTime).to.match(/^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}.\\d{3}Z$/);","        pm.expect(feature.properties.expirationDateTime).to.match(/^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}.\\d{3}Z$/);","        pm.expect(feature.properties.insertedDateTime).to.match(/^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}.\\d{3}Z$/);","        pm.expect(typeof(feature.properties.forecastType) == 'string' || feature.properties.forecastType == null).to.be.true;","        pm.expect(typeof(feature.properties.probability) == 'number' || feature.properties.probability == null).to.be.true;","        pm.expect(typeof(feature.properties.windSpeed) == 'number' || feature.properties.windSpeed == null).to.be.true;","        pm.expect(typeof(feature.properties.windGust) == 'number' || feature.properties.windGust == null).to.be.true;","        pm.expect(typeof(feature.properties.windDirection) == 'number' || feature.properties.windDirection == null).to.be.true;","        pm.expect(typeof(feature.properties.visibility) == 'number' || feature.properties.visibility == null).to.be.true;","        pm.expect(typeof(feature.properties.wmoCode) == 'string' || feature.properties.wmoCode == null).to.be.true;","        pm.expect(typeof(feature.properties.ceilingCode) == 'string' || feature.properties.ceilingCode == null).to.be.true;","        pm.expect(typeof(feature.properties.cloudHeight) == 'number' || feature.properties.cloudHeight == null).to.be.true;","        pm.expect(feature.properties.vicinity).to.be.oneOf([0,1,null]);","    })","});"]}}],"item":[{"name":"wWA bbox metric","request":{"method":"GET","header":[{"key":"Accept","value":"application/json"}],"url":{"host":["{{api_url}}"],"path":["{{version}}","{{endpoint}}"],"query":[{"key":"limit","value":"5","description":"Maximum number of objects to return (default=1000)","disabled":true},{"key":"offset","value":"","description":"Where to start in paginated response set (default=0, i.e., first object)","disabled":true},{"key":"unitSystem","value":"metric","description":"For unit system of output ; Allowed values are \"default\" (default, typically imperial units but not all) or \"metric\""},{"key":"bbox","value":"-124,46.5,-122,48.5","description":"<min_lon>,<min_lat>,<max_lon>,<max_lat>"}],"raw":"{{api_url}}/{{version}}/{{endpoint}}?unitSystem=metric&bbox=-124,46.5,-122,48.5"},"description":"Gets data objects within bounding box encompassing western Washington and output converted where applicable into metric units"}},{"name":"Great Lakes polygon MVFR,IFR,LIFR","request":{"method":"GET","header":[{"key":"Accept","value":"application/json"}],"url":{"host":["{{api_url}}"],"path":["{{version}}","{{endpoint}}"],"query":[{"key":"limit","value":"5","description":"Maximum number of objects to return (default=1000)","disabled":true},{"key":"offset","value":"","description":"Where to start in paginated response set (default=0, i.e., first object)","disabled":true},{"key":"polygon","value":"-92.8,46.6,-87.3,41.4,-81.5,41.2,-75.1,44.0,-82.9,47,-87.6,49.5","description":"<lon_1>,<lat_1>,...,<lon_n>,<lat_n>"},{"key":"flightCategories","value":"MVFR,IFR,LIFR","description":"Include only objects whose flightCategory is one of these ; Comma-delimited list of one or more of \"VFR\", \"MVFR\", \"IFR\", \"LIFR\", \"UNKNOWN\""}],"raw":"{{api_url}}/{{version}}/{{endpoint}}?polygon=-92.8,46.6,-87.3,41.4,-81.5,41.2,-75.1,44.0,-82.9,47,-87.6,49.5&flightCategories=MVFR,IFR,LIFR"},"description":"Gets data objects within polygon encompassing Great Lakes region with flightCategory value MVFR, IFR, or LIFR"}},{"name":"LGA-HVA-BOS 25nm corridor 2/3/4 codes","request":{"method":"GET","header":[{"key":"Accept","value":"application/json"}],"url":{"host":["{{api_url}}"],"path":["{{version}}","{{endpoint}}"],"query":[{"key":"limit","value":"5","description":"Maximum number of objects to return (default=1000)","disabled":true},{"key":"offset","value":"","description":"Where to start in paginated response set (default=0, i.e., first object)","disabled":true},{"key":"corridor","value":"-73.875,40.781,-73.882,41.628,-71.005,42.365,25","description":"<lon_1>,<lat_1>,...,<lon_n>,<lat_n>,<halfwidth>"},{"key":"flightCodes","value":"2,3,4","description":"Include only objects whose flightCode is one of these ; Comma-delimited list of one or more of \"1\", \"2\", \"3\", \"4\", \"0\""}],"raw":"{{api_url}}/{{version}}/{{endpoint}}?corridor=-73.875,40.781,-73.882,41.628,-71.005,42.365,25&flightCodes=2,3,4"},"description":"Gets data objects within corridor defined with 25nm halfwidth and line connecting New York, Hartford, and Boston with flightCode value 2, 3, or 4"}},{"name":"SRID 3857 EVV 100sm circle","request":{"method":"GET","header":[{"key":"Accept","value":"application/json"}],"url":{"host":["{{api_url}}"],"path":["{{version}}","{{endpoint}}"],"query":[{"key":"limit","value":"5","description":"Maximum number of objects to return (default=1000)","disabled":true},{"key":"offset","value":"","description":"Where to start in paginated response set (default=0, i.e., first object)","disabled":true},{"key":"circle","value":"-9743201.03,4585368.62,100","description":"<x>,<y>,<radius> (non-4326 SRID)"},{"key":"distanceUnits","value":"sm","description":"Units for distance of defined circle radius or corridor halfwidth ; Allowed values are \"nm\" (default), \"sm\", \"km\", or \"m\""},{"key":"srid","value":"3857","description":"SRID of provided input coordinates for spatial filter ; Allowed values are \"4326\" (default, lon/lat) or \"3857\" ; Does not affect output coordinates"}],"raw":"{{api_url}}/{{version}}/{{endpoint}}?circle=-9743201.03,4585368.62,100&distanceUnits=sm&srid=3857"},"description":"Gets data objects within circle defined with 100sm radius from center at Evansville defined with SRID 3857 coordinates"}},{"name":"Chicago stationIds valid+4to10h","request":{"method":"GET","header":[{"key":"Accept","value":"application/json"}],"url":{"host":["{{api_url}}"],"path":["{{version}}","{{endpoint}}"],"query":[{"key":"limit","value":"15","description":"Maximum number of objects to return (default=1000)","disabled":true},{"key":"offset","value":"","description":"Where to start in paginated response set (default=0, i.e., first object)","disabled":true},{"key":"stationIds","value":"KORD,KMDW,KGYY,KDPA,KRFD","description":"Include only features whose stationId is one of these ; Comma-delimited list of one or more identifiers each defined by 3-4 letters/numbers"},{"key":"fromDateTime","value":"{{timestamp_plus_4h}}","description":"Include only objects whose valid timeframe includes this time (in UTC) and later ; I.e., exclude objects that expire before this time ; Allowed timeframe for values determined by data type"},{"key":"untilDateTime","value":"{{timestamp_plus_10h}}","description":"Include only objects whose valid timeframe includes this time (in UTC) and earlier ; I.e., exclude objects that are not valid before this time ; Allowed timeframe for values determined by data type"}],"raw":"{{api_url}}/{{version}}/{{endpoint}}?stationIds=KORD,KMDW,KGYY,KDPA,KRFD&fromDateTime={{timestamp_plus_4h}}&untilDateTime={{timestamp_plus_10h}}"},"description":"Gets data objects for stations from specified list for Chicago area valid during period between 4 and 10 hours after now"}},{"name":"DC valid+6h","request":{"method":"GET","header":[{"key":"Accept","value":"application/json"}],"url":{"host":["{{api_url}}"],"path":["{{version}}","{{endpoint}}"],"query":[{"key":"limit","value":"15","description":"Maximum number of objects to return (default=1000)","disabled":true},{"key":"offset","value":"","description":"Where to start in paginated response set (default=0, i.e., first object)","disabled":true},{"key":"stationIds","value":"KDCA,KIAD,KBWI","description":"Include only features whose stationId is one of these ; Comma-delimited list of one or more identifiers each defined by 3-4 letters/numbers"},{"key":"isValidAt","value":"{{timestamp_plus_6h}}","description":"Include only objects that are valid on or before plus expire after this time (in UTC) ; Allowed timeframe for values determined by data type"}],"raw":"{{api_url}}/{{version}}/{{endpoint}}?stationIds=KDCA,KIAD,KBWI&isValidAt={{timestamp_plus_6h}}"},"description":"Gets data objects for stations from specified list for Washington DC area valid at time 6 hours after now"}},{"name":"SoCal stationIds no geometry","request":{"method":"GET","header":[{"key":"Accept","value":"application/json"}],"url":{"host":["{{api_url}}"],"path":["{{version}}","{{endpoint}}"],"query":[{"key":"limit","value":"5","description":"Maximum number of objects to return (default=1000)","disabled":true},{"key":"offset","value":"","description":"Where to start in paginated response set (default=0, i.e., first object)","disabled":true},{"key":"stationIds","value":"KLAX,KLGB,KBUR,KSNA,KONT,KSMO","description":"Include only features whose stationId is one of these ; Comma-delimited list of one or more identifiers each defined by 3-4 letters/numbers"},{"key":"geometry","value":"0","description":"Include geometry in response (boolean, default=true) ; Make falsy to blank out geometry in response"}],"raw":"{{api_url}}/{{version}}/{{endpoint}}?stationIds=KLAX,KLGB,KBUR,KSNA,KONT,KSMO&geometry=0"},"description":"Gets data objects for stations from specified list for southern California and removing geometry from response"}},{"name":"inserted last 10min","request":{"method":"GET","header":[{"key":"Accept","value":"application/json"}],"url":{"host":["{{api_url}}"],"path":["{{version}}","{{endpoint}}"],"query":[{"key":"limit","value":"5","description":"Maximum number of objects to return (default=1000)","disabled":true},{"key":"offset","value":"","description":"Where to start in paginated response set (default=0, i.e., first object)","disabled":true},{"key":"insertedAfter","value":"{{timestamp_minus_10m}}","description":"Include only objects that were inserted after this time (in UTC) ; Like if want new data and previous acquired all insertedThrough this time ; Allowed timeframe for values determined by data type"},{"key":"insertedThrough","value":"{{timestamp_current}}","description":"Include only objects that were inserted before or at this time (in UTC) ; Allowed timeframe for values determined by data type"}],"raw":"{{api_url}}/{{version}}/{{endpoint}}?insertedAfter={{timestamp_minus_10m}}&insertedThrough={{timestamp_current}}"},"description":"Gets data objects inserted in past 10 minutes"}}],"description":"These requests are expected to succeed, though not necessarily always return data.\n\nTests are applied on each response aiming to confirm response is good:\n- To confirm 200 status code for response\n- To confirm that response is valid JSON with an array of features\n- To confirm structure of each object includes certain expected values in specific format"},{"name":"Invalid requests","event":[{"listen":"prerequest","script":{"type":"text/javascript","exec":[""]}},{"listen":"test","script":{"type":"text/javascript","exec":["var jsonData = pm.response.json()","","if (pm.response.code == 400) {","    jsonData.errors.forEach(function(error){","        console.log(`parameter '${error.parameter}' value '${error.value}' error: ${error.message}`)","    })","}","pm.test(\"Status test 400\", function () {","    pm.response.to.have.status(400);","});"]}}],"item":[{"name":"BAD invalid flightCategories","request":{"method":"GET","header":[{"key":"Accept","value":"application/json"}],"url":{"host":["{{api_url}}"],"path":["{{version}}","{{endpoint}}"],"query":[{"key":"limit","value":"5","description":"Maximum number of objects to return (default=1000)","disabled":true},{"key":"offset","value":"","description":"Where to start in paginated response set (default=0, i.e., first object)","disabled":true},{"key":"stationIds","value":"KCHS","description":"Include only features whose stationId is one of these ; Comma-delimited list of one or more identifiers each defined by 3-4 letters/numbers"},{"key":"flightCategories","value":"MVFR,IFR,ILFR","description":"Include only objects whose flightCategory is one of these ; Comma-delimited list of one or more of \"VFR\", \"MVFR\", \"IFR\", \"LIFR\", \"UNKNOWN\""}],"raw":"{{api_url}}/{{version}}/{{endpoint}}?stationIds=KCHS&flightCategories=MVFR,IFR,ILFR"},"description":"Uses value not among specific allowed values for flightCategory (\"LIFR\" misspelled)"}},{"name":"BAD invalid flightCodes","request":{"method":"GET","header":[{"key":"Accept","value":"application/json"}],"url":{"host":["{{api_url}}"],"path":["{{version}}","{{endpoint}}"],"query":[{"key":"limit","value":"5","description":"Maximum number of objects to return (default=1000)","disabled":true},{"key":"offset","value":"","description":"Where to start in paginated response set (default=0, i.e., first object)","disabled":true},{"key":"stationIds","value":"KCHS","description":"Include only features whose stationId is one of these ; Comma-delimited list of one or more identifiers each defined by 3-4 letters/numbers"},{"key":"flightCodes","value":"3,4,5","description":"Include only objects whose flightCode is one of these ; Comma-delimited list of one or more of \"1\", \"2\", \"3\", \"4\", \"0\""}],"raw":"{{api_url}}/{{version}}/{{endpoint}}?stationIds=KCHS&flightCodes=3,4,5"},"description":"Uses value not among specific allowed values for flightCode (\"5\" not valid)"}},{"name":"BAD invalid insert timeframe","request":{"method":"GET","header":[{"key":"Accept","value":"application/json"}],"url":{"host":["{{api_url}}"],"path":["{{version}}","{{endpoint}}"],"query":[{"key":"limit","value":"5","description":"Maximum number of objects to return (default=1000)","disabled":true},{"key":"offset","value":"","description":"Where to start in paginated response set (default=0, i.e., first object)","disabled":true},{"key":"stationIds","value":"KCHS","description":"Include only features whose stationId is one of these ; Comma-delimited list of one or more identifiers each defined by 3-4 letters/numbers"},{"key":"insertedAfter","value":"{{timestamp_current}}","description":"Include only objects that were inserted after this time (in UTC) ; Like if want new data and previous acquired all insertedThrough this time ; Allowed timeframe for values determined by data type"},{"key":"insertedThrough","value":"{{timestamp_minus_5m}}","description":"Include only objects that were inserted before or at this time (in UTC) ; Allowed timeframe for values determined by data type"}],"raw":"{{api_url}}/{{version}}/{{endpoint}}?stationIds=KCHS&insertedAfter={{timestamp_current}}&insertedThrough={{timestamp_minus_5m}}"},"description":"An \"after\" time must be before a \"through\" time"}},{"name":"BAD invalid time format","request":{"method":"GET","header":[{"key":"Accept","value":"application/json"}],"url":{"host":["{{api_url}}"],"path":["{{version}}","{{endpoint}}"],"query":[{"key":"limit","value":"5","description":"Maximum number of objects to return (default=1000)","disabled":true},{"key":"offset","value":"","description":"Where to start in paginated response set (default=0, i.e., first object)","disabled":true},{"key":"isValidAt","value":"2024-07-17 28:00:00 UTC","description":"Include only objects that are valid on or before plus expire after this time (in UTC) ; Allowed timeframe for values determined by data type"}],"raw":"{{api_url}}/{{version}}/{{endpoint}}?isValidAt=2024-07-17 28:00:00 UTC"},"description":"Uses an impossible time value"}},{"name":"BAD invalid unitSystem","request":{"method":"GET","header":[{"key":"Accept","value":"application/json"}],"url":{"host":["{{api_url}}"],"path":["{{version}}","{{endpoint}}"],"query":[{"key":"limit","value":"5","description":"Maximum number of objects to return (default=1000)","disabled":true},{"key":"offset","value":"","description":"Where to start in paginated response set (default=0, i.e., first object)","disabled":true},{"key":"unitSystem","value":"special","description":"For unit system of output ; Allowed values are \"default\" (default, typically imperial units but not all) or \"metric\""}],"raw":"{{api_url}}/{{version}}/{{endpoint}}?unitSystem=special"},"description":"Uses unrecognized unitSystem value"}},{"name":"BAD invalid valid timeframe","request":{"method":"GET","header":[{"key":"Accept","value":"application/json"}],"url":{"host":["{{api_url}}"],"path":["{{version}}","{{endpoint}}"],"query":[{"key":"limit","value":"5","description":"Maximum number of objects to return (default=1000)","disabled":true},{"key":"offset","value":"","description":"Where to start in paginated response set (default=0, i.e., first object)","disabled":true},{"key":"fromDateTime","value":"{{timestamp_plus_1h}}","description":"Include only objects whose valid timeframe includes this time (in UTC) and later ; I.e., exclude objects that expire before this time ; Allowed timeframe for values determined by data type"},{"key":"untilDateTime","value":"{{timestamp_minus_1h}}","description":"Include only objects whose valid timeframe includes this time (in UTC) and earlier ; I.e., exclude objects that are not valid before this time ; Allowed timeframe for values determined by data type"}],"raw":"{{api_url}}/{{version}}/{{endpoint}}?fromDateTime={{timestamp_plus_1h}}&untilDateTime={{timestamp_minus_1h}}"},"description":"A \"from\" time must be before an \"until\" time"}},{"name":"BAD circle radius exceeds constraint","request":{"method":"GET","header":[{"key":"Accept","value":"application/json"}],"url":{"host":["{{api_url}}"],"path":["{{version}}","{{endpoint}}"],"query":[{"key":"limit","value":"5","description":"Maximum number of objects to return (default=1000)"},{"key":"offset","value":"","description":"Where to start in paginated response set (default=0, i.e., first object)","disabled":true},{"key":"corridor","value":"-100,40,1010","description":"<lon_1>,<lat_1>,...,<lon_n>,<lat_n>,<halfwidth>"}],"raw":"{{api_url}}/{{version}}/{{endpoint}}?limit=5&corridor=-100,40,1010"},"description":"Circle radius is (assumedly) too large"}}],"description":"These requests are expected to fail because of some problem with a parameter.\n\nA tests is applied on each response to confirm failure:\n- To confirm 400 status code for response"},{"name":"Sandbox TAF","event":[{"listen":"prerequest","script":{"type":"text/javascript","exec":[""]}},{"listen":"test","script":{"type":"text/javascript","exec":[""]}}],"item":[{"name":"any TAF","request":{"method":"GET","header":[{"key":"Accept","value":"application/json"}],"url":{"host":["{{api_url}}"],"path":["{{version}}","{{endpoint}}"],"query":[{"key":"limit","value":"15","description":"Maximum number of objects to return (default=1000)"},{"key":"offset","value":"","description":"Where to start in paginated response set (default=0, i.e., first object)","disabled":true},{"key":"bbox","value":"-106,40,-104,42","description":"<min_lon>,<min_lat>,<max_lon>,<max_lat>","disabled":true},{"key":"polygon","value":"-125,49,-125,42,-117,42,107.5,45,-111,49","description":"<lon_1>,<lat_1>,...,<lon_n>,<lat_n>","disabled":true},{"key":"circle","value":"-168,29,61","description":"<lon>,<lat>,<radius>","disabled":true},{"key":"corridor","value":"-116.5,32.2,-120,34.5,60","description":"<lon_1>,<lat_1>,...,<lon_n>,<lat_n>,<halfwidth>","disabled":true},{"key":"srid","value":"3857","description":"SRID of provided input coordinates for spatial filter ; Allowed values are \"4326\" (default, lon/lat) or \"3857\" ; Does not affect output coordinates","disabled":true},{"key":"distanceUnits","value":"m","description":"Units for distance of defined circle radius or corridor halfwidth ; Allowed values are \"nm\" (default), \"sm\", \"km\", or \"m\"","disabled":true},{"key":"isValidAt","value":"{{timestamp_plus_6h}}","description":"Include only objects that are valid on or before plus expire after this time (in UTC) ; Allowed timeframe for values determined by data type","disabled":true},{"key":"fromDateTime","value":"{{timestamp_plus_8h}}","description":"Include only objects whose valid timeframe includes this time (in UTC) and later ; I.e., exclude objects that expire before this time ; Allowed timeframe for values determined by data type","disabled":true},{"key":"untilDateTime","value":"{{timestamp_plus_10h}}","description":"Include only objects whose valid timeframe includes this time (in UTC) and earlier ; I.e., exclude objects that are not valid before this time ; Allowed timeframe for values determined by data type","disabled":true},{"key":"insertedAfter","value":"2025-01-14T23:42:00","description":"Include only objects that were inserted after this time (in UTC) ; Like if want new data and previous acquired all insertedThrough this time ; Allowed timeframe for values determined by data type","disabled":true},{"key":"insertedThrough","value":"2025-01-14T23:43:00","description":"Include only objects that were inserted before or at this time (in UTC) ; Allowed timeframe for values determined by data type","disabled":true},{"key":"stationIds","value":"KLAX,KLGB,KBUR","description":"Include only features whose stationId is one of these ; Comma-delimited list of one or more identifiers each defined by 3-4 letters/numbers","disabled":true},{"key":"flightCodes","value":"2,3,4,0","description":"Include only objects whose flightCode is one of these ; Comma-delimited list of one or more of \"1\", \"2\", \"3\", \"4\", \"0\"","disabled":true},{"key":"flightCategories","value":"LIFR","description":"Include only objects whose flightCategory is one of these ; Comma-delimited list of one or more of \"VFR\", \"MVFR\", \"IFR\", \"LIFR\", \"UNKNOWN\"","disabled":true},{"key":"unitSystem","value":"metric","description":"For unit system of output ; Allowed values are \"default\" (default, typically imperial units but not all) or \"metric\"","disabled":true},{"key":"geometry","value":"0","description":"Include geometry in response (boolean, default=true) ; Make falsy to blank out geometry in response","disabled":true}],"raw":"{{api_url}}/{{version}}/{{endpoint}}?limit=15"},"description":"Can create requests from this basis by changing/setting any parameters."}}],"description":"This is for holding any requests a user may want to create and save.\n\nAt least one generic request with all possible parameters available to use should be provided as a template."}],"description":"#### Properties in feature object of TAF response [GeoJSON](https://en.wikipedia.org/wiki/GeoJSON) (not all fields may have meaningful data):\n\n- `ogcFeatureId`: Opaque reference identifier related to ingest and not part of data.\n- `forecastNumber`: Counter for indicating which index of possible multiple forecasts included in the overarching TAF report this object describes.\n- `layerNumber`: Counter for indicating which layer of the particular forecast of possible multiple layers for that forecast included in the TAF report this object describes.\n- `forecastType`: From original data, string indicating how to interpret timing of forecast for report, like `BECMG`, `TEMPO`, `FM`, or `PROB`.\n- `flightCategory`: Determined from original data, the flight category corresponding to the visibility conditions, like `VFR` or `LIFR`.  Can filter request by possible types.\n- `flightCode`: Numerical value corresponding to flightCategory.  Can filter request by possible types.\n- `cloudHeight`: Numerical value to indicate forecasted cloud height.\n- `ceilingCode`: String to indicate forecasted cloud cover proportion for sky, like `SCT` or `OVC`.  The cloud layer indicated may not strictly be a \"ceiling\", which is only for `BKN`, `OVC`, or `VV` layers.\n- `visibility`: Numerical value to indicate visibility distance.\n- `stationId`: Standard ICAO identifier of location for report.\n- `rawTxt`: The original text content for the report for this particular layer and forecast.\n- `issueDateTime`: When the report for the overarching TAF was issued, in UTC.\n- `validDateTime`: When the particular forecast starts (becomes applicable/valid/active), in UTC.\n- `expirationDateTime`: When the particular forecast ends (becomes inapplicable/invalid/inactive), in UTC.\n- `insertedDateTime`: When the report for the METAR was saved in our database, in UTC.  This value is useful chaining requests to get newly available data since a previous request.\n- `probability`: Numerical value to indicate percentage likelihood of forecasted conditions in this report.\n- `windSpeed`: Numerical value for wind speed at station.\n- `windGust`: Numerical value for wind gust at station.\n- `windDirection`: Numerical value for bearing of wind direction at station.  `VRB` wind direction denoted by `9999` value.\n- `wmoCode`: Provides textual code value corresponding to weather condition of this particular forecast.\n- `vicinity`: Indicates if the weather condition of this report is meant to be considered in the vicinity of the location as opposed to necessarily at that particular station location.\n- `unitSystem`: Indicates unit system for measured values.  Default uses mostly (though not all) imperial values, but metric can be selected.  See unit conversion for units for particular fields in those systems.\n\n#### Field units depending on specified `unitSystem`:\n\n| property | default | metric |\n| -------- | ------- | ------ |\n| visibility | miles | meters |\n| windSpeed | knots | meters per second |\n| windGust | knots | meters per second |\n| cloudHeight | feet | meters |\n\n#### Flight category and code definitions\n\n| category | code | visibility | ceiling |\n| -------- | ---- | ---------- | ------- |\n| VFR (Visual Flight Rules) | 1 | > 5 mi | and > 3000 ft AGL |\n| MVFR (Marginal Visual Flight Rules) | 2 | 3-5 mi | and/or between 1000 and 3000 ft AGL |\n| IFR (Instrument Flight Rules) | 3 | 1-3 mi | and/or between 500 and 1000 ft AGL |\n| LIFR (Low Instrument Flight Rules) | 4 | < 1 mi | and/or < 500 ft AGL |"}]}