Skip to content

Aircraft

Role names and user_group_id values are listed in User groups.

Aircraft.ManagerIds names the aircraft’s managers: the people responsible for that tail. An aircraft may name any number of them, including none, and they are peers — there is no primary manager and no ordering. The rule is per aircraft and independent of user_group_id — a Captain (180), a Pilot (190) or a Student Pilot (200) named on a tail gets the same authority over it as a Company Administrator, and none at all over any other aircraft.

Changed September 2026. This used to be a single Aircraft.user_id column. That field is gone from every aircraft payload; read Aircraft.ManagerIds (ids) or Manager (ids with names) instead, and never assume there is exactly one.

Two shared checks decide it (AircraftManagerPolicy server-side):

Check Allowed for Used by
canEditAircraft user_group_id in 1, 100, 105, 110, 150, 300, or any manager of the aircraft aircraft/edit, aircraft/photo, aircraft/removePhoto, Mass & Balance aircraft profile
canManageAircraft user_group_id in 1, 100, 105, 110, 300, or any manager of the aircraft Maintenance Jobs create / edit / sign / duplicate / delete / link, Aircraft Reports MEL/CDL create, edit, extend and delete

A call aimed at an aircraft the caller neither manages nor covers by group answers 404, not 403 — the record is treated as not existing for that caller.

Two further endpoints follow the same rule:

  • GET /aircraft/my_aircraft.json — the aircraft this user manages. Clients use it to decide which per-aircraft actions to offer.
  • GET /schedules/manager_index.json — a caller above user_group_id 170 (and not 300) is admitted only when they manage at least one aircraft, and the board returned holds only those aircraft.

Changing the manager list is staff-only: aircraft/edit silently drops the whole Manager key, plus Aircraft.company_id, Aircraft.active and Aircraft.deleted, from a request made by someone who is only there because they manage the tail. Otherwise a manager could drop the other managers of their own aeroplane, or add themselves to one they do not manage.

Read (ids) Aircraft.ManagerIds — e.g. ["17","204"]. Sent in full to user_group_id < 171 and to 300. Anyone else who manages the tail gets just their own id (["<own id>"]), so a client can tell it may offer the manager actions; everyone else gets the key omitted.
Read (with names) Manager — an array of { id, UserDetail: { name, surname } }.
Write data[Manager][Manager][]=<user id>, repeated once per manager. Staff only.
Clear post one empty value: data[Manager][Manager][]=. The aircraft then has no manager.
Leave unchanged omit the Manager key entirely. A client that knows nothing about managers cannot wipe the list.

Posted ids are intersected with the active users of the caller’s own company, so an id from another company or a deactivated account is dropped silently rather than rejecting the save. Deliberately not restricted by user_group_id: the person running a tail may be of any rank, including a third-party owner who does not fly for the school.

GET /aircraft/index.json

Retrieve the fleet list. Pilots (user_group_id > 170 — Captain and below) see only active aircraft. Managers see all non-deleted aircraft.

Parameter Example Description
active active:true Filter by active status (true or false). Ignored for pilot-level users.
search search:C172 Filter by registration or model name (partial match)
base_id base_id:{uuid} Filter aircraft assigned to a specific base
[
{
"Aircraft": {
"id": "45",
"registration": "EC-ABC",
"active": true,
"multiengine": false,
"multipilot": false,
"simulator": false,
"require_type_rating": false,
"serial": "172-12345",
"registration_exp": "2026-09-30",
"insurance_exp": "2025-12-31",
"airworthiness_exp": "2026-06-15",
"radio_exp": "2026-03-01",
"weight_exp": null,
"billing": false,
"photo": "EC_ABC.1682241511.jpg",
"flight_count": "450",
"created": "2020-01-15 10:00:00",
"hours": "12.500",
"landings": "9",
"log_reference": "1736925801"
},
"AircraftModel": {
"name": "C172",
"icao": "C172",
"aircraft_manufacturer_id": "292",
"id": "2018",
"AircraftManufacturer": { "name": "CESSNA" }
},
"AircraftLogReference": {
"total_time": "0.000",
"landings": "0"
},
"Base": { "id": "b1", "name": "Madrid Base" },
"User": {
"id": "123",
"UserDetail": { "name": "John", "surname": "Doe", "id": "123" }
}
}
]

