openapi: 3.0.3
info:
  title: Swagger OpenThread REST API
  description: |-
    This describes the OpenThread Border Router REST API. The API is provided by the otbr-agent, if the cmake flag `OTBR_REST=ON` is set. By default
    the REST API listens on any address on port 8081.

    Some useful links:
    - [OpenThread Border Router repository](github.com/openthread/ot-br-posix/)
  license:
    name: BSD 3-Clause
    url: https://github.com/openthread/ot-br-posix/blob/main/LICENSE
  version: 0.3.0
servers:
  - url: http://localhost:8081
tags:
  - name: node
    description: Thread parameters of this node.
  - name: diagnostics
    description: Thread network diagnostic.
paths:
  /diagnostics:
    get:
      tags:
        - diagnostics
      summary: Get Thread network diagnostics
      responses:
        "200":
          description: Successful operation
          content:
            application/json:
              schema:
                type: object
  /node:
    get:
      tags:
        - node
      summary: Get current active node parameters
      responses:
        "200":
          description: Successful operation
          content:
            application/json:
              schema:
                type: object
    delete:
      tags:
        - node
      summary: Erase all persistent information, essentially factory reset the Border Router.
      responses:
        "200":
          description: Successful operation
        "409":
          description: Thread interface is in wrong state.
  /node/ba-id:
    get:
      tags:
        - node
      summary: Get the border agent ID
      responses:
        "200":
          description: Successful operation
          content:
            application/json:
              schema:
                type: string
                description: 16 byte border agent ID as hex string.
                example: "AA897CA8A67F6E6DD6166133AD1562A5"
  /node/rloc:
    get:
      tags:
        - node
      summary: Routing Locator IPv6 address of this Thread node.
      responses:
        "200":
          description: Successful operation
          content:
            application/json:
              schema:
                type: string
                description: RLOC IPv6 address
                example: "fda4:728e:4b39:bc4a:0:ff:fe00:1000"
  /node/rloc16:
    get:
      tags:
        - node
      summary: Routing Locator Router and Child ID (RLOC16).
      description: Last 16-bit of the Routing Locator IPv6 consisting of the Router ID and a Child ID.
      responses:
        "200":
          description: Successful operation
          content:
            application/json:
              schema:
                type: number
                description: RLOC16 address
                example: 4096
  /node/ext-address:
    get:
      tags:
        - node
      summary: IEEE 802.15.4 Extended Address (EUI-64).
      responses:
        "200":
          description: Successful operation
          content:
            application/json:
              schema:
                type: string
                description: 8-byte IEEE 802.15.4 Extended Address of this node as hex string.
                example: "C21F906BE0352A4C"
  /node/state:
    get:
      tags:
        - node
      summary: Get current Thread state.
      description: |-
        State describing the current Thread role of this Thread node.
        - disabled: The Thread stack is disabled.
        - detached: Not currently participating in a Thread network/partition.
        - child: The Thread Child role.
        - router: The Thread Router role.
        - leader: The Thread Leader role.
      responses:
        "200":
          description: Successful operation
          content:
            application/json:
              schema:
                type: string
                description: Current state
                example: "leader"
    put:
      tags:
        - node
      summary: Set current Thread state.
      description: |-
        Enable and disable the Thread protocol operation. If network interface
        hasn't been started yet, it will get started automatically.
      responses:
        "200":
          description: Successful operation.
      requestBody:
        description: New Thread state
        content:
          application/json:
            schema:
              type: string
              description: Can be "enable" or "disable".
              example: "enable"
  /node/network-name:
    get:
      tags:
        - node
      summary: Thread network name this node is part of.
      responses:
        "200":
          description: Successful operation
          content:
            application/json:
              schema:
                type: string
                description: Thread network name.
                example: "OpenThread-e445"
  /node/leader-data:
    get:
      tags:
        - node
      summary: Gets the network's leader data.
      responses:
        "200":
          description: Successful operation
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/LeaderData"
  /node/ext-panid:
    get:
      tags:
        - node
      summary: Extended PAN ID.
      responses:
        "200":
          description: Successful operation
          content:
            application/json:
              schema:
                type: string
                description: 8-byte extended PAN ID as hex string.
                example: "3CAB144450CF407E"
  /node/num-of-router:
    get:
      tags:
        - node
      summary: Get number of router devices
      responses:
        "200":
          description: Successful operation
          content:
            application/json:
              schema:
                type: number
                description: Number of routers
                example: 1
  /node/dataset/active:
    get:
      tags:
        - node
      summary: Get current active operational dataset
      responses:
        "200":
          description: Returns currently active operational dataset
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Dataset"
            text/plain:
              schema:
                $ref: "#/components/schemas/DatasetTlv"
        "204":
          description: No active operational dataset
    put:
      tags:
        - node
      summary: Creates or updates the active operational dataset
      description: |-
        Creates or updates the the active operational dataset on the current node. Only allowed if the Thread node
        is inactive. If the Thread node is active, a pending dataset should be used to update the current active
        operational dataset.
      requestBody:
        description: |-
          Operational dataset that will be stored as active operational dataset. Supports request body Content-Type
          `text/plain` (dataset in TLV format as hex string) or `application/json` (dataset in JSON format). In both
          cases keys which are not set will be initialized with defaults.
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/ActiveDataset"
          plain/text:
            schema:
              $ref: "#/components/schemas/DatasetTlv"
      responses:
        "200":
          description: Successfully updated the active operational dataset.
        "201":
          description: Successfully created the active operational dataset.
        "400":
          description: Invalid request body.
        "409":
          description: Writing active operational dataset rejected because Thread network is active.
  /node/dataset/pending:
    get:
      tags:
        - node
      summary: Get current pending operational dataset
      responses:
        "200":
          description: Returns currently pending operational dataset
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/PendingDataset"
            text/plain:
              schema:
                $ref: "#/components/schemas/DatasetTlv"
        "204":
          description: No pending operational dataset
    put:
      tags:
        - node
      summary: Creates or updates the pending operational dataset
      description: |-
        Creates or updates the the pending operational dataset on the current node. Delay needs to be set to let
        the pending dataset apply as active dataset in the near future.
      requestBody:
        description: |-
          Operational dataset that will be stored as pending operational dataset. Supports request body Content-Type
          `text/plain` (dataset in TLV format as hex string) or `application/json` (dataset in JSON format). In both
          cases keys which are not set will be initialized with defaults.
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/PendingDataset"
          text/plain:
            schema:
              $ref: "#/components/schemas/DatasetTlv"
      responses:
        "200":
          description: Successfully updated the pending operational dataset.
        "201":
          description: Successfully created the pending operational dataset.
        "400":
          description: Invalid request body.
