GuzzLabs

EPWForge API

Programmatic access to EPW file generation, future climate morphing, design day data, station catalog, and per-model ensembles.

Prefer AI-agent integration? See the MCP server → for Claude / Cursor / any MCP-aware client.

Quick Start

Most endpoints require a Bearer token in the Authorization header. API keys are free on any tier — generate one from your account page. Generation endpoints charge credits per call (1 for single EPW/DDY, 10 for ensemble); free signup includes 5 welcome credits. All endpoints are idempotent GET requests.

curl -X GET "https://api.guzzlabs.com/epwforge?lat=40.7&lon=-74.0" \ -H "Authorization: Bearer sk_live_your_key_here"
Base URL

https://api.guzzlabs.com

All endpoints are relative to this base URL. Two public read endpoints (/stations and /guzzstations/{path}) work without auth.

Machine-readable spec available for Postman, SDK generation, and agent/tool integrations: https://api.guzzlabs.com/openapi.yaml (OpenAPI 3.1).

Endpoints at a glance

Five endpoints — three generate, two are public read paths. They share the same parameter set wherever it makes sense (lat/lon, ssp/year/percentile, uhi, events, etc.).

  • /epwforge — single EPW file with any combination of options (1 credit)
  • /design-day — derived ASHRAE design conditions (DDY) using the same options (1 credit)
  • /ensemble-epw — per-model CMIP6 ensemble (~20 EPWs in one call) (10 credits)
  • /stations — search the 17,000-station GuzzStations catalog (no auth, free)
  • /guzzstations/{path}.epw — fetch a published EPW or DDY by path (no auth, free)

Authentication & Credits

API keys are free on any tier (including Free). The constraint isn't access — it's credits, which generation endpoints consume per call.

Authorization: Bearer sk_live_abc123def456...
PlanMonthly creditsRate limit$/credit
Free0 (+ 5 lifetime welcome)2 / min
Starter — $49/mo105 / min$4.90
Pro — $149/mo5010 / min$2.98
Pro+ — $249/mo10030 / min$2.49

Credit cost per call: 1 for single EPW / DDY (unmodified TMY is free), 10 for ensemble. Every response includes X-RateLimit-Limit, X-RateLimit-Remaining, and (on 429) Retry-After. Pricing →

Endpoints

GET /epwforge

The primary endpoint for all weather file downloads. Returns a ready-to-use EPW file with any combination of options: TMYx or AMY basis, future climate morphing (SSP scenarios), UHI adjustment, and extreme weather event injection. All parameters are optional except lat and lon.

Parameter dependencies: year requires ssp; percentile applies only when ssp is provided; amy_year applies only when basis=amy. When multiple events are provided, they are applied sequentially to the running EPW result.

Most requests return within 1–2 seconds depending on parameters and location.

ParameterTypeDefaultDescription
latnumberLatitude (-90 to 90), required
lonnumberLongitude (-180 to 180), required
basisstringtmy"tmy" or "amy"
amy_yearintegercurrentYear for AMY basis
tmy_periodstring2011-2025Synthesized TMYx vintage when basis=tmy. One of: full (1950-2025), 2011-2025 (default — recent 15yr, captures post-2010 warming), 2009-2023, 2007-2021 (matches OneBuilding TMYx 2007-2021 standard for direct comparison), 2004-2018.
sspstringssp126, ssp245, ssp370 (ssp585 deprecated per CMIP7 — use ssp370)
yearinteger2030, 2050, 2070, 2090 (with ssp)
percentileinteger505, 10, 25, 50, 75, 90, 95
uhistringnonesuburban, urban, dense_urban
eventsstringheatwave, coldsnap, hothumid, coldwindy (comma-separated)
include_ddybooleanfalseInclude DDY in JSON response
formatstringepw"epw" → binary file download; "json" → metadata + base64-encoded EPW content
# TMYx — any location on Earth curl -H "Authorization: Bearer sk_live_..." \ "https://api.guzzlabs.com/epwforge?lat=40.7&lon=-74.0" # AMY 2023 with urban heat island curl -H "Authorization: Bearer sk_live_..." \ "https://api.guzzlabs.com/epwforge?lat=40.7&lon=-74.0&basis=amy&amy_year=2023&uhi=urban" # SSP2-4.5 morphed to 2050 with heat wave injection curl -H "Authorization: Bearer sk_live_..." \ "https://api.guzzlabs.com/epwforge?lat=25.8&lon=-80.2&ssp=ssp245&year=2050&events=heatwave"

