---
title: "Get Project Device History Topology"
method: GET
path: "/openapi/v2.0/topologies/history"
tags: ["Device Management/Device List Management/Device List (Project Scope)", "Organization & Project"]
---

# Get Project Device History Topology

`GET /openapi/v2.0/topologies/history`

## Request

- Base URL: `` (relative, and it does not resolve against the document’s source URL)
- URL: `/openapi/v2.0/topologies/history`
- Auth: none required

Get the project's historical device topology, grouped by model into dock/remote controller/aircraft nodes. This interface is for historical display only, and all nodes' online status is always false

## Headers

- `X-User-Token` string, required
- `X-Project-Uuid` string, required
- `X-Request-Id` string
- `X-Language` string

## Response `200`

OK

- object
  - `code` integer: Business status code, 0 means success
  - `message` string: Business Message
  - `data` object: Project historical device topology data. Returns {list: []} when the project has no historical devices
    - `list` object[]: Historical topo list, sorted in descending order by the index field. Device classification rules by device_model.class: rc/communication/airport go to parents, drone goes to host, other classes are discarded
      - `index` string: Computed by sha256 over all SNs in this topo concatenated; stably identifies a topo group
      - `host` object, nullable: Aircraft node (device_model.class=drone). This field is null for non-drone class devices
        - `device_sn` string: Device Serial Number
        - `device_model` object: Device model info (po.DeviceModelEnum)
          - `key` string: Unified product enum primary key, formatted as domain-type-sub_type (e.g., 0-89-0)
          - `domain` string: Device domain (top-level category identifier such as drone/payload/rc)
          - `type` string: Main Model
          - `sub_type` string: Sub Model
          - `name` string: Model Name
          - `class` 'rc' | 'drone' | 'communication' | 'airport' | 'payload' | 'relay': Device Category
        - `device_online_status` boolean: Device online status. Always false in legacy interface
        - `is_device_pending_offline` boolean: Whether the device is in the offline pending period. Always false in legacy interface
        - `device_offline_position` object, nullable: Last position when the device went offline (only returned when is_device_pending_offline=true). Always null in legacy interface
          - `latitude` number: Latitude
          - `longitude` number: Longitude
        - `device_project_callsign` string: Device callsign within the project. Always empty string in legacy interface (legacy devices have no project callsign assigned)
        - `is_organization_device` boolean: Whether Device Also Belongs to Project's Organization
        - `device_organization_callsign` string, nullable: Device alias within the organization (has value only when is_organization_device=true)
        - `device_control_user_id` string: User ID currently holding control permission for this device (taken from po.Device.DeviceUserID)
        - `device_control_user_project_callsign` string: Control Permission User's Callsign in Project
        - `device_control_user_organization_callsign` string: Control permission user's callsign in the organization. Not set in legacy interface, defaults to empty
        - `device_state` unknown
        - `device_index` string: AB control attribute (A/B/empty). Not populated in legacy interface
        - `parent_sns` string[]: Parent node SN list of this node. Not populated in legacy interface
      - `parents` object[]: Parent nodes (device_model.class=rc/communication/airport). Length is typically 1 in legacy topo
        - `device_sn` string: Device Serial Number
        - `device_model` object: Device model info (po.DeviceModelEnum)
          - `key` string
          - `domain` string
          - `type` string
          - `sub_type` string
          - `name` string
          - `class` 'rc' | 'drone' | 'communication' | 'airport' | 'payload' | 'relay'
        - `device_online_status` boolean: Legacy interface, always false
        - `is_device_pending_offline` boolean: Legacy interface, always false
        - `device_offline_position` object, nullable: Legacy interface, always null
        - `device_project_callsign` string: Legacy interface, always returns empty string
        - `is_organization_device` boolean
        - `device_organization_callsign` string, nullable
        - `device_control_user_id` string
        - `device_control_user_project_callsign` string
        - `device_control_user_organization_callsign` string
        - `device_state` unknown
        - `device_index` string: AB Control Attribute
        - `parent_sns` string[]
      - `nodes` object[]: Child nodes (payload, etc.). Not populated in legacy topo, typically an empty array
      - `project` object, nullable: Project info (po.Project). omitempty in this interface, usually empty

## Other responses

- `400`: Invalid request parameters (incorrect format, missing required fields, etc.)
- `401`: Authentication failed (token invalid or expired)
- `403`: Insufficient permission (token does not have the corresponding permission in this project/organization)
- `500`: Server Internal Error

---

[API](https://skmtc.dev/dji/apis/flighthub-2-openapi-v2-0-public-cloud.md) - [All operations](https://skmtc.dev/dji/apis/flighthub-2-openapi-v2-0-public-cloud/llms.txt) - [OpenAPI document](https://skmtc.dev/dji/apis/flighthub-2-openapi-v2-0-public-cloud/revisions/aeef0010be34?raw)