components:
  schemas:
    LeaderData:
      type: object
      properties:
        PartitionId:
          type: number
          format: uint32
          description: Partition ID
          example: 1230046604
        Weighting:
          type: number
          format: uint8
          description: Leader Weight
          example: 64
        DataVersion:
          type: number
          description: Full network data version
          example: 244
        StableDataVersion:
          type: number
          format: uint8
          description: Stable Network Data Version
          example: 186
        LeaderRouterId:
          type: number
          format: uint8
          description: Leader Router ID
          example: 4
    ActiveDataset:
      type: object
      properties:
        ActiveTimestamp:
          $ref: "#/components/schemas/Timestamp"
        NetworkKey:
          type: string
          description: Network key, 16 bytes long, formatted as a hexadecimal string
          example: 08277229F21FB7342D705D3CEFDC042A
          default: random
        NetworkName:
          type: string
          description: Network name, 16 bytes long
          example: OpenThread-e445
          default: OpenThread-<PanId>
        ExtPanId:
          type: string
          description: Extended PAN ID, 8 bytes long, formatted as a hexadecimal string
          example: 996D3BEE320097A3
          default: random
        MeshLocalPrefix:
          type: string
          description: Mesh local IPv6 prefix
          example: fd33:d3b9:89e3:72e4::/64
          default: random
        PanId:
          type: integer
          description: IEEE 802.15.4 PAN ID of the Thread network
          format: uint16
          example: 58437
          default: random
        Channel:
          type: integer
          description: IEEE 802.15.4 channel of the Thread network
          format: uint16
          example: 21
          default: random
        PSKc:
          type: string
          description: The pre-shared commissioner key
          example: FD943ECA225A28979B991EFAC1218A72
          default: random
        SecurityPolicy:
          $ref: "#/components/schemas/SecurityPolicy"
        ChannelMask:
          type: integer
          description: Channel mask
          format: uint32
          example: 134215680
          default: 134215680
    PendingDataset:
      type: object
      properties:
        ActiveDataset:
          oneOf:
            - $ref: "#/components/schemas/ActiveDataset"
            - $ref: "#/components/schemas/DatasetTlv"
        PendingTimestamp:
          $ref: "#/components/schemas/Timestamp"
        Delay:
          type: integer
          description: Delay timer in milliseconds
          format: uint32
          example: 30000
          default: not set
    SecurityPolicy:
      type: object
      properties:
        RotationTime:
          type: integer
          description: Thread key rotation time in hours
          format: uint16
          example: 672
          default: 672
        ObtainNetworkKey:
          type: boolean
          description: Obtaining the Network Key for out-of-band commissioning is enabled
          example: true
          default: true
        NativeCommissioning:
          type: boolean
          description: Native Commissioning using PSKc is allowed
          example: true
          default: true
        Routers:
          type: boolean
          description: Thread 1.0/1.1.x Routers are enabled
          example: true
          default: true
        ExternalCommissioning:
          type: boolean
          description: External Commissioner authentication is allowed
          example: true
          default: true
        CommercialCommissioning:
          type: boolean
          description: Commercial Commissioning is enabled
          example: false
          default: false
        AutonomousEnrollment:
          type: boolean
          description: Autonomous Enrollment is enabled
          example: false
          default: false
        NetworkKeyProvisioning:
          type: boolean
          description: Network Key Provisioning is enabled
          example: false
          default: false
        TobleLink:
          type: boolean
          description: ToBLE link is enabled
          example: false
          default: false
        NonCcmRouters:
          type: boolean
          description: Non-CCM Routers enabled
          example: false
          default: false
    Timestamp:
      type: object
      properties:
        Seconds:
          type: integer
          description: Timestamp seconds
          format: uint64
          example: 10
          default: 1
        Ticks:
          type: integer
          description: Timestamp ticks
          format: uint16
          example: 0
          default: 0
        Authoritative:
          type: boolean
          example: false
          default: false
    DatasetTlv:
      type: string
      description: Operational dataset as hex-encoded TLVs.
      example: 0E080000000000010000000300000F35060004001FFFE0020811111111222222220708FDAD70BFE5AA15DD051000112233445566778899AABBCCDDEEFF030E4F70656E54687265616444656D6F010212340410445F2B5CA6F2A93A55CE570A70EFEECB0C0402A0F7F8