Aircraft.require_type_rating is true when crew need a type rating for the aircraft’s model (see Type rating requirement); it is also returned by View Aircraft.

Aircraft.hours and Aircraft.landings are the running totals from the aircraft logbook (decimal hours string and integer count). Aircraft.log_reference is a Unix timestamp of the last logbook entry. AircraftLogReference.total_time / landings are the baseline reference values (often null or 0.000 when no reference has been set). User is null when no default pilot is assigned.


GET /aircraft/my_aircraft.json

Retrieve the aircraft the authenticated user is a manager of, within the current company. Returns an empty list for a user who manages none. Retired (active: false) aircraft are included — a manager keeps access to a parked aeroplane’s history — deleted ones are not.

{
"aircraft": [
{
"id": "45",
"active": true,
"title": "EC-ABC",
"photo": "https://...",
"manufacturer": "Cessna",
"model": "C172"
}
]
}

GET /aircraft/view/{id}.json

Retrieve full details for a single aircraft, including maintenance, rates, logbook reference and the flight types the aircraft is attributed to (FlightType, an array of {id, name, color} — empty is the normal case and means the aircraft flies every unrestricted flight type; see Flight-type attributions).

Parameter Type Description
id string Aircraft ID
{
"Aircraft": {
"id": "45",
"active": true,
"company_id": "42",
"base_id": "5",
"billing": true,
"auto_bill": false,
"serial": "172-12345",
"registration": "EC-ABC",
"photo": "https://...",
"multiengine": false,
"multipilot": false,
"simulator": false,
"hobbs": true,
"tach": false,
"adsb": "ABC123",
"self_schedule": true,
"maintenance": "enabled",
"fuel_tracking": "lbs",
"fuel_type": "JETA1",
"oil_tracking": false,
"hours": "12500",
"landings": "8900",
"flight_count": "4500",
"airworthiness_exp": "2026-06-15",
"insurance_exp": "2025-12-31",
"radio_exp": "2026-03-01",
"weight_exp": null,
"avionics_exp": null,
"registration_exp": "2026-09-30",
"created": "2020-01-15 10:00:00",
"modified": "2025-03-01 14:00:00"
},
"AircraftModel": {
"id": "10",
"name": "C172",
"icao": "C172",
"aircraft_manufacturer_id": "1",
"AircraftManufacturer": { "name": "Cessna" }
},
"AircraftLogReference": {
"total_time": "12000",
"landings": "8500",
"created": "2020-01-15"
},
"Base": { "name": "Madrid Base", "id": "5", "airport_id": "100" },
"User": {
"id": "123",
"UserDetail": { "name": "John", "surname": "Doe", "id": "123" }
},
"DefaultRate": {
"name": "Standard Rate",
"hourly_price": "150.00",
"id": "10"
},
"Rate": [
{
"id": "10",
"company_id": "42",
"deleted": false,
"name": "Standard Rate",
"description": "Per flight hour",
"hourly_price": "150.00",
"pack": false,
"hours": null,
"AircraftRate": { "id": "1", "rate_id": "10", "aircraft_id": "45", "created": "2020-01-15" }
}
],
"Maintenance": {
"past": [],
"future": [
{
"Job": {
"id": "200",
"name": "100h Inspection",
"type": "hours",
"completed": false,
"hours_now": "12500",
"hours_added": "100",
"expiration": null
}
}
],
"next": {
"status": "due",
"basis": "history",
"date": 1791100800,
"band": { "early": 1789804800, "late": 1794124800 },
"trigger": "hours",
"job": { "ref": "585", "name": "100h Inspection" },
"note": "100h Inspection at the blended 90/365-day utilisation.",
"remaining_hours": 42.5,
"due_hours": 12600,
"projected": { "hours": 12600, "landings": 10062 }
}
},
"AdsbHealth": {
"flights": { "found": 18, "not_found": 2, "pending": 1 },
"never_seen": false,
"last_seen": 1791631740,
"last_source": "fr24"
}
}

