Global GFS · 0.25° · updated every 6 hours

The weather of the whole planet,
one request away.

WeatherLabs turns the world's operational forecast into a fast JSON API. Any latitude and longitude, every variable, 209 forecast steps — no GRIB, no Zarr, no pipeline to run.

Scroll
0.25° global resolution
209 forecast steps · 16 days
15+ variables & levels
1 tile read per point query
every 6h fresh cycle

A forecast to answer your business queries, in the shape your code already speaks.

Ask for a point, a region, a journey, or a whole global field. You get back clean JSON (or a binary grid) — units labelled, valid-times attached, ready to plot or pipe into your business logic.

curl
Python
JavaScript

    
    
    
Detected from your locale — not your capital?
Full response — nothing truncated loading…

  

Point

One coordinate in, the full 16-day series out — multiple variables per call.

GET/v1/{model}/{cycle}/forecast?lat=…&lon=…&vars=t2m,tp

Journey

Every waypoint of a route in one call, legs fetched concurrently — same endpoint, POSTed.

POST/v1/{model}/{cycle}/forecast {"points":[…], "vars":"gust"}

Region

A country or continent aggregated at any step — true polygon boundaries, same endpoint.

GET/v1/{model}/{cycle}/forecast?region=uk&vars=gust&agg=max&steps=24

Bounding box

Any rectangle you can draw on a map — min/mean/max at the step you pick.

GET/v1/{model}/{cycle}/forecast?lat_s=49&lat_n=59&lon_w=-8&lon_e=2&vars=t2m&steps=24

Global grid

The whole planet for one step — JSON, or float32 binary for the GPU.

GET/v1/{model}/{cycle}/grid?var=t2m&step=8&format=bin

Honest metadata

Every response carries units, valid-times, and exactly what it read and billed.

units · valid_times · tiles_read · bytes_read · X-Billed-Bytes

Every field the model publishes, one var= away.

Click a variable to see what it is and how to ask for it — then open it on the live globe. Surface fields are 2-D; pressure-level fields take a level= in hPa.

See the forecast, not just the numbers.

The interactive explorer renders a live global field on the GPU as a single texture — scrub through 16 days of forecast, switch peril, click for a point series, plot a route, or drag a box. Every interaction shows the exact API call it made, ready to copy.

Launch the explorer →

One forecast endpoint. A few helpers.

Everything is a view of the same forecast: one endpoint answers "what's the weather going to be?", and a small set of helpers reshape or describe it.

GET
/v1/{model}/{cycle}/forecast

The forecast series at any latitude/longitude — every variable, up to 209 steps, nearest-cell or bilinear, time-selectable with steps= (lead hours), time= or start/end. Pin {cycle} to an immutable run id, or use latest.

vars — comma-separated variables (required, up to 8)
lat, lon — a point · region / bbox — an aggregate
granularity — hourly | daily
level — hPa, pressure vars
interp — nearest | bilinear
steps / time / start+end — time selection
Shapes of the same endpoint
GET
…/forecast?granularity=daily

Daily min/max/mean and physically-correct precip totals, derived server-side.

POST
…/forecast {"points":[…]}

A journey: one series per waypoint, fetched concurrently with shared-tile coalescing.

GET
…/forecast?region= | bbox

Aggregate a named polygon region or bounding box — one step per request, cold-fast.

GET
…/grid

The other endpoint: a full lat/lon field for one step — JSON or binary fast-path.

Discovery helpers
GET
/v1/models

Every published model, its grid and latest cycle.

GET
/v1/models/{m}/cycles

Every retained cycle — pin one for immutable URLs.

GET
…/cycle · …/vars · …/regions

Cycle metadata, the live variable list, and named regions.

GET
/v1/limits

Your tier, live quota and entitlements — costs almost nothing.

Full reference, parameters and examples in the documentation — or run them live in the playground.

Time-major tiles. Read exactly what you ask for.

The serving store is laid out so a point's entire forecast lives in one compressed tile: a point query is a single object read — typically tens of milliseconds cold, sub-millisecond warm server-side. Don't take our word for it: measure it from your own browser, right here.

new cycle every 6 hours queryable ~4 h after model init edge-cached via CloudFront beta — no SLA yet, status page coming

One point, one variable

GET …/forecast?lat&lon&vars=t2m — full 209-step series
1 tile read · one ~200 KB object, decoded once
press “Measure from my browser”

One point, every variable

GET …/forecast?vars=t2m,u10,v10,… — the full surface state of one place
~1,500 values · tiles fetched concurrently
press “Measure from my browser”

Binary grid — Europe

GET …/grid?var=t2m&region=…&format=bin — float32, straight to a typed array
1 GET · zero parsing, zero copies on decode
press “Measure from my browser”
Times include your network round-trip — that's the honest number your users would see.

“Stateless and cacheable” — what that actually buys you

  • No sessions, no cookies, no state. Every request stands alone, so any GET is retry-safe: time out, fire again, nothing breaks. Load balancers and serverless callers need zero affinity.
  • Pinned cycles never change. /v1/gfs/2026060512/… is immutable — cache it in your CDN, your browser, or a plain dict forever; the bytes will always match.
  • Reproducible pipelines. The same pinned URL returns the same answer next month, so backtests, audits and "what did the forecast say at the time?" questions have a stable source of truth.
  • Cheaper at scale. Fan 10,000 requests over one cycle and the CDN absorbs the repeats — you pay quota for what's decoded at the origin, and identical URLs collapse to cache hits.

