> ## 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.

# One question

> The open question for one callsign, the answers on file, and the catalog answer in force if there is one. 404 when observation has no question for it. Rate: 300 per 600 s (bucket `gaps`). Cache: 10 min edge.



## OpenAPI

````yaml /openapi.json get /v1/gaps/{callsign}
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/{callsign}:
    get:
      tags:
        - Contributions
      summary: One question
      description: >-
        The open question for one callsign, the answers on file, and the catalog
        answer in force if there is one. 404 when observation has no question
        for it. Rate: 300 per 600 s (bucket `gaps`). Cache: 10 min edge.
      operationId: gap
      parameters:
        - name: callsign
          in: path
          required: true
          schema:
            type: string
            description: Callsign or flight ident, 2-12 alphanumerics.
            title: Callsign
          description: Callsign or flight ident, 2-12 alphanumerics.
      responses:
        '200':
          description: OK
          content:
            application/json:
              schema:
                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.
                  catalog:
                    description: >-
                      The community answer in force, if any: the whole route,
                      IATA.
                    oneOf:
                      - type: object
                        properties:
                          route:
                            type: array
                            items:
                              type: string
                          valid_from:
                            type: string
                      - type: 'null'
                  answers:
                    type: array
                    items:
                      type: object
                      properties:
                        origin:
                          type: string
                        dest:
                          type: string
                        status:
                          type: string
                          description: pending or approved.
                        verdict:
                          type:
                            - string
                            - 'null'
                          description: >-
                            corroborated, contradicted, unverified, or
                            contested.
                    description: Answers on file, oldest first, rejected ones left out.
              example:
                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
                answers: []
        '404':
          description: Not found or not observed.
          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
        '422':
          description: Malformed input.
          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
        '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

````