Paid plans, not simulators. Outcome of the ADS-B track lookups of the aircraft’s last 30 confirmed flights (see Flight ADS-B Track), and when any position of it was last stored. never_seen is true when its last 5 or more resolved lookups found nothing and none found a track: the aircraft probably does not transmit ADS-B positions, and its flights get a single lookup instead of three.

Estimated next maintenance for this aircraft — the same object documented under Maintenance Jobs → Next maintenance forecast, minus the planned wrapper (booked work is already in Maintenance.scheduled).

An aircraft with no maintenance history at all answers with basis: "first_maintenance" — a nominal first check, not a tracked interval. null only when the aircraft cannot be resolved at all. Deployments that predate the forecast answer with a bare unix timestamp instead of the object; clients should accept both, and must treat the value as advisory — it never limits a booking or a flight.

Returned only on a club, premium or unlimited plan.

All *_exp fields use YYYY-MM-DD format. null means no expiration set.

Field Description
airworthiness_exp Airworthiness certificate expiration
insurance_exp Insurance expiration
radio_exp Radio station license expiration
weight_exp Weight & balance check expiration
avionics_exp Avionics check expiration
registration_exp Aircraft registration expiration

POST /aircraft/read_document.json (multipart)

data[file]=@/path/to/insurance.pdf
data[aircraft_id]=2576

Reads an aircraft document and suggests the expiry field it belongs in, and for a weighing report the basic empty mass and arm. Nothing is saved: the aircraft form and the mass & balance profile apply and save as usual.

{
"reading": {
"kind": "insurance",
"field": "insurance_exp",
"registration": "EC-SKA",
"registration_matches": true,
"serial": null,
"issue": "2026-10-01",
"expiration": "2027-09-30",
"weighing": null,
"confidence": 0.93
},
"reason": null
}
kind field
registration registration_exp
arc, airworthiness airworthiness_exp
insurance insurance_exp
radio radio_exp
weighing weight_exp
avionics avionics_exp
other null
  • registration_matches is false when the registration printed is not this aircraft’s (hyphens and case ignored), and null when either is unknown.
  • weighing is filled for a weighing report only: {mass, mass_unit (kg|lb), arm, arm_unit (m|cm|mm|in), weighed_on, reference}. A value without a known unit is null. The profile’s units are never changed; NEO converts.
  • reason takes the same values as in Pilots → Read Certificate Document.
  • Access: same as editing the aircraft (AircraftManagerPolicy::canEditAircraft: staff editors and the aircraft’s managers), company-scoped (404). One read every 3 seconds per session.

GET /aircraft/logbook/{aircraftId}/limit:{limit}/page:{page}.json

Retrieve the aircraft technical logbook with pagination.

For an aircraft that tracks fuel, each flight carries fuel (its own uplift), fuel_start / fuel_end (on board, gauge unit), and two server-computed values: fuel_uplift (its own uplift plus the uplifts after its legs) and fuel_used (start + uplifts between legs − end, see Flight legs → Fuel; null when it cannot be worked out), both in the uplift unit. The top-level fuel gives the units (gauge, uplift); it is null when the aircraft tracks no fuel.

