> ## Documentation Index
> Fetch the complete documentation index at: https://docs.flightportrait.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Open questions

> Callsigns whose route observation settled at one end only, most-seen first. Each row says which end is missing, which is known, where the aircraft was last heard, and how far its rotation says the other end is. Answers go to the contribution door, not this API. Rate: 300 per 600 s (bucket `gaps`). Cache: 10 min edge.



## OpenAPI

````yaml /openapi.json get /v1/gaps
openapi: 3.1.0
info:
  title: FlightPortrait network API
  description: >-
    Open data from the FlightPortrait receiver network. No API key.


    **Stability.** Operations marked `x-stability: stable` only ever gain
    fields; names and types are frozen. Operations marked `x-stability: map`
    exist for the first-party map and can change with it.


    **Field dialects.** `/v1/aircraft` and `/v2/point` pass readsb's wire fields
    through unchanged (`hex`, `t`, `r`, `gs`, ...) so ecosystem tooling works
    as-is. Every other resource uses full words: `reg`, `type`, `org`, `dst`.
    Airport codes in history resources are IATA; `/v1/airports/{code}` accepts
    IATA or ICAO. Event times are unix seconds UTC; registry timestamps are ISO
    8601 UTC; board and schedule times are HH:MM in the origin airport's local
    time.


    **Data honesty.** History is observation, never an official registry. Gaps
    mean the network's sources did not hear it, nothing more. Responses carry
    `coverage: "observed"` as a reminder. The one exception is the airport
    departures board, whose rows may be inferred from published timetables —
    each board row carries its own `source` (observed / published / both); a
    published row is not a receiver observation. Likewise a flight's
    `route_source`: `observed` when both ends were seen, `observed+catalog` when
    the community supplied the end coverage never reached, `catalog` when it
    supplied both. Catalog answers are checked against observation and reviewed
    before they are served, and observation outranks them whenever it speaks.
    This API is read-only; answers go to the contribution door at
    contribute.flightportrait.com.


    **Errors.** Every non-200 body is `{"error": <code>, "detail": <human
    text>}` with `Cache-Control: no-store`. 404 `not_found` / `not_observed`,
    422 `invalid_request`, 429 `rate_limited` (with `Retry-After` and
    `RateLimit-*` headers), 503 `stale_snapshot` (live snapshot older than 60 s)
    or `artifact_unavailable` (a history artifact is not loaded).


    **Rate limits.** Per IP, per bucket, over a 600 second window; each
    operation notes its bucket and default limit. 429 means wait for
    `Retry-After` seconds.


    Data is ODbL 1.0. Credit "FlightPortrait network feeders" and link the
    credits page, which lists every source the data draws on and the credit each
    one asks for; republishing carries them too.

    Credits: https://flightportrait.com/network/credits.html

    Terms: https://flightportrait.com/network/terms
  version: 1.0.0
servers:
  - url: https://data.flightportrait.com
security: []
tags:
  - name: Live
    description: What the network hears now.
  - name: History
    description: Observed airframes, flights, airports.
  - name: Stations
    description: Feeder roster.
  - name: Reference
    description: Airlines, alliances, types.
  - name: Contributions
    description: What observation could not settle, and the community answers to it.
  - name: Meta
    description: Index and health.
