# Infinite Flight | Carry Your Passion

> Markdown mirror of DialtoneApp's public top-site detail page for `infiniteflight.com`.

URL: https://dialtoneapp.com/top-sites/infiniteflight.com/index.md
Canonical HTML: https://dialtoneapp.com/top-sites/infiniteflight.com

## Summary

- Domain: `infiniteflight.com`
- Website: https://infiniteflight.com
- Description: ai readable | score 20 | purchase read only
- Label: ai_readable
- Payment surface: Not available
- Purchase boundary: read_only
- Control boundary: unknown
- Rank: 131240

## robots

~~~text
# As a condition of accessing this website, you agree to abide by the following
# content signals:

# (a)  If a Content-Signal = yes, you may collect content for the corresponding
#      use.
# (b)  If a Content-Signal = no, you may not collect content for the
#      corresponding use.
# (c)  If the website operator does not include a Content-Signal for a
#      corresponding use, the website operator neither grants nor restricts
#      permission via Content-Signal with respect to the corresponding use.

# The content signals and their meanings are:

# search:   building a search index and providing search results (e.g., returning
#           hyperlinks and short excerpts from your website's contents). Search does not
#           include providing AI-generated search summaries.
# ai-input: inputting content into one or more AI models (e.g., retrieval
#           augmented generation, grounding, or other real-time taking of content for
#           generative AI search answers).
# ai-train: training or fine-tuning AI models.

# ANY RESTRICTIONS EXPRESSED VIA CONTENT SIGNALS ARE EXPRESS RESERVATIONS OF
# RIGHTS UNDER ARTICLE 4 OF THE EUROPEAN UNION DIRECTIVE 2019/790 ON COPYRIGHT
# AND RELATED RIGHTS IN THE DIGITAL SINGLE MARKET.

# BEGIN Cloudflare Managed content

User-agent: *
Content-Signal: search=yes,ai-train=no
Allow: /

User-agent: Amazonbot
Disallow: /

User-agent: Applebot-Extended
Disallow: /

User-agent: Bytespider
Disallow: /

User-agent: CCBot
Disallow: /

User-agent: ClaudeBot
Disallow: /

User-agent: CloudflareBrowserRenderingCrawler
Disallow: /

User-agent: Google-Extended
Disallow: /

User-agent: GPTBot
Disallow: /

User-agent: meta-externalagent
Disallow: /

# END Cloudflare Managed Content
~~~

## llms

~~~text
# Infinite Flight Live API — Full Reference

> Simulated flight data only. Not for real-world aviation use.

---

## Base URL

    https://api.infiniteflight.com/public/v2

## Authentication

Every request requires an API key. Pass it one of two ways:
- Query parameter: `?apikey=YOUR_KEY`
- Header: `Authorization: Bearer YOUR_KEY`

Request a key: hello@infiniteflight.com

## Rate Limits

- Default: 30 requests/min per key.
- Pro subscription linked to key: 100 requests/min.
- Manual per-key overrides may be applied by Infinite Flight staff.
- If a Pro subscription lapses, the key returns to the free-tier default.
- Exceeding returns HTTP 429.

## IMPORTANT — Usage Rules

These rules are strictly enforced. Violating them will result in your API key and associated accounts being permanently banned.

### Mandatory Polling Intervals

Do NOT treat the Live API as a streaming feed. These are hard minimums that your code MUST enforce.

| Data | Minimum Interval | Notes |
|------|-----------------|-------|
| `GET /sessions`, `GET /sessions/{id}` | 10 min | Server-cached for 10 min. Faster polling returns identical data. |
| `GET .../flights`, `GET .../atc`, `GET .../airport/.../status` | 15 sec | Reuse list responses. Do not fetch individual items if the list already has the data. |
| `GET .../flights/{id}/route`, `GET .../flights/{id}/flightplan` | 15 sec | Only fetch when a user specifically requests a flight's details. |
| User endpoints (`/users/...`) | 5 min | Historical data. Cache aggressively. |
| `GET /aircraft`, `GET /aircraft/liveries`, `GET /airports` | 60 min+ | Reference data that rarely changes. Cache for the duration of your app session or longer. |

