The Dark Sky Forecast API v2 Forecast API The Forecast API lets you query for most locations on the globe, and returns: * Current conditions * Minute-by-minute forecasts out to 1 hour (where available) * Hour-by-hour forecasts out to 48 hours * Day-by-day forecasts out to 7 days There are two main API calls. The first <#forecast_call> returns the current forecast (for the next week): |https://api.forecast.io/forecast/APIKEY/LATITUDE,LONGITUDE| The second <#time_call> lets one query for a specific time, past or future (for many places, 60 years in the past to 10 years in the future): |https://api.forecast.io/forecast/APIKEY/LATITUDE,LONGITUDE,TIME| *Note to Dark Sky API users*: The old docs can be found here . Details on migrating to the new API can be found at the bottom of the page <#migration>. Changelog * *3 Dec 2014:* Added Russian to the list of supported languages. * *23 Sep 2014:* Added Portuguese and Bosnian to the list of supported languages. * *14 Aug 2014:* Added Polish and Pig Latin (!?) to the list of supported languages. * *29 Jul 2014:* Added Italian to the list of supported languages. * *11 Jun 2014:* Added Spanish to the list of supported languages. * *29 May 2014:* Added the |lang| option <#options>. * *7 Jan 2014:* Added the |moonPhase| property to data points. * *10 Dec 2013:* Added the MADIS <#data-sources> data source. * *5 Dec 2013:* Added the |nearestStormDistance| and |nearestStormBearing| properties to data points. * *15 Aug 2013:* Added the |apparentTemperature| properties to data points. * *17 Jul 2013:* Added the |description| property to severe weather alerts <#alerts>. * *15 Jul 2013:* Added the RTMA and SREF weather models <#data-sources>, and the |X-Forecast-API-Calls| response header <#response-headers>. * *22 May 2013:* Added the |extend| option. * *6 May 2013:* Added string date format to time machine requests. * *17 Apr 2013:* Added |dewPoint| and |ozone| properties to data points. * *9 Apr 2013:* Added the |ca| and |auto| unit options, and added |precipIntensityMax| and |precipIntensityMaxTime| properties on daily data points. * *1 Apr 2013:* Added the |exclude| option. * *29 Mar 2013:* Deprecated the |si| option, replacing it with the |units| option. When upgrading, be advised that |windSpeed| is now in meters per second, rather than in kilometers per hour. (*Edit 9 Apr 2013:* one can now use |?units=ca| to precisely emulate the functionality of |?si|. Please update any code using the deprecated functionality at your earliest convenience.) * *26 Mar 2013:* Initial version. API Libraries Looking to include Forecast in your app? These wrapper libraries should make it quick and easy to do so: * Official Ruby Wrapper Library by David Czarnecki * Android Client Wrapper Library by Christopher Brown * C++ Wrapper Library by Todd Shore * C# Wrapper Library by Charl Cilliers * Portable C# Wrapper Library by Jerome Cheng * CFML Wrapper Library by Danny Cork * Clojure Wrapper Library by J. D. Hollis * Erlang Wrapper Library by Derek Brown * Go Wrapper Library by Martin-Louis Bright * Java Wrapper Library by David Ervideira * Java Wrapper Library by Kushan Jayatilleke * JavaScript Wrapper Library (with a PHP-based proxy) by Ian Tearle * Node.JS Wrapper Library by Matt Walters * Node.JS Wrapper Library by Chris Jones * Node.JS Wrapper Library by Serhiy Oplakanets * Objective-C Wrapper Library by Rob Phillips * Objective-C Wrapper Library by Carl Jahn * iOS XCode Project Template by Brandon Emrich * Perl Wrapper Library by Martin-Louis Bright * PHP Wrapper Library by Tobias Redmann * PHP Wrapper Library by Guilherm Uhelski * PHP Wrapper Library (supporting multiple, simultaneous calls) by Charlie Gorichanaz * Python Wrapper Library by Ze'ev Gilovitz * R Wrapper Library by Bob Rudis * Unofficial Ruby Wrapper Library by Vicent Gozalbes * Scala Wrapper Library by Garrett Thornburg Additionally, Gerard Davison has provided a JSON Schema of the API, and Alex Handy has provided a CodeEnvy IDE for a Java API wrapper of our API. Finally, please note that all of the above API wrappers (except for the official Ruby wrapper) are unofficial: we cannot provide support for them! If you have any questions about them, please contact the library's author. The Forecast Call |https://api.forecast.io/forecast/APIKEY/LATITUDE,LONGITUDE| |APIKEY| should be your Dark Sky API key. |LATITUDE| and |LONGITUDE| should be the geographic coordinates of a location in decimal degrees. /(Please note that the base domain for this API request is |api.forecast.io|, not |api.darkskyapp.com|.)/ The response will be a JSON-formatted object with the following properties defined: * |latitude|: The requested latitude. * |longitude|: The requested longitude. * |timezone|: The IANA timezone name for the requested location (e.g. |America/New_York|). This is the timezone used for text forecast summaries and for determining the exact start time of daily data points. /(Developers are advised to rely on local system settings rather than this value if at all possible: users may deliberately set an unusual timezone, and furthermore are likely to know what they actually want better than our timezone database does.)/ * |offset|: The current timezone offset in hours from GMT. * |currently|: A /data point/ (see below) containing the current weather conditions at the requested location. * |minutely|: A /data block/ (see below) containing the weather conditions minute-by-minute for the next hour. /(This property’s name should be read as an adjective—analogously to “hourly” or “daily” and meaning “reckoned by the minute”—rather than as an adverb meaning “meticulously.” Yes, we know that this is not proper English. No, we will not change it. Complaints to this effect will be deleted with utmost prejudice.)/ * |hourly|: A /data block/ (see below) containing the weather conditions hour-by-hour for the next two days. * |daily|: A /data block/ (see below) containing the weather conditions day-by-day for the next week. * |alerts|: An array of /alert objects/ (see below), which, if present, contains any severe weather alerts, issued by a governmental weather authority, pertinent to the requested location. * |flags|: An object containing miscellaneous metadata concerning this request. (See /flags object/, below.) In general, to determine the weather at a given point in time, one should examine the highest-precision data block defined (|minutely|, |hourly|, and |daily| respectively), taking any data available from from it and falling back to the next-highest precision data block for any properties that are missing for the point in time desired. Data Points A /data point/ object represents the various weather phenomena occurring at a specific instant of time, and has many varied properties. All of these properties (except |time|) are /optional/, and will only be set if we have that type of information for that location and time. Please note that |minutely| data points are always aligned to the nearest minute boundary, |hourly| points to the top of the hour, and |daily| points to midnight of that day. Data points in the |daily| /data block/ (see below) are special: instead of representing the weather phenomena at a given instant of time, they are an aggregate point representing the weather phenomena that will occur over the entire day. For precipitation fields, this aggregate is a maximum; for other fields, it is an average. Data point objects may contain the following properties: * |time|: The UNIX time (that is, seconds since midnight GMT on 1 Jan 1970) at which this data point occurs. * |summary|: A human-readable text summary of this data point. * |icon|: A machine-readable text summary of this data point, suitable for selecting an icon for display. If defined, this property will have one of the following values: |clear-day|, |clear-night|, |rain|, |snow|, |sleet|, |wind|, |fog|, |cloudy|, |partly-cloudy-day|, or |partly-cloudy-night|. (Developers should ensure that a sensible default is defined, as additional values, such as |hail|, |thunderstorm|, or |tornado|, may be defined in the future.) * |sunriseTime| and |sunsetTime| (only defined on |daily| data points): The UNIX time (that is, seconds since midnight GMT on 1 Jan 1970) of the last sunrise before and first sunset after the solar noon closest to local noon on the given day. (Note: near the poles, these may occur on a different day entirely!) * |moonPhase| (only defined on |daily| data points): A number representing the fractional part of the lunation number of the given day. This can be thought of as the “percentage complete” of the current lunar month: a value of |0| represents a new moon, a value of |0.25| represents a first quarter moon, a value of |0.5| represents a full moon, and a value of |0.75| represents a last quarter moon. (The ranges in between these represent waxing crescent, waxing gibbous, waning gibbous, and waning crescent moons, respectively.) * |nearestStormDistance| (only defined on |currently| data points): A numerical value representing the distance to the nearest storm in miles. (This value is /very approximate/ and should not be used in scenarios requiring accurate results. In particular, a storm distance of zero doesn’t necessarily refer to a storm at the requested location, but rather a storm in the vicinity of that location.) * |nearestStormBearing| (only defined on |currently| data points): A numerical value representing the direction of the nearest storm in degrees, with true north at 0° and progressing clockwise. (If |nearestStormDistance| is zero, then this value will not be defined. The caveats that apply to |nearestStormDistance| also apply to this value.) * |precipIntensity|: A numerical value representing the average expected intensity (in inches of liquid water per hour) of precipitation occurring at the given time /conditional on probability/ (that is, assuming any precipitation occurs at all). A /very/ rough guide is that a value of |0| in./hr. corresponds to no precipitation, |0.002| in./hr. corresponds to very light precipitation, |0.017| in./hr. corresponds to light precipitation, |0.1| in./hr. corresponds to moderate precipitation, and |0.4| in./hr. corresponds to heavy precipitation. * |precipIntensityMax|, and |precipIntensityMaxTime| (only defined on |daily| data points): numerical values representing the maximumum expected intensity of precipitation (and the UNIX time at which it occurs) on the given day in inches of liquid water per hour. * |precipProbability|: A numerical value between 0 and 1 (inclusive) representing the probability of precipitation occuring at the given time. * |precipType|: A string representing the type of precipitation occurring at the given time. If defined, this property will have one of the following values: |rain|, |snow|, |sleet| (which applies to each of freezing rain, ice pellets, and “wintery mix”), or |hail|. (If |precipIntensity| is zero, then this property will not be defined.) * |precipAccumulation| (only defined on |hourly| and |daily| data points): the amount of snowfall accumulation expected to occur on the given day. (If no accumulation is expected, this property will not be defined.) * |temperature| (not defined on |daily| data points): A numerical value representing the temperature at the given time in degrees Fahrenheit. * |temperatureMin|, |temperatureMinTime|, |temperatureMax|, and |temperatureMaxTime| (only defined on |daily| data points): numerical values representing the minimum and maximumum temperatures (and the UNIX times at which they occur) on the given day in degrees Fahrenheit. * |apparentTemperature| (not defined on |daily| data points): A numerical value representing the apparent (or “feels like”) temperature at the given time in degrees Fahrenheit. * |apparentTemperatureMin|, |apparentTemperatureMinTime|, |apparentTemperatureMax|, and |apparentTemperatureMaxTime| (only defined on |daily| data points): numerical values representing the minimum and maximumum apparent temperatures (and the UNIX times at which they occur) on the given day in degrees Fahrenheit. * |dewPoint|: A numerical value representing the dew point at the given time in degrees Fahrenheit. * |windSpeed|: A numerical value representing the wind speed in miles per hour. * |windBearing|: A numerical value representing the direction that the wind is coming /from/ in degrees, with true north at 0° and progressing clockwise. (If |windSpeed| is zero, then this value will not be defined.) * |cloudCover|: A numerical value between 0 and 1 (inclusive) representing the percentage of sky occluded by clouds. A value of |0| corresponds to clear sky, |0.4| to scattered clouds, |0.75| to broken cloud cover, and |1| to completely overcast skies. * |humidity|: A numerical value between 0 and 1 (inclusive) representing the relative humidity. * |pressure|: A numerical value representing the sea-level air pressure in millibars. * |visibility|: A numerical value representing the average visibility in miles, capped at 10 miles. * |ozone|: A numerical value representing the columnar density of total atmospheric ozone at the given time in Dobson units. All of the above numeric, non-time fields may, optionally, have an associated |Error| value defined (with the property |precipIntensityError|, |windSpeedError|, |pressureError|, etc.), representing our system’s confidence in its prediction. Such properties represent standard deviations of the value of their associated property; small error values therefore represent a strong confidence, while large error values represent a weak confidence. These properties are omitted where the confidence is not precisely known (though generally considered to be adequate). Data Blocks A /data block/ object represents the various weather phenomena occurring over a period of time. Such objects contain the following properties: * |summary|: A human-readable text summary of this data block. * |icon|: A machine-readable text summary of this data block (see /data point/, above, for an enumeration of possible values that this property may take on). * |data|: An array of /data point/ objects (see above), ordered by time, which together describe the weather conditions at the requested location over time. Ideally, the |minutely| data block will contain data for the next hour, the |hourly| data block for the next two days, and the |daily| data block for the next week; however, if we are lacking data for a given time period, the data point sequence may contain gaps or terminate early. Furthermore, if no data points for a time period are known, then the data block will be omitted from the response in its entirety. Developers are strongly encouraged, therefore, to check for the presence of data before attempting to read it. Alert Objects An /alert object/ represents a severe weather warning issued for the requested location by a governmental authority (for a list of which authorities we currently support, please see /data sources/, below). Such objects contain the following properties: * |title|: A short text summary of the alert. * |expires|: The UNIX time (that is, seconds since midnight GMT on 1 Jan 1970) at which the alert will cease to be valid. * |description|: A detailed text description of the alert from the appropriate weather service. * |uri|: An HTTP(S) URI that contains detailed information about the alert. Flags Objects The /flags object/ contains various metadata information related to the request. Such objects may optionally contain any of the following properties: * |darksky-unavailable|: The presence of this property indicates that the Dark Sky data source supports the given location, but a temporary error (such as a radar station being down for maintenace) has made the data unavailable. * |darksky-stations|: This property contains an array of IDs for each radar station utilized in servicing this request. * |datapoint-stations|: This property contains an array of IDs for each DataPoint station utilized in servicing this request. * |isd-stations|: This property contains an array of IDs for each ISD station utilized in servicing this request. * |lamp-stations|: This property contains an array of IDs for each LAMP station utilized in servicing this request. * |metar-stations|: This property contains an array of IDs for each METAR station utilized in servicing this request. * |metno-license|: The presence of this property indicates that data from api.met.no was utilized in order to facilitate this request (as per their license agreement). * |sources|: This property contains an array of IDs for each data source utilized in servicing this request. (For more information, see /data sources/, below.) * |units|: The presence of this property indicates which units were used for the data in this request. (For more information, see /options/, below.) Forecast at a Given Time It is also possible to request a forecast for an arbitrary point in time: |https://api.forecast.io/forecast/APIKEY/LATITUDE,LONGITUDE,TIME| |TIME| should either be a UNIX time (that is, seconds since midnight GMT on 1 Jan 1970) or a string formatted as follows: |[YYYY]-[MM]-[DD]T[HH]:[MM]:[SS]| (with an optional time zone formatted as |Z| for GMT time or |{+,-}[HH][MM]| for an offset in hours or minutes). For the latter format, if no timezone is present, local time (at the provided latitude and longitude) is assumed. (This string format is a subset of ISO 8601 time. An as example, |2013-05-06T12:00:00-0400|.) If a time is provided in this way, only the conditions for the day on which that time occurred (or will occur), midnight-to-midnight, are provided; in all other ways, making such a request is equivalent to getting in a time machine, going back or forward in time to the given moment, and making a normal forecast request. (In fact, this is how it is implemented behind-the-scenes.) Generally speaking, forecasted data is more accurate the nearer you query to the present moment. (That is, the present moment if you don’t have a time machine.) Options The API request may optionally be modified through the use of query parameters. It will respond to the following: * |callback=[callback]|: Return the API response as JSONP . /Please use caution when using this,/ since exposing your API key to the public is a security hazard and, if abused, will result in the revokation of your API key. However, if developing a personal- or internal-use app, this is a convenient method of doing so. * |units=[setting]|: Return the API response in units other than the default Imperial units. In particular, the following settings are possible: o |us|: The default, as outlined above. o |si|: Returns results in SI units. In particular, properties now have the following units: + |summary|: Any summaries containing temperature or snow accumulation units will have their values in degrees Celsius or in centimeters (respectively). + |nearestStormDistance|: Kilometers. + |precipIntensity|: Millimeters per hour. + |precipIntensityMax|: Millimeters per hour. + |precipAccumulation|: Centimeters. + |temperature|: Degrees Celsius. + |temperatureMin|: Degrees Celsius. + |temperatureMax|: Degrees Celsius. + |apparentTemperature|: Degrees Celsius. + |dewPoint|: Degrees Celsius. + |windSpeed|: Meters per second. + |pressure|: Hectopascals (which are, conveniently, equivalent to the default millibars). + |visibility|: Kilometers. o |ca|: Identical to |si|, except that |windSpeed| is in kilometers per hour. o |uk|: Identical to |si|, except that |windSpeed| is in miles per hour, as in the US. (This option is provided because adoption of SI in the UK has been inconsistent.) o |auto|: Selects the relevant units automatically, based on geographic location. * |exclude=[blocks]|: Exclude some number of data blocks from the API response. This is useful for reducing latency and saving cache space. |[blocks]| should be a comma-delimeted list (without spaces) of any of the following: |currently|, |minutely|, |hourly|, |daily|, |alerts|, |flags|. (Crafting a request with /all/ of the above blocks excluded is exceedingly silly and not recommended.) * |extend=hourly|: When present on a forecast request, return hourly data for the next seven days, rather than the next two. (This option is ignored on time machine requests. When using this option, we strongly recommend ensuring that your HTTP client supports compression.) * |lang=[language]|: Return text summaries in the desired language. (Please be advised that units in the summary will be set according to the |units| option, above, so be sure to set both options as needed.) |[language]| may be |bs| (Bosnian), |de| (German), |en| (English, which is the default), |es| (Spanish), |fr| (French), |it| (Italian), |nl| (Dutch), |pl| (Polish), |pt| (Portuguese), |ru| (Russian), |tet| (Tetum), or |x-pig-latin| (Igpay Atinlay). (If a different language is desired, please consider contributing to our API translation module on Github.) Response Headers The API will set the following HTTP response headers to values useful to developers: * |Cache-Control| and |Expires|: These headers are set to conservative values for data caching purposes based on the data present in the response body. * |X-Forecast-API-Calls|: The number of API calls made by the given API key for today. * |X-Response-Time|: The server-side response time of the request. Notes * Just about every object property in the response is optional. In fact, a request with no data to return will return a nearly empty object, rather than a failure. Robust code will check for the presence of required parameters before using them, and will fail gracefully if they are not present (or return an error if a minimum functional set of data is not available). * All numeric properties are real numbers, except for UNIX timestamps, which are (signed) integers. * Summaries on the |hourly| data block actually only cover up to a maximum of 24 hours, rather than the full time period in the data block. We found that covering the full 48 hours could be, in a number of circumstances, far too wordy to be practical. * Summaries and icons on |daily| data points actually cover the period from 4AM to 4AM, rather than the stated time period of midnight to midnight. We found that the summaries so generated were less awkward. * The Forecast Data API supports HTTP compression. We heartily recommend using it, as it will make responses much smaller over the wire. To enable it, simply add an |Accept-Encoding: gzip| header to your request. (Most HTTP client libraries wrap this functionality for you, please consult your library’s documentation for details. Be advised that we do not support such compression over HTTP/1.0 connections.) * JSON responses are in UTF-8 format (due to text summaries, which can contain Unicode characters). Please ensure that your JSON parser acts accordingly. Data Sources This API is backed by a wide range of data sources, which are aggregated together statistically to provide the most accurate forecast possible for a given location. Any data sources used to service a given request will be noted in the |flags| section of a forecast response. These sources include: 1. Dark Sky’s own hyperlocal precipitation forecasting system (id |darksky|), backed by radar data from the following systems: * The USA NOAA’s NEXRAD system (USA). * The UK Met Office’s NIMROD system (UK, Ireland). * (More coming soon.) 2. The USA NOAA’s LAMP system (USA, id |lamp|). 3. The UK Met Office’s Datapoint API (UK, id |datapoint|). 4. The Norwegian Meteorological Institute’s meteorological forecast API (global, id |metno|). 5. The USA NOAA’s Global Forecast System (global, id |gfs|). 6. The USA NOAA’s Integrated Surface Database (global, id |isd|). 7. The USA NOAA’s Public Alert system (USA, id |nwspa|). 8. The UK Met Office’s Severe Weather Warning system (UK, id |metwarn|). 9. Environment Canada’s Canadian Meteorological Center ensemble model (global, id |cmc|). 10. The US Navy’s Fleet Numerical Meteorology and Oceanography Ensemble Forecast System (global, id |fnmoc|). 11. The USA NOAA and Environment Canada’s North American Ensemble Forecast System (global, id |naefs|). 12. The USA NOAA’s North American Mesoscale Model (North America, id |nam|). 13. The USA NOAA’s Rapid Refresh Model (North America, id |rap|). 14. The Norwegian Meteorological Institute’s GRIB file forecast for Central Europe (Europe, id |metno_ce|). 15. The Norwegian Meteorological Institute’s GRIB file forecast for Northern Europe (Europe, id |metno_ne|). 16. Worldwide METAR weather reports (global, id |metar|). 17. The USA NOAA/NCEP’s Short-Range Ensemble Forecast (North America, id |sref|). 18. The USA NOAA/NCEP’s Real-Time Mesoscale Analysis model (North America, id |rtma|). 19. The USA NOAA/ESRL’s Meteorological Assimilation Data Ingest System (global, id |madis|). v1-to-v2 Migration Guide The v2 Forecast API is designed to be as close to a pure superset of the v1 Forecast API as possible, allowing for a straightforward upgrade path if you’re currently using the v1 API and wish to upgrade. Below is a mapping of all v1 response properties and how they map to v2 properties. v1 Property v2 Property Notes |timezone| |timezone| and |offset| In v1, |timezone| was a string containing the IANA timezone name, the timezone abbrevation, and the timezone offset in hours. In v2, |timezone| contains the IANA timezone name, while |offset| contains the timezone offset in hours. The timezone abbreviation has no analogue in v2. |currentSummary| |currently.summary| |currentIntensity| |currently.precipIntensity| In v1, |currentIntensity| was in dBZ. In v2, |precipIntensity| is in inches of liquid water per hour. An equation for converting between the two is available from the Wikipedia page for dBZ . |currentTemp| |currently.temperature| |hourSummary| |minutely.summary| |hourPrecipitation| |minutely.data| In v2, |minutely| may be omitted entirely given a lack of data. |hourPrecipitation[x].time| |minutely.data[x].time| |hourPrecipitation[x].probability| |minutely.data[x].precipProbability| |hourPrecipitation[x].intensity| |minutely.data[x].precipIntensity| In v1, |intensity| was in dBZ. In v2, |precipIntensity| is in inches of liquid water per hour. An equation for converting between the two is available from the Wikipedia page for dBZ . |hourPrecipitation[x].error| |minutely.data[x].precipIntensityError| Note the change in |precipIntensity| units outlined above. Additionally, in v2, this value is a one-sigma value rather than a three-sigma value, and if |precipIntensity| is zero, then this property will be omitted entirely. |hourPrecipitation[x].type| |minutely.data[x].precipType| In v2, there is an additional type of precipitation: |hail|. Additionally, in v2, if |precipIntensity| is zero, then this property will be omitted. |daySummary| |hourly.summary| |dayPrecipitation| |hourly.data| In v2, |hourly| may be omitted entirely given a lack of data. |dayPrecipitation[x].time| |hourly.data[x].time| |dayPrecipitation[x].probability| |hourly.data[x].precipProbability| In v2, |precipProbability| will be omitted if |precipIntensity| is zero. It is also very uncommonly provided by our data sources; developers are encouraged to use rely on |precipIntensity| whenever possible. |dayPrecipitation[x].type| |hourly.data[x].precipType| In v2, there is an additional type of precipitation: |hail|. Additionally, in v2, if |precipIntensity| is zero, then this property will be omitted. |dayPrecipitation[x].temp| |hourly.data[x].temperature| |dayPrecipitation[x].cloudCover| |hourly.data[x].cloudCover| |dayPrecipitation[x].relHumidity| |hourly.data[x].humidity| |radarStation| |flags["darksky-stations"]| In v2, this property will be omitted if we do not have radar coverage of the given location. Additionally, v2 makes use of multiple radar sources, so this property contains an array of station IDs, rather than a single ID. Finally, in v1, radar stations were lower case and would have their first letter omitted if they began with a "K". In v2, radar station IDs are always four letters long and upper case. |isPrecipitating| /not present/ In v2, simply check if |currently.precipIntensity| is nonzero. |minutesUntilChange| /not present/ In v2, iterate over |minutely.data| and |hourly.data| in order, finding the first data point for which |currently.precipIntensity !== 0| does not equal |datapoint.precipIntensity !== 0|. Once that data point is found, |minutesUntilChange| may be calculated as follows: |(datapoint.time - currently.time) / 60|. |checkTimeout| /not present/ Use either the |Cache-Control| or |Expires| HTTP response headers. © 2013 The Dark Sky Company, LLC Email Us Terms of Use Privacy Policy