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

# Routes, bulk

> Derived routes for the callsigns of a list on screen, up to 80 in one call: observed routes first, the community catalog where they are silent. Null for a callsign never observed. Rate: 120 per 600 s (bucket `routes`). Cache: 1 h edge.



## OpenAPI

````yaml /openapi.json get /v1/routes
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/routes:
    get:
      tags:
        - History
        - History
      summary: Routes, bulk
      description: >-
        Derived routes for the callsigns of a list on screen, up to 80 in one
        call: observed routes first, the community catalog where they are
        silent. Null for a callsign never observed. Rate: 120 per 600 s (bucket
        `routes`). Cache: 1 h edge.
      operationId: routes_bulk
      parameters:
        - name: cs
          in: query
          required: true
          schema:
            type: string
            minLength: 2
            maxLength: 1100
            description: Comma-separated callsigns, up to 80.
            title: Cs
          description: Comma-separated callsigns, up to 80.
      responses:
        '200':
          description: OK
          content:
            application/json:
              schema:
                type: object
                properties:
                  routes:
                    description: >-
                      Callsign (upper case) to [origin, ...via, destination]
                      IATA, or null when unknown. Every requested callsign is a
                      key.
                    type: object
                    additionalProperties:
                      oneOf:
                        - type: array
                          items:
                            type: string
                        - type: 'null'
              example:
                routes:
                  SQ322:
                    - SIN
                    - LHR
                  BAW9:
                    - LHR
                    - SIN
        '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

````