Python Weather API Example
This beginner-friendly example shows how to request weather data from an API, read the JSON response, and print a few useful values.
The goal here is to build a simple real-world Python example. You do not need to fully understand HTTP yet. You only need to see the basic pattern:
- Send a request
- Get data back
- Read the JSON
- Print the values you want
Quick example
import requests
url = "https://api.open-meteo.com/v1/forecast"
params = {
"latitude": 40.7128,
"longitude": -74.0060,
"current_weather": True
}
response = requests.get(url, params=params)
data = response.json()
print(data["current_weather"]["temperature"])
print(data["current_weather"]["windspeed"])
This uses the free Open-Meteo API and the requests package.
It keeps the example small:
- Make a GET request
- Parse JSON
- Print values
What this example does
This example:
- Makes a GET request to a weather API
- Sends location data as query parameters
- Gets JSON data back from the API
- Reads a few fields from the response
- Prints the current weather values
What you need before running it
Before you run the code, make sure you have:
- Python installed
- The
requestspackage installed with pip - An internet connection
- Basic understanding of dictionaries and function calls
If you are new to API requests, see how to make an API request in Python.
Install requests
The requests package is not built into Python, so you need to install it first.
Run:
pip install requests
If that does not work, try:
python -m pip install requests
You can also check that it is installed with:
python -c "import requests; print(requests.__version__)"
How the code works step by step
Here is the same example again:
import requests
url = "https://api.open-meteo.com/v1/forecast"
params = {
"latitude": 40.7128,
"longitude": -74.0060,
"current_weather": True
}
response = requests.get(url, params=params)
data = response.json()
print(data["current_weather"]["temperature"])
print(data["current_weather"]["windspeed"])
1. Import requests
import requests
This gives you access to the requests package so you can send HTTP requests.
2. Set the API URL
url = "https://api.open-meteo.com/v1/forecast"
This is the API endpoint you are calling.
3. Create a params dictionary
params = {
"latitude": 40.7128,
"longitude": -74.0060,
"current_weather": True
}
This dictionary holds the query parameters sent with the request.
In this example:
latitudeandlongitudechoose the locationcurrent_weatherasks for current weather data
4. Call requests.get() with the URL and params
response = requests.get(url, params=params)
This sends a GET request to the API.
If you print response.url, you can see the full URL with the parameters added to it.
5. Convert the response to Python data
data = response.json()
The API sends JSON text back.response.json() converts that JSON into normal Python data, usually dictionaries and lists.
If you want a deeper explanation, read how to parse JSON in Python or Python JSON module overview.
6. Access nested dictionary values
print(data["current_weather"]["temperature"])
print(data["current_weather"]["windspeed"])
The response contains a top-level dictionary.
Inside it, current_weather is another dictionary.
Inside that dictionary, temperature and windspeed are keys.
7. Print the result
The program prints the values returned by the API.
Your output will vary depending on the real weather, but it may look something like this:
22.4
13.1
Understanding the JSON response
The API returns JSON text. After you call response.json(), you get Python data you can work with.
A simplified response might look like this:
{
"latitude": 40.71,
"longitude": -74.01,
"current_weather": {
"temperature": 22.4,
"windspeed": 13.1,
"winddirection": 240,
"weathercode": 3
}
}
Important parts:
- The whole response is a dictionary
current_weatheris a dictionary inside the responsetemperatureandwindspeedare keys insidecurrent_weather
So this line:
data["current_weather"]["temperature"]
means:
- get the value for
"current_weather" - then get the value for
"temperature"inside it
If you want more practice reading API data, see how to handle API responses in Python.
Simple improvements to the example
Here is a slightly better version that prints labels, rounds values, and checks the status code first:
import requests
city_name = "New York"
url = "https://api.open-meteo.com/v1/forecast"
params = {
"latitude": 40.7128,
"longitude": -74.0060,
"current_weather": True
}
response = requests.get(url, params=params)
if response.status_code == 200:
data = response.json()
current_weather = data.get("current_weather", {})
temperature = current_weather.get("temperature")
windspeed = current_weather.get("windspeed")
if temperature is not None and windspeed is not None:
print(f"Weather for {city_name}")
print(f"Temperature: {round(temperature, 1)}°C")
print(f"Wind Speed: {round(windspeed, 1)} km/h")
else:
print("Weather data is missing expected values.")
else:
print("Request failed.")
print("Status code:", response.status_code)
This version improves the original example by:
- Storing the city name separately for display
- Printing clear labels
- Rounding values before printing
- Checking the status code before using the response
- Handling missing keys more safely with
.get()
Common problems when this example fails
Some common causes are:
requestsis not installed- There is no internet connection
- You used the wrong key name when reading the JSON
- You switched to an API that requires an API key
- You assumed every weather API uses the same JSON structure
You may also run into these specific errors:
ModuleNotFoundErrorbecauserequestsis not installedKeyErrorbecause the expected JSON key is missingTypeErrorfrom treating a list like a dictionary- Connection-related request failure due to network issues
- An authentication error when using an API that needs a key
If you see a missing-key problem, read KeyError in Python: causes and fixes.
If Python cannot import requests, see ModuleNotFoundError: no module named X fix.
Beginner debugging steps
If the example does not work, try these steps.
Print the status code
print(response.status_code)
This tells you whether the request succeeded.
Print the raw response text
print(response.text)
This helps you inspect the exact data returned by the API.
Print the top-level keys
print(data.keys())
This shows which keys exist at the top level of the response.
Print the current_weather section
print(data["current_weather"])
Only do this if that key exists.
Compare your key names with the real response
A very common beginner mistake is using a key name that does not exactly match the API response.
For example, this will fail if the key is not present:
print(data["weather"]["temp"])
Always compare your code with the actual JSON returned by the API.
Useful install and check commands:
pip install requests
python -m pip install requests
python -c "import requests; print(requests.__version__)"
FAQ
Do I need an API key for this example?
No. The Open-Meteo version shown here does not require an API key.
Some other weather APIs do require one.
Why use requests.get() instead of opening a URL manually?
requests.get() is easier for beginners.
It makes it simple to:
- send query parameters
- read the response
- work with JSON data
What type of data does response.json() return?
Usually Python dictionaries and lists, depending on the JSON structure.
Why does my code raise KeyError?
The key name in your code may not match the real API response.
Print the response and inspect the keys before trying to read nested values.