İçeriğe geç
Updraft Docs
English

Şemalar · API referansı

Body_upload_flight_v1_flights_post

AdTipAçıklama
file zorunlustring (binary)IGC, GPX or FIT file, byte for byte as recorded; the format is detected from the content
external_pilot_hash zorunlustringHMAC-SHA256 of the client's pilot id, 64 hex characters; the HMAC key stays with the client
^[0-9a-fA-F]{64}$
consent_version zorunluintegerVersion of the consent text the pilot accepted
0 ≤ x ≤ 32767
source zorunlu"kunduzo"Uploading platform
external_refstring | nullClient's own flight reference
1–200 chars
sportSportSport of the flight (optional, default paragliding); stored with a new flight. Shared layers count only paragliding flights for now
varsayılan "paragliding"

ConsentReceipt

What the request changed. No pilot identity is returned.

AdTipAçıklama
event zorunlu"withdrawn" | "granted"
scope zorunlu"pilot" | "flights"
recorded zorunlubooleanA new consent event was written; false: it was already in effect (repeated request), nothing changed
flights_in_scope zorunluintegerFlights the request covers (deleted ones aside); 0 for a pilot-wide withdrawal, which only covers later uploads
flights_affected zorunluintegerWithdrawal by list: flights that counted towards the shared layers and no longer do; 0 for a pilot-wide withdrawal. Grant: flights not in the layers now that are checked again (consent and quality)
received_at zorunlustring (date-time)Time the request was recorded (UTC)
layers_updated_by zorunlustring (date-time) | nullWithdrawal by list: the layers no longer contain these flights by this time (received_at + 24 h); null for a pilot-wide withdrawal (no flight leaves the layers) and for a grant

ConsentRequest

Pilot-wide (no flight_ids) or for the listed flights of that pilot.

AdTipAçıklama
external_pilot_hash zorunlustringHMAC-SHA256 of the client's pilot id, 64 hex characters; the same value as external_pilot_hash of the uploads
^[0-9a-fA-F]{64}$
consent_version zorunluintegerVersion of the consent text the pilot acted on
0 ≤ x ≤ 32767
source zorunlu"kunduzo"Platform the pilot gave or withdrew it on
flight_idsarray<string (uuid)> | nullUpdraft flight ids (flight_id of the upload response) of this pilot. Omitted: pilot-wide; a pilot-wide withdrawal covers the flights uploaded from now on (earlier flights stay in the anonymous aggregates), a pilot-wide grant every flight
1–1000 items

DeletionReceiptOut

What the request recorded. No pilot identity and no flight id is returned.

AdTipAçıklama
deletion_id zorunlustring (uuid) | nullThe deletion request covering this one (GET /v1/deletions/{id}): new when recorded, else the earlier request that already covers it; null when there is nothing to delete (pilot unknown to Updraft or already erased)
scope zorunlu"pilot" | "flights"
recorded zorunlubooleanA new deletion was recorded; false: everything asked was already deleted or being deleted (repeated request), nothing changed
flights_in_scope zorunluintegerWith flight_ids: the listed flights; pilot-wide: the flights of the covering request
status zorunlu"pending" | "completed"completed: raw files, fix files and thermal events are gone
received_at zorunlustring (date-time)When the covering request was received (UTC)
layers_updated_by zorunlustring (date-time)The published layers no longer contain these flights by this time (received_at + 24 h)

DeletionRequestBody

Pilot-wide (no flight_ids) or the listed flights of that pilot.

AdTipAçıklama
external_pilot_hash zorunlustringHMAC-SHA256 of the client's pilot id, 64 hex characters; the same value as external_pilot_hash of the uploads
^[0-9a-fA-F]{64}$
source zorunlu"kunduzo"Platform the pilot asked on
flight_idsarray<string (uuid)> | nullUpdraft flight ids (flight_id of the upload response) of this pilot. Omitted: pilot-wide, every flight of the pilot and the pilot's link to the client's pilot id
1–1000 items

