True wind from apparent wind calculator
With 18 knots of apparent wind at 45° off the bow, a boat speed of 6 knots and a 90° heading, the true wind is 14.396699 knots from 152.139272° true. Check your instruments or show how boat motion bends the wind. Free in your browser.
- Free
- Runs in your browser
- No sign-up
- Your data stays on your device
Run — free
Worked example
- Apparent wind speed
- 18
- Apparent wind angle deg
- 45
- Boat speed
- 6
- Heading deg
- 90
- True wind speed
- 14.396699
- True wind angle deg
- 62.139272
- True wind angle signed deg
- 62.139272
- True wind from deg
- 152.139272
Sailors and instruments measure apparent wind—the wind you feel on deck—not the true meteorological wind over the water. Apparent wind is the vector sum of true wind and the boat’s own motion, so as soon as the hull moves the numbers on the masthead sensor diverge from the forecast. This true wind from apparent wind calculator undoes that motion: given apparent wind speed, apparent wind angle relative to the bow, boat speed, and heading, it subtracts the vessel velocity vector and returns true wind speed, true wind angle on the boat, and absolute true wind from-direction in degrees true.
Why apparent wind is not true wind on a moving boat
Apparent wind is what a masthead anemometer and wind vane report: the relative airflow over the boat. True wind is the wind relative to the water or ground—the field used in forecasts, routing software, and race documents. Vectorially, the air velocity relative to the boat equals the air velocity relative to the water minus the boat velocity relative to the water.
Rearranged, true wind equals apparent wind minus the vessel motion once both are expressed in the same frame and with a consistent from-versus-to convention. On a beat the boat charges into the breeze, so apparent wind is stronger and more ahead than true wind; on a run the boat adds its speed downwind, so apparent wind is lighter and more aft. Ignoring that difference makes polar tables look wrong, polarises sail-trim decisions, and mis-sets laylines.
This calculator works entirely in the boat frame first: longitudinal residual is apparent wind speed times cosine of the apparent wind angle minus boat speed; lateral residual is apparent wind speed times sine of the angle; true wind speed is the hypotenuse of those two residuals; true wind angle from the bow is the two-argument arctangent of lateral over longitudinal. Adding heading then yields meteorological true wind from-direction clockwise from north.
Who needs true wind from apparent wind
Offshore and coastal racers use a true wind from apparent wind calculator to cross-check instrument processors against a second source when calibration of boat speed or mast twist is suspect. Training skippers and sailing schools show students how a five-knot change in boat speed on a close reach moves true wind angle by several degrees, building intuition that polars and VMG targets refer to true wind, not the number on the mast display.
Weather routers and logging pipelines convert logged AWS, AWA, BSP, and heading into TWS and true-from so archived tracks can be compared with GRIB forecasts without trusting a single proprietary black box. Failed validation—including out-of-range bearings and negative speeds—does not consume balance. Keep requests small, pin the rounded fields in tests, and you get reproducible true wind for race tools, education, and edge workers without standing up a navigation stack of your own.
What you can do with it
Race instrument cross-check
Recompute TWS and true wind from logged AWS, AWA, boat speed, and heading to verify masthead calibration against a second analytic source.
Sailing school demos
Show how boat speed on a beat strengthens and heads the apparent wind so students link polars to true wind, not deck feel alone.
Track log enrichment
Convert NMEA-style apparent wind and heading streams into true wind speed and meteorological from-direction for routing and forecast comparison.
FAQ
What AWA convention does the calculator use?
Zero is dead ahead, 90 is starboard beam, 180 is dead astern, 270 is port beam. Angles outside 0–360 inclusive are rejected as out of range.
What is the difference between apparent and true wind?
Apparent wind is the airflow you feel on deck and the masthead sensor reads; true wind is the wind over the water used in forecasts and routing. The boat’s own motion is what separates the two.
Why is apparent wind stronger when sailing upwind?
Because on a beat the boat drives into the breeze, so its speed adds to the wind you feel and pulls it forward. On a run the boat moves with the wind, so the apparent wind is lighter and further aft.
Which units can I use for wind speed and boat speed?
Knots, metres per second or miles per hour all work, as long as wind speed and boat speed share the same unit. Nothing is converted, so the true wind speed comes back in that unit.
What does the heading change in the result?
Heading turns the true wind angle measured from the bow into a compass direction: where the wind blows from, in degrees true, clockwise from north. Without it you would only know the angle on the boat.
Related tools
For developers — API access
Everything on this page is available programmatically. This section is for teams who want to wire it into their own systems; everyone else can just use the tool above.
API endpoint
Prefer to automate it? One authenticated POST creates the task; the result comes back by webhook or a signed link. The same capability also runs here on the web, by email and from Telegram — and soon from our app too.
Call it from your stack
curl -X POST https://api.kit.forhosting.com/earth/true-wind-from-apparent \
-H "Authorization: Bearer $KIT_KEY" \
-H "Content-Type: application/json" \
-d '{"apparent_wind_speed":18,"apparent_wind_angle_deg":45,"boat_speed":6,"heading_deg":90}'const res = await fetch("https://api.kit.forhosting.com/earth/true-wind-from-apparent", {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.KIT_KEY}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"apparent_wind_speed": 18,
"apparent_wind_angle_deg": 45,
"boat_speed": 6,
"heading_deg": 90
})
});
const { task_id } = await res.json();import os, requests
res = requests.post(
"https://api.kit.forhosting.com/earth/true-wind-from-apparent",
headers={"Authorization": f"Bearer {os.environ['KIT_KEY']}"},
json={
"apparent_wind_speed": 18,
"apparent_wind_angle_deg": 45,
"boat_speed": 6,
"heading_deg": 90
},
)
task_id = res.json()["task_id"]<?php
$res = file_get_contents("https://api.kit.forhosting.com/earth/true-wind-from-apparent", false, stream_context_create([
"http" => [
"method" => "POST",
"header" => "Authorization: Bearer " . getenv("KIT_KEY") . "\r\nContent-Type: application/json",
"content" => '{"apparent_wind_speed":18,"apparent_wind_angle_deg":45,"boat_speed":6,"heading_deg":90}',
],
]));
$task = json_decode($res, true);body := bytes.NewBufferString(`{"apparent_wind_speed":18,"apparent_wind_angle_deg":45,"boat_speed":6,"heading_deg":90}`)
req, _ := http.NewRequest("POST", "https://api.kit.forhosting.com/earth/true-wind-from-apparent", body)
req.Header.Set("Authorization", "Bearer "+os.Getenv("KIT_KEY"))
req.Header.Set("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)Example request
{
"apparent_wind_speed": 18,
"apparent_wind_angle_deg": 45,
"boat_speed": 6,
"heading_deg": 90
}Example response
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "earth.true_wind_from_apparent",
"status": "queued",
"_links": {
"result": "/tasks/tsk_…/result"
}
}The API is asynchronous: the call returns a task_id immediately and the result arrives by webhook. Polling is capped at 1 req/s per task.
Pricing
Published price — no tokens, no invented credits. A failed task is never charged.
Errors
| HTTP | Code | Meaning |
|---|---|---|
401 | unauthorized | Missing or invalid API key. |
402 | insufficient_balance | Your balance doesn't cover the task price. |
404 | unknown_type | That task type doesn't exist. |
429 | rate_limited | Too many requests. Use the webhook instead of polling. |
Technical notes
Invalid bearings outside zero to three hundred sixty degrees fail with invalid_input instead of wrapping silently.
Why apparent wind is not true wind on a moving boat
When true wind speed is effectively zero the direction is undefined and the endpoint reports a clean zero relative angle rather than a noisy atan2 singularity.
Input contract, bearings, units, and response fields
Example: eighteen units of AWS at forty-five degrees AWA, six units of boat speed, and ninety degrees heading yields a reduced true wind speed forward of the apparent angle and a true-from near the north-east sector after heading is applied. POST a JSON body with four required finite numbers. apparent_wind_speed is the measured AWS and must be non-negative; boat_speed is speed through water or ground in the same unit and must also be non-negative. Speeds may be knots, metres per second, or miles per hour—the solver never converts units, so output true_wind_speed is always in the same unit you sent. apparent_wind_angle_deg is the AWA relative to the bow with zero dead ahead, ninety starboard beam, one hundred eighty dead astern, and two hundred seventy port beam; heading_deg is vessel heading in degrees true. Both bearings must lie in the closed interval from zero to three hundred sixty inclusive; values outside that range raise invalid_input with an explicit out-of-range message so instrument pipelines cannot silently accept corrupted NMEA. Each field accepts common aliases such as aws, awa, bsp, and hdg. On success the body echoes the four inputs rounded for stable goldens, then true_wind_speed, true_wind_angle_deg in zero-to-three-sixty boat-relative form, true_wind_angle_signed_deg in the open-closed interval from negative one hundred eighty to positive one hundred eighty for port-versus-starboard displays, true_wind_from_deg and true_wind_to_deg as absolute meteorological directions, unit equal to same_as_input_speeds, and a short formula string.
Technical questions
How do I convert apparent wind to true wind?
Send non-negative apparent_wind_speed and boat_speed in the same unit, apparent_wind_angle_deg and heading_deg in [0, 360]. The API returns true_wind_speed, boat-relative true_wind_angle_deg, and absolute true_wind_from_deg.
Which speed unit should I use?
Any consistent unit (knots, m/s, mph). The solver does not convert units; true_wind_speed is returned in the same unit as the inputs.
What happens if a bearing is out of range?
heading_deg or apparent_wind_angle_deg outside [0, 360] fails with invalid_input and an out-of-range message. Invalid input is not billed.
What does the true wind from apparent wind calculator cost?
The browser tool is free. API requests use prepaid KIT balance at $0.002 per successful call; invalid input is not billed.