Logo

Developer Documentation

Endpoint Reference
Ready to start building?
To execute API requests, you need a valid key. Get started in two steps:
  1. Create a free account and log in to eLoadcontrol.
  2. Navigate to Settings > Developer to enable developer access and generate your free test key.

Integrate the eLoadcontrol Weight & Balance engine directly into your Virtual Airline or dispatch tool.

Architecture: "Bring Your Own Key" (BYOK)

eLoadcontrol operates on a decentralized BYOK model, meaning you do not pay for API usage.

1. Development: Use your personal Developer Sandbox key (above) to build and test your integration.
2. Production: Create a text field in your dispatch UI for your pilots. They simply paste their personal Pro License Key into your system, and you pass that key dynamically in the headers below.

Sandbox Key Limitations Your elc_test_... key is a sandbox key. It is free to use for development but has the following restrictions:

Loadsheets & ACARS messages are watermarked and scrambled — CG balance data (MACZFW, MACTOW, etc.) will return as XX.X and the loadsheet will contain a "SANDBOX ENVIRONMENT — NOT FOR LIVE OPERATIONS" header. This prevents free abuse of the generation engine.

All other endpoints (aircraft, airlines, formats, calculate-cg) return full, real data with a sandbox key. Switch to a pilot's live Pro License Key in production to unlock full output.

Authentication (Required Headers)

  • Content-Type: application/json
  • x-api-key: <PILOT_PRO_KEY>
Error Reference

All errors return a JSON object with a single error key describing the problem.

HTTP Code Error Message Cause & Fix
401 "API Key is missing" The x-api-key header is required on all requests. Pass the pilot's Pro License Key as a request header: x-api-key: <key>.
403 "Invalid API Key or unauthorized account type" The key provided does not match any account, or the account does not have API access enabled. Verify the key in Settings > Developer.
403 "Inactive subscription. Please renew." The pilot's Pro license has expired. Ask the pilot to renew their subscription at eloadcontrol.com.
404 "Aircraft not found" The identifier you passed does not match any aircraft. The parameter accepts ICAO code, IATA code, full type name, or model string — all case-insensitive. Prefer ICAO codes for exact matches (e.g. B738 returns 1 result). IATA codes are shared across variants and return multiple results (e.g. 737 returns all 737 family types). Use GET /aircraft without a parameter to browse the full fleet.
400 "Invalid aircraft type" The aircraftType field passed to /calculate-cg does not match a known full aircraft type name (e.g. "Boeing 737-800"). Use the type field from GET /aircraft.
400 "Cabin configuration '...'
does not exist."
The cabinConfig string does not exist. Use availableCabinConfigs from GET /aircraft to get valid values for the specific aircraft.
429 "Monthly API Quota Exceeded." Monthly request quota exceeded. Each Pro License Key includes a generous request allowance sufficient for individual use. Bulk or programmatic use across multiple users under a single key is not permitted.
500 "Internal Server Error" An unexpected server-side error occurred. If this persists, contact [email protected].
1. Database & Reference Endpoints

GET https://www.eloadcontrol.com/api/v1/airlines

Returns a list of all supported airlines and their IATA/ICAO codes. The airline field in /generate-loadsheet accepts the ICAO code, IATA code, or full airline name — all case-insensitive. Regardless of which format you pass, the server always resolves the airline record and prints the IATA code on the loadsheet.

Example JSON Response

{
  "success": true,
  "count": 369,
  "data": [
    { "name": "Ryanair",   "iata": "FR", "icao": "RYR" },
    { "name": "Lufthansa", "iata": "LH", "icao": "DLH" }
  ]
}

GET https://www.eloadcontrol.com/api/v1/formats

Returns a list of available visual loadsheet templates. Pass the templateId as the loadsheetFormat field in any generation request.

Example JSON Response

{
  "success": true,
  "count": 2,
  "data": [
    {
      "name": "IATA",
      "templateId": "standard_iata",
      "description": "Standard AHM560 format with IATA LIR"
    },
    {
      "name": "DHL Aviation (DHX)",
      "templateId": "dhx_v1",
      "description": "DHL Aviation A300-600F Format"
    }
  ]
}

GET https://www.eloadcontrol.com/api/v1/aircraft

Returns the full supported fleet (92 aircraft types). Each entry includes the valid availableCabinConfigs for that type. Always call this first to get correct identifiers before making generation requests.

Query Parameters

Parameter Description
identifier
Optional (String)
Filter by ICAO code, IATA code, full type name, or model string. The search is case-insensitive and partial-match.
Example: https://www.eloadcontrol.com/api/v1/aircraft?identifier=B738