GET /design-day

Generate ASHRAE design day (DDY) files for EnergyPlus. Accepts the same morphing, UHI, and event options as /epwforge. Without SSP parameters, returns baseline design conditions.

curl -H "Authorization: Bearer sk_live_..." \ "https://api.guzzlabs.com/design-day?lat=25.8&lon=-80.2&ssp=ssp245&year=2050&uhi=urban"

GET /ensemble-epw 10 credits

Generate a per-model CMIP6 ensemble — one morphed EPW per climate model (up to ~20 files). Each file uses that model's physically consistent delta set, enabling true inter-model uncertainty analysis. Returns JSON with base64-encoded EPW files.

Ensemble responses can be 10–15 MB and take 30–60 seconds. Bump your client timeout to ≥ 90s.

curl -H "Authorization: Bearer sk_live_..." \ "https://api.guzzlabs.com/ensemble-epw?lat=40.7&lon=-74.0&ssp=ssp245&year=2050"

GET /stations no auth · free

Search the 17,000-station GuzzStations catalog (our self-hosted mirror of the OneBuilding TMYx library). No API key required.

Query params: q (city/state search), lat+lon (proximity sort), country (ISO 3-letter filter), limit (default 50, max 500). Each station returns an epw_url ready to fetch.

curl "https://api.guzzlabs.com/stations?q=boston&limit=5" curl "https://api.guzzlabs.com/stations?lat=40.7&lon=-74.0&limit=10"

GET /guzzstations/{path}.epw no auth · free

Fetch a published EPW or DDY file from the GuzzStations library by relative path. Theepw_url returned by /stations points here. Light IP rate limit (60/min); 24-hour CDN cache.

# EPW curl "https://api.guzzlabs.com/guzzstations/WMO_Region_4_North_and_Central_America/USA_United_States_of_America/MA_Massachusetts/USA_MA_Boston-Logan.Intl.AP.725090_TMYx.2011-2025.epw" \ -o boston_tmyx.epw # Matching DDY (same path, .ddy extension) curl "https://api.guzzlabs.com/guzzstations/WMO_Region_4_North_and_Central_America/USA_United_States_of_America/MA_Massachusetts/USA_MA_Boston-Logan.Intl.AP.725090_TMYx.2011-2025.ddy" \ -o boston_tmyx.ddy

Response Formats

By default, weather endpoints return the EPW file directly as a binary download (Content-Type: application/octet-stream, Content-Disposition: attachment) — ready to drop into EnergyPlus, IES, eQUEST (via a third-party BIN converter), or any building energy simulation tool.

Pass format=json to receive JSON with metadata and base64-encoded EPW content (Content-Type: application/json), useful when your workflow needs to inspect parameters before saving.

{ "filename": "40.7N_-74.0E_TMYx_ssp245_2050_P50_urban.epw", "lat": 40.7, "lon": -74.0, "basis": "tmy", "ssp": "ssp245", "year": 2050, "percentile": 50, "uhi": "urban", "epw_base64": "TE9DQVRJT04sTmV3IFlvcmsuLi4=" }

Error Codes

All errors return JSON with a single error field describing what went wrong:

{ "error": "Invalid parameter: lat must be between -90 and 90" }
CodeMeaning
400Invalid or missing parameters
401Missing or invalid API key
402Insufficient credits — buy more at /pricing or wait for next monthly refresh
429Rate limit exceeded — check Retry-After
500Server error — try again or contact support

Code Examples

Python

import requests API_KEY = "sk_live_your_key_here" BASE = "https://api.guzzlabs.com" # Future-climate EPW with UHI and heat wave resp = requests.get(f"{BASE}/epwforge", params={ "lat": 40.7, "lon": -74.0, "ssp": "ssp245", "year": 2050, "uhi": "urban", "events": "heatwave" }, headers={"Authorization": f"Bearer {API_KEY}"}) with open("NYC_ssp245_2050_urban_heatwave.epw", "wb") as f: f.write(resp.content)

JavaScript / Node.js

const API_KEY = "sk_live_your_key_here"; const BASE = "https://api.guzzlabs.com"; const resp = await fetch( `${BASE}/epwforge?lat=40.7&lon=-74.0&ssp=ssp245&year=2050&uhi=urban`, { headers: { "Authorization": `Bearer ${API_KEY}` } } ); const epwBuffer = await resp.arrayBuffer(); // Save with fs.writeFileSync, or use directly in your workflow.
← Back to GuzzLabs