Parameter Type Description
aircraftId string Aircraft ID
limit number Records per page (default: 10)
page number Page number
{
"logbook": [
{
"AircraftLog": {
"id": "1000",
"user_id": "123",
"aircraft_id": "45",
"time": "3600",
"meter": null,
"total_time": "12500",
"landings": "1",
"total_landings": "8900",
"type": "flight",
"foreign_key": "5678",
"created": "2025-03-10 09:30:00",
"modified": "2025-03-10 09:30:00"
},
"Flight": {
"id": "5678",
"date": "2025-03-10",
"callsign": "EC-ABC",
"departure_airport": "LEMD",
"landing_airport": "LEBL",
"offblocks_time": "08:00:00",
"onblocks_time": "09:25:00",
"rules": "VFR",
"landings": "1",
"fuel": "40.00",
"fuel_start": "1500.00",
"fuel_end": "1100.00",
"fuel_uplift": 440,
"fuel_used": 625.67,
"Pic": {
"id": "123",
"UserDetail": { "name": "John", "surname": "Doe" }
}
}
}
],
"fuel": { "gauge": "lbs", "uplift": "l" },
"paging": {
"page": 1,
"current": 1,
"count": 4500,
"prevPage": false,
"nextPage": true,
"pageCount": 450,
"limit": 10
}
}

AircraftLog.meter is the absolute meter reading of the flight on an aircraft counted on Hobbs time, and null otherwise. A reading below the running total is not used: the row adds AircraftLog.time instead, so total_time ends above meter. NEO shows a warning on such a row.


The technical log (see Technical log). Every call needs CompanySetting.techlog on (400 otherwise). Any active user of the company; the aircraft is company-scoped (404). Dates and times are in the flight timezone (CompanySetting.flight_timezone_id), like the flights endpoints.

POST /techlog/day/{aircraftId}/{date}.json

Everything one page needs. date is Y-m-d, today at the latest (400 Invalid date).

Page numbers are one per aircraft-day, consecutive within the company, never reused and in date order. An aircraft-day is numbered when it has a flight (any status except cancelled or deleted), when a DEFECT, MEL or CDL report is created on the aircraft that day, or on request with body {"allocate": 1} (an empty page; 400 unless the day is today, or yesterday while today has no number yet). Every quarter hour the server numbers each technical-log company’s yesterday and today (flight timezone, else company timezone), in that order, for every active non-simulator aircraft with a flight that day, in fleet order. A day older than the newest numbered day is never numbered. This call is POST because it also numbers today or yesterday when the cron has not run yet. A day without a number returns page: null.

  • page: {page_no, created} or null.
  • layout: log_rows, min_empty_rows (the PDF is always one page; a busier day gets more, shorter log rows).
  • aircraft: registration, serial, manufacturer, model, fuel_unit (the aircraft’s fuel tracking unit, which fuel_start / fuel_end are in).
  • crs: last signed CRS of the day (date, reference, name, release_reference) and the earliest limits it left running (until_hours, until_date), from the latest sign-off per maintenance plan.
  • maintenance_due: the maintenance statement, up to 5 tasks due next, each name, reference, due_hours, due_landings, due_date, soonest first.
  • camo: the company is a CAMO / Part-M operator (CompanySetting.techlog_camo).
  • company: name, phone, address, zip, city, state, country, logo.
  • flights: the day’s flights (DRAFT, SCHEDULED, DELAYED, DISPATCHED, LANDED, and CANCELED only when it was preflight-signed first), each with departure_airport, landing_airport, flight_type (name), fuel_start, fuel_end, times (unix), block_time and flight_time (seconds), crs_hours_left, crew (pic, sic, supervisor), preflight (the preflight signature, with offline) and postflight (the confirmation: who and when).
  • defects: DEFECT, MEL and CDL reports open at some point of the day, with mel_reference, mel_category, operational (O), maintenance (M), valid_until, released_by, work_order (id, number, completed; the maintenance job the item is assigned to or was closed with, null when none), and closed / closed_by when closed during the day.

GET /techlog/days/{aircraftId}.json?page=&date=

