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

# Contributors

> Who answered, by approved claims they stood behind, most first. Only claims in the catalog count, and only contributors who gave a name. Rate: 300 per 600 s (bucket `gaps`). Cache: 10 min edge.



## OpenAPI

````yaml /openapi.json get /v1/contributors
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/contributors:
    get:
      tags:
        - Contributions
      summary: Contributors
      description: >-
        Who answered, by approved claims they stood behind, most first. Only
        claims in the catalog count, and only contributors who gave a name.
        Rate: 300 per 600 s (bucket `gaps`). Cache: 10 min edge.
      operationId: contributors
      responses:
        '200':
          description: OK
          content:
            application/json:
              schema:
                properties:
                  answers:
                    type: integer
                    description: Approved claims, all contributors.
                  contributors:
                    items:
                      properties:
                        handle:
                          type: string
                        answers:
                          type: integer
                          description: Approved claims stood behind.
                        latest:
                          type:
                            - string
                            - 'null'
                          description: Date of the latest, YYYY-MM-DD.
                      type: object
                    type: array
                    description: Most answers first, top 200.
                type: object
                required:
                  - answers
                  - contributors
              example:
                answers: 41
                contributors:
                  - handle: spotter_sg
                    answers: 23
                    latest: '2026-09-14'
        '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

````