API Changelog
Track changes, improvements, and updates to the Virtual Performance Tool API.
Current Version: 1.3.6
Stable release with standardized camelCase API responses.
Takeoff Performance — Selectable Graphic Format
Release Date: August 2026
New
-
Client-selectable image format. The
Takeoff Performance
request now accepts an
imageFormatstring ("svg","png"or"jpg", default"svg") controlling which raster format is generated forgraphic,cduGraphicandrtoGraphic.svgis always produced regardless of the request — it's cheap and is the canonical source the other formats are rendered from — whilepng/jpgnow require a genuine Imagick rasterization pass and are only generated when explicitly requested, since most calculations are only ever displayed as SVG and never need a raster export.
Takeoff Performance — RTO Graphic
Release Date: August 2026
New
-
Rejected-takeoff (RTO) graphic. The
Takeoff Performance
response now includes an
rtoGraphic(svg,png,jpg), always generated since it only needs V1 and the calculated ASDR. It plots the estimated accelerate-stop distance for a reject initiated at V1, 100kt and 80kt on the same runway/exits/windsock layout as the existing takeoff distances graphic. The ground/air brake cooling time for each speed (frombrakeCoolingSchedule) is shown alongside the distance only when the aircraft profile haslanding.brakeCooling.isBrakeCoolingAvailableset. The 100kt/80kt distances are estimated from the calculated V1 ASDR usingestimateASDRAtSpeed(asdr, v1, targetSpeed) = asdr × (targetSpeed / v1)², scaling by the kinetic-energy ratio between the two speeds.
Checklist Management API
Release Date: July 2026
New
-
New
Checklist Management API:
checklistList,checklistGet,checklistSave,checklistDeleteandchecklistRatefor creating, editing, deleting and listing user, virtual-airline and community checklists. -
Built-in default/generic checklists (previously only reachable
through an aircraft profile's
checklists.file) are now individually addressable via a stabledefault:{folder}:{file}id, and can be listed, rated, and cloned into a user's own checklist. -
Community sharing: checklist owners can opt in with
shareCommunity, and community + default checklists can be rated 1–5 stars. -
Aircraft profiles can now reference any checklist — built-in
or custom — by a single stable
checklistIdviachecklists.checklistId, resolved through the same code path used by the new endpoints. Access to private checklists is enforced server-side. - See Checklist JSON Format for the schema shared by every checklist, wherever it is stored.
Version 1.3.0
Release Date: January 2026
Bug Fixes
-
Subscription plan-change handling rewritten.
Three coupled fixes for upgrades and downgrades through 2Checkout:
-
Upgrading (e.g. Lite → Pro) no longer leaves the previous
plan’s row Running in the database. A new
supersede pass runs after every CREATE / plan-change
event and marks all other Running / Paused rows of the same
user as
Superseded, guaranteeing exactly one active subscription per user. -
Downgrades that arrive only as an LCN (the typical 2Checkout
behaviour — no
ORDER_CREATEDIPN because there is no charge) are now detected. When anSTATUS=ACTIVELCN carries a changedNEXT_RENEWAL_PRICEthe dispatcher callsGET /subscriptions/{ref}/on 2Checkout, reads the current PCODE, resolves it to a local product and routes the event through the plan-change handler so thesubscriptionsrow is actually updated. -
Downgrades are now re-prorated server-side.
Because 2Checkout does not refund the unused portion of the
more expensive plan, we extend
date_endusingremainingValue / newDailyRateso paid value carries over (capped at 1095 d). See Plan Change Server Behaviour.
api/Subscriptions/PlanChangeService.phpandDatabase/migrate_subscription_status_width.php(widenssubscriptions.statusfromVARCHAR(10)toVARCHAR(20)). Run the migration once:php Database/migrate_subscription_status_width.php.
Hotfix mirrored to legacy site. Until the 2Checkout IPN/LCN webhook URLs in the Merchant Control Panel are switched to the newapi.virtualperformancetool.com/api/webhooks/2checkout/…endpoints, the same three-bug fix has also been applied toupgradeSubscriptionIPN()in the legacy marketing site (assets/php/subscriptions/2checkout/dataLibrary.php) so production IPNs receive the fix immediately. -
Upgrading (e.g. Lite → Pro) no longer leaves the previous
plan’s row Running in the database. A new
supersede pass runs after every CREATE / plan-change
event and marks all other Running / Paused rows of the same
user as
New Features
-
Flight Data history (audit log). A new
append-only
flight_data_historytable records everyinsert/update/deleteperformed viaflightDataSaveandflightDataDelete, including the full payload snapshot and the actor’s userId. Exposed via the newflightDataHistoryendpoint — supports a metadata-only mode (default) or full payload streaming (includePayload: true) so clients can implement “who changed what” UI and undo-last-change without storing snapshots locally. -
OFP cross-account sharing. Four new
JWT-authenticated endpoints —
ofpShare,ofpShareList,ofpShareAccept,ofpShareRevoke— let an OFP owner invite another VPT account to view or co-edit a stored flight and its Flight Data. Invites can be issued by email, by short share-code, or by QR deep-link (vpt://share/{token}) which the client renders from the returnedqrPayload. Two permission levels:view(read OFP + Flight Data) andedit(also Flight Data writes); OFPdeletestays owner-only. Centralised in a newOfpAccessServiceused by all OFP and Flight Data handlers. See OFP Sharing. -
Flight Data store. Four new JWT-authenticated
endpoints —
flightDataList,flightDataGet,flightDataSave,flightDataDelete— let the client persist any free-form payload attached to an imported OFP (journey log, fuel log, post-flight notes, …). The server never inspects the payload, so the schema can evolve entirely client-side. Each entry is keyed by(userId, ofpId, dataKey)and carries a monotonicversion+updatedAt; saves include an optionalexpectedVersionandlastDownloadedAtfor optimistic locking. On a stale write the API returns409 VERSION_CONFLICTwith the server's current copy incurrent, so the client can offer a Cancel / Download latest / Override dialog. See Flight Data.
Breaking Changes
-
All API response keys now use camelCase naming
convention (e.g.,
apiVersion,calculationPossible,maxTow) -
Previous PascalCase and UPPER_CASE response keys have been
converted (e.g.,
RTOW→tow,MaxRTOW→maxTow)
Improvements
-
User payload exposes structured subscription state.
The login response (and every endpoint that returns the
userobject) now includes auser.subscriptionobject at MEDIUM and FULL access levels —title,level,status,expiry,daysRemaining,isActive,isExpired,isTrial,isPaused,isAutoRenew,paymentMethodand acapabilitiessub-object (isNotam,isNnc,isMel,isCdl,isCommercial,isFleetDatabase,maxCalculation). See Authentication » The subscription object. -
Embedded
previewblock on every subscription. Theuser.subscriptionobject now carries an embeddedpreviewsub-object that signals when the user is experiencing the API as a limited Pro preview (no real subscription, expired subscription, or otherwise inactive). Whensubscription.preview.activeistruethe API enforces theallowedAirportsrestriction server-side. Users with no real subscription receive a synthesized PREVIEW subscription built from product id 3 (VPT Pro Demo) so the client can render the full Pro UI. See Authentication » The embedded preview block. -
User preferences restructured. The
userPreferencesresponse now groups settings by feature area (defaultAircraftOnStartup,performancecontainingtakeoffandwb,export,simbrief,efb,weather) and exposes a new top-levelefbobject with module toggles (enableEFB,modules.briefingNavlog,modules.checklist,modules.library,modules.tools) plus an opaquetoolsOptionsJSON store synchronized across the user's clients. A new top-levelweathergroup combinesweather.displaywithweather.notification(opt-in to the new weather notification stream). -
Adaptive partial save.
saveUserSettingsnow writes only the keys present in the request payload — missing keys leave their DB columns untouched. Unknown keys are silently ignored (forward-compatible).saveUserSettingsMobileis kept as an alias. -
Server-enforced settings lock.
settingsLockedis now admin-only:saveUserSettingsrejects writes when set, and any attempt to set or unset the flag through the user-facing endpoint is silently dropped. Only the admin save path can toggle the lock or bypass it. -
Runway exits always drawn.
landing.displayRunwayExitsis no longer consulted by the landing performance graphics in API 1.3.0 — exits are always rendered when available. -
userId-based queries. Internal preference lookups
now join on a new
user_preferences.user_idcolumn (UNIQUE FK tousers.id) instead ofapi_key. Existing rows are backfilled by the012_user_preferences_refactor.sqlmigration; theapi_keycolumn is preserved for legacy API versions. -
Clean camelCase query names throughout the API (e.g.,
"airport"instead of"get_airport","allowedAircrafts"instead of"allowed_aircrafts","apiVersion"instead of"get_api_version"). -
All request parameters use camelCase natively (e.g.,
userRegistration,virtualAirline,requestType) -
Standardized subCalculation values:
OPTIMUM,FIXED_DERATE,WINDSHEAR,MAX_RTOW - Fixed RTOW+OPTIMUM calculation logic to use the first actual rating when rating is set to OPTIMUM
- New Performance API architecture with improved error handling
Deprecated (kept in DB for legacy API versions)
-
displayDemoAircraft,landing.displayRunwayExits,disclaimer.*,visualCustomization.*,export.exportEmail,export.exportURLare no longer returned by API 1.3.0. They remain in theuser_preferencestable (withCOMMENT 'DEPRECATED in API 1.3.0') so that older API versions continue to behave identically. -
The
exportEmaildispatch case no longer reads a secondary email from preferences. Exports are sent to the user's primaryusers.emailonly.
Version 1.2.9
Release Date: December 2025
Initial public release of the Virtual Performance Tool API with basic takeoff and landing performance calculations.