# Wind & Snow Load Calculator (ASCE 7-16) (`jumblemog/wind-snow-load-calculator`) Actor

ASCE 7-16 design loads from plain text: wind pressures on walls and roofs and base shear by the directional procedure, roof snow loads with unbalanced loads and drifts at steps and parapets, and LRFD and ASD load combinations.

- **URL**: https://apify.com/jumblemog/wind-snow-load-calculator.md
- **Developed by:** [Jumble Mog](https://apify.com/jumblemog) (community)
- **Categories:** AI, Automation, Developer tools
- **Security:** Limited permissions
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

Pay per event

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

## Wind & Snow Load Calculator (ASCE 7-16)

**ASCE 7-16 design loads from one line of text: wind pressures on a building, roof snow loads with drifts, and the LRFD and ASD load combinations.** Ask `115 mph, exposure C, 30 ft high, 100 x 60 ft, flat roof`, `ground snow 30 psf, upper roof 100 ft, step 6 ft` or `D = 20, L = 50, S = 30, W = 25 psf` and you get back:

- **Wind (main wind force resisting system, directional procedure)**: the velocity pressure qz up the height and qh at the roof, external and net wall and roof pressures with internal pressure both ways, roof zones (0 to h/2, h/2 to h, h to 2h ...) or windward and leeward slopes for gable and hip roofs, and the base shear with the wind on each face, checked against the 16 psf minimum.
- **Snow**: the flat roof load pf, the sloped roof load ps, the minimum load, rain-on-snow, unbalanced loads on gable roofs, and drifts against a roof step or a parapet, with the drift height, width and surcharge.
- **Load combinations**: every ASCE 7-16 strength (LRFD) and allowable stress (ASD) combination with its largest and smallest value, the loads it uses, and which one governs for gravity and for uplift.
- **A chart** and a **Markdown report** with every coefficient, so the numbers can be checked by hand.

It's made for:

- Structural engineers and designers who want a quick check of a wind or snow calculation, or loads for a beam or connection.
- Contractors, architects, solar and sign installers, and metal building and shed sellers who need design pressures before they call an engineer.
- Students learning ASCE 7, and AI agents that need wind and snow loads they can explain.

![A chart made by this Actor for a 100 x 60 x 30 ft flat-roof building at 115 mph exposure C: the windward wall pressure rising from 16.6 psf at 15 ft to 19.2 psf at 30 ft, the leeward wall at -12 psf, and the roof zone pressures down to -26.7 psf](https://api.apify.com/v2/key-value-stores/Km5b4PG3kYHdZSb1E/records/wind-snow-load-calculator-example.png?signature=Q2XZPkEshyR6NgJr0yxD)

### How to use it

1. Write **Buildings, roofs and loads**, one per entry. The form has examples.
2. Optionally set the **Units**: US (mph, ft, psf) by default; m/s, m or kPa in a request switch it to metric.
3. Click **Start**. Each request is a row in the results, with its summary, chart and report.

#### What you can write

| You write | It means |
|---|---|
| `115 mph`, `50 m/s` | Basic wind speed V for the building's risk category (from the ASCE 7-16 maps or the ASCE Hazard Tool) |
| `exposure C` | Exposure B (towns, suburbs), C (open terrain) or D (flat coasts) |
| `30 ft high`, `mean roof height 9 m`, `eave height 20 ft` | Building height |
| `100 x 60 ft` | Plan: length along the ridge x width |
| `flat roof`, `6/12 gable`, `20° hip` | Roof shape and slope |
| `partially enclosed`, `Kzt 1.2`, `elevation 5000 ft` | Enclosure, hill speed-up, ground elevation |
| `ground snow 30 psf`, `pg 1.5 kPa` | Ground snow load pg |
| `terrain B`, `fully exposed`, `sheltered` | Snow exposure (Ce) |
| `unheated`, `cold ventilated`, `freezer`, `greenhouse` | Thermal condition (Ct) |
| `risk category III`, `metal roof`, `40 ft wide` | Importance, slippery surface, width for unbalanced loads |
| `step 6 ft, upper roof 100 ft, lower roof 50 ft` | Drift at a roof step |
| `parapet 3 ft, roof 120 ft long` | Drift at a parapet or rooftop unit |
| `D = 20, L = 50, Lr = 20, S = 30, R = 5, W = 25 psf` | Loads to combine (or dead, live, roof live, snow, rain, wind) |
| `W = 20 / -35`, `wind uplift -40`, `E = 12, SDS 1.0` | Wind both ways, one-way uplift, earthquake with vertical effect |
| `LRFD`, `ASD`, `live factor 0.5` | One method only; the 0.5 live load factor |

The same as an object: `{"speed": "115 mph", "exposure": "C", "height": "30 ft", "length": "100 ft", "width": "60 ft", "roof": "flat"}`, `{"groundSnow": "1.5 kPa", "parapet": "1 m", "lowerLength": "40 m"}` or `{"D": 15, "Lr": 20, "W": [-30], "method": "asd", "unit": "psf"}`.

### Examples

- `115 mph, exposure C, 30 ft high, 100 x 60 ft, flat roof` → qh = 28.3 psf (Kh 0.98); windward wall 16.6 to 19.2 psf, leeward -12.0 psf; net roof suction up to -26.7 psf near the windward edge; base shear 88 kips with the wind on the long side.
- `110 mph, exposure B, mean roof height 25 ft, 80 x 40 ft, 6/12 gable roof` → qh = 17.5 psf; windward slope Cp -0.31 or +0.17, leeward slope -0.6; base shear 33 kips normal to the ridge.
- `ground snow 30 psf, upper roof 100 ft, lower roof 50 ft, step 6 ft` → pf = 21 psf; leeward drift 3.52 ft high and 14.1 ft wide, up to 63 psf extra (84 psf at the step).
- `ground snow 25 psf, 3/12 gable, 50 ft wide, risk category IV, sheltered` → pf = 23.1 psf, the 24 psf minimum governs as a separate case, unbalanced 6.9 psf windward and 23.1 psf leeward plus 13.4 psf over 8.3 ft by the ridge.
- `D = 20, L = 50, S = 30, W = 25 psf` → LRFD max 122 psf (1.2D + 1.6S + L), min -7 psf (0.9D + 1.0W); ASD max 91.25 psf, min -3 psf.

### How-to examples

Each example is a complete input; the results are from runs of the Actor (also listed under **Examples**).

#### How to calculate wind pressures on a building (ASCE 7-16)

```json
{"requests": ["115 mph, exposure C, 30 ft high, 100 x 60 ft, flat roof"]}
```

Result: qh = 28.3 psf (Kh 0.98); windward wall 16.6 to 19.2 psf, leeward -12.0 psf; net roof suction up to -26.7 psf near the windward edge; base shear 88 kips with the wind on the long side.

#### How to calculate roof snow load and a drift at a roof step

```json
{"requests": ["ground snow 30 psf, upper roof 100 ft, lower roof 50 ft, step 6 ft"]}
```

Result: pf = 21 psf; the leeward drift is 3.52 ft high and 14.1 ft wide, adding up to 63 psf (84 psf at the step).

#### How to find the governing LRFD and ASD load combinations

```json
{"requests": ["D = 20, L = 50, S = 30, W = 25 psf"]}
```

Result: LRFD maximum 122 psf (1.2D + 1.6S + L) and minimum -7 psf (0.9D + 1.0W); ASD maximum 91.25 psf and minimum -3 psf.

#### How to let an AI agent work out design loads

Add this Actor to the [Apify MCP server](https://mcp.apify.com) with `https://mcp.apify.com/?tools=jumblemog/wind-snow-load-calculator`. The agent passes the wind speed, snow load or loads in one line and answers with the pressures, drifts or governing combinations, with the ASCE 7-16 factors used.

### FAQ

**Which code does it follow?** ASCE 7-16: chapters 26 and 27 (part 1) for wind, chapter 7 for snow, and sections 2.3 and 2.4 for the combinations.

**Does it cover gable roofs and unbalanced snow?** Yes. `ground snow 25 psf, 3/12 gable, 50 ft wide, risk category IV, sheltered` gives pf 23.1 psf, the 24 psf minimum as a separate case, and the unbalanced loads with the surcharge by the ridge.

**Does it give components and cladding pressures?** No. Wind covers the main wind force resisting system of enclosed, partially enclosed and partially open rigid buildings with flat, gable and hip roofs.

**Where do the wind speed and ground snow load come from?** From the ASCE 7-16 maps, the ASCE Hazard Tool or the local building department. This is a design aid, not a stamped calculation.

### Input

| Field | What it is |
|---|---|
| `requests` | Buildings, roofs and loads, as lines of text or objects (up to 200 per run) |
| `units` | `us` (mph, ft, psf, kips) or `metric` (m/s, m, kPa, kN) for values without a unit |
| `charts` | Draw a chart for each request (default on) |

### Output

One dataset item per request, also saved together in the run's `OUTPUT` record:

```json
{
  "request": 1, "status": "ok", "type": "wind", "title": "Wind on a 100 ft x 60 ft x 30 ft building",
  "summary": "qh = 28.3 psf at the 30 ft mean roof height (115 mph, exposure C, Kh 0.98); external windward wall 16.6 to 19.2 psf, leeward -12.0 psf; net roof suction up to -26.7 psf (enclosed, GCpi ±0.18); base shear 88 kips with wind on the long side.",
  "wind": {"speed": 115, "exposure": "C", "enclosure": "enclosed", "roof": "flat", "meanRoofHeight": 30, "kh": 0.982,
           "kzt": 1, "kd": 0.85, "ke": 1, "g": 0.85, "gcpi": 0.18, "qh": 28.27, "maxBaseShear": 88.01, "maxRoofSuction": -26.71},
  "directions": [{"direction": "Wind on the long side", "alongWind": 60, "faceWidth": 100, "leewardCp": -0.5, "baseShear": 88.01, "...": "..."}],
  "walls": [{"surface": "windward wall", "height": 15, "kz": 0.849, "qz": 24.43, "cp": 0.8, "external": 16.61,
             "netPositiveGCpi": 11.52, "netNegativeGCpi": 21.7}, "..."],
  "roofZones": [{"zone": "0 to h/2 (15 ft) from the windward edge", "case": "case 1", "cp": -0.9,
                 "netPositiveGCpi": -26.71, "netNegativeGCpi": -16.54}, "..."],
  "units": {"length": "ft", "speed": "mph", "pressure": "psf", "force": "kips"},
  "imageUrl": "https://api.apify.com/v2/key-value-stores/.../records/001-Wind-on-a-100-ft-x-60-ft-x-30-ft-building.png"
}
```

Snow items have `snow` (pg, Ce, Ct, Is, Cs, flatRoofLoad, slopedRoofLoad, minimumLoad, rainOnSnowLoad, designUniformLoad, snowDensity), `unbalanced`, `drift` and `profile`; combination items have `loads`, `governing` and `combinations` (each with max, min and the loads used). Every item also has `warnings`, `notes` (the method and every assumption), a Markdown `report` and links to the chart and report. A request that can't be computed has `"status": "failed"` and the reason in `error`, and isn't billed.

### How it works

1. **Wind** (ASCE 7-16 chapters 26 and 27 part 1): qz = 0.00256 Kz Kzt Kd Ke V² psf with Kz from Table 26.10-1, Kd = 0.85 and G = 0.85 (rigid); p = q G Cp - qh (GCpi) with Cp from Figure 27.3-1 (interpolated in L/B, h/L and roof slope) and GCpi from Table 26.13-1. Gable and hip roofs of 10° or more get windward and leeward slope coefficients for wind normal to the ridge and the flat-roof zones for wind along it.
2. **Snow** (chapter 7): pf = 0.7 Ce Ct Is pg; ps = Cs pf with Figure 7.4-1; the minimum load for roofs under 15°; 5 psf rain-on-snow where pg ≤ 20 psf on flat roofs; unbalanced gable loads for slopes from 1/2 on 12 to 7 on 12; drifts hd = 0.43 lu^(1/3) (pg + 10)^(1/4) - 1.5 ft (leeward, and 0.75 hd windward) limited by the clear height above the balanced snow.
3. **Combinations** (2.3 and 2.4): every combination is tried with each transient load present or absent, one of Lr, S or R, and wind and earthquake each way, so both the gravity maximum and the uplift minimum come out.

### Pricing

You pay one low price per request, at the price shown on this page. The chart and report are included. Requests that can't be computed are never charged. If you set a maximum cost per run, the Actor stops before a request that wouldn't fit.

### Speed

A request takes a few milliseconds. A run through the API answers in about 10 seconds, including the cloud container starting.

### Tips and limits

- **This is a design aid, not a stamped calculation.** The wind speed and ground snow load must come from the ASCE 7-16 maps (or the ASCE Hazard Tool) or the local building department for the building's risk category; many mountain areas need a site-specific snow study.
- **Wind** covers the main wind force resisting system of enclosed, partially enclosed and partially open rigid buildings with flat, gable and hip roofs. Components and cladding (chapter 30), open buildings, monoslope roofs of 10° or more, and flexible buildings aren't covered.
- **Snow** doesn't cover sliding snow onto a lower roof, curved roofs or ponding.
- **Combinations** take W and E as the strength-level ASCE 7-16 loads; enter loads with a consistent sign (gravity positive).
- **Limits**: 200 requests per run.

### For AI agents and developers

This Actor works with the [Apify MCP server](https://mcp.apify.com), so AI agents can call it as a tool. Pass `requests` as plain text and read `summary`, `wind`, `snow`, `drift`, `governing` and `warnings`. A direct API call that waits for the answer:

```bash
curl -X POST "https://api.apify.com/v2/acts/jumblemog~wind-snow-load-calculator/run-sync-get-dataset-items?token=YOUR_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"requests": ["130 mph, exposure D, 40 ft high, 120 x 80 ft, 4/12 gable roof"]}'
```

`run-sync` instead returns the run's `OUTPUT`: the status, the counts and every result as JSON.

In Python, with the `apify-client` package:

```python
from apify_client import ApifyClient

client = ApifyClient("YOUR_TOKEN")
run = client.actor("jumblemog/wind-snow-load-calculator").call(run_input={
    "requests": [{"groundSnow": "40 psf", "step": "8 ft", "upperLength": "150 ft", "lowerLength": "60 ft"}],
})
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item["summary"])
```

### Credits

- Method: ASCE/SEI 7-16, *Minimum Design Loads and Associated Criteria for Buildings and Other Structures* (chapters 2, 7, 26 and 27). This Actor is not affiliated with ASCE.
- Charts: [Vega-Lite](https://vega.github.io/vega-lite/) and [vl-convert](https://github.com/vega/vl-convert) (BSD-3-Clause), with the [Inter](https://rsms.me/inter/) font (SIL Open Font License).

# Actor input Schema

## `requests` (type: `array`):

One request per entry, as a line of text or an object. Wind: the basic wind speed for the risk category ('115 mph' or '50 m/s'), exposure B, C or D, the mean roof height ('30 ft high'; or 'eave height 20 ft'), the plan ('100 x 60 ft': length along the ridge x width), the roof ('flat', '6/12 gable', '20° hip'), optionally 'partially enclosed', 'Kzt 1.2' and 'elevation 5000 ft'. Snow: the ground snow load ('ground snow 30 psf' or 'pg 1.5 kPa'), optionally terrain B, C or D, 'fully exposed' / 'partially exposed' / 'sheltered', 'unheated' / 'cold ventilated' / 'freezer' / 'greenhouse', 'risk category III', the slope ('4/12', '20°'), 'metal roof' (slippery), the width (for unbalanced loads), and for drifts 'step 6 ft, upper roof 100 ft, lower roof 50 ft' or 'parapet 3 ft, roof 120 ft long'. Combinations: 'D = 20, L = 50, Lr = 20, S = 30, R = 5, W = 25 psf' (or dead, live, roof live, snow, rain, wind, seismic; 'W = 20 / -35' for two directions; 'E = 12, SDS 1.0'), optionally 'LRFD' or 'ASD' and 'live factor 0.5'. Object fields: type (wind, snow or combos), speed, exposure, height, eaveHeight, length, width, slope, roof, enclosure, kzt, elevation, groundSnow, terrain, roofExposure, thermal, risk, slippery, eaveToRidge, step, parapet, upperLength, lowerLength, D, L, Lr, S, R, W, E, Ev, sds, method, liveFactor, unit, units, title, text.

## `units` (type: `string`):

For values without a unit. mph, ft or psf switch a request to US units; m/s, m or kPa to metric.

## `charts` (type: `boolean`):

Wall pressures by height and roof zone pressures, roof snow loads or the drift profile, or each load combination's range.

## Actor input object example

```json
{
  "requests": [
    "wind 115 mph, exposure C, 30 ft high, 100 x 60 ft, flat roof",
    "wind 110 mph, exposure B, mean roof height 25 ft, 80 x 40 ft, 6/12 gable roof",
    "ground snow 30 psf, exposure B, partially exposed, heated, 6/12 gable roof, 40 ft wide",
    "snow drift: ground snow 30 psf, upper roof 100 ft, lower roof 50 ft, step 6 ft",
    "D = 20, L = 50, S = 30, W = 25 psf",
    {
      "type": "snow",
      "groundSnow": "1.5 kPa",
      "terrain": "C",
      "roof": "flat",
      "parapet": "1 m",
      "lowerLength": "40 m"
    }
  ],
  "units": "us",
  "charts": true
}
```

# Actor output Schema

## `results` (type: `string`):

One row per request: the summary and chart.

## `output` (type: `string`):

The OUTPUT record: every result in one JSON object.

## `files` (type: `string`):

Charts (PNG and SVG) and Markdown reports in the run's key-value store.

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "requests": [
        "wind 115 mph, exposure C, 30 ft high, 100 x 60 ft, flat roof",
        "wind 110 mph, exposure B, mean roof height 25 ft, 80 x 40 ft, 6/12 gable roof",
        "ground snow 30 psf, exposure B, partially exposed, heated, 6/12 gable roof, 40 ft wide",
        "snow drift: ground snow 30 psf, upper roof 100 ft, lower roof 50 ft, step 6 ft",
        "D = 20, L = 50, S = 30, W = 25 psf",
        {
            "type": "snow",
            "groundSnow": "1.5 kPa",
            "terrain": "C",
            "roof": "flat",
            "parapet": "1 m",
            "lowerLength": "40 m"
        }
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("jumblemog/wind-snow-load-calculator").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = { "requests": [
        "wind 115 mph, exposure C, 30 ft high, 100 x 60 ft, flat roof",
        "wind 110 mph, exposure B, mean roof height 25 ft, 80 x 40 ft, 6/12 gable roof",
        "ground snow 30 psf, exposure B, partially exposed, heated, 6/12 gable roof, 40 ft wide",
        "snow drift: ground snow 30 psf, upper roof 100 ft, lower roof 50 ft, step 6 ft",
        "D = 20, L = 50, S = 30, W = 25 psf",
        {
            "type": "snow",
            "groundSnow": "1.5 kPa",
            "terrain": "C",
            "roof": "flat",
            "parapet": "1 m",
            "lowerLength": "40 m",
        },
    ] }

# Run the Actor and wait for it to finish
run = client.actor("jumblemog/wind-snow-load-calculator").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "requests": [
    "wind 115 mph, exposure C, 30 ft high, 100 x 60 ft, flat roof",
    "wind 110 mph, exposure B, mean roof height 25 ft, 80 x 40 ft, 6/12 gable roof",
    "ground snow 30 psf, exposure B, partially exposed, heated, 6/12 gable roof, 40 ft wide",
    "snow drift: ground snow 30 psf, upper roof 100 ft, lower roof 50 ft, step 6 ft",
    "D = 20, L = 50, S = 30, W = 25 psf",
    {
      "type": "snow",
      "groundSnow": "1.5 kPa",
      "terrain": "C",
      "roof": "flat",
      "parapet": "1 m",
      "lowerLength": "40 m"
    }
  ]
}' |
apify call jumblemog/wind-snow-load-calculator --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,jumblemog/wind-snow-load-calculator"
        }
    }
}
```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/U3yeNgEmT57j459xV/builds/Jp0YzDo4RvGg95gXd/openapi.json