Example JSON Response

{
  "success": true,
  "count": 1,
  "data": [
    {
      "icao": "B738",
      "iata": "737",
      "type": "Boeing 737-800",
      "model": "737-800",
      "availableCabinConfigs": [
        "F12Y148",
        "Y184",
        "Y189"
      ]
    }
  ]
}
Note on identifiers: The icao field (e.g. B738) is used as the type field in /generate-loadsheet. The full type string (e.g. "Boeing 737-800") is used as aircraftType in /calculate-cg. These are different fields by design — loadsheets display IATA codes, while the CG engine looks up the full aircraft record.
2. Core Engine Endpoints
 Recommended SimBrief Integration Flow Step 1 — Fetch: Call POST /generate-from-simbrief with the pilot's SimBrief username. The server fetches their latest OFP and returns all flight weights (BOW, fuel, cargo, max weights, times, registration, etc.). You do not need to call SimBrief directly.

Step 2 — Distribute PAX: SimBrief only returns a total passenger count — it has no knowledge of cabin class split. Your dispatch UI must present the pax count to the dispatcher so they can distribute it across the classes defined by the selected cabinConfig (e.g. a C16Y182 config needs a Business and an Economy input). You may also distribute automatically based on your own logic.

Step 3 — Generate: Call POST /generate-loadsheet with all the fetched SimBrief weights plus the resolved per-class pax counts (paxC, paxY, etc.). This produces the final loadsheet.
PAX class distribution is not handled by SimBrief. This endpoint places the full SimBrief pax_count into paxY (economy) by default. If your cabin config has multiple classes, you must split the total into the correct class fields (paxF, paxC, paxY, etc.) before calling /generate-loadsheet. How you do this — manual dispatcher input or automatic distribution logic — is entirely up to your implementation.

POST https://www.eloadcontrol.com/api/v1/generate-from-simbrief

Fetches the pilot's latest SimBrief OFP and returns all parsed flight weights ready for use in /generate-loadsheet. Always uses the pilot's most recent active flight plan.

Request Body

Field Type Description
simbriefUsername * String The pilot's SimBrief username. The API fetches their latest active OFP.
cabinConfig * String Cabin configuration string (e.g. "Y189"). Must be valid for the aircraft type in the OFP. Get valid values from GET /aircraft.
loadsheetFormat * String Template ID for the loadsheet layout (e.g. "standard_iata"). Get valid values from GET /formats.

* Required

At least one pax field required for passenger aircraft. Not required for freighter cabin configs.

Example JSON Request Body

{
  "simbriefUsername": "SimBriefUser123",
  "cabinConfig": "Y189",
  "loadsheetFormat": "standard_iata"
}

Example JSON Response (Success)

{
  "loadsheet": "...",
  "loadPlanning": "CPT 1  :     0\nCPT 2  :  1044\nCPT 3  :  1566\nCPT 4  :     0",
  "distributedCargo": [
    { "hold": "AFT", "section": "CPT 3", "load": 1566, "z": 230 },
    { "hold": "FWD", "section": "CPT 2", "load": 1044, "z": -200 }
  ],
  "acarsMessage": "...",
  "cgData": {
    "MACZFW": 25.4,
    "MACTOW": 24.1,
    "MACLAW": 24.8
  },
  "loadedIndices": {
    "ZFW": 60559,
    "TOW": 68021,
    "LAW": 63286,
    "LIZFW": 45.2,
    "LITOW": 48.1,
    "LILAW": 46.5
  },
  "aircraftMaxWeights": {
    "MZFW": 61000,
    "MTOW": 69235,
    "MLDW": 64500,
    "BOW": 42600
  },
  "cgLimits": {
    "forwardLimit": 15,
    "aftLimit": 39
  },
  "unit": "kgs"
}
Sandbox key: cgData values will return as "XX.X" and the loadsheet string will contain a watermark header. Switch to a live Pro key for full output.

POST https://www.eloadcontrol.com/api/v1/generate-loadsheet

The raw dispatch engine. Use this if your Virtual Airline has a custom dispatch system instead of SimBrief. You must manually provide all flight weights.

Request Body