Days with flights or with a page number, newest first, 10 per page, each with flights (count) and page_no (null when never numbered). paging: page, limit, count, pageCount. With date=Y-m-d returns only that day, flights or not.

GET /techlog/index.json?aircraft_id=&from=&to=&page_no=&origin=&page=

Every numbered page of the company, newest number first, 25 per page. from / to are Y-m-d (inclusive), origin is FLIGHTS, DEFECT or MANUAL. Each row: page_no, date, origin, created, issued_by (null when issued automatically), aircraft (id, registration), flights and signed (flights of that aircraft-day with a preflight signature). paging: page, limit, count, pageCount.

GET /techlog/status/{aircraftId}.json

What a preflight signature accepts right now: aircraft_hours, crs (name, until_hours, until_date, hours_left, release_reference), maintenance_due (as above, each with hours_left) and the open defects (same fields as above). NEO keeps the last answer on the device so the preflight signature can be given offline.


GET /aircraft/logbook/{aircraftId}/limit:10000/logbook.xls

Download the aircraft logbook as an Excel file. Token passed as query parameter: ?token=<token>


GET /aircraft/consumptions/{id}.json

Retrieve monthly fuel and oil consumption rates, per block hour of confirmed flights. Defaults to last 12 months. Fuel is in the uplift unit (CompanySetting.fuel_uplift_unit, else the aircraft’s fuel_tracking), from two sources that are never added together:

  • Measured — flights whose fuel used can be worked out from fuel on board (see Flight legs → Fuel). A month with any such flight gets its own measured_fuel_per_block_hour. A negative burn (mis-keyed reading) or an unconvertible one is left out.
  • Uplift — every uplift of the flights (Flight.fuel plus the legs’ fuel) over all block hours, pooled over a trailing 6 months (trailing_fuel_per_block_hour): an uplift refills fuel burned on earlier flights, so it is only meaningful averaged.

fuel_per_block_hour is the value to plot: the measured rate where the month has one, else the trailing uplift rate, with fuel_source naming which. rolling_fuel_per_block_hour (same on every row) is the measured rate over the window’s measured hours when there are any, else total uplift / total hours, with rolling_fuel_source. Oil is always uplift-based.

Parameter Type Description
id string Aircraft ID
Parameter Type Description
months integer Optional. Number of months to look back. Range: 1–120. Default: 12
[
[
{
"month_unix": "1709251200",
"month": "2025 Mar",
"trailing_fuel_per_block_hour": "34.1",
"trailing_oil_per_block_hour": "0.2",
"measured_fuel_per_block_hour": "31.8",
"measured_hours": "42.5",
"fuel_per_block_hour": "31.8",
"fuel_source": "measured",
"rolling_fuel_per_block_hour": "32.2",
"rolling_fuel_source": "measured",
"rolling_measured_hours": "310.4",
"rolling_oil_per_block_hour": "0.21"
}
]
]

fuel_source is "measured", "uplift", or null when there is nothing to show.


GET /aircraft/adsb.json

Retrieve real-time ADSB positions for all aircraft in the fleet with ADSB transponders configured.

[
{
"Aircraft": {
"id": "45",
"adsb": "ABC123",
"registration": "EC-ABC",
"hours": "12500",
"landings": "8900"
},
"AircraftModel": {
"name": "C172",
"icao": "C172",
"manufacturer": "Cessna"
},
"AircraftPosition": [
{
"id": "9999",
"aircraft_id": "45",
"lat": "40.4719",
"lon": "-3.5626",
"speed": "120",
"alt": "5500",
"ground": false,
"track": "090",
"created": "2025-03-10 12:00:00"
}
],
"lastKnownPosition": [
{
"AircraftPosition": {
"id": "9999",
"lat": "40.4719",
"lon": "-3.5626",
"speed": "120",
"alt": "5500",
"ground": false,
"track": "090",
"created": "2025-03-10 12:00:00"
}
}
]
}
]

