Mass & Balance
Role names and
user_group_idvalues are listed in User groups.
Aircraft Mass & Balance profiles and per-flight loadsheets. All endpoints are JSON and company-scoped: the aircraft or flight must belong to the authenticated user's company_id, otherwise 404.
The server always recalculates a loadsheet itself; results sent by a client are never trusted.
Units and conventions
A profile uses one unit system:
mass_unit(kg|lb) andarm_unit(m|mm|cm|in). Values are never converted.Fuel is given as a volume in the station's
fuel_unit(l|usgal|impgal) and converted to mass withfuel_density(profile mass unit per volume unit).Envelope limits are
[mass, arm]points. The limit is linear between points and constant below the first / above the last point.
Access control
aircraft (GET)
Any company user. ACL grants for groups 180, 240, 245, 250
aircraft_save, aircraft_delete
Any manager of the aircraft (Aircraft.ManagerIds) or user_group_id in 1, 100, 105, 110, 150, 300 (Company Administrators, Operations Managers, Compliance & Safety Managers, Chief Pilots and Mechanics) → otherwise 403
loadsheet (GET)
Same rule as GET /flights/view: user_group_id 171–249 (Captains, Pilots, Student Pilots and Cabin Crew) only when creator, PIC, SIC, supervisor or a manager of the aircraft → otherwise 403
loadsheet_save, loadsheet_delete
Creator, PIC, SIC, supervisor, a manager of the aircraft, or user_group_id in 1, 100, 105, 110, 145, 150, 170 (Company Administrators, Operations Managers, Compliance & Safety Managers, Flight Dispatchers, Chief Pilots and Flight Instructors). Never on CANCELED / DELETED flights → 403
loadsheet_sign
PIC or supervisor (creator when the flight has no PIC). Requires the user's password
Groups 240 (Cabin Crew), 245 (Specialist) and 250 (Auditor) have ACL access to the two read endpoints only.
Get aircraft profile
GET /mass_balance/aircraft/{aircraftId}.json
profile is null when the aircraft has none.
Save aircraft profile
POST /mass_balance/aircraft_save/{aircraftId}.json
Form-encoded. Creates or fully replaces the profile.
profile
string (JSON)
Required. mass_unit, arm_unit, basic_empty_mass, basic_empty_arm, max_takeoff_mass, optional max_landing_mass, max_zero_fuel_mass, max_ramp_mass, stations[], envelope, optional landing_envelope
weighed_on
string
YYYY-MM-DD or empty
weighing_reference
string
Max 100 characters
notes
string
template_key
string
Informational
Station fields: key ([A-Za-z0-9_-], unique), name, type (seat | baggage | fuel | other), arm, max_mass; fuel stations also fuel_unit, fuel_density (required, > 0), fuel_capacity. Maximum 40 stations and 20 points per envelope limit.
Validation failure returns result: false with field errors:
Codes: REQUIRED, REQUIRED_POSITIVE, POSITIVE, NOT_BELOW_MAX_TAKEOFF, TOO_MANY, DUPLICATE, INVALID (for an envelope: a forward limit at or behind the aft limit at some point).
Delete aircraft profile
POST /mass_balance/aircraft_delete/{aircraftId}.json
Loadsheets already saved keep their own profile copy.
Get flight loadsheet
GET /mass_balance/loadsheet/{flightId}.json
stale: the flight's aircraft or its profile changed after the loadsheet was calculated.signed.valid: the stored signature still matches the stored numbers.
Issue codes
STATION_OVER_MAX, FUEL_OVER_CAPACITY, BURN_EXCEEDS_FUEL, NEGATIVE_INPUT, UNKNOWN_STATION, ZERO_FUEL_OVER_MAX, RAMP_OVER_MAX, TAKEOFF_OVER_MAX, LANDING_OVER_MAX, CG_FORWARD, CG_AFT, PROFILE_INCOMPLETE. Issues carry station, condition (zero_fuel | takeoff | landing), value and limit where relevant. The landing CG limits are the landing envelope clipped to the normal envelope (the most restrictive of the two at that mass).
Save flight loadsheet
POST /mass_balance/loadsheet_save/{flightId}.json
inputs
string (JSON)
{ "loads": { stationKey: mass }, "fuel": { stationKey: { "takeoff": vol, "taxi": vol, "burn": vol } }, "labels": { stationKey: text } }
Calculated with the aircraft's current profile (400 if the flight has no aircraft or the aircraft has no profile). Unknown station keys are dropped. Saving different numbers clears any signature; saving identical numbers keeps it. Returns { result, message, loadsheet }.
Sign flight loadsheet
POST /mass_balance/loadsheet_sign/{flightId}.json
pass
string
Required. The signing user's password
Refused with 400 when there is no saved loadsheet, the aircraft or profile changed since it was saved, the loadsheet is outside limits, or the password is wrong. Returns { result, message, loadsheet }.
Delete flight loadsheet
POST /mass_balance/loadsheet_delete/{flightId}.json
Last updated