Field Type Description
airline * String Airline ICAO code (e.g. "RYR"). Get valid values from GET /airlines.
flightNumber * String Flight number without the airline prefix (e.g. "1942").
departure * String Departure airport ICAO code (e.g. "EHAM").
destination * String Destination airport ICAO code (e.g. "EGLL").
type * String Aircraft ICAO code (e.g. "B738"). Use the icao field from GET /aircraft.
aircraftReg * String Aircraft registration (e.g. "EI-DCL").
cabinConfig * String Cabin configuration string (e.g. "Y189"). Must be valid for the aircraft type. Get valid values from GET /aircraft.
loadsheetFormat * String Template ID (e.g. "standard_iata"). Get valid values from GET /formats.
BOW * Number Basic Operating Weight in kg (e.g. 42264).
cargo * Number Total cargo weight in kg (e.g. 2100).
paxF / paxC / paxJ / paxW / paxY / paxO / paxG / paxX / paxP / paxZ Number Passenger counts per class. Use whichever fields match the classes in your selected cabinConfig. Common ones: paxF = First, paxC = Business, paxJ = Premium Economy, paxY = Economy. All default to 0 if omitted. At least one must be provided for passenger aircraft. For freighter flights, use paxSUP for supernumeraries instead.
paxWeight Number Standard weight per passenger in kg including baggage. Defaults to 86 if omitted.
crewAmount * String Flight deck / cabin crew in "FD/CC" format (e.g. "02/04").
blockFuel * Number Total block fuel in kg (e.g. 7500).
taxiFuel * Number Taxi fuel in kg (e.g. 200). Used to derive takeoff fuel when toFuel is not provided.
toFuel Number Takeoff fuel in kg. If provided, this value is used directly. If omitted, the server calculates it as blockFuel − taxiFuel. SimBrief integrations should pass this directly from the OFP as it is more precise.
tripFuel * Number Trip fuel burned en route in kg (e.g. 4100). Used to derive Landing Weight.
tripTime * String Estimated flight time in "HHMM" format (e.g. "0130" for 1h30m).
taxiTime * String Estimated taxi time in "HHMM" format (e.g. "0020").
date * String Flight date in "DDMMMYY" format (e.g. "28MAR26").
departureTime * String Scheduled departure time UTC in "HHMM" format (e.g. "1200").
editionNumber Number Loadsheet revision number. Increment each time you regenerate for the same flight. Defaults to 1.

* Required

Example JSON Request Body

{
  "airline": "RYR",
  "flightNumber": "1942",
  "departure": "EHAM",
  "destination": "EGLL",
  "type": "B738",
  "aircraftReg": "EI-DCL",
  "cabinConfig": "Y189",
  "loadsheetFormat": "standard_iata",
  "BOW": 42264,
  "cargo": 2100,
  "paxY": 140,
  "paxWeight": 86,
  "crewAmount": "02/04",
  "blockFuel": 7500,
  "taxiFuel": 200,
  "tripFuel": 4100,
  "tripTime": "0130",
  "taxiTime": "0020",
  "date": "28MAR26",
  "departureTime": "1200",
  "editionNumber": 1
}

Example JSON Response (Success)

{
  "loadsheet": "...",
  "loadPlanning": "CPT 1  :     0\nCPT 2  :   840\nCPT 3  :  1260\nCPT 4  :     0",
  "distributedCargo": [
    { "hold": "AFT", "section": "CPT 3", "load": 1260, "z": 225 },
    { "hold": "FWD", "section": "CPT 2", "load": 840,  "z": -200 }
  ],
  "acarsMessage": "...",
  "editionNumber": 1,
  "cgData": {
    "MACZFW": 25.4,
    "MACTOW": 24.1,
    "MACLAW": 24.8
  },
  "loadedIndices": {
    "ZFW": 56404,
    "TOW": 63704,
    "LAW": 59604,
    "LIZFW": 45.2,
    "LITOW": 48.1,
    "LILAW": 46.5
  },
  "aircraftMaxWeights": {
    "MZFW": 62750,
    "MTOW": 79000,
    "MLDW": 65317,
    "BOW": 42264
  },
  "cgLimits": {
    "forwardLimit": 15,
    "aftLimit": 38
  },
  "unit": "kgs"
}
Sandbox key: cgData values will return as "XX.X" and the loadsheet / acarsMessage strings will contain a watermark. Switch to a live Pro key for full output.

POST https://www.eloadcontrol.com/api/v1/calculate-cg

A lightweight CG-only engine. Provide flight weights and the API returns precise Center of Gravity percentages for ZFW, TOW, and LDW along with the structural envelope limits. Ideal for building interactive CG envelope charts in your dispatch UI. Returns full data with sandbox keys.

Important: This endpoint uses aircraftType (the full type name, e.g. "Boeing 737-800"), not the ICAO code. Use the type field returned by GET /aircraft.

Request Body

