{"openapi":"3.1.0","info":{"title":"Roger ATC Copilot API","version":"1.14.0","description":"Access to one pilot’s own Copilot EFB data — aircraft, aerodrome cards, weather at their aerodromes, notes, checklists, flight plans, the logbook and the pilot profile — and the RogerATC plugin’s two writes: its session summaries and its live link. Authenticate with the personal API key from Settings → API."},"servers":[{"url":"https://api.rogeratc.app"}],"components":{"securitySchemes":{"bearer":{"type":"http","scheme":"bearer","description":"`Authorization: Bearer rat_live_…`"},"apiKeyHeader":{"type":"apiKey","in":"header","name":"X-API-Key"}},"schemas":{"Meta":{"type":"object","required":["requestId","generatedAt"],"properties":{"requestId":{"type":"string"},"generatedAt":{"type":"string","format":"date-time"}}},"Single":{"type":"object","required":["data","meta"],"properties":{"data":{},"meta":{"$ref":"#/components/schemas/Meta"}}},"Page":{"type":"object","required":["data","page","meta"],"properties":{"data":{"type":"array","items":{"type":"object","additionalProperties":true}},"page":{"type":"object","properties":{"limit":{"type":"integer"},"total":{"type":"integer"},"nextCursor":{"type":["string","null"]}}},"meta":{"$ref":"#/components/schemas/Meta"}}},"Error":{"type":"object","required":["error","meta"],"properties":{"error":{"type":"object","properties":{"code":{"type":"string","enum":["bad_request","unauthorized","not_found","method_not_allowed","gone","payload_too_large","unsupported_media_type","rate_limited","internal"]},"message":{"type":"string"}}},"meta":{"$ref":"#/components/schemas/Meta"}}}}},"paths":{"/v1/health":{"get":{"tags":["Service"],"summary":"Service health","description":"Answers without a key, touches no data and is not counted. For uptime monitoring.","operationId":"getV1Health","parameters":[],"security":[],"responses":{"200":{"description":"The result.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Single"}}}},"400":{"description":"`bad_request` — A parameter is malformed. The message says which.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"`not_found` — No such route, or no such record in this account.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"405":{"description":"`method_not_allowed` — GET everywhere; PUT only on `/v1/plugin/sessions/{id}` and `/v1/plugin/live`. `Allow` lists what is.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"`internal` — Our fault. The `requestId` in `meta` identifies the request in our logs.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/me":{"get":{"tags":["Service"],"summary":"The account this key belongs to","description":"The account id, email and name, and the key’s own dates. The cheapest way for an integration to check its key works.","operationId":"getV1Me","parameters":[],"security":[{"bearer":[]},{"apiKeyHeader":[]}],"responses":{"200":{"description":"The result.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Single"}}}},"400":{"description":"`bad_request` — A parameter is malformed. The message says which.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"`unauthorized` — No key, a malformed key, a rotated key, or a paused account.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"`not_found` — No such route, or no such record in this account.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"405":{"description":"`method_not_allowed` — GET everywhere; PUT only on `/v1/plugin/sessions/{id}` and `/v1/plugin/live`. `Allow` lists what is.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"`rate_limited` — Over 120 requests a minute for this key. Retry after `Retry-After` seconds.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"`internal` — Our fault. The `requestId` in `meta` identifies the request in our logs.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/aerodromes":{"get":{"tags":["Aerodromes"],"summary":"Aerodrome cards","description":"Every aerodrome card in the account, with every field: frequencies, contacts, navaids, runways, taxiways, fuel, position, notes, the NOTAM and MADHEL notes the pilot copied. Sorted by identifier.\n\nField reference: `src/core/airfields/types.ts (Airfield)`.","operationId":"getV1Aerodromes","parameters":[{"name":"limit","in":"query","description":"Records per page, 1–200. Default 50. A page may hold fewer when records are large.","schema":{"type":"integer","minimum":1,"maximum":200}},{"name":"cursor","in":"query","description":"Opaque. Pass `page.nextCursor` from the previous response to get the next page.","schema":{"type":"string"}},{"name":"updatedSince","in":"query","description":"ISO 8601 date-time. Only records changed after it — the way to follow changes.","schema":{"type":"string","format":"date-time"}}],"security":[{"bearer":[]},{"apiKeyHeader":[]}],"responses":{"200":{"description":"A page of records.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Page"}}}},"400":{"description":"`bad_request` — A parameter is malformed. The message says which.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"`unauthorized` — No key, a malformed key, a rotated key, or a paused account.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"`not_found` — No such route, or no such record in this account.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"405":{"description":"`method_not_allowed` — GET everywhere; PUT only on `/v1/plugin/sessions/{id}` and `/v1/plugin/live`. `Allow` lists what is.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"`rate_limited` — Over 120 requests a minute for this key. Retry after `Retry-After` seconds.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"`internal` — Our fault. The `requestId` in `meta` identifies the request in our logs.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/aerodromes/{id}":{"get":{"tags":["Aerodromes"],"summary":"One aerodrome card","description":"By card id, or by the aerodrome’s identifier (`SADF`, or a national code such as `LEN`), case-insensitive.\n\nField reference: `src/core/airfields/types.ts (Airfield)`.","operationId":"getV1AerodromesId","parameters":[{"name":"id","in":"path","required":true,"description":"The card id, or the aerodrome identifier.","schema":{"type":"string"}}],"security":[{"bearer":[]},{"apiKeyHeader":[]}],"responses":{"200":{"description":"The result.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Single"}}}},"400":{"description":"`bad_request` — A parameter is malformed. The message says which.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"`unauthorized` — No key, a malformed key, a rotated key, or a paused account.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"`not_found` — No such route, or no such record in this account.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"405":{"description":"`method_not_allowed` — GET everywhere; PUT only on `/v1/plugin/sessions/{id}` and `/v1/plugin/live`. `Allow` lists what is.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"`rate_limited` — Over 120 requests a minute for this key. Retry after `Retry-After` seconds.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"`internal` — Our fault. The `requestId` in `meta` identifies the request in our logs.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/aerodromes/{id}/attachments/{attachmentId}":{"get":{"tags":["Aerodromes"],"summary":"Download link for an aerodrome attachment","description":"A diagram, procedure or photo the pilot attached to the card (listed in the card’s `attachments`). Returns the attachment’s metadata and a presigned HTTPS URL to the file itself, valid for 15 minutes; fetch it without the API key. `404` when the card does not name that attachment, or its file has not been uploaded yet.\n\nField reference: `src/core/files/attachments.ts (Attachment)`.","operationId":"getV1AerodromesIdAttachmentsAttachmentId","parameters":[{"name":"id","in":"path","required":true,"description":"The card id, or the aerodrome identifier.","schema":{"type":"string"}},{"name":"attachmentId","in":"path","required":true,"description":"The `id` of one entry in the card’s `attachments`.","schema":{"type":"string","format":"uuid"}}],"security":[{"bearer":[]},{"apiKeyHeader":[]}],"responses":{"200":{"description":"The result.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Single"}}}},"400":{"description":"`bad_request` — A parameter is malformed. The message says which.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"`unauthorized` — No key, a malformed key, a rotated key, or a paused account.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"`not_found` — No such route, or no such record in this account.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"405":{"description":"`method_not_allowed` — GET everywhere; PUT only on `/v1/plugin/sessions/{id}` and `/v1/plugin/live`. `Allow` lists what is.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"`rate_limited` — Over 120 requests a minute for this key. Retry after `Retry-After` seconds.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"`internal` — Our fault. The `requestId` in `meta` identifies the request in our logs.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/aircraft":{"get":{"tags":["Aircraft"],"summary":"Aircraft","description":"Every aircraft profile, with every field: registration, type, equipment, speeds, fuel, weight and balance, envelope. Sorted by registration.\n\nField reference: `src/core/aircraft/types.ts (AircraftProfile)`.","operationId":"getV1Aircraft","parameters":[{"name":"limit","in":"query","description":"Records per page, 1–200. Default 50. A page may hold fewer when records are large.","schema":{"type":"integer","minimum":1,"maximum":200}},{"name":"cursor","in":"query","description":"Opaque. Pass `page.nextCursor` from the previous response to get the next page.","schema":{"type":"string"}},{"name":"updatedSince","in":"query","description":"ISO 8601 date-time. Only records changed after it — the way to follow changes.","schema":{"type":"string","format":"date-time"}}],"security":[{"bearer":[]},{"apiKeyHeader":[]}],"responses":{"200":{"description":"A page of records.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Page"}}}},"400":{"description":"`bad_request` — A parameter is malformed. The message says which.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"`unauthorized` — No key, a malformed key, a rotated key, or a paused account.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"`not_found` — No such route, or no such record in this account.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"405":{"description":"`method_not_allowed` — GET everywhere; PUT only on `/v1/plugin/sessions/{id}` and `/v1/plugin/live`. `Allow` lists what is.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"`rate_limited` — Over 120 requests a minute for this key. Retry after `Retry-After` seconds.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"`internal` — Our fault. The `requestId` in `meta` identifies the request in our logs.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/aircraft/{id}":{"get":{"tags":["Aircraft"],"summary":"One aircraft","description":"By aircraft id.\n\nField reference: `src/core/aircraft/types.ts (AircraftProfile)`.","operationId":"getV1AircraftId","parameters":[{"name":"id","in":"path","required":true,"description":"The aircraft id.","schema":{"type":"string"}}],"security":[{"bearer":[]},{"apiKeyHeader":[]}],"responses":{"200":{"description":"The result.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Single"}}}},"400":{"description":"`bad_request` — A parameter is malformed. The message says which.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"`unauthorized` — No key, a malformed key, a rotated key, or a paused account.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"`not_found` — No such route, or no such record in this account.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"405":{"description":"`method_not_allowed` — GET everywhere; PUT only on `/v1/plugin/sessions/{id}` and `/v1/plugin/live`. `Allow` lists what is.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"`rate_limited` — Over 120 requests a minute for this key. Retry after `Retry-After` seconds.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"`internal` — Our fault. The `requestId` in `meta` identifies the request in our logs.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/aircraft/{id}/attachments/{attachmentId}":{"get":{"tags":["Aircraft"],"summary":"Download link for an aircraft document","description":"A flight manual, an aircraft document or a photo the pilot attached to the aircraft (listed in its `attachments`). Returns the attachment’s metadata and a presigned HTTPS URL to the file itself, valid for 15 minutes; fetch it without the API key. `404` when the aircraft does not name that attachment, or its file has not been uploaded yet.\n\nField reference: `src/core/files/attachments.ts (Attachment)`.","operationId":"getV1AircraftIdAttachmentsAttachmentId","parameters":[{"name":"id","in":"path","required":true,"description":"The aircraft id.","schema":{"type":"string"}},{"name":"attachmentId","in":"path","required":true,"description":"The `id` of one entry in the aircraft’s `attachments`.","schema":{"type":"string","format":"uuid"}}],"security":[{"bearer":[]},{"apiKeyHeader":[]}],"responses":{"200":{"description":"The result.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Single"}}}},"400":{"description":"`bad_request` — A parameter is malformed. The message says which.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"`unauthorized` — No key, a malformed key, a rotated key, or a paused account.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"`not_found` — No such route, or no such record in this account.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"405":{"description":"`method_not_allowed` — GET everywhere; PUT only on `/v1/plugin/sessions/{id}` and `/v1/plugin/live`. `Allow` lists what is.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"`rate_limited` — Over 120 requests a minute for this key. Retry after `Retry-After` seconds.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"`internal` — Our fault. The `requestId` in `meta` identifies the request in our logs.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/weather":{"get":{"tags":["Weather"],"summary":"Weather at the pilot’s aerodromes","description":"Latest METAR and TAF, raw and decoded, for every aerodrome on a card or on the weather briefing. Each entry has a `status` — `ok`, `no_report`, `no_icao_indicator` or `unavailable` — and nothing is filled in when a report is absent. Source: NOAA Aviation Weather Center, cached for up to five minutes.","operationId":"getV1Weather","parameters":[],"security":[{"bearer":[]},{"apiKeyHeader":[]}],"responses":{"200":{"description":"The result.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Single"}}}},"400":{"description":"`bad_request` — A parameter is malformed. The message says which.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"`unauthorized` — No key, a malformed key, a rotated key, or a paused account.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"`not_found` — No such route, or no such record in this account.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"405":{"description":"`method_not_allowed` — GET everywhere; PUT only on `/v1/plugin/sessions/{id}` and `/v1/plugin/live`. `Allow` lists what is.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"`rate_limited` — Over 120 requests a minute for this key. Retry after `Retry-After` seconds.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"`internal` — Our fault. The `requestId` in `meta` identifies the request in our logs.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/weather/{ident}":{"get":{"tags":["Weather"],"summary":"Weather at one aerodrome","description":"Any four-letter ICAO location indicator, whether or not it is on a card. A three-letter national code answers `no_icao_indicator`.","operationId":"getV1WeatherIdent","parameters":[{"name":"ident","in":"path","required":true,"description":"ICAO location indicator, e.g. `SAEZ`.","schema":{"type":"string"}}],"security":[{"bearer":[]},{"apiKeyHeader":[]}],"responses":{"200":{"description":"The result.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Single"}}}},"400":{"description":"`bad_request` — A parameter is malformed. The message says which.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"`unauthorized` — No key, a malformed key, a rotated key, or a paused account.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"`not_found` — No such route, or no such record in this account.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"405":{"description":"`method_not_allowed` — GET everywhere; PUT only on `/v1/plugin/sessions/{id}` and `/v1/plugin/live`. `Allow` lists what is.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"`rate_limited` — Over 120 requests a minute for this key. Retry after `Retry-After` seconds.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"`internal` — Our fault. The `requestId` in `meta` identifies the request in our logs.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/notes":{"get":{"tags":["Notes"],"summary":"Flight notes","description":"Every note — the kneeboard — with every field, including a handwritten note’s image as a data URL. Newest first by last change.\n\nField reference: `src/core/notes/types.ts (FlightNote)`.","operationId":"getV1Notes","parameters":[{"name":"limit","in":"query","description":"Records per page, 1–200. Default 50. A page may hold fewer when records are large.","schema":{"type":"integer","minimum":1,"maximum":200}},{"name":"cursor","in":"query","description":"Opaque. Pass `page.nextCursor` from the previous response to get the next page.","schema":{"type":"string"}},{"name":"updatedSince","in":"query","description":"ISO 8601 date-time. Only records changed after it — the way to follow changes.","schema":{"type":"string","format":"date-time"}}],"security":[{"bearer":[]},{"apiKeyHeader":[]}],"responses":{"200":{"description":"A page of records.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Page"}}}},"400":{"description":"`bad_request` — A parameter is malformed. The message says which.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"`unauthorized` — No key, a malformed key, a rotated key, or a paused account.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"`not_found` — No such route, or no such record in this account.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"405":{"description":"`method_not_allowed` — GET everywhere; PUT only on `/v1/plugin/sessions/{id}` and `/v1/plugin/live`. `Allow` lists what is.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"`rate_limited` — Over 120 requests a minute for this key. Retry after `Retry-After` seconds.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"`internal` — Our fault. The `requestId` in `meta` identifies the request in our logs.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/notes/{id}":{"get":{"tags":["Notes"],"summary":"One note","description":"By note id.\n\nField reference: `src/core/notes/types.ts (FlightNote)`.","operationId":"getV1NotesId","parameters":[{"name":"id","in":"path","required":true,"description":"The note id.","schema":{"type":"string"}}],"security":[{"bearer":[]},{"apiKeyHeader":[]}],"responses":{"200":{"description":"The result.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Single"}}}},"400":{"description":"`bad_request` — A parameter is malformed. The message says which.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"`unauthorized` — No key, a malformed key, a rotated key, or a paused account.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"`not_found` — No such route, or no such record in this account.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"405":{"description":"`method_not_allowed` — GET everywhere; PUT only on `/v1/plugin/sessions/{id}` and `/v1/plugin/live`. `Allow` lists what is.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"`rate_limited` — Over 120 requests a minute for this key. Retry after `Retry-After` seconds.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"`internal` — Our fault. The `requestId` in `meta` identifies the request in our logs.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/flight-plans":{"get":{"tags":["Flight plans"],"summary":"Flight plans","description":"Every ICAO flight plan with every field (items 7 to 19, the route, supplementary information). Newest departure date first.\n\nField reference: `src/core/flightplan/types.ts (FlightPlan)`.","operationId":"getV1FlightPlans","parameters":[{"name":"limit","in":"query","description":"Records per page, 1–200. Default 50. A page may hold fewer when records are large.","schema":{"type":"integer","minimum":1,"maximum":200}},{"name":"cursor","in":"query","description":"Opaque. Pass `page.nextCursor` from the previous response to get the next page.","schema":{"type":"string"}},{"name":"updatedSince","in":"query","description":"ISO 8601 date-time. Only records changed after it — the way to follow changes.","schema":{"type":"string","format":"date-time"}}],"security":[{"bearer":[]},{"apiKeyHeader":[]}],"responses":{"200":{"description":"A page of records.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Page"}}}},"400":{"description":"`bad_request` — A parameter is malformed. The message says which.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"`unauthorized` — No key, a malformed key, a rotated key, or a paused account.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"`not_found` — No such route, or no such record in this account.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"405":{"description":"`method_not_allowed` — GET everywhere; PUT only on `/v1/plugin/sessions/{id}` and `/v1/plugin/live`. `Allow` lists what is.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"`rate_limited` — Over 120 requests a minute for this key. Retry after `Retry-After` seconds.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"`internal` — Our fault. The `requestId` in `meta` identifies the request in our logs.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/flight-plans/{id}":{"get":{"tags":["Flight plans"],"summary":"One flight plan","description":"By flight plan id.\n\nField reference: `src/core/flightplan/types.ts (FlightPlan)`.","operationId":"getV1FlightPlansId","parameters":[{"name":"id","in":"path","required":true,"description":"The flight plan id.","schema":{"type":"string"}}],"security":[{"bearer":[]},{"apiKeyHeader":[]}],"responses":{"200":{"description":"The result.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Single"}}}},"400":{"description":"`bad_request` — A parameter is malformed. The message says which.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"`unauthorized` — No key, a malformed key, a rotated key, or a paused account.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"`not_found` — No such route, or no such record in this account.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"405":{"description":"`method_not_allowed` — GET everywhere; PUT only on `/v1/plugin/sessions/{id}` and `/v1/plugin/live`. `Allow` lists what is.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"`rate_limited` — Over 120 requests a minute for this key. Retry after `Retry-After` seconds.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"`internal` — Our fault. The `requestId` in `meta` identifies the request in our logs.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/plannings":{"get":{"tags":["Flight plans"],"summary":"Plannings","description":"Every route the pilot planned on the map — the working before a flight plan: the points in order with their positions, the aircraft, the planned departure, altitude, fuel on board, reserve and wind choice, and the flight plan it became (`flightPlanId`). Stored as the `route` entity; `departure`, `destination` and `waypoints` mirror `points`. Newest change first.\n\nField reference: `src/core/planning/types.ts (RoutePlanning)`.","operationId":"getV1Plannings","parameters":[{"name":"limit","in":"query","description":"Records per page, 1–200. Default 50. A page may hold fewer when records are large.","schema":{"type":"integer","minimum":1,"maximum":200}},{"name":"cursor","in":"query","description":"Opaque. Pass `page.nextCursor` from the previous response to get the next page.","schema":{"type":"string"}},{"name":"updatedSince","in":"query","description":"ISO 8601 date-time. Only records changed after it — the way to follow changes.","schema":{"type":"string","format":"date-time"}}],"security":[{"bearer":[]},{"apiKeyHeader":[]}],"responses":{"200":{"description":"A page of records.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Page"}}}},"400":{"description":"`bad_request` — A parameter is malformed. The message says which.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"`unauthorized` — No key, a malformed key, a rotated key, or a paused account.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"`not_found` — No such route, or no such record in this account.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"405":{"description":"`method_not_allowed` — GET everywhere; PUT only on `/v1/plugin/sessions/{id}` and `/v1/plugin/live`. `Allow` lists what is.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"`rate_limited` — Over 120 requests a minute for this key. Retry after `Retry-After` seconds.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"`internal` — Our fault. The `requestId` in `meta` identifies the request in our logs.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/plannings/{id}":{"get":{"tags":["Flight plans"],"summary":"One planning","description":"By planning id.\n\nField reference: `src/core/planning/types.ts (RoutePlanning)`.","operationId":"getV1PlanningsId","parameters":[{"name":"id","in":"path","required":true,"description":"The planning id.","schema":{"type":"string"}}],"security":[{"bearer":[]},{"apiKeyHeader":[]}],"responses":{"200":{"description":"The result.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Single"}}}},"400":{"description":"`bad_request` — A parameter is malformed. The message says which.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"`unauthorized` — No key, a malformed key, a rotated key, or a paused account.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"`not_found` — No such route, or no such record in this account.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"405":{"description":"`method_not_allowed` — GET everywhere; PUT only on `/v1/plugin/sessions/{id}` and `/v1/plugin/live`. `Allow` lists what is.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"`rate_limited` — Over 120 requests a minute for this key. Retry after `Retry-After` seconds.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"`internal` — Our fault. The `requestId` in `meta` identifies the request in our logs.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/shared-plannings":{"get":{"tags":["Flight plans"],"summary":"Shared plannings","description":"Plannings this pilot plans together with a copilot — as the owner, or as a guest who accepted. One document both edit (`doc`: the route, alternates, time, level, rules, wind), each pilot’s own half under `participants[].personal` (aircraft, speed, burn, fuel) with a summary of the aircraft each chose. Never the owner’s provider keys. Newest change first.\n\nField reference: `src/core/planning/shared.ts (SharedPlanning)`.","operationId":"getV1SharedPlannings","parameters":[],"security":[{"bearer":[]},{"apiKeyHeader":[]}],"responses":{"200":{"description":"The result.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Single"}}}},"400":{"description":"`bad_request` — A parameter is malformed. The message says which.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"`unauthorized` — No key, a malformed key, a rotated key, or a paused account.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"`not_found` — No such route, or no such record in this account.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"405":{"description":"`method_not_allowed` — GET everywhere; PUT only on `/v1/plugin/sessions/{id}` and `/v1/plugin/live`. `Allow` lists what is.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"`rate_limited` — Over 120 requests a minute for this key. Retry after `Retry-After` seconds.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"`internal` — Our fault. The `requestId` in `meta` identifies the request in our logs.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/shared-plannings/{id}":{"get":{"tags":["Flight plans"],"summary":"One shared planning","description":"By id. Not found unless this pilot is its owner or its accepted guest.\n\nField reference: `src/core/planning/shared.ts (SharedPlanning)`.","operationId":"getV1SharedPlanningsId","parameters":[{"name":"id","in":"path","required":true,"description":"The shared planning id.","schema":{"type":"string"}}],"security":[{"bearer":[]},{"apiKeyHeader":[]}],"responses":{"200":{"description":"The result.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Single"}}}},"400":{"description":"`bad_request` — A parameter is malformed. The message says which.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"`unauthorized` — No key, a malformed key, a rotated key, or a paused account.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"`not_found` — No such route, or no such record in this account.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"405":{"description":"`method_not_allowed` — GET everywhere; PUT only on `/v1/plugin/sessions/{id}` and `/v1/plugin/live`. `Allow` lists what is.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"`rate_limited` — Over 120 requests a minute for this key. Retry after `Retry-After` seconds.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"`internal` — Our fault. The `requestId` in `meta` identifies the request in our logs.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/airways":{"get":{"tags":["Aerodromes"],"summary":"ATS routes (airways)","description":"Argentina’s lower and upper ATS routes from AIP Argentina ENR 3.1/3.2, with significant points from ENR 4.4, as the app draws them: designator, lower/upper, conventional/RNAV, points in order with positions, and the published distance of each segment. `source` names the editions. Limits, minimum flight levels and direction of cruising levels are not included.\n\nField reference: `src/core/airways/index.ts (Airway)`.","operationId":"getV1Airways","parameters":[{"name":"airspace","in":"query","description":"`lower` or `upper`. Both when absent.","schema":{"type":"string"}},{"name":"designator","in":"query","description":"One route, e.g. `W5` or `UL780`.","schema":{"type":"string"}}],"security":[{"bearer":[]},{"apiKeyHeader":[]}],"responses":{"200":{"description":"The result.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Single"}}}},"400":{"description":"`bad_request` — A parameter is malformed. The message says which.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"`unauthorized` — No key, a malformed key, a rotated key, or a paused account.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"`not_found` — No such route, or no such record in this account.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"405":{"description":"`method_not_allowed` — GET everywhere; PUT only on `/v1/plugin/sessions/{id}` and `/v1/plugin/live`. `Allow` lists what is.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"`rate_limited` — Over 120 requests a minute for this key. Retry after `Retry-After` seconds.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"`internal` — Our fault. The `requestId` in `meta` identifies the request in our logs.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/logbook":{"get":{"tags":["Logbook"],"summary":"Logbook entries","description":"Every flight in the logbook, with every field; the ANAC logbook line is under `log`. Newest first by flight date. Durations are whole minutes.\n\nField reference: `src/services/storage/db.ts (FlightLog) and src/core/logbook/entry.ts (LogbookEntry)`.","operationId":"getV1Logbook","parameters":[{"name":"limit","in":"query","description":"Records per page, 1–200. Default 50. A page may hold fewer when records are large.","schema":{"type":"integer","minimum":1,"maximum":200}},{"name":"cursor","in":"query","description":"Opaque. Pass `page.nextCursor` from the previous response to get the next page.","schema":{"type":"string"}},{"name":"updatedSince","in":"query","description":"ISO 8601 date-time. Only records changed after it — the way to follow changes.","schema":{"type":"string","format":"date-time"}}],"security":[{"bearer":[]},{"apiKeyHeader":[]}],"responses":{"200":{"description":"A page of records.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Page"}}}},"400":{"description":"`bad_request` — A parameter is malformed. The message says which.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"`unauthorized` — No key, a malformed key, a rotated key, or a paused account.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"`not_found` — No such route, or no such record in this account.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"405":{"description":"`method_not_allowed` — GET everywhere; PUT only on `/v1/plugin/sessions/{id}` and `/v1/plugin/live`. `Allow` lists what is.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"`rate_limited` — Over 120 requests a minute for this key. Retry after `Retry-After` seconds.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"`internal` — Our fault. The `requestId` in `meta` identifies the request in our logs.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/logbook/totals":{"get":{"tags":["Logbook"],"summary":"Logbook totals","description":"Sums over every entry, in whole minutes, computed by the same function the app uses. The breakdown cells are never added to the flight total. Optional `from` / `to` dates bound the flights counted.","operationId":"getV1LogbookTotals","parameters":[{"name":"from","in":"query","description":"First flight date counted, `YYYY-MM-DD`, inclusive.","schema":{"type":"string","format":"date"}},{"name":"to","in":"query","description":"Last flight date counted, `YYYY-MM-DD`, inclusive.","schema":{"type":"string","format":"date"}}],"security":[{"bearer":[]},{"apiKeyHeader":[]}],"responses":{"200":{"description":"The result.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Single"}}}},"400":{"description":"`bad_request` — A parameter is malformed. The message says which.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"`unauthorized` — No key, a malformed key, a rotated key, or a paused account.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"`not_found` — No such route, or no such record in this account.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"405":{"description":"`method_not_allowed` — GET everywhere; PUT only on `/v1/plugin/sessions/{id}` and `/v1/plugin/live`. `Allow` lists what is.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"`rate_limited` — Over 120 requests a minute for this key. Retry after `Retry-After` seconds.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"`internal` — Our fault. The `requestId` in `meta` identifies the request in our logs.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/logbook/{id}":{"get":{"tags":["Logbook"],"summary":"One logbook entry","description":"By entry id.\n\nField reference: `src/services/storage/db.ts (FlightLog)`.","operationId":"getV1LogbookId","parameters":[{"name":"id","in":"path","required":true,"description":"The logbook entry id.","schema":{"type":"string"}}],"security":[{"bearer":[]},{"apiKeyHeader":[]}],"responses":{"200":{"description":"The result.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Single"}}}},"400":{"description":"`bad_request` — A parameter is malformed. The message says which.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"`unauthorized` — No key, a malformed key, a rotated key, or a paused account.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"`not_found` — No such route, or no such record in this account.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"405":{"description":"`method_not_allowed` — GET everywhere; PUT only on `/v1/plugin/sessions/{id}` and `/v1/plugin/live`. `Allow` lists what is.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"`rate_limited` — Over 120 requests a minute for this key. Retry after `Retry-After` seconds.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"`internal` — Our fault. The `requestId` in `meta` identifies the request in our logs.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/checklists":{"get":{"tags":["Checklists"],"summary":"Checklists","description":"Every checklist the pilot built, with its sections and items, for every aircraft. Sorted by aircraft, then by the pilot’s own order. Filter with `aircraftId`.\n\nField reference: `src/core/checklists/types.ts (Checklist)`.","operationId":"getV1Checklists","parameters":[{"name":"limit","in":"query","description":"Records per page, 1–200. Default 50. A page may hold fewer when records are large.","schema":{"type":"integer","minimum":1,"maximum":200}},{"name":"cursor","in":"query","description":"Opaque. Pass `page.nextCursor` from the previous response to get the next page.","schema":{"type":"string"}},{"name":"updatedSince","in":"query","description":"ISO 8601 date-time. Only records changed after it — the way to follow changes.","schema":{"type":"string","format":"date-time"}},{"name":"aircraftId","in":"query","description":"Only the checklists of this aircraft.","schema":{"type":"string"}}],"security":[{"bearer":[]},{"apiKeyHeader":[]}],"responses":{"200":{"description":"A page of records.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Page"}}}},"400":{"description":"`bad_request` — A parameter is malformed. The message says which.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"`unauthorized` — No key, a malformed key, a rotated key, or a paused account.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"`not_found` — No such route, or no such record in this account.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"405":{"description":"`method_not_allowed` — GET everywhere; PUT only on `/v1/plugin/sessions/{id}` and `/v1/plugin/live`. `Allow` lists what is.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"`rate_limited` — Over 120 requests a minute for this key. Retry after `Retry-After` seconds.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"`internal` — Our fault. The `requestId` in `meta` identifies the request in our logs.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/checklists/{id}":{"get":{"tags":["Checklists"],"summary":"One checklist","description":"By checklist id.\n\nField reference: `src/core/checklists/types.ts (Checklist)`.","operationId":"getV1ChecklistsId","parameters":[{"name":"id","in":"path","required":true,"description":"The checklist id.","schema":{"type":"string"}}],"security":[{"bearer":[]},{"apiKeyHeader":[]}],"responses":{"200":{"description":"The result.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Single"}}}},"400":{"description":"`bad_request` — A parameter is malformed. The message says which.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"`unauthorized` — No key, a malformed key, a rotated key, or a paused account.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"`not_found` — No such route, or no such record in this account.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"405":{"description":"`method_not_allowed` — GET everywhere; PUT only on `/v1/plugin/sessions/{id}` and `/v1/plugin/live`. `Allow` lists what is.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"`rate_limited` — Over 120 requests a minute for this key. Retry after `Retry-After` seconds.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"`internal` — Our fault. The `requestId` in `meta` identifies the request in our logs.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/check-flights":{"get":{"tags":["Checklists"],"summary":"Flight checks","description":"One record per flight the pilot ran an aircraft’s checklists on: when it started and finished, the lists in that day’s order, and a summary — items total, items done, and every item left unchecked. Newest first. Filter with `aircraftId`.\n\nField reference: `src/core/checklists/checkFlight.ts (CheckFlight)`.","operationId":"getV1CheckFlights","parameters":[{"name":"limit","in":"query","description":"Records per page, 1–200. Default 50. A page may hold fewer when records are large.","schema":{"type":"integer","minimum":1,"maximum":200}},{"name":"cursor","in":"query","description":"Opaque. Pass `page.nextCursor` from the previous response to get the next page.","schema":{"type":"string"}},{"name":"updatedSince","in":"query","description":"ISO 8601 date-time. Only records changed after it — the way to follow changes.","schema":{"type":"string","format":"date-time"}},{"name":"aircraftId","in":"query","description":"Only the flights of this aircraft.","schema":{"type":"string"}}],"security":[{"bearer":[]},{"apiKeyHeader":[]}],"responses":{"200":{"description":"A page of records.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Page"}}}},"400":{"description":"`bad_request` — A parameter is malformed. The message says which.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"`unauthorized` — No key, a malformed key, a rotated key, or a paused account.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"`not_found` — No such route, or no such record in this account.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"405":{"description":"`method_not_allowed` — GET everywhere; PUT only on `/v1/plugin/sessions/{id}` and `/v1/plugin/live`. `Allow` lists what is.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"`rate_limited` — Over 120 requests a minute for this key. Retry after `Retry-After` seconds.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"`internal` — Our fault. The `requestId` in `meta` identifies the request in our logs.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/check-flights/{id}":{"get":{"tags":["Checklists"],"summary":"One flight’s checks","description":"By flight id.\n\nField reference: `src/core/checklists/checkFlight.ts (CheckFlight)`.","operationId":"getV1CheckFlightsId","parameters":[{"name":"id","in":"path","required":true,"description":"The flight id.","schema":{"type":"string"}}],"security":[{"bearer":[]},{"apiKeyHeader":[]}],"responses":{"200":{"description":"The result.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Single"}}}},"400":{"description":"`bad_request` — A parameter is malformed. The message says which.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"`unauthorized` — No key, a malformed key, a rotated key, or a paused account.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"`not_found` — No such route, or no such record in this account.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"405":{"description":"`method_not_allowed` — GET everywhere; PUT only on `/v1/plugin/sessions/{id}` and `/v1/plugin/live`. `Allow` lists what is.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"`rate_limited` — Over 120 requests a minute for this key. Retry after `Retry-After` seconds.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"`internal` — Our fault. The `requestId` in `meta` identifies the request in our logs.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/plugin/sessions/{id}":{"put":{"tags":["RogerATC plugin"],"summary":"Store a plugin session","description":"An idempotent upsert of one whole RogerATC session: send it at the start, at checkpoints, and at the end, under the same id. Answers `201` the first time and `200` after. `410 gone` when the pilot deleted the session in the app — stop sending it. Oldest events are dropped to fit the limits, and `eventsDropped` says how many.\n\nField reference: `src/core/plugin/session.ts (PluginSession)`.","operationId":"putV1PluginSessionsId","parameters":[{"name":"id","in":"path","required":true,"description":"The plugin’s session id, stable for the flight: 3–128 of `A–Z a–z 0–9 . _ -`.","schema":{"type":"string"}}],"requestBody":{"required":true,"description":"A plugin session, schema 1 — see docs/API.md, “PUT /v1/plugin/sessions/{id}”, and src/core/plugin/session.ts.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"security":[{"bearer":[]},{"apiKeyHeader":[]}],"responses":{"200":{"description":"The result.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Single"}}}},"201":{"description":"Stored for the first time.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Single"}}}},"400":{"description":"`bad_request` — A parameter is malformed. The message says which.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"`unauthorized` — No key, a malformed key, a rotated key, or a paused account.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"`not_found` — No such route, or no such record in this account.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"405":{"description":"`method_not_allowed` — GET everywhere; PUT only on `/v1/plugin/sessions/{id}` and `/v1/plugin/live`. `Allow` lists what is.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"410":{"description":"`gone` — The pilot deleted this plugin session in the app. Stop sending it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"`payload_too_large` — A write body over its limit: 512 KB for a session, 32 KB for a live report.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"415":{"description":"`unsupported_media_type` — A write body that is not `application/json`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"`rate_limited` — Over 120 requests a minute for this key. Retry after `Retry-After` seconds.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"`internal` — Our fault. The `requestId` in `meta` identifies the request in our logs.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"get":{"tags":["RogerATC plugin"],"summary":"One plugin session","description":"By session id.\n\nField reference: `src/core/plugin/session.ts (PluginSession)`.","operationId":"getV1PluginSessionsId","parameters":[{"name":"id","in":"path","required":true,"description":"The plugin’s session id.","schema":{"type":"string"}}],"security":[{"bearer":[]},{"apiKeyHeader":[]}],"responses":{"200":{"description":"The result.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Single"}}}},"400":{"description":"`bad_request` — A parameter is malformed. The message says which.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"`unauthorized` — No key, a malformed key, a rotated key, or a paused account.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"`not_found` — No such route, or no such record in this account.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"405":{"description":"`method_not_allowed` — GET everywhere; PUT only on `/v1/plugin/sessions/{id}` and `/v1/plugin/live`. `Allow` lists what is.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"`rate_limited` — Over 120 requests a minute for this key. Retry after `Retry-After` seconds.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"`internal` — Our fault. The `requestId` in `meta` identifies the request in our logs.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/plugin/live":{"put":{"tags":["RogerATC plugin"],"summary":"Report live state, collect commands","description":"The live link, polled by the plugin while the simulator runs. The body is the plugin’s current state — position, phase, radios, weather as the simulator has it, the controller’s last procedure — and the outcome (`acks`) of every command it dealt with since the last call. The answer carries the commands the pilot sent from the app and the plugin has not collected yet, oldest first, each handed over exactly once, and `pollMs`: 2000 while somebody has the RogerATC screen open, 10000 while nobody does. Always `200`. The report replaces the previous one and expires after ten minutes; it is never a track and never a synced record. No navigation data: the plugin sends where the aeroplane is, never what is near it. Body at most 32 KB.\n\nField reference: `src/core/plugin/live.ts (LiveReport, CommandRequest)`.","operationId":"putV1PluginLive","parameters":[],"requestBody":{"required":true,"description":"A live report, schema 1 — see docs/API.md, “PUT /v1/plugin/live”, and src/core/plugin/live.ts (LiveReport).","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"security":[{"bearer":[]},{"apiKeyHeader":[]}],"responses":{"200":{"description":"The result.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Single"}}}},"400":{"description":"`bad_request` — A parameter is malformed. The message says which.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"`unauthorized` — No key, a malformed key, a rotated key, or a paused account.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"`not_found` — No such route, or no such record in this account.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"405":{"description":"`method_not_allowed` — GET everywhere; PUT only on `/v1/plugin/sessions/{id}` and `/v1/plugin/live`. `Allow` lists what is.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"`payload_too_large` — A write body over its limit: 512 KB for a session, 32 KB for a live report.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"415":{"description":"`unsupported_media_type` — A write body that is not `application/json`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"`rate_limited` — Over 120 requests a minute for this key. Retry after `Retry-After` seconds.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"`internal` — Our fault. The `requestId` in `meta` identifies the request in our logs.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/plugin/sessions":{"get":{"tags":["RogerATC plugin"],"summary":"Plugin sessions","description":"Every RogerATC session stored for the account, newest first, with its statistics and events. `updatedSince` follows sessions still in progress.\n\nField reference: `src/core/plugin/session.ts (PluginSession)`.","operationId":"getV1PluginSessions","parameters":[{"name":"limit","in":"query","description":"Records per page, 1–200. Default 50. A page may hold fewer when records are large.","schema":{"type":"integer","minimum":1,"maximum":200}},{"name":"cursor","in":"query","description":"Opaque. Pass `page.nextCursor` from the previous response to get the next page.","schema":{"type":"string"}},{"name":"updatedSince","in":"query","description":"ISO 8601 date-time. Only records changed after it — the way to follow changes.","schema":{"type":"string","format":"date-time"}}],"security":[{"bearer":[]},{"apiKeyHeader":[]}],"responses":{"200":{"description":"A page of records.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Page"}}}},"400":{"description":"`bad_request` — A parameter is malformed. The message says which.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"`unauthorized` — No key, a malformed key, a rotated key, or a paused account.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"`not_found` — No such route, or no such record in this account.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"405":{"description":"`method_not_allowed` — GET everywhere; PUT only on `/v1/plugin/sessions/{id}` and `/v1/plugin/live`. `Allow` lists what is.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"`rate_limited` — Over 120 requests a minute for this key. Retry after `Retry-After` seconds.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"`internal` — Our fault. The `requestId` in `meta` identifies the request in our logs.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/plugin/stats":{"get":{"tags":["RogerATC plugin"],"summary":"Plugin totals","description":"Totals over every stored session — the same function the app’s RogerATC screen uses: sessions by status, minutes, transmissions, readbacks, response time, stations, aerodromes and aircraft.\n\nField reference: `src/core/plugin/session.ts (PluginTotals)`.","operationId":"getV1PluginStats","parameters":[],"security":[{"bearer":[]},{"apiKeyHeader":[]}],"responses":{"200":{"description":"The result.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Single"}}}},"400":{"description":"`bad_request` — A parameter is malformed. The message says which.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"`unauthorized` — No key, a malformed key, a rotated key, or a paused account.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"`not_found` — No such route, or no such record in this account.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"405":{"description":"`method_not_allowed` — GET everywhere; PUT only on `/v1/plugin/sessions/{id}` and `/v1/plugin/live`. `Allow` lists what is.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"`rate_limited` — Over 120 requests a minute for this key. Retry after `Retry-After` seconds.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"`internal` — Our fault. The `requestId` in `meta` identifies the request in our logs.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/pilot":{"get":{"tags":["Pilot"],"summary":"Pilot profile","description":"The pilot profile with every field: name, telephone, licences, ratings with their expiry, the medical certificate. `data` is null when the pilot has not created one. The key grants this; treat it accordingly.\n\nField reference: `src/core/flightplan/types.ts (PilotProfile) and src/core/pilot/credentials.ts`.","operationId":"getV1Pilot","parameters":[],"security":[{"bearer":[]},{"apiKeyHeader":[]}],"responses":{"200":{"description":"The result.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Single"}}}},"400":{"description":"`bad_request` — A parameter is malformed. The message says which.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"`unauthorized` — No key, a malformed key, a rotated key, or a paused account.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"`not_found` — No such route, or no such record in this account.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"405":{"description":"`method_not_allowed` — GET everywhere; PUT only on `/v1/plugin/sessions/{id}` and `/v1/plugin/live`. `Allow` lists what is.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"`rate_limited` — Over 120 requests a minute for this key. Retry after `Retry-After` seconds.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"`internal` — Our fault. The `requestId` in `meta` identifies the request in our logs.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}}}}