Find an API

Search public APIs with auth details & Postman guides

← All APIs

Visual Crossing Weather API

visualcrossing · Location

Location No Auth Free & Open location

Weather Forecast and Historical Weather Data via RESTful API.

Authentication

No authentication requiredFree to use with no key needed.

Sample Requests

GET Weather Forecast API

Provides access to weather forecast information. The forecast is available for up to 15 days at the hourly, 12 hour and daily summary level.

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

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));
GET Retrieves hourly or daily historical weather records.

The weather history data is suitable for retrieving hourly or daily historical weather records.

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

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));
GET Historical and Forecast Weather API

Seamless access to daily and hourly historical and forecast weather data plus weather alerts, events and current conditions.

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

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

Get Postman ↗
  1. 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

Open documentation ↗