Top SitesInfinite Flight | Carry Your Passion

Machine Readiness

Stored receipt and evidence

Overall

20

Readable

65

Callable

0

Commerce

0

Payment

0

Machine Access

Inspect the site's MCP endpoint

Open MCP explorer

DialtoneApp can scan the stored discovery files for this domain, try the MCP initialize handshake, and show the raw protocol transcript.

Purchase boundary

read only

Control boundary

unknown

Payment rails

None

Payment providers

None

Payment methods

None

Payment protocols

None

Payment assets

None

Payment networks

None

Capabilities

None

Verified payment surface

No

Crypto only

No

Readable docs

robots, llms

Products

0

Variants

0

Priced variants

0

Currencies

0

Offers

0

Priced offers

0

Priced actions

0

Samples

Offer samples

No stored offer samples.

Samples

Action samples

No stored action samples.

Samples

Product samples

No stored product samples.

Document

robots.txt

Open robots.txt
# 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

Document

llms.txt

Open llms.txt
# 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

Document

llms-full.txt

Not stored for this site.