Field Type Description
aircraftType * String Full aircraft type name (e.g. "Boeing 737-800"). Use the type field from GET /aircraft. Not the ICAO code.
cabinConfig * String Cabin configuration string (e.g. "Y189"). Must be valid for the aircraft type.
BOW * Number Basic Operating Weight in kg.
cargo * Number Total cargo weight in kg.
paxF / paxC / paxJ / paxW / paxY / paxO / paxG / paxX / paxP / paxZ Number Passenger counts per class. Use whichever fields match the classes in your selected cabinConfig. Common ones: paxF = First, paxC = Business, paxJ = Premium Economy, paxY = Economy. All default to 0 if omitted. At least one must be provided for passenger aircraft.
paxWeight Number Standard weight per passenger in kg including baggage. Defaults to 84 if omitted.
blockFuel * Number Total block fuel in kg.
taxiFuel * Number Taxi fuel in kg. Subtracted from block fuel to derive takeoff fuel.
tripFuel * Number Trip fuel in kg. Subtracted from takeoff fuel to derive landing fuel.

* Required

At least one pax field required for passenger aircraft. Not required for freighter cabin configs.

Example JSON Request Body

{
  "aircraftType": "Boeing 737-800",
  "cabinConfig": "Y189",
  "BOW": 42264,
  "cargo": 2100,
  "paxY": 140,
  "paxWeight": 86,
  "blockFuel": 7500,
  "taxiFuel": 200,
  "tripFuel": 4100
}

Example JSON Response (Success)

{
  "unit": "kgs",
  "payload": 14140,
  "weights": {
    "ZFW": 56404,
    "TOW": 63704,
    "LDW": 59604,
    "BOW": 42264
  },
  "cgPercentageMACZFW": 25.4,
  "cgPercentageMACTOW": 24.1,
  "cgPercentageMACLDW": 24.8,
  "loadedIndices": {
    "DOI": 42.3,
    "LIZFW": 40.0,
    "LITOW": 43.8,
    "LILAW": 41.1
  },
  "envelope": {
    "forwardLimit": 15,
    "aftLimit": 38
  },
  "maxWeights": {
    "MTOW": 79000,
    "MZFW": 62750,
    "MLDW": 65317
  }
}

Common Errors

HTTP Code Error & Cause
400 "Invalid aircraft type"aircraftType did not match any aircraft. Use the full type string from GET /aircraft, e.g. "Boeing 737-800", not "B738".
404 "Cabin configuration '...' does not exist." — the cabinConfig string is not valid for this aircraft type. Check availableCabinConfigs from GET /aircraft.
3. Dispatch & Connectivity

POST https://www.eloadcontrol.com/api/v1/send-acars

Dispatches an ACARS telex message directly to an aircraft in the simulator via the Hoppie network. The API looks up the correct ICAO routing code based on the operator and flight number you provide. Requires a Pro License Key — sandbox test keys will return a watermarked message instead of dispatching.

Request Body

Field Type Description
logonCode * String The pilot's personal Hoppie logon code. This is obtained from hoppie.nl.
operator * String Airline ICAO code (e.g. "RYR"). Used to build the correct Hoppie callsign routing.
flightNumber * String Flight number without airline prefix (e.g. "1942"). Combined with operator to form the Hoppie callsign (e.g. RYR1942).
acarsMessage * String The raw ACARS telex string. Pass the acarsMessage field directly from a /generate-loadsheet or /generate-from-simbrief response.

* Required

Example JSON Request Body

{
  "logonCode": "your_hoppie_logon_code",
  "operator": "RYR",
  "flightNumber": "1942",
  "acarsMessage": "The raw telex string from the generate endpoint"
}

Example JSON Response (Success)

{
  "success": true,
  "message": "ACARS message dispatched to Hoppie network.",
  "hoppieResponse": "ok"
}

Edge Cases

Scenario What happens
Aircraft not logged into Hoppie The API returns 200 and the Hoppie network queues the message. It will be delivered when the aircraft connects. This is normal Hoppie behaviour.
Invalid Hoppie logon code Hoppie returns an error string in the hoppieResponse field (e.g. "error logon"). The API still returns HTTP 200 — always check hoppieResponse for "ok".
Sandbox test key used The acarsMessage from a sandbox generation call will be watermarked. The message will be sent to Hoppie as-is, including the watermark text. Use a live Pro key for real dispatch.

Thank you for integrating eLoadcontrol into your dispatch system. For feedback, questions, or feature requests contact [email protected].

A Product By

FlightSimPartner Logo
eLoadcontrol