GET /aircraft/adsb/{aircraftId}/{start}/{end}.json

Retrieve ADSB position history for a specific aircraft within a date range.

Parameter Type Description
aircraftId string Aircraft ID
start int Window start, Unix seconds
end int Window end, Unix seconds

For a flight, prefer Flight ADS-B Track, which also returns the lookup status and the matched legs.


GET /aircraft/manufacturers.json

List all aircraft manufacturers.


GET /aircraft/model/{manufacturerId}.json?q={search}

Search aircraft models by manufacturer.

Parameter Type Description
q string Search query for model name

GET /manager/aircraft/pilot_prices/{pilotId}.json

POST /manager/aircraft/pilot_prices/{pilotId}.json

Custom hourly price a pilot is billed for each aircraft. When one exists it replaces the aircraft’s default rate and any rate chosen on the flight when a flight is billed to that pilot. Restricted to user_group_id ≤ 130 (Financial Manager and above); any other caller gets 404. The pilot must belong to the caller’s company and have billing enabled, otherwise 404.

Parameter Type Description
pilotId string Pilot user ID
{
"aircraft": [
{
"Aircraft": { "id": "12", "registration": "EC-KHZ" },
"AircraftModel": { "name": "C172", "AircraftManufacturer": { "name": "Cessna" } },
"DefaultRate": { "hourly_price": "275.00" },
"PilotAircraftPrice": [{ "id": "2558", "hourly_price": "225.00" }]
}
],
"history": [
{
"id": "41",
"registration": "EC-KHZ",
"old_price": "215.00",
"new_price": "225.00",
"changed_by": "Amparo Moreno",
"created": "1792055597"
}
]
}

history lists the latest 100 changes to this pilot’s custom prices, newest first. old_price is null when a custom price was added and new_price is null when it was removed. changed_by is the manager’s name, or null if the user no longer exists. created is a Unix timestamp. Changes made before October 2026 were not recorded, so the history starts empty.

Field Type Required Description
prices[{aircraftId}] number | string Yes Custom hourly price for that aircraft. An empty string leaves the aircraft without custom price

The submitted list replaces all of the pilot’s custom prices: aircraft not sent, or sent empty, lose their custom price. Each added, changed or removed price is recorded in the history with the caller as author; resubmitting identical values records nothing.

{
"result": true,
"prices": [{ "PilotAircraftPrice": { "id": "2559", "aircraft_id": "12", "user_id": "8226", "hourly_price": "225.00" } }]
}

POST /aircraft/add.json

Add a new aircraft to the fleet. Admin access required.

When Aircraft.require_type_rating is 1 the response carries type_rating_uncovered (see Requires a type rating); otherwise it is null.


POST /aircraft/edit.json

Update aircraft details. Requires canEditAircraft: user_group_id in 1, 100, 105, 110, 150, 300, or being one of the aircraft’s managers. A manager’s request has the Manager key and Aircraft.company_id, Aircraft.active, Aircraft.deleted and Aircraft.require_type_rating stripped before the save, so the manager list and those columns can only be changed by staff.

Field Type Description
Aircraft.require_type_rating 0 / 1 Crew can only be booked or dispatched on this aircraft with a valid Type Rating, TRI or TRE linked to its model. Off by default. Staff only. See Type rating requirement.

When a save switches it on, the response carries type_rating_uncovered: the active flying users of the company who hold no valid linked rating for the model today, so nobody is locked out unknowingly. null on every other save.

{
"result": true,
"message": "The changes were saved!",
"type_rating_uncovered": {
"count": 3,
"total": 12,
"pilots": [ { "id": 178, "name": "Antonio Oreilly" } ]
}
}

pilots holds the first 20 by name; count is the full number.

