Aircraft weight and balance calculator
Empty weight, front seats, fuel and baggage add up to 2,130 lb and a moment of 186,200, which puts the CG inside an 82 to 95.5 envelope and under a 2,550 lb gross limit. Enter each station's weight and arm to check your load. Free in your browser.
- Free
- Runs in your browser
- No sign-up
- Your data stays on your device
Run — free
Worked example
- Max gross weight
- 2,550
- Cg forward limit
- 82
- Cg aft limit
- 95.5
- Station count
- 4
- Total weight
- 2,130
- Total moment
- 186,200
- Cg
- 87.41784038
Every takeoff starts with a weight and balance check: empty aircraft, crew, passengers, fuel, and baggage each sit at a known arm from the datum, and the resulting center of gravity must stay inside the certified envelope. This aircraft weight and balance calculator accepts a list of stations with weight and arm, multiplies each pair into a moment, sums weight and moment, and returns CG as total moment divided by total weight. Optional maximum gross weight and forward/aft CG limits report whether the loading is legal on paper before you walk out to the ramp.
How weight, arm, moment, and CG fit together
Weight and balance for light aircraft is a longitudinal lever problem. The manufacturer publishes a datum (often the firewall, leading edge, or a virtual station ahead of the nose) and a table of arms: the empty-aircraft CG arm, front and rear seat stations, fuel tanks, and baggage compartments. For each station you record the actual weight in consistent mass units (pounds or kilograms) and the arm in consistent length units (inches or millimetres).
Moment for that station is simply weight times arm. Add every station weight to get total weight; add every moment to get total moment. The loaded center of gravity is total moment divided by total weight, expressed in the same units as the arms.
That CG is then compared to the forward and aft limits on the type certificate data sheet or pilot operating handbook for the chosen weight. If total weight exceeds maximum gross weight, or CG sits forward of the forward limit or aft of the aft limit, the loading is outside the approved envelope and must be adjusted—move baggage, burn or offload fuel, change seating, or leave weight behind.
Arms may be negative when a station lies forward of the datum; weights must be non-negative, and the sum of weights must be greater than zero so CG is defined.
What you can do with it
Flight school and ground-school drills
Let students enter empty weight, seats, fuel, and baggage for a sample type and verify total weight, moment, and CG against hand-calculated worksheets.
Preflight load-sheet automation
Dispatch and flight-planning apps sum station moments and flag loads that exceed gross weight or sit outside the CG envelope before pushback.
Owner what-if loading scenarios
Experiment with passenger swaps, baggage moves, and fuel levels using a fixed station table and a deterministic CG result for logbook notes.
FAQ
How is aircraft center of gravity calculated from stations?
For each station, moment = weight × arm. Total weight is the sum of weights; total moment is the sum of moments. CG = total moment ÷ total weight, in the same units as the arms.
What units should I use for weight and arm?
Any consistent pair—pounds and inches, or kilograms and millimetres—is fine. The calculator does not convert units; it multiplies and divides what you send. Keep the aircraft POH units for limit comparison.
What should I do if the CG falls outside the limits?
The loading is outside the approved envelope and has to change before flight. Move baggage, burn or offload fuel, change who sits where or leave weight behind, then run the numbers again.
Can an arm be a negative number?
Yes. A station that sits forward of the datum has a negative arm, and its moment is negative too. Weights, however, cannot be negative, and the total weight must be above zero.
Where do I find the arms and CG limits for my aircraft?
The manufacturer publishes the datum and the arm of each seat, tank and baggage area, and the CG limits appear in the pilot operating handbook or type certificate data sheet. This check does not replace your aircraft's own loading graph.
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/travel/weight-and-balance \
-H "Authorization: Bearer $KIT_KEY" \
-H "Content-Type: application/json" \
-d '{"stations":[{"name":"Empty weight","weight":1500,"arm":85},{"name":"Front seats","weight":340,"arm":85},{"name":"Fuel","weight":240,"arm":95},{"name":"Baggage","weight":50,"arm":140}]}'const res = await fetch("https://api.kit.forhosting.com/travel/weight-and-balance", {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.KIT_KEY}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"stations": [
{
"name": "Empty weight",
"weight": 1500,
"arm": 85
},
{
"name": "Front seats",
"weight": 340,
"arm": 85
},
{
"name": "Fuel",
"weight": 240,
"arm": 95
},
{
"name": "Baggage",
"weight": 50,
"arm": 140
}
]
})
});
const { task_id } = await res.json();import os, requests
res = requests.post(
"https://api.kit.forhosting.com/travel/weight-and-balance",
headers={"Authorization": f"Bearer {os.environ['KIT_KEY']}"},
json={
"stations": [
{
"name": "Empty weight",
"weight": 1500,
"arm": 85
},
{
"name": "Front seats",
"weight": 340,
"arm": 85
},
{
"name": "Fuel",
"weight": 240,
"arm": 95
},
{
"name": "Baggage",
"weight": 50,
"arm": 140
}
]
},
)
task_id = res.json()["task_id"]<?php
$res = file_get_contents("https://api.kit.forhosting.com/travel/weight-and-balance", false, stream_context_create([
"http" => [
"method" => "POST",
"header" => "Authorization: Bearer " . getenv("KIT_KEY") . "\r\nContent-Type: application/json",
"content" => '{"stations":[{"name":"Empty weight","weight":1500,"arm":85},{"name":"Front seats","weight":340,"arm":85},{"name":"Fuel","weight":240,"arm":95},{"name":"Baggage","weight":50,"arm":140}]}',
],
]));
$task = json_decode($res, true);body := bytes.NewBufferString(`{"stations":[{"name":"Empty weight","weight":1500,"arm":85},{"name":"Front seats","weight":340,"arm":85},{"name":"Fuel","weight":240,"arm":95},{"name":"Baggage","weight":50,"arm":140}]}`)
req, _ := http.NewRequest("POST", "https://api.kit.forhosting.com/travel/weight-and-balance", body)
req.Header.Set("Authorization", "Bearer "+os.Getenv("KIT_KEY"))
req.Header.Set("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)Example request
{
"stations": [
{
"name": "Empty weight",
"weight": 1500,
"arm": 85
},
{
"name": "Front seats",
"weight": 340,
"arm": 85
},
{
"name": "Fuel",
"weight": 240,
"arm": 95
},
{
"name": "Baggage",
"weight": 50,
"arm": 140
}
]
}Example response
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "travel.weight_and_balance",
"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
Failed validation is not billed; successful calls use the published $0.002 base price with no model tokens and no outbound network.
How weight, arm, moment, and CG fit together
This endpoint performs the arithmetic and optional limit checks; it does not replace a type-specific W&B graph or your aircraft's equipment list.
Input contract, response fields, and error behaviour
You may send at most fifty stations. POST a JSON body with stations, a non-empty array of objects each carrying weight (finite number ≥ 0) and arm (finite number). Optional name labels the row; if omitted, the API assigns Station 1, Station 2, and so on. Aliases list, items, and loads are accepted for the same array. Optional max_gross_weight (also mgw, max_weight, gross_weight_limit) sets the certified takeoff or ramp weight ceiling in the same units as station weights. Optional cg_forward_limit and cg_aft_limit (with short aliases) define the CG envelope in arm units; supply both together or neither. On success the body includes station_count, a stations array with index, name, weight, arm, and moment for each row, total_weight, total_moment, cg, a short formula string, and a human summary. When limits are provided the response also includes the echoed limits, within_gross_weight and/or within_cg_limits booleans, and an overall within_limits flag that is true only when every supplied check passes. Missing stations, empty arrays, non-finite numbers, negative weights, zero total weight, a lone CG limit without its pair, or an aft limit not greater than the forward limit fail with invalid_input naming the problem—those failures are not billed.
Where an aircraft weight and balance API earns its keep
Flight schools and ground-school platforms use an aircraft weight and balance calculator so students can plug in sample loads for a trainer type and see whether CG moves aft with baggage or forward with a heavy front passenger. Flight-planning apps and dispatch tools call the same pure function from edge workers without shipping a spreadsheet: they already know station arms from the equipment list and only need moment sums and a within-limits flag before printing a load sheet. Owners of experimental and light-sport aircraft often maintain a personal station table in JSON and want a deterministic oracle for what-if scenarios—swap two occupants, add a ballistic parachute, or change fuel burn assumptions—without opening a desktop workbook.
Technical questions
Can I check maximum gross weight and CG limits?
Yes. Pass optional max_gross_weight and both cg_forward_limit and cg_aft_limit. The response includes within_gross_weight, within_cg_limits, and overall within_limits when those fields are set.
Why was my request rejected with invalid_input?
Common causes: missing or empty stations, non-finite weight or arm, negative weight, total weight zero, only one of the two CG limits, or aft limit not greater than forward limit. Fix the named field and retry; invalid input is not billed.
What does the aircraft weight and balance calculator cost?
The browser tool is free. API requests use prepaid KIT balance at $0.002 per successful call; invalid input is not billed.