Weather intelligence for every industry the atmosphere touches.

Hover a tile to see the kind of question it answers — and the exact call that answers it. Click to open that query on the live globe.

Pay for the data you decode.

Simple, metered plans: billing is by the volume of decoded forecast data your requests return, and quotas are per account. No per-seat fees, no overage surprises — when you hit your allowance, requests pause until reset or you upgrade.

Beta Beta — no SLA yet. WeatherLabs is in early access: prices and quotas may change, and there is no uptime guarantee yet. Paid plans are launching soon — create a free account now and we'll get you onboarded. VAT is handled at checkout by Paddle (our merchant of record) once billing is live.
Free
£0
10 MB decoded / day
Point & daily forecasts to learn the API.
  • Point + daily endpoints
  • Basic perils — temp, precip, wind
  • 00z cycle · 120 h horizon (5 days)
  • 1 request / second
  • Community support
Create account
Developer
£3/mo
50 MB decoded / day
Prototype with grids and regions — first month on us.
  • + grid & region endpoints
  • Every variable · every cycle
  • 1.0° resolution · 120 h
  • 5 requests / second
  • Community support
Start free month
Starter
£250/mo
5 GB decoded / mo
For production apps and dashboards.
  • All endpoints · all variables
  • 0.25° native · 384 h (16 days)
  • 20 requests / second
  • Email support
Choose Starter
Growth
£750/mo
50 GB decoded / mo
High-volume, native-resolution access.
  • All endpoints · all variables
  • 0.25° native · 384 h (16 days)
  • 50 requests / second
  • Priority email support
Choose Growth
Scale
£1,500/mo
Unlimited (fair use)
Everything, plus a meteorologist on call.
  • Unlimited data · all endpoints
  • 0.25° native · 384 h
  • 100 requests / second
  • Bespoke perils & consultancy — ask your meteorologist
  • Dedicated onboarding & priority support
Contact sales

Anyone can try the Explorer and Playground free — no key needed (they use a shared, embedded demo key). You only need an account key to call the API from your own code.

How billing works — honest cost per request
RequestDecodedOf a 500 MB plan
Point / daily query≤ 32 KiB~0.006%
Region seriessmall~0.006%
Global grid step · 1.0°254.5 KiB~0.05%
Global grid step · 0.5°~1 MB~0.2%
Global grid step · 0.25° native4.15 MB~0.8%

Billing counts the values a response decodes (values × 4 bytes), with a 32 KiB floor per request. Quotas use SI units (1 GB = 10⁹ bytes) and are shared across your whole account. Every response carries X-Billed-Bytes and live quota headers, so there are no surprises. Full breakdown in the pricing & billing docs.

Full pricing details & billing docs →

Weather moves every market. We make it one request away.

A valuable forecast is often the most important data an industry consumes — it prices power, routes ships, schedules harvests, and settles insurance. Yet using it still means wrestling GRIB files, regridding pipelines and petabyte archives. WeatherLabs exists to delete that work. We ingest the operational global forecast every six hours, regrid and consolidate it into a time-major tiled store, and serve it through a stateless Rust API — the hard parts happen once, on our side, so they never happen on yours.

Today

NOAA GFS, end to end

The full operational GFS run — every variable, every level we publish, 16 days ahead at native 0.25° — refreshed every six hours and served from memory-speed tiles.

Next

Multiple models, one API

The same paths, more {model}s: additional physical models and the best AI forecast systems, side by side — compare them, pin them, blend them.

Research

NWP + AI, physics first

We're building toward world-leading research on next-generation forecasting — machine learning grounded in atmospheric physics, verified in the open on our public rankings.

Always

Ultra-fast, constantly tuned

Speed is a feature of the data, not a tier. We profile and optimise the serving path relentlessly — tile layout, caches, binary formats — so the fastest query is the default one.

Do I need an API key to try it?
No — the Explorer and Playground work without signing up, using a shared demo key. You only need your own (free) key to call the API from your code.
Where does the data come from?
From NOAA's operational Global Forecast System (GFS), which is public domain. What you pay for is the processing and delivery: decoding, regridding, consolidation, and a fast, reliable API on top. WeatherLabs is not affiliated with NOAA/NWS.
How fresh is the forecast?
A new model cycle is initialised every 6 hours (00/06/12/18 UTC). NOAA publishes the full run roughly 3.5–4 hours after init; we ingest and publish it shortly after. The hero badge above shows the exact cycle being served right now.
Can I cache responses?
Please do. Responses scoped to a pinned cycle (/v1/gfs/2026060512/…) are immutable and carry year-long Cache-Control headers; latest URLs revalidate every ~30 s.
Is this suitable for safety-of-life decisions?
No. The data is automatically processed model output provided “as is” — it may be wrong, late or missing, and must not be the sole basis for decisions involving risk to life or property (aviation, marine navigation, emergency management). See our Terms.