The uplift unit (the unit fuel is bought in) is a company setting, CompanySetting.fuel_uplift_unit (see Company), not a field of the aircraft. Uplifts (Flight.fuel, FlightLeg.fuel, refuellings) and fuel used are in that unit, or in the aircraft’s fuel_tracking unit when the company has none set. Aircraft.fuel_uplift_unit (November 2026) no longer exists; a posted value is ignored.

Field Type Description
Aircraft.fuel_tracking string | null Gauge unit: l, usgal, impgal, kgs, lbs; null = fuel not tracked. Fuel on board (Flight.fuel_start / fuel_end, FlightLeg.fuel_start / fuel_end) is in this unit.
Aircraft.fuel_type string | null AVGAS100LL, JETA1, JETA, MOGAS, SAF, OTHER. Required when the gauge unit and the company’s uplift unit are a weight (kgs, lbs) and a volume: the save is refused with a field error under errors.Aircraft.fuel_type unless the type has a known density (any but OTHER).

Two fields choose which clock drives a computation. Both accept the same vocabulary and are validated: an unknown value answers 400 with a field error under errors.Aircraft.<field> (it used to reach the database and fail with a 500).

Value Meaning
btime Block time (off-blocks → on-blocks)
ftime Flight time (take-off → landing)
ttime Tach: abs(tach_end − tach_start) from the readings entered on the flight
htime Hobbs: abs(hobbs_end − hobbs_start) from the readings entered on the flight
Field Type Description
Aircraft.maintenance string Clock that advances the airframe hours. htime treats the Hobbs end reading as the airframe’s absolute value (see Maintenance Jobs).
Aircraft.billing_timer string Clock a flight is billed on when billing is enabled for the aircraft. For ttime and htime a flight missing either reading, or whose readings differ by more than 24 h, is not auto-billed. Only read when Aircraft.billing is 1.

ttime / htime need the matching Aircraft.tach / Aircraft.hobbs timer enabled, otherwise the flight form never collects the readings; the NEO client switches the Hobbs timer on for you when either clock is set to htime.

The aircraft end of the fleet restriction that flight types own (see Flight Types → Aircraft restriction). The rows are the same rows; only the direction of editing differs, so an empty set is read the flight type’s way:

Links Meaning
none The aircraft flies every flight type that itself names no aircraft. It is not grounded.
one or more Those flight types are restricted to this aircraft (plus whatever other aircraft they name).
Field Type Required Description
FlightType.FlightType[] array No Flight type ids this aircraft is attributed to. When the key is present it replaces the whole set; an empty value detaches the aircraft from every flight type. When the key is absent, existing links are left untouched — so an older client posting an aircraft edit cannot wipe restrictions it knows nothing about.

Ids outside the authenticated company are dropped silently. Detaching the last aircraft from a flight type makes that flight type unrestricted again, which reopens it to the whole fleet — that is the empty-set rule, not a special case.

POST /aircraft/add.json does not accept these: it saves the Aircraft fields alone and would drop the links silently. Attribute the aircraft in a follow-up edit.

Example (form-encoded):

data[Aircraft][id]=45
data[FlightType][FlightType][]=524
data[FlightType][FlightType][]=368

Detach from everything:

data[Aircraft][id]=45
data[FlightType][FlightType][]=

POST /aircraft/photo/{id}.json

Upload or replace the aircraft’s photo. Requires being the aircraft’s assigned manager, or an Admin / Operations Manager role.

Parameter Type Description
id string Aircraft ID

Multipart form data, field logo: image file (JPG, PNG or GIF, max 8MB).

{
"result": true,
"file": "9XRSP.1731000000.jpg",
"error": null
}

POST /aircraft/removePhoto/{id}.json

Clear the aircraft’s photo. Requires being the aircraft’s assigned manager, or an Admin / Operations Manager role.

Parameter Type Description
id string Aircraft ID
{
"result": true,
"error": null
}

GET /aircraft/delete/{id}.json

Remove an aircraft from the fleet. Admin access required.

Parameter Type Description
id string Aircraft ID