Visual Crossing Weather API
visualcrossing · Location
Weather Forecast and Historical Weather Data via RESTful API.
Authentication
Sample Requests
Provides access to weather forecast information. The forecast is available for up to 15 days at the hourly, 12 hour and daily summary level.
Hover any highlighted part to learn what it does
curl -X GET "https://api.apis.guru/v2/specs/visualcrossing.com/weather/4.6/VisualCrossingWebServices/rest/services/weatherdata/forecast?key=YOUR_API_KEY&locations=example&unitGroup=example&allowAsynch=true&contentType=example&aggregateHours=example&sendAsDatasource=true&shortColumnNames=true"
import requests
params = {
"key": "YOUR_API_KEY",
"locations": "example",
"unitGroup": "example",
"allowAsynch": "true",
"contentType": "example",
"aggregateHours": "example",
"sendAsDatasource": "true",
"shortColumnNames": "true"
}
response = requests.get(
"https://api.apis.guru/v2/specs/visualcrossing.com/weather/4.6/VisualCrossingWebServices/rest/services/weatherdata/forecast",
params=params,
)
print(response.json())const url = new URL('https://api.apis.guru/v2/specs/visualcrossing.com/weather/4.6/VisualCrossingWebServices/rest/services/weatherdata/forecast');
url.searchParams.set('key', 'YOUR_API_KEY');
url.searchParams.set('locations', 'example');
url.searchParams.set('unitGroup', 'example');
url.searchParams.set('allowAsynch', 'true');
url.searchParams.set('contentType', 'example');
url.searchParams.set('aggregateHours', 'example');
url.searchParams.set('sendAsDatasource', 'true');
url.searchParams.set('shortColumnNames', 'true');
const response = await fetch(url);
const data = await response.json();
console.log(data);package main
import (
"fmt"
"io"
"net/http"
"net/url"
)
func main() {
baseURL, _ := url.Parse("https://api.apis.guru/v2/specs/visualcrossing.com/weather/4.6/VisualCrossingWebServices/rest/services/weatherdata/forecast")
q := baseURL.Query()
q.Set("key", "YOUR_API_KEY")
q.Set("locations", "example")
q.Set("unitGroup", "example")
q.Set("allowAsynch", "true")
q.Set("contentType", "example")
q.Set("aggregateHours", "example")
q.Set("sendAsDatasource", "true")
q.Set("shortColumnNames", "true")
baseURL.RawQuery = q.Encode()
targetURL := baseURL.String()
req, _ := http.NewRequest("GET", targetURL, nil)
client := &http.Client{}
resp, _ := client.Do(req)
defer resp.Body.Close()
body, _ := io.ReadAll(resp.Body)
fmt.Println(string(body))
}require "net/http"
require "json"
uri = URI("https://api.apis.guru/v2/specs/visualcrossing.com/weather/4.6/VisualCrossingWebServices/rest/services/weatherdata/forecast")
uri.query = URI.encode_www_form({
"key" => "YOUR_API_KEY",
"locations" => "example",
"unitGroup" => "example",
"allowAsynch" => "true",
"contentType" => "example",
"aggregateHours" => "example",
"sendAsDatasource" => "true",
"shortColumnNames" => "true"
})
http = Net::HTTP.new(uri.host, uri.port)
http.use_ssl = uri.scheme == "https"
req = Net::HTTP::Get.new(uri)
res = http.request(req)
puts JSON.parse(res.body)<?php
$url = "https://api.apis.guru/v2/specs/visualcrossing.com/weather/4.6/VisualCrossingWebServices/rest/services/weatherdata/forecast?" . http_build_query([
"key" => "YOUR_API_KEY",
"locations" => "example",
"unitGroup" => "example",
"allowAsynch" => "true",
"contentType" => "example",
"aggregateHours" => "example",
"sendAsDatasource" => "true",
"shortColumnNames" => "true"
]);
$opts = ["http" => [
"method" => "GET",
]];
$ctx = stream_context_create($opts);
$res = file_get_contents($url, false, $ctx);
print_r(json_decode($res, true));The weather history data is suitable for retrieving hourly or daily historical weather records.
Hover any highlighted part to learn what it does
curl -X GET "https://api.apis.guru/v2/specs/visualcrossing.com/weather/4.6/VisualCrossingWebServices/rest/services/weatherdata/history?key=YOUR_API_KEY&locations=example&unitGroup=example&allowAsynch=true&contentType=example&endDateTime=example&maxDistance=example&maxStations=example&startDateTime=example&aggregateHours=example&includeNormals=true&shortColumnNames=true&collectStationContributions=true"
import requests
params = {
"key": "YOUR_API_KEY",
"locations": "example",
"unitGroup": "example",
"allowAsynch": "true",
"contentType": "example",
"endDateTime": "example",
"maxDistance": "example",
"maxStations": "example",
"startDateTime": "example",
"aggregateHours": "example",
"includeNormals": "true",
"shortColumnNames": "true",
"collectStationContributions": "true"
}
response = requests.get(
"https://api.apis.guru/v2/specs/visualcrossing.com/weather/4.6/VisualCrossingWebServices/rest/services/weatherdata/history",
params=params,
)
print(response.json())const url = new URL('https://api.apis.guru/v2/specs/visualcrossing.com/weather/4.6/VisualCrossingWebServices/rest/services/weatherdata/history');
url.searchParams.set('key', 'YOUR_API_KEY');
url.searchParams.set('locations', 'example');
url.searchParams.set('unitGroup', 'example');
url.searchParams.set('allowAsynch', 'true');
url.searchParams.set('contentType', 'example');
url.searchParams.set('endDateTime', 'example');
url.searchParams.set('maxDistance', 'example');
url.searchParams.set('maxStations', 'example');
url.searchParams.set('startDateTime', 'example');
url.searchParams.set('aggregateHours', 'example');
url.searchParams.set('includeNormals', 'true');
url.searchParams.set('shortColumnNames', 'true');
url.searchParams.set('collectStationContributions', 'true');
const response = await fetch(url);
const data = await response.json();
console.log(data);package main
import (
"fmt"
"io"
"net/http"
"net/url"
)
func main() {
baseURL, _ := url.Parse("https://api.apis.guru/v2/specs/visualcrossing.com/weather/4.6/VisualCrossingWebServices/rest/services/weatherdata/history")
q := baseURL.Query()
q.Set("key", "YOUR_API_KEY")
q.Set("locations", "example")
q.Set("unitGroup", "example")
q.Set("allowAsynch", "true")
q.Set("contentType", "example")
q.Set("endDateTime", "example")
q.Set("maxDistance", "example")
q.Set("maxStations", "example")
q.Set("startDateTime", "example")
q.Set("aggregateHours", "example")
q.Set("includeNormals", "true")
q.Set("shortColumnNames", "true")
q.Set("collectStationContributions", "true")
baseURL.RawQuery = q.Encode()
targetURL := baseURL.String()
req, _ := http.NewRequest("GET", targetURL, nil)
client := &http.Client{}
resp, _ := client.Do(req)
defer resp.Body.Close()
body, _ := io.ReadAll(resp.Body)
fmt.Println(string(body))
}require "net/http"
require "json"
uri = URI("https://api.apis.guru/v2/specs/visualcrossing.com/weather/4.6/VisualCrossingWebServices/rest/services/weatherdata/history")
uri.query = URI.encode_www_form({
"key" => "YOUR_API_KEY",
"locations" => "example",
"unitGroup" => "example",
"allowAsynch" => "true",
"contentType" => "example",
"endDateTime" => "example",
"maxDistance" => "example",
"maxStations" => "example",
"startDateTime" => "example",
"aggregateHours" => "example",
"includeNormals" => "true",
"shortColumnNames" => "true",
"collectStationContributions" => "true"
})
http = Net::HTTP.new(uri.host, uri.port)
http.use_ssl = uri.scheme == "https"
req = Net::HTTP::Get.new(uri)
res = http.request(req)
puts JSON.parse(res.body)<?php
$url = "https://api.apis.guru/v2/specs/visualcrossing.com/weather/4.6/VisualCrossingWebServices/rest/services/weatherdata/history?" . http_build_query([
"key" => "YOUR_API_KEY",
"locations" => "example",
"unitGroup" => "example",
"allowAsynch" => "true",
"contentType" => "example",
"endDateTime" => "example",
"maxDistance" => "example",
"maxStations" => "example",
"startDateTime" => "example",
"aggregateHours" => "example",
"includeNormals" => "true",
"shortColumnNames" => "true",
"collectStationContributions" => "true"
]);
$opts = ["http" => [
"method" => "GET",
]];
$ctx = stream_context_create($opts);
$res = file_get_contents($url, false, $ctx);
print_r(json_decode($res, true));Seamless access to daily and hourly historical and forecast weather data plus weather alerts, events and current conditions.
Hover any highlighted part to learn what it does
curl -X GET "https://api.apis.guru/v2/specs/visualcrossing.com/weather/4.6/VisualCrossingWebServices/rest/services/timeline/{location}?key=YOUR_API_KEY&lang=en&include=example&unitGroup=example&contentType=example"import requests
params = {
"key": "YOUR_API_KEY",
"lang": "en",
"include": "example",
"unitGroup": "example",
"contentType": "example"
}
response = requests.get(
"https://api.apis.guru/v2/specs/visualcrossing.com/weather/4.6/VisualCrossingWebServices/rest/services/timeline/{location}",
params=params,
)
print(response.json())const url = new URL('https://api.apis.guru/v2/specs/visualcrossing.com/weather/4.6/VisualCrossingWebServices/rest/services/timeline/{location}');
url.searchParams.set('key', 'YOUR_API_KEY');
url.searchParams.set('lang', 'en');
url.searchParams.set('include', 'example');
url.searchParams.set('unitGroup', 'example');
url.searchParams.set('contentType', 'example');
const response = await fetch(url);
const data = await response.json();
console.log(data);package main
import (
"fmt"
"io"
"net/http"
"net/url"
)
func main() {
baseURL, _ := url.Parse("https://api.apis.guru/v2/specs/visualcrossing.com/weather/4.6/VisualCrossingWebServices/rest/services/timeline/{location}")
q := baseURL.Query()
q.Set("key", "YOUR_API_KEY")
q.Set("lang", "en")
q.Set("include", "example")
q.Set("unitGroup", "example")
q.Set("contentType", "example")
baseURL.RawQuery = q.Encode()
targetURL := baseURL.String()
req, _ := http.NewRequest("GET", targetURL, nil)
client := &http.Client{}
resp, _ := client.Do(req)
defer resp.Body.Close()
body, _ := io.ReadAll(resp.Body)
fmt.Println(string(body))
}require "net/http"
require "json"
uri = URI("https://api.apis.guru/v2/specs/visualcrossing.com/weather/4.6/VisualCrossingWebServices/rest/services/timeline/{location}")
uri.query = URI.encode_www_form({
"key" => "YOUR_API_KEY",
"lang" => "en",
"include" => "example",
"unitGroup" => "example",
"contentType" => "example"
})
http = Net::HTTP.new(uri.host, uri.port)
http.use_ssl = uri.scheme == "https"
req = Net::HTTP::Get.new(uri)
res = http.request(req)
puts JSON.parse(res.body)<?php
$url = "https://api.apis.guru/v2/specs/visualcrossing.com/weather/4.6/VisualCrossingWebServices/rest/services/timeline/{location}?" . http_build_query([
"key" => "YOUR_API_KEY",
"lang" => "en",
"include" => "example",
"unitGroup" => "example",
"contentType" => "example"
]);
$opts = ["http" => [
"method" => "GET",
]];
$ctx = stream_context_create($opts);
$res = file_get_contents($url, false, $ctx);
print_r(json_decode($res, true));Postman Setup Guide
- See official documentation for authentication and setup.
What can you build with Visual Crossing Weather API?
Visual Crossing Weather API is a Location API. Developers commonly use location APIs for:
- tracking assets and vehicles in real time
- building delivery and logistics apps
- finding nearby businesses or services
- geo-fencing and location-based notifications
- address validation and autocomplete
No authentication required. This API is open — no signup or key needed. Ideal for quick prototypes and public-facing features. Visual Crossing Weather API is free to use, making it a low-risk choice to experiment with.
New to APIs? Read our beginner's guide