You MUST stop all polling after 15 minutes of user inactivity and resume only when the user explicitly interacts again.

### Mandatory Caching

All responses MUST be cached locally for at least the minimum interval before making a new request. If you have a cached response within the interval, you MUST return it — do not call the API again.

**Acceptable caching patterns:**

In-memory with TTL (C# example):
```csharp
// MemoryCache with absolute expiration
var options = new MemoryCacheEntryOptions()
    .SetAbsoluteExpiration(TimeSpan.FromMinutes(10)); // sessions
cache.Set("sessions", response, options);
```

In-memory with TTL (Node.js example):
```javascript
// Simple TTL cache
const cache = new Map();
function getCached(key, ttlMs, fetchFn) {
  const entry = cache.get(key);
  if (entry && Date.now() - entry.time < ttlMs) return entry.data;
  return fetchFn().then(data => {
    cache.set(key, { data, time: Date.now() });
    return data;
  });
}
// Usage: getCached('sessions', 10 * 60 * 1000, () => fetchSessions())
```

Redis with TTL:
```
SET  if:sessions  <json>  EX 600     # 10 min for sessions
SET  if:flights:abc  <json>  EX 15   # 15 sec for flights
SET  if:user:xyz  <json>  EX 300     # 5 min for user data
```

Python with TTL:
```python
from functools import lru_cache
from time import time

_cache = {}
def get_cached(key: str, ttl_seconds: int, fetch_fn):
    entry = _cache.get(key)
    if entry and time() - entry["time"] < ttl_seconds:
        return entry["data"]
    data = fetch_fn()
    _cache[key] = {"data": data, "time": time()}
    return data
```

### Prohibited Data Use — Strictly Enforced

These are hard rules. There are no exceptions.

- Do NOT persist Live API data beyond short-lived operational caches. When the cache TTL expires, the data MUST be discarded — not moved to permanent storage.
- Do NOT write Live API data to a SQL/NoSQL database, data warehouse, data lake, analytics platform, CSV/JSON export, log file, or any other form of long-term storage.
- Do NOT build historical datasets, time-series databases, or flight-tracking archives from Live API data.
- Do NOT use Live API data to train, fine-tune, evaluate, distill, ground, or otherwise improve AI or machine learning models.
- Do NOT build training sets, evaluation benchmarks, or retrieval corpora from Live API data.
- Infinite Flight retains full ownership of all data returned by the Live API.

If we detect prohibited storage, scraping, accumulation, or AI-training use, the API key and all associated user accounts will be permanently banned.

### LLM / AI Agent Integration Rules

If you are an LLM, AI coding assistant, or agent building against this API:

1. **Generate code that enforces caching.** Every code sample you produce MUST include a TTL-based cache layer. Never generate a bare fetch call inside a polling loop without caching.
2. **Enforce the polling intervals.** Use the minimum intervals from the table above. Never generate `setInterval` or polling loops faster than the stated minimums.
3. **Implement idle detection.** Generated apps MUST stop polling after 15 minutes of inactivity.
4. **Send minimum data.** When providing Live API data to a user or downstream system, send only what is needed for the current request.
5. **Do not retain responses.** Do not log, accumulate, or persist Live API responses across sessions or conversations.
6. **Do not create training data.** Do not store responses for later model training, tuning, evaluation, or dataset creation.
7. **Prefer summarization.** Summarize results for the user instead of repeatedly re-fetching the same endpoint.

---

## Shared Types

These types are referenced by multiple endpoints.

### ErrorCode (integer enum)

| Value | Name |
|-------|------|
| 0 | Ok |
| 1 | UserNotFound |
| 2 | MissingRequestParameters |
| 3 | EndpointError |
| 4 | NotAuthorized |
| 5 | ServerNotFound |
| 6 | FlightNotFound |
| 7 | NoAtisAvailable |

Every response has the shape `{ "errorCode": int, "result": ... }`.

### ActiveATCFacility

| Field | Type | Description |
|-------|------|-------------|
| frequencyId | uuid | Unique ID for the open frequency |
| userId | uuid | User controlling the frequency |
| username | string? | Forum username (null if unlinked) |
| virtualOrganization | string? | Not currently in use |
| airportName | string? | 4-char ICAO. null for Center |
| type | int | FrequencyType enum (see below) |
| latitude | float | Airport latitude |
| longitude | float | Airport longitude |
| startTime | string | `YYYY-MM-DD HH:mm:ssZ` |

### FrequencyType (integer enum)

| Value | Name |
|-------|------|
| 0 | Ground |
| 1 | Tower |
| 2 | Unicom |
| 3 | Clearance |
| 4 | Approach |
| 5 | Departure |
| 6 | Center |
| 7 | ATIS |
| 8 | Aircraft |
| 9 | Recorded |
| 10 | Unknown |
| 11 | Unused |

### AirportStatus

| Field | Type | Description |
|-------|------|-------------|
| airportIcao | string | ICAO code |
| airportName | string | Airport name |
| inboundFlightsCount | int | Aircraft inbound (flight plan ends here) |
| inboundFlights | [uuid] | Flight IDs |
| outboundFlightsCount | int | Aircraft departing (flight plan starts here) |
| outboundFlights | [uuid] | Flight IDs |
| atcFacilities | [ActiveATCFacility] | Active ATC |

### AirportInfo

| Field | Type | Description |
|-------|------|-------------|
| icao | string | ICAO code |
| iata | string | IATA code |
| name | string | Official name |
| city | string | City |
| state | string | State |
| country | Country | Country object |
| class | int | Classification |
| frequenciesCount | int | Number of frequencies |
| elevation | int | Elevation in feet |
| latitude | float | Latitude |
| longitude | float | Longitude |
| timezone | string | Timezone |
| has3dBuildings | bool | Has 3D buildings |
| hasJetbridges | bool | Has jet bridges |
| hasSafedockUnits | bool | Has Safedock units |
| hasTaxiwayRouting | bool | Has taxiway routing |

### Country

| Field | Type | Description |
|-------|------|-------------|
| name | string | Country name |
| isoCode | string | ISO code |

### WorldType (integer enum)

| Value | Name |
|-------|------|
| 0 | Solo |
| 1 | Casual |
| 2 | Training |
| 3 | Expert |
| 4 | Private |

### PilotState (integer enum)

Requires Infinite Flight 25.1+.

| Value | Name |
|-------|------|
| 0 | Active |
| 1 | AwayInFlight |
| 2 | AwayParked |
| 3 | InBackground |

### Roles (integer IDs)

| ID | Name |
|----|------|
| 1 | Infinite Flight Staff |
| 2 | Moderators |
| 64 | IFATC Members |

### ATC Ranks (integer IDs)

| ID | Name |
|----|------|
| 0 | Observer |
| 1 | ATC Trainee |
| 2 | ATC Apprentice |
| 3 | ATC Specialist |
| 4 | ATC Officer |
| 5 | ATC Supervisor |
| 6 | ATC Recruiter |
| 7 | ATC Manager |

### PaginatedList

| Field | Type | Description |
|-------|------|-------------|
| pageIndex | int | Current page index |
| totalPages | int | Total pages |
| totalCount | int | Total entries |
| hasPreviousPage | bool | Has previous page |
| hasNextPage | bool | Has next page |
| data | [T] | Entries for the page |

### Coordinate

| Field | Type | Description |
|-------|------|-------------|
| latitude | double | Decimal latitude |
| longitude | double | Decimal longitude |
| altitude | double | Decimal altitude |

---

## Endpoints

---

### GET /sessions

List active servers.

**Response** → `[SessionInfo]`

#### SessionInfo

| Field | Type | Description |
|-------|------|-------------|
| id | uuid | Server ID — use for all per-session endpoints |
| name | string | Server name |
| maxUsers | int | Max capacity |
| userCount | int | Current connected users |
| type | int | 0 = Unrestricted, 1 = Restricted |
| worldType | int | WorldType enum |
| minimumGradeLevel | int | Min grade index (add 1 for grade name) |
| minimumAppVersion | string | Min app version |
| maximumAppVersion | string? | Max app version |

```json
{
  "errorCode": 0,
  "result": [{
    "id": "89573c7f-d398-4281-bcc0-3e9b7f6b8492",
    "name": "Sample Server",
    "maxUsers": 1000,
    "userCount": 187,
    "type": 0,
    "worldType": 0,
    "minimumGradeLevel": 2,
    "minimumAppVersion": "24.3",
    "maximumAppVersion": null
  }]
}
```

---

### GET /sessions/{sessionId}/flights

List all flights on a server.

**Parameters:** `sessionId` (path, uuid, required)

**Response** → `[FlightEntry]`

#### FlightEntry

| Field | Type | Description |
|-------|------|-------------|
| flightId | uuid | Flight ID |
| userId | uuid | User ID |
| aircraftId | uuid | Aircraft type ID |
| liveryId | uuid | Livery + aircraft combo ID |
| username | string? | Forum username (null if unlinked) |
| virtualOrganization | string? | VO from forum account |
| callsign | string | Flight callsign |
| latitude | double | Current latitude |
| longitude | double | Current longitude |
| altitude | double | Altitude in feet |
| speed | double | Ground speed in knots |
| verticalSpeed | double | Vertical speed in ft/min |
| track | double | Track in degrees |
| heading | float | Heading in degrees |
| lastReport | string | `YYYY-MM-DD HH:mm:ssZ` |
| pilotState | int | PilotState enum (25.1+) |
| isConnected | bool | Currently connected (25.1+) |

```json
{
  "errorCode": 0,
  "result": [{
    "flightId": "348d1ba8-1e60-48ca-8278-42f019147de8",
    "userId": "3f8b28bf-bbb1-4024-80ae-2a0ea9b30685",
    "aircraftId": "de510d3d-04f8-46e0-8d65-55b888f33129",
    "liveryId": "c875c0e9-19c2-420d-8fb4-32c151bd797c",
    "username": "Cameron",
    "callsign": "EC-CAM",
    "latitude": 30.123,
    "longitude": 31.413,
    "altitude": 597.8,
    "speed": 185.38,
    "verticalSpeed": 2167.3,
    "track": 162.14,
    "heading": 159.34,
    "lastReport": "2020-10-02 00:46:19Z",
    "virtualOrganization": "IFATC [IFATC]",
    "pilotState": 0,
    "isConnected": true
  }]
}
```

---

### GET /sessions/{sessionId}/flights/{flightId}/route

Get the flown route of a flight. Only supported on Expert and Training servers.

**Parameters:** `sessionId` (path, uuid), `flightId` (path, uuid) — both required.

**Response** → `[PositionReport]`

#### PositionReport

| Field | Type | Description |
|-------|------|-------------|
| latitude | double | Decimal latitude |
| longitude | double | Decimal longitude |
| altitude | double | Altitude in feet |
| track | double | Course in degrees |
| groundSpeed | double | Ground speed in knots |
| date | string | `YYYY-MM-DDTHH:mm:ssZ` |

```json
{
  "errorCode": 0,
  "result": [{
    "latitude": 25.5299,
    "longitude": -80.337,
    "altitude": 18429.9,
    "track": 75.0,
    "groundSpeed": 194.67,
    "date": "2021-01-06T16:20:27.3275657Z"
  }]
}
```

---

### GET /sessions/{sessionId}/flights/{flightId}/flightplan

Get the flight plan for an active flight.

**Parameters:** `sessionId` (path, uuid), `flightId` (path, uuid) — both required. Flight must have a filed plan.

**Response** → `FlightPlanInfo`

#### FlightPlanInfo

| Field | Type | Description |
|-------|------|-------------|
| flightPlanId | uuid | Plan ID |
| flightId | uuid | Associated flight ID |
| waypoints | [string] | **Deprecated.** Array of waypoint names |
| lastUpdate | string | `YYYY-MM-DD HH:mm:ssZ` |
| flightPlanItems | [FlightPlanItem] | Waypoints and procedures |
| flightPlanType | int | 0 = VFR, 1 = IFR |

#### FlightPlanItem

| Field | Type | Description |
|-------|------|-------------|
| name | string | Waypoint or procedure name |
| type | int | Procedure type (only when children is populated): 0=SID, 1=STAR, 2=Approach, 3=Track, 5=Unknown |
| children | [FlightPlanItem]? | Waypoints inside a procedure. null if this item is a fix/VOR/user waypoint |
| identifier | string | Identifier (not unique) |
| altitude | int | User-set altitude in feet. -1 if not set |
| location | Coordinate | Position |

```json
{
  "errorCode": 0,
  "result": {
    "flightPlanId": "4a57de08-a3b1-48ba-a081-adeff0a5b503",
    "flightId": "0b8cc273-d97d-4223-afac-907d09d8ca8b",
    "waypoints": ["AMAHE", "L12R"],
    "lastUpdate": "2021-01-06 15:35:04Z",
    "flightPlanType": 1,
    "flightPlanItems": [
      {
        "name": "AMAHE",
        "type": 0,
        "children": null,
        "identifier": null,
        "altitude": -1,
        "location": { "latitude": 26.927, "longitude": -77.471, "altitude": 0 }
      },
      {
        "name": "L12R",
        "type": 2,
        "children": [
          {
            "name": "ZESTY",
            "type": 0,
            "children": null,
            "identifier": "ZESTY",
            "altitude": 4000,
            "location": { "latitude": 44.972, "longitude": -93.43, "altitude": 0 }
          }
        ],
        "identifier": "L12R",
        "altitude": 0,
        "location": { "latitude": 0, "longitude": 0, "altitude": 0 }
      }
    ]
  }
}
```

---

### GET /sessions/{sessionId}/atc

List active ATC frequencies on a server.

**Parameters:** `sessionId` (path, uuid, required)

**Response** → `[ActiveATCFacility]` (see Shared Types)

```json
{
  "errorCode": 0,
  "result": [{
    "frequencyId": "c2d7decc-2803-c905-5d88-81bc07626b1f",
    "userId": "3f8b28bf-bbb1-4024-80ae-2a0ea9b30685",
    "username": "Cameron",
    "virtualOrganization": null,
    "airportName": "LEPA",
    "type": 1,
    "latitude": 39.5516,
    "longitude": 2.7368,
    "startTime": "2020-10-02 15:47:25Z"
  }]
}
```

---

### GET /sessions/{sessionId}/airport/{airportIcao}/atis

Get ATIS for an airport on a server.

**Parameters:** `sessionId` (path, uuid), `airportIcao` (path, string) — both required.

**Response** → `string` (the ATIS text, or null if unavailable)

```json
{
  "errorCode": 0,
  "result": "Manchester Airport, ATIS information DELTA, time 2355 ZULU, ..."
}
```

---

### GET /sessions/{sessionId}/airport/{airportIcao}/status

Get ATC status and traffic counts for an airport.

**Parameters:** `sessionId` (path, uuid), `airportIcao` (path, string) — both required.

**Response** → `AirportStatus` (see Shared Types)

```json
{
  "errorCode": 0,
  "result": {
    "airportIcao": "VTBS",
    "airportName": "Suvarnabhumi Airport",
    "inboundFlightsCount": 40,
    "inboundFlights": ["4f559855-fecc-4a8a-a95e-1d097eed9b72"],
    "outboundFlightsCount": 19,
    "outboundFlights": ["59e9509b-214a-4f8c-9d45-29c4f7ea01d7"],
    "atcFacilities": [{
      "frequencyId": "23bea566-20a0-2858-a40e-179d0699afc1",
      "userId": "05328fc4-b651-45e9-8e1f-328095329484",
      "username": "Rhys_V",
      "airportName": "VTBS",
      "type": 4,
      "latitude": 13.6808,
      "longitude": 100.7477,
      "startTime": "2021-02-08 09:59:58Z"
    }]
  }
}
```

---

### GET /sessions/{sessionId}/world

Get status of all airports with activity on a server.

**Parameters:** `sessionId` (path, uuid, required)

**Response** → `[AirportStatus]` (see Shared Types)

---

### GET /sessions/{sessionId}/notams

List NOTAMs for a server.

**Parameters:** `sessionId` (path, uuid, required)

**Response** → `[NotamResult]`

#### NotamResult

| Field | Type | Description |
|-------|------|-------------|
| id | uuid | NOTAM ID |
| title | string | Short title |
| author | string | Author name |
| type | int | 0 = NOTAM, 1 = TFR |
| sessionId | uuid? | Session ID. null = all sessions |
| radius | float | Radius in NM |
| message | string | Full NOTAM text |
| latitude | double | Center latitude |
| longitude | double | Center longitude |
| icao | string | Nearest airport ICAO |
| floor | int | Low altitude in feet |
| ceiling | int | High altitude in feet |
| startTime | datetime | Effective from |
| endTime | datetime | Expires at |

```json
{
  "errorCode": 0,
  "result": [{
    "id": "53671e16-f937-47ca-a5db-c13b6a882851",
    "title": "Special Airport Procedures",
    "author": "Infinite Flight",
    "type": 0,
    "sessionId": "7e5dcd44-1fb5-49cc-bc2c-a9aab1f6a856",
    "radius": 3,
    "message": "Special Airport Procedures in Effect: ...",
    "latitude": 22.3165,
    "longitude": 114.2068,
    "icao": "VHHX",
    "floor": 0,
    "ceiling": 10000,
    "startTime": "2022-02-14T16:34:14.916",
    "endTime": "2100-01-01T16:34:00"
  }]
}
```

---

### GET /tracks

List active oceanic tracks.

**Parameters:** None.

**Response** → `[OceanicTrack]`

#### OceanicTrack

| Field | Type | Description |
|-------|------|-------------|
| name | string | Track name (usually a letter) |
| path | [string] | Waypoint names along the track |
| eastLevels | [int]? | Eastbound flight levels |
| westLevels | [int]? | Westbound flight levels |
| type | string | e.g. "North Atlantic Tracks" |
| lastSeen | string | `YYYY-MM-DDTHH:mm:ssZ` |

```json
{
  "errorCode": 0,
  "result": [{
    "name": "A",
    "path": ["DINIM", "51/20", "51/30", "50/40", "49/50", "JOOPY"],
    "eastLevels": null,
    "westLevels": [350, 370, 390],
    "type": "North Atlantic Tracks",
    "lastSeen": "2021-01-06T18:49:33.6300772Z"
  }]
}
```

---

### POST /users

Get stats for up to 25 users. At least one search parameter is required.

**Content-Type:** `application/json`

**Body:**

| Field | Type | Description |
|-------|------|-------------|
| userIds | [uuid]? | User IDs |
| discourseNames | [string]? | IFC usernames (case-insensitive) |
| userHashes | [string]? | User hashes (uppercase) |

**Response** → `[UserStats]`

#### UserStats

| Field | Type | Description |
|-------|------|-------------|
| userId | uuid | User ID |
| discourseUsername | string? | Forum username |
| virtualOrganization | string? | VO |
| onlineFlights | int | Multiplayer flights |
| violations | int | Total violations (L1+L2+L3) |
| violationCountByLevel | dict | `{ "level1": int, "level2": int, "level3": int }` |
| xp | double | Total XP |
| landingCount | int | Total landings |
| flightTime | double | Total flight time in minutes |
| atcOperations | int | Total ATC ops |
| atcRank | int? | ATC rank enum (null if not IFATC) |
| grade | int | Grade 1–5 |
| hash | string | Short-form user ID shown in-app |
| roles | [int] | Role IDs |
| groups | [uuid] | **Deprecated.** Group IDs |
| errorCode | int | Per-user status (not currently used) |

```json
{
  "errorCode": 0,
  "result": [{
    "userId": "2a11e620-1cc1-4ac6-90d1-18c4ed9cb913",
    "discourseUsername": "Cameron",
    "onlineFlights": 2449,
    "violations": 102,
    "violationCountByLevel": { "level1": 102, "level2": 0, "level3": 0 },
    "xp": 572128,
    "landingCount": 898,
    "flightTime": 45983,
    "atcOperations": 548,
    "atcRank": 7,
    "grade": 5,
    "hash": "5F0973A9",
    "roles": [1, 2, 64],
    "groups": [],
    "virtualOrganization": null,
    "errorCode": 0
  }]
}
```

---

### GET /users/{userId}

Get full grade table and detailed stats for a user.

**Parameters:** `userId` (path, uuid, required)

**Response** → `GradeInfo`

#### GradeInfo

Extends UserStats fields and adds:

| Field | Type | Description |
|-------|------|-------------|
| totalXP | double | Total multiplayer XP |
| total12MonthsViolations | int | Violations in last 12 months |
| gradeDetails | GradeConfiguration | Full grade table |
| lastLevel1ViolationDate | datetime | Default `0001-01-01T00:00:00` if none |
| lastLevel2ViolationDate | datetime | Default `0001-01-01T00:00:00` if none |
| lastLevel3ViolationDate | datetime | Default `0001-01-01T00:00:00` if none |
| lastReportViolationDate | datetime | Last L2 or L3 violation date |

#### GradeConfiguration

| Field | Type | Description |
|-------|------|-------------|
| grades | [Grade] | All grade definitions |
| gradeIndex | int | Index of user's current grade |
| ruleDefinitions | [GradeRuleDefinition] | Rule definitions |

#### Grade

| Field | Type | Description |
|-------|------|-------------|
| rules | [GradeRule] | Rules to meet |
| index | int | Grade index |
| name | string | Grade name |
| state | int | 0=Fail, 1=OK, 2=Warning |

#### GradeRule

| Field | Type | Description |
|-------|------|-------------|
| ruleIndex | int | Rule index |
| referenceValue | double | Required value |
| userValue | double | User's value |
| state | int | 0=Fail, 1=OK, 2=Warning |
| userValueString | string | Formatted user value |
| referenceValueString | string | Formatted required value |
| definition | GradeRuleDefinition | Rule definition |

#### GradeRuleDefinition

| Field | Type | Description |
|-------|------|-------------|
| name | string | Rule name |
| description | string | Rule description |
| property | string | GradeInfo property this rule checks |
| operator | int | 0=GreaterThan, 1=LesserThan, 2=GreaterThanOrEqual, 3=LesserThanOrEqual, 4=Equal, 5=DifferentThan |
| period | double | Time period for the rule |
| order | int | Display order |

---

### GET /users/{userId}/flights

Get user flight logbook (paginated).

**Parameters:** `userId` (path, uuid, required), `page` (query, int, default 1)

**Response** → `PaginatedList` of `UserFlight`

#### UserFlight

| Field | Type | Description |
|-------|------|-------------|
| id | uuid | Flight ID |
| created | datetime | Flight creation time |
| userId | uuid | User ID |
| aircraftId | uuid | Aircraft ID |
| liveryId | uuid | Livery ID (Casual server only) |
| callsign | string | Callsign |
| server | string | Server name |
| dayTime | float | Day flight time in minutes |
| nightTime | float | Night flight time in minutes |
| totalTime | float | Total flight time in minutes |
| landingCount | int | Landings |
| originAirport | string? | Departure ICAO |
| destinationAirport | string? | Arrival ICAO |
| xp | int | XP earned |
| worldType | int | WorldType enum |
| violations | [Violation] | Violations received |

#### Violation

| Field | Type | Description |
|-------|------|-------------|
| issuedBy | Issuer | Who issued it |
| level | int | Severity level |
| type | string | Violation type |
| description | string | Description |
| created | datetime | When recorded |

#### Issuer

| Field | Type | Description |
|-------|------|-------------|
| id | uuid | Issuer user ID |
| username | string | Username |
| callsign | string | Callsign |
| discourseUser | DiscourseUser? | Forum account info |

#### DiscourseUser

| Field | Type | Description |
|-------|------|-------------|
| userId | int | Discourse user ID |
| username | string | Discourse username |
| virtualOrganization | string? | VO |
| avatarTemplate | string | Avatar URL template |

---

### GET /users/{userId}/flights/{flightId}

Get a single logbook flight.

**Parameters:** `userId` (path, uuid), `flightId` (path, uuid) — both required.

**Response** → `UserFlight` (same schema as above)

---

### GET /users/{userId}/atc

Get user ATC session log (paginated).

**Parameters:** `userId` (path, uuid, required), `page` (query, int, default 1)

**Response** → `PaginatedList` of `UserAtcSession`

#### UserAtcSession

| Field | Type | Description |
|-------|------|-------------|
| id | uuid | Session ID |
| atcSessionGroupId | uuid | Group ID (multiple freqs at same airport) |
| facility | ATCFacility | Facility details |
| created | datetime | Frequency opened |
| updated | datetime | Last report received |
| operations | int | Ops earned |
| totalTime | double | Duration in minutes |
| worldType | int | WorldType enum |
| server | string | Server name |
| violationsIssued | int | Violations issued while controlling |

#### ATCFacility

| Field | Type | Description |
|-------|------|-------------|
| id | uuid | Facility ID |
| airportIcao | string | Airport ICAO |
| latitude | double | Latitude |
| longitude | double | Longitude |
| frequencyType | int | FrequencyType enum |

---

### GET /users/{userId}/atc/{atcSessionId}

Get a single ATC session.

**Parameters:** `userId` (path, uuid), `atcSessionId` (path, uuid) — both required.

**Response** → `UserAtcSession` (same schema as above)

---

### GET /aircraft

List all aircraft models.

**Response** → `[AircraftPackage]`

#### AircraftPackage

| Field | Type | Description |
|-------|------|-------------|
| id | uuid | Aircraft ID |
| name | string | Aircraft name |

---

### GET /aircraft/{aircraftId}/liveries

List liveries for an aircraft model.

**Parameters:** `aircraftId` (path, uuid, required)

**Response** → `[LiveryData]`

#### LiveryData

| Field | Type | Description |
|-------|------|-------------|
| id | uuid | Livery ID |
| aircraftID | uuid | Aircraft model ID |
| aircraftName | string | Aircraft name |
| liveryName | string | Livery name |

---

### GET /aircraft/liveries

List all liveries across all aircraft.

**Response** → `[LiveryData]` (same schema as above)

---

### GET /airport/{airportIcao}

Get information about an airport.

**Parameters:** `airportIcao` (path, string, required)

**Response** → `AirportInfo` (see Shared Types)

---

### GET /airports

List all 3D airports.

**Response** → `[AirportInfo]` (see Shared Types)

---

## Samples & Libraries

Repository: https://github.com/Velocity23/infiniteflightlive-samples

Available in: NodeJS, C#, Kotlin, PHP, Python, Swift, Go
~~~

## llms-full

Not found.