DeletionStatusOut

Progress of one deletion request. No pilot identity and no flight id.

AdTipAçıklama
deletion_id zorunlustring (uuid)
scope zorunlu"pilot" | "flights"
status zorunlu"pending" | "completed"
flights zorunluintegerFlights the request deletes
flights_completed zorunluintegerOf these, flights whose files are gone
received_at zorunlustring (date-time)
completed_at zorunlustring (date-time) | nullEvery flight done (pilot-wide: also the pilot's masks and link); null while pending
layers_updated_by zorunlustring (date-time)received_at + 24 h

ErrorBody

AdTipAçıklama
code zorunlustring
detail zorunlustring
errorsarray<object> | null

FlightReceipt

The stored flight. Pilot identity, track and altitude are never returned.

AdTipAçıklama
flight_id zorunlustring (uuid)uuid5 of the file's SHA-256; same bytes, same id
status zorunlu"accepted" | "duplicate"accepted (202): new flight, queued; duplicate (200): already stored
igc_sha256 zorunlustringSHA-256 of the uploaded bytes (IGC, GPX or FIT), lower case hex
flown_on zorunlustring (date)Local (Europe/Istanbul) date of the first valid fix
consent_version zorunluintegerConsent text version stored with the flight
sport zorunluSportSport stored with the flight; a duplicate keeps the sport of the first upload. Shared layers count only paragliding flights for now
processing zorunlu"pending" | "processed" | "failed"
usable_for_layers zorunlubooleanCounts towards shared layers (consent and quality); false until processed
received_at zorunlustring (date-time)Time this upload was received (UTC)

ForecastCell

AdTipAçıklama
lat zorunlunumberLatitude of the 0.25° cell centre the forecast is for
lon zorunlunumberLongitude of the cell centre

ForecastInfo

AdTipAçıklama
source zorunlustring | nullForecast service (open-meteo); null when off
model zorunlustring | nullWeather model (icon_eu); null when off
cell zorunluForecastCell
fetched_at zorunlustring (date-time) | nullWhen our forecast server produced this forecast (UTC); the model run is at most about 9 hours older. Null without a forecast
attribution zorunlustringRequired data attribution (CC BY 4.0)

Health

AdTipAçıklama
status zorunlu"ok"
version zorunlustring

HTTPValidationError

AdTipAçıklama
detailarray<ValidationError>

IncidentRegion

AdTipAçıklama
id zorunlustring (uuid)
slug zorunlustring
name zorunlustring

IncidentType

docs/02 features; the same list as migration 0013 (a test compares).

"collision_obstacle" | "takeoff_problem" | "landing_problem" | "rotor_turbulence" | "power_line" | "airspace" | "other"

MultiPolygonGeometry

AdTipAçıklama
type zorunlu"MultiPolygon"
coordinates zorunluarray<array<array<[number, number]>>>Polygons → rings → [longitude, latitude] (WGS 84), simplified

NoticeText

AdTipAçıklama
tr zorunlustring
en zorunlustring

OpenDataAttribution

AdTipAçıklama
tr zorunlustring
en zorunlustring

OpenDataFileInfo

AdTipAçıklama
name zorunlustringFile name, e.g. sites.geojson
layer zorunlustring | nullthermals_r7, thermals_r9, sites, hazards, skyways; null for README.md and LICENSE.txt
format zorunlustringgeoparquet (GeoParquet 1.1), geojson, markdown (README), text (LICENSE)
rows zorunluinteger | nullFeatures in the layer; null for documents
size_bytes zorunluinteger
sha256 zorunlustringSHA-256 of the file, 64 lowercase hex characters

OpenDataList

AdTipAçıklama
releases zorunluarray<OpenDataReleaseInfo>Newest year first; may be empty

OpenDataReleaseInfo

AdTipAçıklama
year zorunluintegerRelease year (the content is the build day's cumulative state)
generated_on zorunlustring (date)UTC day the package was built
open_data_version zorunluintegerPackage format version
license_id zorunlustringCC-BY-4.0
license_url zorunlustring
attribution zorunluOpenDataAttributionRequired credit line (docs/29 §2)
thresholds zorunluOpenDataThresholdsPrivacy thresholds at build time
files zorunluarray<OpenDataFileInfo>Package files (manifest.json not listed)

OpenDataThresholds

AdTipAçıklama
min_pilots_grid zorunluintegerDistinct pilots behind every thermal cell
min_pilots_features zorunluintegerDistinct pilots behind every site and hazard
min_pilots_skyways zorunluintegerDistinct pilots behind every skyway

PackFileInfo

One PMTiles file; a MapLibre source of the same name reads it as pmtiles://.

AdTipAçıklama
kind zorunlu"base" | "contours" | "terrain" | "hillshade" | "power"Base map source the file replaces offline (docs/02 §6)
file zorunlustringFile name, {kind}.pmtiles
url zorunlustringTime-limited GET URL (until expires_at); supports HTTP range requests
size_bytes zorunluinteger
sha256 zorunlustringSHA-256 of the file, 64 lowercase hex characters
tile_type zorunlu"mvt" | "webp"
tile_compression zorunlu"gzip" | "none"
min_zoom zorunluinteger
max_zoom zorunluintegerHighest zoom in the file; MapLibre over-zooms beyond it
tile_count zorunluinteger
source_build_id zorunlustringBase map build the file was cut from
attribution zorunlustringAttribution of the source (may hold HTML links)

PackInfo

AdTipAçıklama
region zorunlustring
name zorunlustring | nullRegion name when cut from regions
pack_version zorunlustringYYYYMMDD[-n]; a larger value is a newer pack. Compare it with the downloaded one to decide whether to download again
created_at zorunlustring (date-time)
bbox zorunlu[number, number, number, number][west, south, east, north] degrees, WGS 84: every tile meeting it is in
4–4 items
size_bytes zorunluintegerSum of the files
max_zoom zorunluinteger
zoom_trimmed zorunlubooleanTrue when zoom levels were dropped to stay under the size limit
files zorunluarray<PackFileInfo>
attribution zorunlustringCredit line to show with the offline map
expires_at zorunlustring (date-time)The file URLs stop working at this time (UTC)

PilotMaskCreate

home: a circle (center, radius_m optional). custom: a circle (center + radius_m) or a polygon.

AdTipAçıklama
external_pilot_hash zorunlustringHMAC-SHA256 of the client's pilot id, 64 hex characters; the same value as external_pilot_hash of the uploads
^[0-9a-fA-F]{64}$
source zorunlu"kunduzo"Platform the pilot set the mask on
kind zorunlu"home" | "custom"home: the pilot's home (at most one per pilot); custom: another place
centerPilotMaskPoint | nullCentre of a circle
radius_minteger | nullCircle radius in metres. home: at least the home mask default (privacy settings, 2000) and the default when omitted; custom: 200-10000, required with center
1 ≤ x ≤ 10000
polygonPilotMaskPolygonIn | nullcustom only, instead of a circle; area between a 200 m and a 10000 m circle's

PilotMaskList

AdTipAçıklama
items zorunluarray<PilotMaskOut>The pilot's masks, oldest first
max_masks zorunluintegerMasks a pilot may have

PilotMaskOut

One mask of the pilot, with its geometry (for the client's own pilot only).

AdTipAçıklama
id zorunlustring (uuid)
kind zorunlu"home" | "custom"
center zorunluPilotMaskPoint | nullhome: the circle centre; custom: null
radius_m zorunluinteger | nullhome: the circle radius; custom: null
polygon zorunluPilotMaskPolygon
area_km2 zorunlunumberArea of the stored geometry, 3 decimals
created_at zorunlustring (date-time)

PilotMaskPoint

AdTipAçıklama
lat zorunlunumberLatitude (WGS84, degrees)
-90 ≤ x ≤ 90
lon zorunlunumberLongitude (WGS84, degrees)
-180 ≤ x ≤ 180

PilotMaskPolygon

AdTipAçıklama
type zorunlu"Polygon"
coordinates zorunluarray<array<array<number>>>The stored geometry, [lon, lat] with 6 decimals (a circle as its polygon)

PilotMaskPolygonIn

GeoJSON Polygon with one ring (no holes), positions [lon, lat].

AdTipAçıklama
type zorunlu"Polygon"
coordinates zorunluarray<array<[number, number]>>One closed ring of 4-500 [lon, lat] positions (last = first); a valid, non self-intersecting polygon
1–1 items

PilotMaskReceipt

What the change recorded. No pilot identity is returned.

AdTipAçıklama
mask zorunluPilotMaskOut | nullThe new mask; null after a removal
removed_id zorunlustring (uuid) | nullThe removed mask; null after an addition
flights_affected zorunluintegerThe pilot's flights that are processed again with the changed masks
received_at zorunlustring (date-time)Time the change was recorded (UTC)
layers_updated_by zorunlustring (date-time)The published layers follow the change by this time (received_at + 24 h)

PointGeometry

AdTipAçıklama
type zorunlu"Point"
coordinates zorunlu[number, number][longitude, latitude], WGS 84
2–2 items

PublicIncident

AdTipAçıklama
id zorunlustring (uuid)Incident id (stable while the record exists)
type zorunluIncidentTypeKind of incident (fixed list, docs/02 features)
period_from zorunlustringStart of the period: YYYY or YYYY-MM (never a day)
^[0-9]{4}(-(0[1-9]|1[0-2]))?$
period_to zorunlustringEnd of the period: YYYY or YYYY-MM
^[0-9]{4}(-(0[1-9]|1[0-2]))?$
precaution zorunlustringWhat to do or avoid here (moderator's note)
0–280 chars
lon zorunlunumberLongitude, WGS 84, 5 decimals
-180 ≤ x ≤ 180
lat zorunlunumberLatitude, WGS 84, 5 decimals
-90 ≤ x ≤ 90

PublicReplay

A shared flight for the 3D replay. No pilot identity, no flight id, no clock time, no maximum altitude field; masked stretches are gaps between parts.

AdTipAçıklama
id zorunlustringThe share's public_id
summary zorunluPublicReplaySummary
parts zorunluarray<PublicReplayPart>Time ordered; a masked stretch between two parts is not returned
thermals zorunluarray<PublicReplayThermal>Thermal events starting inside a part; empty when none
max_points zorunluinteger

PublicReplayPart

One unmasked stretch of the flight as parallel arrays (one entry per point).

AdTipAçıklama
t zorunluarray<number>Seconds since the first returned fix (0.1 s)
lon zorunluarray<number>
lat zorunluarray<number>
alt_gps zorunluarray<integer | null>GNSS altitude, m
alt_baro zorunluarray<integer | null>Pressure altitude, m; null without sensor
vario zorunluarray<number | null>Vertical speed, m/s; null when unknown

PublicReplaySummary

AdTipAçıklama
flown_on zorunlustring (date)Day of the flight (no time of day)
duration_s zorunluinteger | null
distance_m zorunluinteger | null
takeoff_name zorunlustring | nullNearest public (approved) take-off site within 500 m, if any
landing_name zorunlustring | nullNearest public (approved) landing site within 500 m
fix_count zorunluintegerVisible (unmasked, usable) fixes before thinning
point_count zorunluintegerPoints returned

PublicReplayThermal

AdTipAçıklama
lon zorunlunumberCore of the thermal
lat zorunlunumber
start_s zorunlunumberStart, seconds on the same clock as the parts
duration_s zorunluinteger
gain_m zorunluintegerHeight gained, m
avg_climb_ms zorunlunumberMean climb rate, m/s

RegionCollection

AdTipAçıklama
type zorunlu"FeatureCollection"
features zorunluarray<RegionFeature>

RegionFeature

AdTipAçıklama
type zorunlu"Feature"
id zorunlustring (uuid)
bbox zorunlu[number, number, number, number][west, south, east, north] of the full boundary, degrees
4–4 items
geometry zorunluMultiPolygonGeometry
properties zorunluRegionListProperties

RegionHourClimb

AdTipAçıklama
hour_bucket zorunluintegerLocal 2-hour bucket (Europe/Istanbul), 0 = 00:00-02:00
0 ≤ x ≤ 11
avg_climb_ms zorunlunumberMean climb of the thermals in the region, m/s

RegionIncidentsResponse

AdTipAçıklama
region zorunluIncidentRegion
incidents zorunluarray<PublicIncident>Approved incidents of the region, by period, newest first (no ranking)

RegionListProperties

AdTipAçıklama
slug zorunlustringShort name (regions.slug), used in Atlas addresses
name zorunlustring
updated_at zorunlustring (date-time)Last change of the region (UTC)
summary zorunluRegionSummary | nullNull when the profile is not computed yet or withheld after a threshold increase (as GET /v1/regions/{region}/profile)

RegionMonth

AdTipAçıklama
month zorunluintegerLocal calendar month
1 ≤ x ≤ 12
flyable_days zorunluintegerLocal dates in this month, over all years, on which at least one flight from the region lasted longer than 15 minutes
0 ≤ x
years zorunluintegerYears with flights in this month (divide for a mean)
1 ≤ x

RegionProfile

regions.profile (docs/02 regions); values below the thresholds are absent.

AdTipAçıklama
version zorunlu1Profile rules and shape version
processing_version zorunluintegerFix pipeline version of the inputs
1 ≤ x
thresholds zorunluRegionThresholds
support zorunluRegionSupport | nullBand of pilots behind the region's flights; null below the threshold
takeoffs zorunluarray<RegionTakeoff>Approved take-offs in the region
months zorunluarray<RegionMonth>Months passing the threshold, in order
wind zorunluRegionWind
avg_flight_duration_min zorunluinteger | nullMean airborne time of the region's flights, minutes
0 ≤ x
hours zorunluarray<RegionHourClimb>Hour buckets passing the threshold, in order
best_hour_bucket zorunluinteger | nullHour bucket with the highest mean climb
0 ≤ x ≤ 11

RegionProfileResponse

AdTipAçıklama
id zorunlustring (uuid)
slug zorunlustring
name zorunlustring
updated_at zorunlustring (date-time)Last change of the region (UTC)
profile zorunluRegionProfile | nullNull when not computed yet, or withheld after a threshold increase until the next nightly run

RegionSummary

Headline values of the region profile; every one is absent below the thresholds.

AdTipAçıklama
support zorunluRegionSupport | nullBand of pilots behind the region's flights; null below the threshold
months zorunluarray<integer>Months (1-12) passing the threshold, in order; a missing month means 'not enough data', not 'not flown'
dominant_sector zorunluinteger | nullDominant 850 hPa wind sector (0 = north, 45° steps)
0 ≤ x ≤ 7
best_hour_bucket zorunluinteger | nullLocal 2-hour bucket with the highest mean climb
0 ≤ x ≤ 11
avg_flight_duration_min zorunluinteger | nullMean airborne time of the region's flights, minutes
0 ≤ x
takeoffs zorunluintegerApproved take-offs in the region (profile list)
0 ≤ x

RegionSupport

AdTipAçıklama
confidence zorunlu"low" | "medium" | "high"Pilots behind the region's flights: low (3 to 4), medium (5 to 9), high (10 or more)
min_pilots zorunluinteger | nullAt least this many different pilots, floored to 3, 5, 10, 20, 50, 100; the exact count is never returned

RegionTakeoff

AdTipAçıklama
id zorunlustring (uuid)Site id (GET /v1/sites)
name zorunlustring | nullName given by a moderator; null if none yet
lon zorunlunumberLongitude, WGS 84, 6 decimals
-180 ≤ x ≤ 180
lat zorunlunumberLatitude, WGS 84, 6 decimals
-90 ≤ x ≤ 90
headings zorunluarray<integer> | nullLaunch directions (degrees, 45° sectors)
elevation_m zorunluinteger | nullGround elevation in metres (DEM)
confidence zorunlu"low" | "medium" | "high"
min_pilots zorunluinteger | null

RegionThresholds

AdTipAçıklama
min_pilots zorunluintegermin_pilots_regions used for this profile
1 ≤ x
min_flights zorunluintegermin_flights_regions used for this profile
1 ≤ x

RegionWind

AdTipAçıklama
dominant_sector zorunluinteger | nullSector with the most flights when its share is at least 0.3
0 ≤ x ≤ 7
sectors zorunluarray<RegionWindSector>

RegionWindSector

AdTipAçıklama
sector zorunluinteger850 hPa wind the air came from, 45° sectors, 0 = north
0 ≤ x ≤ 7
share zorunlunumberShare of the flights with a known sector
0 ≤ x ≤ 1

RouteGraphInfo

AdTipAçıklama
built_at zorunlustring (date-time)Last change of the region's precomputed graph
rule_version zorunluinteger

RouteLanding

AdTipAçıklama
id zorunlustring (uuid)Public landing (GET /v1/sites)
name zorunlustring | null
lat zorunlunumber
lon zorunlunumber

RouteOption

AdTipAçıklama
id zorunlustringStable within the answer: the direction code
direction zorunlu"n" | "ne" | "e" | "se" | "s" | "sw" | "w" | "nw"General direction from the take-off
waypoints zorunluarray<RouteWaypoint>
reasons zorunluarray<string>i18n keys routes.reason.<code> (docs/10 §20)

RoutesResponse

AdTipAçıklama
takeoff zorunluRouteTakeoff
date zorunlustring (date)Local date (Europe/Istanbul)
hour zorunluintegerLocal hour (Europe/Istanbul)
0 ≤ x ≤ 23
timezone zorunlu"Europe/Istanbul"
wind zorunluRouteWind
options zorunluarray<RouteOption>A few options in compass order (clockwise from north); not ranked
empty zorunlustring | nulli18n key routes.empty.<code> when there is no option; else null
forecast zorunluForecastInfo
graph zorunluRouteGraphInfo
notice zorunlu"routes.notice.preflight_only"i18n key of the fixed notice (docs/04 §3)
notice_text zorunluNoticeTextThe notice itself: pre-flight planning only; the pilot decides; airspace and legal limits are checked separately

RouteTakeoff

AdTipAçıklama
id zorunlustring (uuid)
name zorunlustring | null
lat zorunlunumber
lon zorunlunumber

RouteWaypoint

AdTipAçıklama
lat zorunlunumberCentre of the thermal cell (H3 r9, about 0.1 km²)
lon zorunlunumber
support zorunlu"high" | "medium"Support band of the cell over all months (high from 10 pilots, medium from 5; never an exact count)
conditions zorunlu"hour_and_wind" | "wind" | "hour" | "general"Which breakdown weighted the cell: the day's hour and wind sector, the sector only, the hour only, or the general pattern
along_skyway zorunlubooleanThe leg arriving here follows a public skyway
landings zorunluarray<RouteLanding>Landing alternatives within reach of this waypoint, nearest first

RouteWind

AdTipAçıklama
sector zorunluinteger | null850 hPa wind sector used for weighting (0 = from the north, 45° slices clockwise); null without a forecast
0 ≤ x ≤ 7
direction_deg zorunluinteger | null850 hPa wind, from
0 ≤ x ≤ 360
speed_ms zorunlunumber | null850 hPa wind speed, m/s
0 ≤ x

ShareOut

The flight's active share. No pilot identity, no flight data.

AdTipAçıklama
public_id zorunlustringUnguessable link id: 22 characters of 0-9A-Za-z (about 131 random bits), not derived from the flight
url_path zorunlustringPath of the Atlas page, /flights/{public_id}; the client joins it to the Atlas origin
created_at zorunlustring (date-time)When this share was opened (UTC)

ShareRequestBody

The pilot who acts and the consent text version they acted on.

AdTipAçıklama
external_pilot_hash zorunlustringHMAC-SHA256 of the client's pilot id, 64 hex characters; the same value as external_pilot_hash of the upload. The flight must be this pilot's
^[0-9a-fA-F]{64}$
consent_version zorunluintegerVersion of the consent text the pilot shared (or stopped sharing) under; stored with the public_replay consent event
0 ≤ x ≤ 32767
source zorunlu"kunduzo"Platform the pilot acted on

Site

AdTipAçıklama
type zorunlu"Feature"
id zorunlustring (uuid)
geometry zorunluPointGeometry
properties zorunluSitePropertiesPublic attributes of a site. Never: pilot identity, flights, exact pilot count.

SiteCollection

AdTipAçıklama
type zorunlu"FeatureCollection"
features zorunluarray<Site>
next_cursor zorunlustring | nullPass as cursor for the next page; null on the last page

SiteProperties

Public attributes of a site. Never: pilot identity, flights, exact pilot count.

AdTipAçıklama
kind zorunlu"takeoff" | "landing"
name zorunlustring | nullName given by a moderator; null if none yet
headings zorunluarray<integer> | nullTakeoff: launch directions (downhill azimuth, degrees, 45° sectors); null when not derived (no DEM yet) or for landings
slope_deg zorunluinteger | nullTakeoff: slope in degrees (DEM)
elevation_m zorunluinteger | nullTakeoff: ground elevation in metres (DEM)
area_m2 zorunluinteger | nullLanding: area of the landing points' hull, m²
confidence zorunlu"low" | "medium" | "high"Support from flight data: low (3 to 4 pilots), medium (5 to 9), high (10 or more). Moderator or OSM sites below 3 pilots are low
min_pilots zorunluinteger | nullAt least this many different pilots used the site, floored to 3, 5, 10, 20, 50, 100; null for moderator or OSM sites under 3. The exact count is never returned
version zorunluintegerIncrements on every change of the site
updated_at zorunlustring (date-time)Last change (UTC)

SlopeConditions

AdTipAçıklama
date zorunlustring (date)Local date (Europe/Istanbul)
timezone zorunlu"Europe/Istanbul"
cell zorunluForecastCellCentre of the 0.25° cell the answer is for
hours zorunluarray<SlopeHour>Local hours 05-21
forecast_state zorunlu"available" | "out_of_range" | "unavailable"available; out_of_range (date outside today..today + 4, sun only); unavailable (forecast server off or failed, sun only)
forecast zorunluForecastInfo
method_version zorunluintegerVersion of the slope rule (docs/07 §9b)
notice zorunlu"slopes.notice.preflight_only"i18n key of the fixed notice: pre-flight planning only; the pilot decides

SlopeHour

AdTipAçıklama
time zorunlustring (date-time)UTC hour; values are instantaneous
local_hour zorunluintegerHour in Europe/Istanbul
0 ≤ x ≤ 23
sun zorunluSunSun at the cell centre (style state sun_azimuth/altitude)
wind_10m zorunluWind | null10 m forecast wind; null without a forecast
wind_850hpa zorunluWind | null850 hPa forecast wind (about 1,500 m); null without a forecast

Sport

flights.sport (migration 0016, SPORT-001). Layers count only PARAGLIDING for now.

"paragliding" | "hang_gliding" | "sailplane" | "paramotor" | "hike_and_fly" | "other"

SuitabilityHour

AdTipAçıklama
time zorunlustring (date-time)UTC hour; forecast values are instantaneous
level zorunlu"green" | "yellow" | "red" | "unknown"
reasons zorunluarray<string>i18n keys suitability.reason.<code>
wind_10m zorunluWind | null10 m wind; null without a forecast
wind_850hpa zorunluWind | null850 hPa wind (about 1,500 m)
heading_offset_deg zorunluinteger | nullAngle of the 10 m wind to the nearest launch heading (0 = straight in); null for light wind, unknown headings or no forecast

SuitabilityResponse

AdTipAçıklama
site_id zorunlustring (uuid)
date zorunlustring (date)Local date (Europe/Istanbul)
timezone zorunlu"Europe/Istanbul"
headings zorunluarray<integer> | nullLaunch directions used (downhill azimuth, degrees); null when not derived
slots zorunluarray<SuitabilitySlot>
forecast zorunluForecastInfo
rule_version zorunluintegerVersion of the rating rule
notice zorunlu"suitability.notice.preflight_only"i18n key of the fixed notice: pre-flight planning only, not for in-flight use; the pilot decides (docs/04 §3)

SuitabilitySlot

AdTipAçıklama
start zorunlustring (date-time)Local start (Europe/Istanbul, with offset)
end zorunlustring (date-time)Local end (exclusive)
level zorunlu"green" | "yellow" | "red" | "unknown"green looks suitable, yellow caution, red looks unsuitable, unknown no forecast; the worst of the slot's hours
reasons zorunluarray<string>i18n keys suitability.reason.<code> (docs/10 §14)
hours zorunluarray<SuitabilityHour>

Sun

AdTipAçıklama
azimuth_deg zorunlunumberClockwise from north, one decimal
0 ≤ x < 360
altitude_deg zorunlunumberAbove the horizon, one decimal; negative = night
-90 ≤ x ≤ 90

ValidationError

AdTipAçıklama
loc zorunluarray<string | integer>
msg zorunlustring
type zorunlustring
inputany
ctxobject

VideoFormat

Aspect ratio in the URL and the object key; both are 1080p.

"16x9" | "9x16"

VideoInfo

A video of a shared flight. No pilot, no flight id: the share's public_id only.

AdTipAçıklama
public_id zorunlustring
format zorunlu"16:9" | "9:16"
length_s zorunlu15 | 30Longest video, seconds: 15 (default; about 3.5 minutes to make) or 30 (about 7 minutes). A flight is shown at least 10x faster, so a short flight gives a shorter video
status zorunlu"queued" | "rendering" | "ready" | "failed"queued → rendering → ready; failed after every retry failed
status_path zorunlustringPath of the status route of this video
url zorunlustring | nullTime-limited download URL (MP4, H.264) when ready, else null
expires_at zorunlustring (date-time) | nullurl stops working at this time (UTC)
width zorunluinteger
height zorunluinteger
fps zorunluinteger | null30 when ready
duration_s zorunlunumber | nullLength of the video, seconds, when ready
size_bytes zorunluinteger | null
sha256 zorunlustring | nullSHA-256 of the MP4 when ready
error zorunlu"replay_gone" | "render_failed" | nullWhy it failed: render_failed (asking again retries), replay_gone

VideoLength

Longest video, seconds: what a request asks for (Q-023). The worker's UPDRAFT_RENDER_MAX_SECONDS (default 30) caps it.

15 | 30

VideoRequest

AdTipAçıklama
format zorunlu"16:9" | "9:16"Aspect ratio: 16:9 landscape or 9:16 portrait (stories, reels)
resolution"1080p"Only 1080p (1920x1080 / 1080x1920)
varsayılan "1080p"
length_s15 | 30Longest video, seconds: 15 (default; about 3.5 minutes to make) or 30 (about 7 minutes). A flight is shown at least 10x faster, so a short flight gives a shorter video
varsayılan 15

Wind

AdTipAçıklama
direction_deg zorunluintegerWhere the wind comes from, degrees
0 ≤ x ≤ 360
speed_ms zorunlunumberSpeed in m/s, one decimal
0 ≤ x