paths:
  /v1/gaps:
    get:
      tags:
        - Contributions
      summary: Open questions
      description: >-
        Callsigns whose route observation settled at one end only, most-seen
        first. Each row says which end is missing, which is known, where the
        aircraft was last heard, and how far its rotation says the other end is.
        Answers go to the contribution door, not this API. Rate: 300 per 600 s
        (bucket `gaps`). Cache: 10 min edge.
      operationId: gaps
      parameters:
        - name: airline
          in: query
          required: false
          schema:
            anyOf:
              - type: string
                minLength: 2
                maxLength: 3
              - type: 'null'
            description: ICAO airline prefix.
            title: Airline
          description: ICAO airline prefix.
        - name: side
          in: query
          required: false
          schema:
            anyOf:
              - type: string
                pattern: ^(origin|dest)$
              - type: 'null'
            title: Side
        - name: limit
          in: query
          required: false
          schema:
            type: integer
            maximum: 200
            minimum: 1
            default: 50
            title: Limit
        - name: offset
          in: query
          required: false
          schema:
            type: integer
            minimum: 0
            default: 0
            title: Offset
      responses:
        '200':
          description: OK
          content:
            application/json:
              schema:
                type: object
                properties:
                  total:
                    type: integer
                    description: Rows matching the filters.
                  offset:
                    type: integer
                  gaps:
                    type: array
                    items:
                      type: object
                      properties:
                        callsign:
                          type: string
                        side:
                          type: string
                          description: 'The missing end: origin or dest.'
                        known:
                          type: string
                          description: The settled end, IATA.
                        hint:
                          type:
                            - string
                            - 'null'
                          description: >-
                            The missing end's leading code when observation saw
                            it too rarely to settle it.
                        chain:
                          description: >-
                            Every known stop in order when the callsign is a
                            chain with one end unseen; the missing end goes
                            before or after it. Null for a single leg.
                          oneOf:
                            - type: array
                              items:
                                type: string
                            - type: 'null'
                        type:
                          type:
                            - string
                            - 'null'
                          description: Dominant aircraft type on the leg.
                        n_recent:
                          type: integer
                          description: Sightings in the last 90 days.
                        last_seen:
                          type: string
                          description: Last date observed, YYYY-MM-DD.
                        last_heard:
                          description: >-
                            Where the most recent truncated leg was last heard,
                            with its track in degrees true. Null when unknown.
                          oneOf:
                            - type: object
                              properties:
                                lat:
                                  type: number
                                lon:
                                  type: number
                                track:
                                  type:
                                    - integer
                                    - 'null'
                            - type: 'null'
                        rotation_km:
                          type:
                            - integer
                            - 'null'
                          description: >-
                            How far the missing end is, from the time the
                            airframe takes to come back. Null until a few
                            rotations were seen.
                        suggested:
                          type: array
                          items:
                            type: string
                          description: >-
                            Airports the evidence allows for the missing end,
                            best first: at the rotation's distance, within the
                            type's range, along the last heard track, ranked by
                            how much the airline is seen flying there. Empty
                            until the rotation is known.
                  coverage:
                    type: string
                    description: >-
                      Always "observed": evidence from our receivers and open
                      trace archives, never a published schedule or registry.
                    const: observed
                required:
                  - total
                  - offset
                  - gaps
                  - coverage
              example:
                total: 1
                offset: 0
                gaps:
                  - callsign: SIA842
                    side: dest
                    known: SIN
                    type: B78X
                    n_recent: 13
                    last_seen: '2026-09-06'
                    last_heard:
                      lat: 12.41
                      lon: 106.92
                      track: 21
                    rotation_km: 3150
                    suggested:
                      - TFU
                      - CTU
                coverage: observed
        '422':
          description: Validation Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/HTTPValidationError'
        '429':
          description: >-
            Rate limited. Wait Retry-After seconds. Headers: Retry-After,
            RateLimit-Limit, RateLimit-Remaining, RateLimit-Reset.
          content:
            application/json:
              schema:
                properties:
                  error:
                    type: string
                    description: >-
                      Machine code: not_found, not_observed, invalid_request,
                      rate_limited, stale_snapshot, artifact_unavailable,
                      upstream_unavailable.
                  detail:
                    type: string
                    description: Human-readable explanation.
                type: object
                required:
                  - error
                  - detail
              example:
                error: rate_limited
                detail: slow down
        '503':
          description: >-
            Live snapshot older than 60 seconds (stale_snapshot) or a required
            history artifact is not loaded (artifact_unavailable). Retry-After
            is set.
          content:
            application/json:
              schema:
                properties:
                  error:
                    type: string
                    description: >-
                      Machine code: not_found, not_observed, invalid_request,
                      rate_limited, stale_snapshot, artifact_unavailable,
                      upstream_unavailable.
                  detail:
                    type: string
                    description: Human-readable explanation.
                type: object
                required:
                  - error
                  - detail
components:
  schemas:
    HTTPValidationError:
      properties:
        detail:
          items:
            $ref: '#/components/schemas/ValidationError'
          type: array
          title: Detail
      type: object
      title: HTTPValidationError
    ValidationError:
      properties:
        loc:
          items:
            anyOf:
              - type: string
              - type: integer
          type: array
          title: Location
        msg:
          type: string
          title: Message
        type:
          type: string
          title: Error Type
        input:
          title: Input
        ctx:
          type: object
          title: Context
      type: object
      required:
        - loc
        - msg
        - type
      title: ValidationError

````