> For the complete documentation index, see [llms.txt](https://developer.fotokite.com/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://developer.fotokite.com/~/changes/46/fotokite-api/models.md).

# Models

## The SpecFileVersion object

```json
{"openapi":"3.0.4","info":{"title":"Fotokite API","version":"0.2.0"},"components":{"schemas":{"SpecFileVersion":{"type":"object","description":"SemVer version number of the Fotokite API.","required":["version"],"properties":{"version":{"description":"The version number","type":"string"}}}}}}
```

## The Error object

```json
{"openapi":"3.0.4","info":{"title":"Fotokite API","version":"0.2.0"},"components":{"schemas":{"Error":{"type":"object","description":"A generic error object.","required":["code","message"],"properties":{"code":{"description":"Unique error code.","type":"string"},"message":{"description":"User readable message of the error","type":"string"}}}}}}
```

## The OnlineState object

```json
{"openapi":"3.0.4","info":{"title":"Fotokite API","version":"0.2.0"},"components":{"schemas":{"OnlineState":{"type":"string","description":"Online state of the payload.\n  * `Online` - payload is on and available to the system.\n  * `Offline` - payload is not available for some reason.\n","enum":["Online","Offline"]}}}}
```

## The Scopes object

```json
{"openapi":"3.0.4","info":{"title":"Fotokite API","version":"0.2.0"},"components":{"schemas":{"Scopes":{"type":"string","description":"Available OAuth2 scopes. > - `info` - Read static information about the system. - `telemetry` - Read dynamic information about the system. - `command` - Send commands to the system. - `media` - Interaction with the media library. - `internal` - Fotokite-internal APIs. Not for third-party use."}}}}
```

## The System object

```json
{"openapi":"3.0.4","info":{"title":"Fotokite API","version":"0.2.0"},"components":{"schemas":{"System":{"type":"object","description":"Represents system information","required":["gs_name","gs_mac","kite_name","rtb_name","installation","model","timezone","timezone_name_short","timezone_offset","boards"],"properties":{"gs_name":{"description":"Identity of the Ground Station","type":"string"},"gs_mac":{"description":"The MAC address of the router WAN port","type":"string"},"kite_name":{"description":"Name of the Kite","type":"string"},"rtb_name":{"description":"Name of the Rooftop Box (RTB)","type":"string"},"installation":{"description":"Type of installation (RTB, Transport Case, Tray Mount, DevKit)","type":"string"},"model":{"description":"Model/generation of the Fotokite system","type":"string"},"timezone":{"description":"Timezone of the Fotokite system","type":"string"},"timezone_name_short":{"description":"Short name of the timezone","type":"string"},"timezone_offset":{"description":"Offset of the timezone","type":"string"},"boards":{"type":"array","description":"List of system boards","items":{"$ref":"#/components/schemas/SystemBoard"}}}},"SystemBoard":{"type":"object","description":"Represents a system board","required":["board","id"],"properties":{"board":{"type":"string","description":"Available system board names"},"id":{"description":"Unique identifier of a system board (e.g. \"001111211136511134311FFF\")\n","type":"string"}}}}}}
```

## The SystemBoard object

```json
{"openapi":"3.0.4","info":{"title":"Fotokite API","version":"0.2.0"},"components":{"schemas":{"SystemBoard":{"type":"object","description":"Represents a system board","required":["board","id"],"properties":{"board":{"type":"string","description":"Available system board names"},"id":{"description":"Unique identifier of a system board (e.g. \"001111211136511134311FFF\")\n","type":"string"}}}}}}
```

## The SystemDynamicInfo object

```json
{"openapi":"3.0.4","info":{"title":"Fotokite API","version":"0.2.0"},"components":{"schemas":{"SystemDynamicInfo":{"type":"object","description":"Represents frequently changing system information\n","properties":{"kite_battery_level":{"description":"Kite backup battery charge level in percents [0..+100]","type":"number","minimum":0,"maximum":100},"gs_battery_level":{"description":"Ground Station backup battery charge level in percents [0..+100]","type":"number","minimum":0,"maximum":100},"gs_input_voltage":{"description":"Ground Station input voltage (volts)","type":"number"},"rtb_lids_state":{"$ref":"#/components/schemas/RTBLidsState"},"gs_gps_has_fix":{"description":"Whether the data reported by the Ground Station GPS is useable","type":"boolean"},"gs_gps_lat":{"description":"Latitude reported by Ground Station GPS [-90..+90] (degrees)","type":"number","minimum":-90,"exclusiveMinimum":true,"maximum":90},"gs_gps_lon":{"description":"Longitude reported by Ground Station GPS (-180..+180] (degrees)","type":"number","minimum":-180,"exclusiveMinimum":true,"maximum":180},"gs_gps_elevation":{"description":"Elevation reported by Ground Station GPS (meters)","type":"number"},"gs_gps_accuracy":{"description":"Ground Station GPS accuracy in meters","type":"number","minimum":0}}},"RTBLidsState":{"type":"string","description":"Rooftop Box (RTB) lids state\n","enum":["Closed","Opening","Opened","Closing"]}}}}
```

## The RTBLidsState object

```json
{"openapi":"3.0.4","info":{"title":"Fotokite API","version":"0.2.0"},"components":{"schemas":{"RTBLidsState":{"type":"string","description":"Rooftop Box (RTB) lids state\n","enum":["Closed","Opening","Opened","Closing"]}}}}
```

## The CameraInfo object

```json
{"openapi":"3.0.4","info":{"title":"Fotokite API","version":"0.2.0"},"components":{"schemas":{"CameraInfo":{"type":"object","description":"Camera information","required":["online_state"],"properties":{"online_state":{"description":"If Online then the camera is powered on and can be used. This also means that the data about camera is up-to-date. If Offline then the camera is powered off or not connected to the system. In this case the data about the last online camera is provided. And this information may be inaccurate due to payload swap.\n","$ref":"#/components/schemas/OnlineState"},"model":{"description":"Camera model. Allows to identify the camera type. Possible values:\n* `SigCam1` - Sigma camera 1. It has one color and one thermal module.\n* `SigCam2` - Sigma camera 2. It has two color and one thermal module. One color video stream has 32x zoom capabilities. Thermal module has resolution of 320x240.\n* `SigCam2+` - Sigma camera 2+. It has two color and one thermal module. Thermal module is upgraded to a resolution of 640x512.\n","type":"string"},"video_streams":{"description":"List of video streams available on the camera.","type":"array","items":{"$ref":"#/components/schemas/VideoStreamStaticInfo"}}}},"OnlineState":{"type":"string","description":"Online state of the payload.\n  * `Online` - payload is on and available to the system.\n  * `Offline` - payload is not available for some reason.\n","enum":["Online","Offline"]},"VideoStreamStaticInfo":{"type":"object","description":"Information about video stream","required":["id","type","sensor_width","sensor_height","lens_focal_length","zoom_min","zoom_max","can_do_snapshot"],"properties":{"id":{"description":"Unique video stream identifier.","type":"string"},"type":{"$ref":"#/components/schemas/VideoStreamType"},"sensor_width":{"description":"Sensor width in mm.","type":"number"},"sensor_height":{"description":"Sensor height in mm.","type":"number"},"lens_focal_length":{"description":"Lens focal length in mm. This value is constant and is not affected by zoom. This value corresponds to the `zoom_min` value.\n","type":"number"},"zoom_min":{"description":"Minimum zoom level.","type":"number"},"zoom_max":{"description":"Maximum zoom level.","type":"number"},"can_do_snapshot":{"description":"If true then the video stream supports snapshot functionality. This means that the video stream can provide a snapshot image.\n","type":"boolean"}}},"VideoStreamType":{"type":"string","description":"Video stream type. Possible values:\n* `Color` - regular color video stream.\n* `Thermal` - thermal video stream.\n"}}}}
```

## The VideoStreamStaticInfo object

```json
{"openapi":"3.0.4","info":{"title":"Fotokite API","version":"0.2.0"},"components":{"schemas":{"VideoStreamStaticInfo":{"type":"object","description":"Information about video stream","required":["id","type","sensor_width","sensor_height","lens_focal_length","zoom_min","zoom_max","can_do_snapshot"],"properties":{"id":{"description":"Unique video stream identifier.","type":"string"},"type":{"$ref":"#/components/schemas/VideoStreamType"},"sensor_width":{"description":"Sensor width in mm.","type":"number"},"sensor_height":{"description":"Sensor height in mm.","type":"number"},"lens_focal_length":{"description":"Lens focal length in mm. This value is constant and is not affected by zoom. This value corresponds to the `zoom_min` value.\n","type":"number"},"zoom_min":{"description":"Minimum zoom level.","type":"number"},"zoom_max":{"description":"Maximum zoom level.","type":"number"},"can_do_snapshot":{"description":"If true then the video stream supports snapshot functionality. This means that the video stream can provide a snapshot image.\n","type":"boolean"}}},"VideoStreamType":{"type":"string","description":"Video stream type. Possible values:\n* `Color` - regular color video stream.\n* `Thermal` - thermal video stream.\n"}}}}
```

## The VideoStreamType object

```json
{"openapi":"3.0.4","info":{"title":"Fotokite API","version":"0.2.0"},"components":{"schemas":{"VideoStreamType":{"type":"string","description":"Video stream type. Possible values:\n* `Color` - regular color video stream.\n* `Thermal` - thermal video stream.\n"}}}}
```

## The RotateCameraByAngle object

```json
{"openapi":"3.0.4","info":{"title":"Fotokite API","version":"0.2.0"},"components":{"schemas":{"RotateCameraByAngle":{"type":"object","description":"Pan Kite and tilt camera by angle command arguments. If a property is missed then the Kite or camera will not be rotated in this direction.\n","properties":{"pan":{"description":"Change camera pan by this angle in degrees. Positive value means that the camera is rotated to the right.\n","type":"number","minimum":-180,"maximum":180},"tilt":{"description":"Change camera tilt by this angle in degrees. Positive value means that the camera is rotated up.\n","type":"number","minimum":-180,"exclusiveMinimum":true,"maximum":180}}}}}}
```

## The RotateCameraToAngle object

```json
{"openapi":"3.0.4","info":{"title":"Fotokite API","version":"0.2.0"},"components":{"schemas":{"RotateCameraToAngle":{"type":"object","description":"Pan Kite and tilt camera to angle command arguments. If a property is missed then the Kite or camera will not be rotated in this direction.\n","properties":{"heading":{"description":"Rotate the camera (set its heading) to the heading specified [0..+360) (degrees). 0 - North, 90 - East, 180 - South, 270 - West.\n","type":"number","minimum":0,"maximum":360,"exclusiveMaximum":true},"tilt":{"description":"Tilt to rotate to in degrees. 0 - means that the camera is looking straight forward. -90 - means that the camera is looking straight down. +90 - means that the camera is looking straight up. +180 - means that the camera is looking backward and upside down.\n","type":"number","minimum":-180,"exclusiveMinimum":true,"maximum":180}}}}}}
```

## The RotateCameraWithSpeed object

```json
{"openapi":"3.0.4","info":{"title":"Fotokite API","version":"0.2.0"},"components":{"schemas":{"RotateCameraWithSpeed":{"type":"object","description":"Rotate camera with speed command data","required":["duration"],"properties":{"pan_speed":{"description":"Change the camera pan with the angle speed specified. Positive value - rotate clockwise (degrees/sec). Minimum absolute speed is `camera_pan_speed_min` (degrees/sec). Maximum absolute speed is `camera_pan_speed_max` (degrees/sec). If parameter missed then pan speed is considered to be 0 (no pan).\n","type":"number"},"tilt_speed":{"description":"Change the camera tilt with the angle speed specified. Positive value - rotate up (degrees/sec). Minimum absolute speed is `camera_tilt_speed_min` (degrees/sec). Maximum absolute speed is `camera_tilt_speed_max` (degrees/sec). If parameter missed then tilt speed is considered to be 0 (no tilt).\n","type":"number"},"duration":{"description":"Duration of the command in seconds. The camera will rotate with the speed specified for the time specified.\n","type":"number","minimum":0.1,"maximum":10}}}}}}
```

## The VideoStreamInfo object

```json
{"openapi":"3.0.4","info":{"title":"Fotokite API","version":"0.2.0"},"components":{"schemas":{"VideoStreamInfo":{"type":"object","description":"Information about video stream. This information is mostly static but may change based on a user request.","required":["id","protocol","codec","url"],"properties":{"id":{"description":"Unique video stream identifier.","type":"string"},"protocol":{"description":"Video stream protocol. Possible values:\n- `RTP`\n","type":"string"},"frame_width":{"description":"Video frames width. Presented for fixed resolution encoders.","type":"integer"},"frame_height":{"description":"Video frames height. Presented for fixed resolution encoders.","type":"integer"},"codec":{"description":"Video codec. Possible values:\n- `H.264`\n","type":"string"},"url":{"description":"Video stream url.","type":"string"}}}}}}
```

## The VideoStreamTelemetry object

```json
{"openapi":"3.0.4","info":{"title":"Fotokite API","version":"0.2.0"},"components":{"schemas":{"VideoStreamTelemetry":{"type":"object","description":"Dynamic (frequently changing) information about video stream","required":["id","is_streaming"],"properties":{"id":{"description":"Unique video stream identifier.","type":"string"},"is_streaming":{"description":"If true then the video stream is currently streaming.\n","type":"boolean"},"timestamp":{"description":"Video timestamp of the last video frame. For RTP video streams this is the RTP timestamp.\n","type":"number"},"fov_horizontal":{"description":"Horizontal field of view in degrees.","type":"number"},"fov_vertical":{"description":"Vertical field of view in degrees.","type":"number"},"zoom_level":{"description":"Current zoom level.","type":"number"},"camera_pan":{"description":"Camera pan angle in degrees. 0 - The camera is facing directly forward relative to the Kite. +90 - The camera is facing directly to the right side of the Kite. +180 - The camera is facing directly backward relative to the Kite. -90 - The camera is facing directly to the left side of the Kite.\n","type":"number","minimum":-180,"exclusiveMinimum":true,"maximum":180},"camera_tilt":{"description":"Camera tilt angle in degrees. 0 - The camera is level, looking straight ahead relative to the Kite. -90 - The camera is pointing straight down relative to the Kite. +90 - The camera is pointing straight up relative to the Kite.\n","type":"number","minimum":-180,"exclusiveMinimum":true,"maximum":180},"camera_roll":{"description":"Camera roll angle in degrees. 0 - The camera is level, with the top facing upward. +90 - The top of the camera is rotated to the right. +180 - The top of the camera is facing downward. -90 - The top of the camera is rotated to the left.\n","type":"number","minimum":-180,"exclusiveMinimum":true,"maximum":180},"thermal_color_palette":{"description":"Thermal color palette. This property is present only for thermal video streams. If the video stream is not thermal then this property is absent.\n","allOf":[{"$ref":"#/components/schemas/ThermalColorPalette"}]}}},"ThermalColorPalette":{"type":"string","description":"Thermal color palette. Possible values: - `WhiteHot` - `BlackHot` - `Rainbow` - `RainbowHighContrast` - `Ironbow` - `Lava` - `Arctic` - `Glowbow` - `GradedFire` - `Hottest`\n"}}}}
```

## The ThermalColorPalette object

```json
{"openapi":"3.0.4","info":{"title":"Fotokite API","version":"0.2.0"},"components":{"schemas":{"ThermalColorPalette":{"type":"string","description":"Thermal color palette. Possible values: - `WhiteHot` - `BlackHot` - `Rainbow` - `RainbowHighContrast` - `Ironbow` - `Lava` - `Arctic` - `Glowbow` - `GradedFire` - `Hottest`\n"}}}}
```

## The NotificationDictionaryItem object

```json
{"openapi":"3.0.4","info":{"title":"Fotokite API","version":"0.2.0"},"components":{"schemas":{"NotificationDictionaryItem":{"type":"object","description":"Notification dictionary item object","required":["code","severity","message"],"properties":{"code":{"description":"Notification code","type":"integer"},"severity":{"$ref":"#/components/schemas/NotificationSeverity","description":"Notification severity"},"message":{"description":"Description message","type":"string"},"system_reaction":{"description":"System reaction message\n","type":"string"},"instructions":{"description":"User instructions message\n","type":"string"}}},"NotificationSeverity":{"type":"string","description":"Notification severity enumeration. * `Info` - Something happened that is not an issue, but may be of interest * `Warning` - Something bad happened, but functionality is not affected * `Critical` - Something bad happened, some functionality is broken * `Fatal` - Something bad happened, system is not functional\n","enum":["Info","Warning","Critical","Fatal"]}}}}
```

## The NotificationsObject object

```json
{"openapi":"3.0.4","info":{"title":"Fotokite API","version":"0.2.0"},"components":{"schemas":{"NotificationsObject":{"type":"object","description":"Notifications object","required":["to_time","notifications"],"properties":{"from_time":{"description":"The time from which notifications are sent (including the time point itself). In RFC3339 (section 5.6) format. This value typically comes from request query parameter. If request parameter is missed then only currently active notifications returned and `from_time` is missed. If too many notifications were requested then the value is set to the `end_time` of the first returned notification.\n","type":"string","format":"date-time"},"to_time":{"description":"Current system time up to which notifications were fetched (excluding the time point itself). In RFC3339 (section 5.6) format.","type":"string","format":"date-time"},"notifications":{"description":"Notifications array. If no notifications are registered in the time interval from `from_time` to `to_time` then the array is empty.","type":"array","items":{"$ref":"#/components/schemas/Notification"}}}},"Notification":{"type":"object","description":"One notification item","required":["severity","code","message","begin_time"],"properties":{"severity":{"$ref":"#/components/schemas/NotificationSeverity","description":"Notification severity"},"code":{"description":"Notification code. See the dictionary for all possible codes.","type":"integer"},"message":{"description":"Notification message. This is a human-readable message of the notification. It may contain parameters that are used in the notification texts.","type":"string"},"begin_time":{"description":"Notification begin time. This is the time point when the notification was initially detected. In RFC3339 (section 5.6) format.","type":"string","format":"date-time"},"end_time":{"description":"Notification end time. This is the time point when the notification was gone. In RFC3339 (section 5.6) format. If notification is still not gone then the property is absent.","type":"string","format":"date-time"},"parameters":{"description":"Notification parameters. This is a dictionary of key-value pairs that are used in the notification texts. The keys are defined in the notification code dictionary.\n","type":"object","additionalProperties":true}}},"NotificationSeverity":{"type":"string","description":"Notification severity enumeration. * `Info` - Something happened that is not an issue, but may be of interest * `Warning` - Something bad happened, but functionality is not affected * `Critical` - Something bad happened, some functionality is broken * `Fatal` - Something bad happened, system is not functional\n","enum":["Info","Warning","Critical","Fatal"]}}}}
```

## The Notification object

```json
{"openapi":"3.0.4","info":{"title":"Fotokite API","version":"0.2.0"},"components":{"schemas":{"Notification":{"type":"object","description":"One notification item","required":["severity","code","message","begin_time"],"properties":{"severity":{"$ref":"#/components/schemas/NotificationSeverity","description":"Notification severity"},"code":{"description":"Notification code. See the dictionary for all possible codes.","type":"integer"},"message":{"description":"Notification message. This is a human-readable message of the notification. It may contain parameters that are used in the notification texts.","type":"string"},"begin_time":{"description":"Notification begin time. This is the time point when the notification was initially detected. In RFC3339 (section 5.6) format.","type":"string","format":"date-time"},"end_time":{"description":"Notification end time. This is the time point when the notification was gone. In RFC3339 (section 5.6) format. If notification is still not gone then the property is absent.","type":"string","format":"date-time"},"parameters":{"description":"Notification parameters. This is a dictionary of key-value pairs that are used in the notification texts. The keys are defined in the notification code dictionary.\n","type":"object","additionalProperties":true}}},"NotificationSeverity":{"type":"string","description":"Notification severity enumeration. * `Info` - Something happened that is not an issue, but may be of interest * `Warning` - Something bad happened, but functionality is not affected * `Critical` - Something bad happened, some functionality is broken * `Fatal` - Something bad happened, system is not functional\n","enum":["Info","Warning","Critical","Fatal"]}}}}
```

## The NotificationSeverity object

```json
{"openapi":"3.0.4","info":{"title":"Fotokite API","version":"0.2.0"},"components":{"schemas":{"NotificationSeverity":{"type":"string","description":"Notification severity enumeration. * `Info` - Something happened that is not an issue, but may be of interest * `Warning` - Something bad happened, but functionality is not affected * `Critical` - Something bad happened, some functionality is broken * `Fatal` - Something bad happened, system is not functional\n","enum":["Info","Warning","Critical","Fatal"]}}}}
```

## The TakeoffAltitude object

```json
{"openapi":"3.0.4","info":{"title":"Fotokite API","version":"0.2.0"},"components":{"schemas":{"TakeoffAltitude":{"type":"object","description":"Kite takeoff altitude","properties":{"altitude":{"description":"Kite takeoff altitude (meters). Property is not presented when the value is unknown.","type":"number"}}}}}}
```

## The FlightHardLimits object

```json
{"openapi":"3.0.4","info":{"title":"Fotokite API","version":"0.2.0"},"components":{"schemas":{"FlightHardLimits":{"type":"object","description":"Flight hard limits","required":["altitude_max","camera_pan_speed_min","camera_pan_speed_max","camera_tilt_speed_min","camera_tilt_speed_max"],"properties":{"altitude_max":{"description":"Maximum altitude of the Fotokite system (meters).\n","type":"number"},"camera_pan_speed_min":{"description":"Minimum absolute pan speed of the camera (degrees/sec)","type":"number"},"camera_pan_speed_max":{"description":"Maximum absolute pan speed of the camera (degrees/sec)","type":"number"},"camera_tilt_speed_min":{"description":"Minimum absolute tilt speed of the camera (degrees/sec)","type":"number"},"camera_tilt_speed_max":{"description":"Maximum absolute tilt speed of the camera (degrees/sec)","type":"number"}}}}}}
```

## The FlightDynamicInfo object

```json
{"openapi":"3.0.4","info":{"title":"Fotokite API","version":"0.2.0"},"components":{"schemas":{"FlightDynamicInfo":{"type":"object","description":"Represents frequently changing flight information. A property is not presented if it could not be gathered (for example due to a magnetometer or a GPS issue). Note: there is always a margin of error between the altitude_target and the altitude the Kite will take. And this error is not a constant.\n","required":["flight_state"],"properties":{"flight_state":{"$ref":"#/components/schemas/FlightState"},"altitude":{"description":"Current Kite altitude above the Ground Station (meters)","type":"number","minimum":0},"altitude_target":{"description":"Target Kite altitude set by the user (meters)","type":"number","minimum":0},"kite_heading":{"description":"Kite heading [0..+360) (degrees)","type":"number","minimum":0,"maximum":360,"exclusiveMaximum":true},"is_rotating":{"description":"Whether Kite is rotating (changing heading) as a result of the rotation command. True - Kite is rotating\n","type":"boolean"},"is_changing_altitude":{"description":"Whether Kite is changing altitude as a result of the set altitude command. True - Kite is changing altitude\n","type":"boolean"},"kite_gps_has_fix":{"description":"Whether the data reported by the Kite GPS is useable","type":"boolean"},"kite_gps_lat":{"description":"Latitude reported by Kite GPS [-90..+90] (degrees)","type":"number","minimum":-90,"maximum":90},"kite_gps_lon":{"description":"Longitude reported by Kite GPS (-180..+180] (degrees)","type":"number","minimum":-180,"exclusiveMinimum":true,"maximum":180},"kite_gps_elevation":{"description":"Elevation reported by Kite GPS (meters)","type":"number"},"kite_gps_accuracy":{"description":"Kite GPS accuracy in meters","type":"number","minimum":0}}},"FlightState":{"type":"string","description":"Flight state enumeration\n  * `Unknown` - We couldn't get required data to conclude flight sate. This may happen due to numerous reasons:\n    Kite detached, Kite power is off, etc. More information can be found in notifications.\n  * `StandBy` - Kite is on the Ground Station\n  * `TakingOff` - Kite is doing preflight checks or taking off\n  * `Flying` - Kite is flying\n  * `Landing` - Kite is landing\n  * `SafetyLanding` - Kite is landing due to a critical issue happened during the flight.\n    More information can be found in notifications.\n  * `SafetyDescending` - Kite is descending for safety reasons (due to strong wind or weak GPS signal).\n    More information can be found in notifications.\n","enum":["Unknown","StandBy","TakingOff","Flying","Landing","SafetyLanding","SafetyDescending"]}}}}
```

## The FlightState object

```json
{"openapi":"3.0.4","info":{"title":"Fotokite API","version":"0.2.0"},"components":{"schemas":{"FlightState":{"type":"string","description":"Flight state enumeration\n  * `Unknown` - We couldn't get required data to conclude flight sate. This may happen due to numerous reasons:\n    Kite detached, Kite power is off, etc. More information can be found in notifications.\n  * `StandBy` - Kite is on the Ground Station\n  * `TakingOff` - Kite is doing preflight checks or taking off\n  * `Flying` - Kite is flying\n  * `Landing` - Kite is landing\n  * `SafetyLanding` - Kite is landing due to a critical issue happened during the flight.\n    More information can be found in notifications.\n  * `SafetyDescending` - Kite is descending for safety reasons (due to strong wind or weak GPS signal).\n    More information can be found in notifications.\n","enum":["Unknown","StandBy","TakingOff","Flying","Landing","SafetyLanding","SafetyDescending"]}}}}
```

## The FlightSoftLimits object

```json
{"openapi":"3.0.4","info":{"title":"Fotokite API","version":"0.2.0"},"components":{"schemas":{"FlightSoftLimits":{"type":"object","description":"Kite flight soft limits set by an operator.","required":["altitude_max"],"properties":{"altitude_max":{"description":"Maximum altitude the Kite can fly if soft limit has been set in Fotokite Live by the user or the API (meters). This value resets on system reboot.\n","type":"number"}}}}}}
```

## The RecorderStatus object

```json
{"openapi":"3.0.4","info":{"title":"Fotokite API","version":"0.2.0"},"components":{"schemas":{"RecorderStatus":{"type":"object","description":"Current status of the video recorder.","required":["directory","started_recording_timestamp"],"properties":{"directory":{"type":"string","description":"Directory path of the recording on the filesystem (URL-encoded)."},"started_recording_timestamp":{"type":"string","format":"date-time","description":"Last time a recording was started since boot, or zero otherwise."},"stopped_recording_timestamp":{"type":"string","format":"date-time","description":"Last time a recording was stopped, or current time if recording."},"is_recording":{"type":"boolean","description":"Whether the recorder is currently running."},"recording_seconds":{"type":"integer","format":"int32","description":"Number of seconds the current recording has been running."}}}}}}
```

## The Recording object

```json
{"openapi":"3.0.4","info":{"title":"Fotokite API","version":"0.2.0"},"components":{"schemas":{"Recording":{"type":"object","description":"Represents a video recording, including video files and metadata.","required":["directory","is_being_recorded","videos"],"properties":{"directory":{"type":"string","description":"Directory of the recording, URL-encoded."},"is_being_recorded":{"type":"boolean","description":"Whether this recording is currently being recorded."},"videos":{"type":"array","items":{"$ref":"#/components/schemas/VideoFile"}}}},"VideoFile":{"description":"Represents a video file in a recording, including metadata.","type":"object","required":["type","directory","name","size","is_recording"],"properties":{"type":{"$ref":"#/components/schemas/VideoStreamType"},"directory":{"type":"string","description":"Directory of the video recording on the FS"},"name":{"type":"string"},"size":{"type":"integer","format":"int64"},"is_recording":{"type":"boolean"}}},"VideoStreamType":{"type":"string","description":"Video stream type. Possible values:\n* `Color` - regular color video stream.\n* `Thermal` - thermal video stream.\n"}}}}
```

## The VideoFile object

```json
{"openapi":"3.0.4","info":{"title":"Fotokite API","version":"0.2.0"},"components":{"schemas":{"VideoFile":{"description":"Represents a video file in a recording, including metadata.","type":"object","required":["type","directory","name","size","is_recording"],"properties":{"type":{"$ref":"#/components/schemas/VideoStreamType"},"directory":{"type":"string","description":"Directory of the video recording on the FS"},"name":{"type":"string"},"size":{"type":"integer","format":"int64"},"is_recording":{"type":"boolean"}}},"VideoStreamType":{"type":"string","description":"Video stream type. Possible values:\n* `Color` - regular color video stream.\n* `Thermal` - thermal video stream.\n"}}}}
```

## The DiskStats object

```json
{"openapi":"3.0.4","info":{"title":"Fotokite API","version":"0.2.0"},"components":{"schemas":{"DiskStats":{"type":"object","description":"Disk usage statistics in bytes.","required":["used","total"],"properties":{"used":{"type":"integer","format":"int64","minimum":0},"total":{"type":"integer","format":"int64","minimum":0}}}}}}
```

## The SoftwareVersion object

```json
{"openapi":"3.0.4","info":{"title":"Fotokite API","version":"0.2.0"},"components":{"schemas":{"SoftwareVersion":{"type":"object","description":"Represents software version information","properties":{"channel":{"type":"string","description":"Software channel (e.g., production, beta)"},"version":{"type":"string","description":"Software release version number"}}}}}}
```

## The TokenRequest object

```json
{"openapi":"3.0.4","info":{"title":"Fotokite API","version":"0.2.0"},"components":{"schemas":{"TokenRequest":{"type":"object","description":"Request to obtain a session token. Compatible with OAuth2 `client_credentials` flow.","required":["client_secret"],"properties":{"grant_type":{"type":"string","description":"OAuth2 flow type, only \"client_credentials\" is supported.\n"},"client_id":{"type":"string","description":"Ignored (For OAuth compatibility)\n"},"client_secret":{"type":"string","description":"Fotokite API key. Contact Fotokite support to get an API key assigned and activated for your systems.\n"},"scope":{"type":"string","description":"Which scopes to request access for. This must be a subset of the scopes enabled for the plugin. If more scopes are requested, the request will fail. Comma-separated list.\n","allOf":[{"$ref":"#/components/schemas/Scopes"}]},"session_name":{"type":"string","description":"Name of the session for display to the operator if there can be multiple sessions per plugin.\n"}}},"Scopes":{"type":"string","description":"Available OAuth2 scopes. > - `info` - Read static information about the system. - `telemetry` - Read dynamic information about the system. - `command` - Send commands to the system. - `media` - Interaction with the media library. - `internal` - Fotokite-internal APIs. Not for third-party use."}}}}
```

## The TokenResponse object

```json
{"openapi":"3.0.4","info":{"title":"Fotokite API","version":"0.2.0"},"components":{"schemas":{"TokenResponse":{"type":"object","description":"OAuth2 compatible access token response.","required":["access_token","token_type","expires_in"],"properties":{"access_token":{"type":"string","description":"Token to use for future requests.\n"},"scope":{"type":"string","description":"Comma-separated list of scopes that this token grants access to.\n"},"plugin_id":{"type":"string","description":"ID of the plugin (API key) that was used to create this token.\n"},"expires_in":{"type":"integer","nullable":true,"description":"Number of seconds until this token expires and will no longer be valid.\n"},"valid_until":{"type":"string","format":"date-time","nullable":true,"description":"Timestamp when this token expires and will no longer be valid.\n"}}}}}}
```

## The StateUpdate object

```json
{"openapi":"3.0.4","info":{"title":"Fotokite API","version":"0.2.0"},"components":{"schemas":{"StateUpdate":{"type":"object","description":"Status update from a plugin or other customer integration.","properties":{"state":{"type":"string","description":"Current operating state of the plugin. * `Active` - The plugin has not yet connected to any back-end serivces. * `Connected` - The plugin has is connected to any external services and is fully operational. * `Error` - The plugin has encountered an error.\n"},"error":{"type":"string","description":"Free-form error message for logging or display to an operator.\n"}}}}}}
```

## The HandoffControlStatus object

```json
{"openapi":"3.0.4","info":{"title":"Fotokite API","version":"0.2.0"},"components":{"schemas":{"HandoffControlStatus":{"type":"object","description":"Information about connected and controlling entities.","required":["controlling_client","requesting_clients"],"properties":{"controlling_client":{"$ref":"#/components/schemas/ClientHandoffStatus","nullable":true,"description":"Information about the entity currently controlling the system. If no entity is controlling the system, this field will be null.\n"},"requesting_clients":{"type":"array","items":{"$ref":"#/components/schemas/ClientHandoffStatus"}}}},"ClientHandoffStatus":{"type":"object","description":"Information about controlling entity or an entity requested control.","required":["session_name","operator_name"],"properties":{"plugin_id":{"type":"string","description":"Unique ID assigned by Fotokite assigned to this plugin.\n"},"plugin_name":{"type":"string","description":"Human readable name of the plugin. Has value of `Fotokite Live` for Fotokite Live application.\n"},"session_name":{"type":"string","description":"Name of the session for display to the operator if there can be multiple sessions per plugin.\n"},"operator_name":{"type":"string","description":"Operator name provided to `take_command` or `request_command` endpoint.\n"},"ip_address":{"type":"string","description":"IP address of the machine. Optional field used by Fotokite Tablets.\n"},"last_change":{"type":"string","format":"date-time","description":"Timestamp of the last change to this status. For controlling entity, this is the time when control was taken. For requesting entities, this is the time when the entity was added to the waiting queue.\n"}}}}}}
```

## The ClientHandoffStatus object

```json
{"openapi":"3.0.4","info":{"title":"Fotokite API","version":"0.2.0"},"components":{"schemas":{"ClientHandoffStatus":{"type":"object","description":"Information about controlling entity or an entity requested control.","required":["session_name","operator_name"],"properties":{"plugin_id":{"type":"string","description":"Unique ID assigned by Fotokite assigned to this plugin.\n"},"plugin_name":{"type":"string","description":"Human readable name of the plugin. Has value of `Fotokite Live` for Fotokite Live application.\n"},"session_name":{"type":"string","description":"Name of the session for display to the operator if there can be multiple sessions per plugin.\n"},"operator_name":{"type":"string","description":"Operator name provided to `take_command` or `request_command` endpoint.\n"},"ip_address":{"type":"string","description":"IP address of the machine. Optional field used by Fotokite Tablets.\n"},"last_change":{"type":"string","format":"date-time","description":"Timestamp of the last change to this status. For controlling entity, this is the time when control was taken. For requesting entities, this is the time when the entity was added to the waiting queue.\n"}}}}}}
```

## The RequestHandoffControl object

```json
{"openapi":"3.0.4","info":{"title":"Fotokite API","version":"0.2.0"},"components":{"schemas":{"RequestHandoffControl":{"type":"object","description":"Request to take control","required":["operator_name"],"properties":{"operator_name":{"type":"string","description":"Name of the operator taking control for display in UI.\n"},"ip_address":{"type":"string","description":"IP address of the machine taking control. Optional field used by Fotokite Tablets.\n"}}}}}}
```


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## Querying This Documentation
If you need additional information that is not directly available in this page, you can query the documentation by asking a question.

Perform an HTTP GET request on the following URL with the `ask` and `goal` query parameters:

```
GET https://developer.fotokite.com/~/changes/46/fotokite-api/models.md?ask=<question>&goal=<user_goal>
```

`ask` is the immediate question: it should be specific, self-contained, and written in natural language.
`goal` is what the user is ultimately trying to achieve, the reason they need the answer. Sharing it helps GitBook give you a better, more relevant answer. A goal is most helpful when it describes the outcome the user wants rather than restating the question. For example, with `ask=how do I create an API token`, a goal like `automate deployments from our CI pipeline` lets GitBook tailor the answer to that use case.

The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
