Weather — entry 031 of 31

wttr.in

Verified Jul 2026

wttr.in returns weather reports as ASCII art directly to curl, wget, or a plain browser request, so there's no client UI to build. It's a standalone open-source Go service with plain-text, colorized ANSI, PNG, and JSON output modes, and needs no signup or API key.

wttr.in is a single free-form endpoint that renders weather for a location as ANSI terminal art, a one-line string, a PNG, or JSON — the output format is chosen by query params and by sniffing whether the caller looks like curl or a browser.

cliascii-artopen-sourceterminal
AuthenticationNone requiredCall it straight away — no key, no signup.
HTTPSSupportedTraffic is encrypted in transit.
CORSEnabledCallable directly from browser JavaScript.
PricingFreeNo paid tier — free for the documented use case.
Formatsplain text, ANSI, PNG, JSONResponses can be requested as plain text or ANSI or PNG or JSON.

GreatAPIs Score

Score80out of 100
Authentication25/25No authentication required
Pricing20/20Free to use
Docs0/20No docs or spec available
Formats15/15Supports 4 response formats
Freshness20/20Verified within 6 months

Embed this badge

Scored 80 on greatapis.com
<a href="https://greatapis.com/api/wttr-in/"><img src="https://greatapis.com/badge/wttr-in.svg" alt="Scored 80 on greatapis.com"></a>

Auth quickstart

  1. No API key required — requests are public and keyless.
Stored keyNo key stored

Your key is stored only in this browser (localStorage) and sent directly to the API — never to greatapis.

Structured forecast for a city as JSON

GEThttps://wttr.in/Berlin?format=j1

200 text/plain; charset=utf-8

{
  "current_condition": [
    {
      "FeelsLikeC": "13",
      "FeelsLikeF": "55",
      "cloudcover": "12",
      "humidity": "61",
      "observation_time": "02:07 AM",
      "precipMM": "0.0",
      "pressure": "1004",
      "temp_C": "18",
      "temp_F": "65",
      "uvIndex": "0",
      "visibility": "10",
      "weatherCode": "113",
      "weatherDesc": [{ "value": "Clear " }],
      "winddir16Point": "W",
      "windspeedKmph": "8"
    }
  ],
  "nearest_area": [
    {
      "areaName": [{ "value": "Berlin" }],
      "country": [{ "value": "Germany" }],
      "latitude": "52.517",
      "longitude": "13.400",
      "population": "3426354",
      "region": [{ "value": "Berlin" }]
    }
  ],
  "weather": [
    {
      "date": "2026-07-26",
      "avgtempC": "21",
      "avgtempF": "71",
      "astronomy": [
        {
          "moon_illumination": "88",
          "moon_phase": "Waxing Gibbous",
          "sunrise": "05:17 AM",
          "sunset": "09:08 PM"
        }
      ],
      "hourly": [ "...3-hourly breakdown, each with chanceofrain/chanceofsnow/etc..." ]
    }
  ]
}

Developer reference

Base URLhttps://wttr.in

Gotchas & limits

  • `format=j1` still responds with `content-type: text/plain`, not `application/json`, even though the body is genuine JSON — parse it as JSON regardless of the declared content type
  • Without a `format` query param, the response is chosen by User-Agent sniffing: `curl`/`Wget` get ANSI-colored terminal art (256-color escape codes), a plain browser gets an HTML/PNG page — plan for that if you're calling wttr.in from a non-terminal HTTP client
  • `?format=3` returns a compact one-liner (e.g. `Berlin: ☀️ +65°F`), handy for status bars and scripts that don't want to parse JSON at all
  • Locations aren't limited to city names — airport codes, `~landmark` names, `@domain.com` (geolocates the domain's server), and raw `lat,lon` coordinates are all accepted in the same path segment