The Things Stack Join Server

OTAA join handling, root-key registry, JsEndDeviceRegistry, AsJs/AppJs/NsJs internal interfaces, NetworkCryptoService and ApplicationCryptoService for external HSM-backed crypto, and ApplicationActivationSettings.

The Things Stack Join Server is one of 9 APIs that The Things Network / The Things Stack publishes on the APIs.io network, described by a machine-readable OpenAPI specification.

This API exposes 1 machine-runnable capability that can be deployed as REST, MCP, or Agent Skill surfaces via Naftiko.

Tagged areas include Join Server, LoRaWAN, OTAA, Root Keys, and Crypto. The published artifact set on APIs.io includes API documentation, an OpenAPI specification, and 1 Naftiko capability spec.

OpenAPI Specification

the-things-stack-join-server-openapi.yml Raw ↑
swagger: '2.0'
info:
  title: The Things Stack — Join Server
  version: v3.36
  description: The Things Stack is an open-source LoRaWAN Network Server implementation. This OpenAPI was derived from the
    upstream gRPC-Gateway generated api.swagger.json published by TheThingsNetwork/lorawan-stack v3.36.
  license:
    name: Apache 2.0
    url: https://www.apache.org/licenses/LICENSE-2.0
  contact:
    name: The Things Industries
    url: https://www.thethingsindustries.com
host: eu1.cloud.thethings.industries
basePath: /api/v3
schemes:
- https
consumes:
- application/json
produces:
- application/json
securityDefinitions:
  ApiKeyAuth:
    type: apiKey
    in: header
    name: Authorization
    description: 'Bearer API key. Set Authorization: Bearer NNSXS.xxxxxxxxxx.'
security:
- ApiKeyAuth: []
tags:
- name: Js
- name: JsEndDeviceRegistry
- name: JsEndDeviceBatchRegistry
paths:
  /js/applications/{application_ids.application_id}/devices/batch:
    delete:
      summary: 'Delete a list of devices within the same application.

        This operation is atomic; either all devices are deleted or none.

        Devices not found are skipped and no error is returned.'
      operationId: JsEndDeviceBatchRegistry_Delete
      responses:
        '200':
          description: A successful response.
          schema:
            type: object
            properties: {}
        default:
          description: An unexpected error response.
          schema:
            $ref: '#/definitions/googlerpcStatus'
      parameters:
      - name: application_ids.application_id
        in: path
        required: true
        type: string
      - name: device_ids
        in: query
        required: false
        type: array
        items:
          type: string
        collectionFormat: multi
      tags:
      - JsEndDeviceBatchRegistry
  /js/applications/{application_ids.application_id}/devices/{device_id}:
    delete:
      summary: 'Delete deletes the device that matches the given identifiers.

        If there are multiple matches, an error will be returned.'
      operationId: JsEndDeviceRegistry_Delete
      responses:
        '200':
          description: A successful response.
          schema:
            type: object
            properties: {}
        default:
          description: An unexpected error response.
          schema:
            $ref: '#/definitions/googlerpcStatus'
      parameters:
      - name: application_ids.application_id
        in: path
        required: true
        type: string
      - name: device_id
        in: path
        required: true
        type: string
      - name: dev_eui
        description: The LoRaWAN DevEUI.
        in: query
        required: false
        type: string
        format: string
      - name: join_eui
        description: The LoRaWAN JoinEUI (AppEUI until LoRaWAN 1.0.3 end devices).
        in: query
        required: false
        type: string
        format: string
      - name: dev_addr
        description: The LoRaWAN DevAddr.
        in: query
        required: false
        type: string
        format: string
      tags:
      - JsEndDeviceRegistry
  /js/applications/{application_ids.application_id}/provision-devices:
    put:
      summary: 'This rpc is deprecated; use EndDeviceTemplateConverter service instead.

        TODO: Remove (https://github.com/TheThingsNetwork/lorawan-stack/issues/999)'
      operationId: JsEndDeviceRegistry_Provision
      responses:
        '200':
          description: A successful response.(streaming responses)
          schema:
            type: object
            properties:
              result:
                $ref: '#/definitions/v3EndDevice'
              error:
                $ref: '#/definitions/googlerpcStatus'
            title: Stream result of v3EndDevice
        default:
          description: An unexpected error response.
          schema:
            $ref: '#/definitions/googlerpcStatus'
      parameters:
      - name: application_ids.application_id
        in: path
        required: true
        type: string
      - name: body
        in: body
        required: true
        schema:
          $ref: '#/definitions/JsEndDeviceRegistryProvisionBody'
      tags:
      - JsEndDeviceRegistry
  /js/applications/{end_device.ids.application_ids.application_id}/devices:
    post:
      summary: Set creates or updates the device.
      operationId: JsEndDeviceRegistry_Set2
      responses:
        '200':
          description: A successful response.
          schema:
            $ref: '#/definitions/v3EndDevice'
        default:
          description: An unexpected error response.
          schema:
            $ref: '#/definitions/googlerpcStatus'
      parameters:
      - name: end_device.ids.application_ids.application_id
        in: path
        required: true
        type: string
      - name: body
        in: body
        required: true
        schema:
          $ref: '#/definitions/v3JsEndDeviceRegistrySetBody'
      tags:
      - JsEndDeviceRegistry
  /js/applications/{end_device.ids.application_ids.application_id}/devices/{end_device.ids.device_id}:
    put:
      summary: Set creates or updates the device.
      operationId: JsEndDeviceRegistry_Set
      responses:
        '200':
          description: A successful response.
          schema:
            $ref: '#/definitions/v3EndDevice'
        default:
          description: An unexpected error response.
          schema:
            $ref: '#/definitions/googlerpcStatus'
      parameters:
      - name: end_device.ids.application_ids.application_id
        in: path
        required: true
        type: string
      - name: end_device.ids.device_id
        in: path
        required: true
        type: string
      - name: body
        in: body
        required: true
        schema:
          $ref: '#/definitions/v3JsEndDeviceRegistrySetBody'
      tags:
      - JsEndDeviceRegistry
  /js/applications/{end_device_ids.application_ids.application_id}/devices/{end_device_ids.device_id}:
    get:
      summary: 'Get returns the device that matches the given identifiers.

        If there are multiple matches, an error will be returned.'
      operationId: JsEndDeviceRegistry_Get
      responses:
        '200':
          description: A successful response.
          schema:
            $ref: '#/definitions/v3EndDevice'
        default:
          description: An unexpected error response.
          schema:
            $ref: '#/definitions/googlerpcStatus'
      parameters:
      - name: end_device_ids.application_ids.application_id
        in: path
        required: true
        type: string
      - name: end_device_ids.device_id
        in: path
        required: true
        type: string
      - name: end_device_ids.dev_eui
        description: The LoRaWAN DevEUI.
        in: query
        required: false
        type: string
        format: string
      - name: end_device_ids.join_eui
        description: The LoRaWAN JoinEUI (AppEUI until LoRaWAN 1.0.3 end devices).
        in: query
        required: false
        type: string
        format: string
      - name: end_device_ids.dev_addr
        description: The LoRaWAN DevAddr.
        in: query
        required: false
        type: string
        format: string
      - name: field_mask
        description: 'The names of the end device fields that should be returned.

          See the API reference for which fields can be returned by the different services.'
        in: query
        required: false
        type: string
      tags:
      - JsEndDeviceRegistry
  /js/default_join_eui:
    get:
      summary: Request the default JoinEUI that is configured for this Join Server.
      operationId: Js_GetDefaultJoinEUI
      responses:
        '200':
          description: A successful response.
          schema:
            $ref: '#/definitions/v3GetDefaultJoinEUIResponse'
        default:
          description: An unexpected error response.
          schema:
            $ref: '#/definitions/googlerpcStatus'
      tags:
      - Js
  /js/join_eui_prefixes:
    get:
      summary: Request the JoinEUI prefixes that are configured for this Join Server.
      operationId: Js_GetJoinEUIPrefixes
      responses:
        '200':
          description: A successful response.
          schema:
            $ref: '#/definitions/v3JoinEUIPrefixes'
        default:
          description: An unexpected error response.
          schema:
            $ref: '#/definitions/googlerpcStatus'
      tags:
      - Js
definitions:
  ADRSettingsDynamicMode:
    type: object
    properties:
      margin:
        type: number
        format: float
        description: 'The ADR margin (dB) tells the network server how much margin it should add in ADR requests.

          A bigger margin is less efficient, but gives a better chance of successful reception.

          If unset, the default value from Network Server configuration will be used.'
      min_data_rate_index:
        $ref: '#/definitions/v3DataRateIndexValue'
        description: 'Minimum data rate index.

          If unset, the default value from Network Server configuration will be used.'
      max_data_rate_index:
        $ref: '#/definitions/v3DataRateIndexValue'
        description: 'Maximum data rate index.

          If unset, the default value from Network Server configuration will be used.'
      min_tx_power_index:
        type: integer
        format: int64
        description: 'Minimum transmission power index.

          If unset, the default value from Network Server configuration will be used.'
      max_tx_power_index:
        type: integer
        format: int64
        description: 'Maximum transmission power index.

          If unset, the default value from Network Server configuration will be used.'
      min_nb_trans:
        type: integer
        format: int64
        description: 'Minimum number of retransmissions.

          If unset, the default value from Network Server configuration will be used.'
      max_nb_trans:
        type: integer
        format: int64
        description: 'Maximum number of retransmissions.

          If unset, the default value from Network Server configuration will be used.'
      channel_steering:
        $ref: '#/definitions/DynamicModeChannelSteeringSettings'
      overrides:
        $ref: '#/definitions/DynamicModeOverrides'
    description: Configuration options for dynamic ADR.
  ADRSettingsStaticMode:
    type: object
    properties:
      data_rate_index:
        $ref: '#/definitions/v3DataRateIndex'
        description: Data rate index to use.
      tx_power_index:
        type: integer
        format: int64
        description: Transmission power index to use.
      nb_trans:
        type: integer
        format: int64
        description: Number of retransmissions.
    description: Configuration options for static ADR.
  ApplicationDownlinkClassBC:
    type: object
    properties:
      gateways:
        type: array
        items:
          type: object
          $ref: '#/definitions/v3ClassBCGatewayIdentifiers'
        description: 'Possible gateway identifiers, antenna index, and group index to use for this downlink message.

          The Network Server selects one of these gateways for downlink, based on connectivity, signal quality, channel utilization
          and an available slot.

          If none of the gateways can be selected, the downlink message fails.

          If empty, a gateway and antenna is selected automatically from the gateways seen in recent uplinks.

          If group index is set, gateways will be grouped by the index for the Network Server to select one gateway per group.'
      absolute_time:
        type: string
        format: date-time
        description: 'Absolute time when the downlink message should be transmitted.

          This requires the gateway to have GPS time synchronization.

          If the time is in the past or if there is a scheduling conflict, the downlink message fails.

          If null, the time is selected based on slot availability. This is recommended in class B mode.'
  ApplicationDownlinkConfirmedRetry:
    type: object
    properties:
      attempt:
        type: integer
        format: int64
        description: The number of attempted confirmed downlink acknowledgements.
      max_attempts:
        type: integer
        format: int64
        description: 'The maximum number of confirmed downlink acknowledgement attempts.

          If null, the Application Server configuration is used instead.'
  ChannelSteeringSettingsLoRaNarrowMode:
    type: object
    description: 'Configuration options for LoRa narrow channels steering.

      The narrow mode attempts to steer the end device towards

      using the LoRa modulated, 125kHz bandwidth channels.'
  DownlinkMessageMessageMACPayload:
    type: object
    properties:
      f_port:
        type: integer
        format: int64
      full_f_cnt:
        type: integer
        format: int64
  DownlinkMessageMessageMHDR:
    type: object
    properties:
      m_type:
        $ref: '#/definitions/v3MType'
  DynamicModeChannelSteeringSettings:
    type: object
    properties:
      lora_narrow:
        $ref: '#/definitions/ChannelSteeringSettingsLoRaNarrowMode'
      disabled:
        $ref: '#/definitions/DynamicModeChannelSteeringSettingsDisabledMode'
    description: 'EXPERIMENTAL: Channel steering settings.'
  DynamicModeChannelSteeringSettingsDisabledMode:
    type: object
    description: 'Configuration options for cases in which ADR is not supposed to steer the end device

      to another set of channels.'
  DynamicModeOverrides:
    type: object
    properties:
      data_rate_0:
        $ref: '#/definitions/DynamicModePerDataRateIndexOverride'
      data_rate_1:
        $ref: '#/definitions/DynamicModePerDataRateIndexOverride'
      data_rate_2:
        $ref: '#/definitions/DynamicModePerDataRateIndexOverride'
      data_rate_3:
        $ref: '#/definitions/DynamicModePerDataRateIndexOverride'
      data_rate_4:
        $ref: '#/definitions/DynamicModePerDataRateIndexOverride'
      data_rate_5:
        $ref: '#/definitions/DynamicModePerDataRateIndexOverride'
      data_rate_6:
        $ref: '#/definitions/DynamicModePerDataRateIndexOverride'
      data_rate_7:
        $ref: '#/definitions/DynamicModePerDataRateIndexOverride'
      data_rate_8:
        $ref: '#/definitions/DynamicModePerDataRateIndexOverride'
      data_rate_9:
        $ref: '#/definitions/DynamicModePerDataRateIndexOverride'
      data_rate_10:
        $ref: '#/definitions/DynamicModePerDataRateIndexOverride'
      data_rate_11:
        $ref: '#/definitions/DynamicModePerDataRateIndexOverride'
      data_rate_12:
        $ref: '#/definitions/DynamicModePerDataRateIndexOverride'
      data_rate_13:
        $ref: '#/definitions/DynamicModePerDataRateIndexOverride'
      data_rate_14:
        $ref: '#/definitions/DynamicModePerDataRateIndexOverride'
      data_rate_15:
        $ref: '#/definitions/DynamicModePerDataRateIndexOverride'
    description: 'EXPERIMENTAL: Configuration overrides.'
  DynamicModePerDataRateIndexOverride:
    type: object
    properties:
      min_nb_trans:
        type: integer
        format: int64
        description: 'Minimum number of retransmissions.

          If unset, the default value from Network Server configuration will be used.'
      max_nb_trans:
        type: integer
        format: int64
        description: 'Maximum number of retransmissions.

          If unset, the default value from Network Server configuration will be used.'
    description: 'EXPERIMENTAL: Data rate index override settings.'
  JsEndDeviceRegistryProvisionBody:
    type: object
    properties:
      application_ids:
        type: object
      provisioner_id:
        type: string
        description: ID of the provisioner service as configured in the Join Server.
      provisioning_data:
        type: string
        format: byte
        description: Vendor-specific provisioning data.
      list:
        $ref: '#/definitions/ProvisionEndDevicesRequestIdentifiersList'
        description: 'List of device identifiers that will be provisioned.

          The device identifiers must contain device_id and dev_eui.

          If set, the application_ids must equal the provision request''s application_ids.

          The number of entries in data must match the number of given identifiers.'
      range:
        $ref: '#/definitions/ProvisionEndDevicesRequestIdentifiersRange'
        description: 'Provision devices in a range.

          The device_id will be generated by the provisioner from the vendor-specific data.

          The dev_eui will be issued from the given start_dev_eui.'
      from_data:
        $ref: '#/definitions/ProvisionEndDevicesRequestIdentifiersFromData'
        description: 'Provision devices with identifiers from the given data.

          The device_id and dev_eui will be generated by the provisioner from the vendor-specific data.'
  MACCommandADRParamSetupReq:
    type: object
    properties:
      adr_ack_limit_exponent:
        $ref: '#/definitions/v3ADRAckLimitExponent'
        description: Exponent e that configures the ADR_ACK_LIMIT = 2^e messages.
      adr_ack_delay_exponent:
        $ref: '#/definitions/v3ADRAckDelayExponent'
        description: Exponent e that configures the ADR_ACK_DELAY = 2^e messages.
  MACCommandBeaconFreqAns:
    type: object
    properties:
      frequency_ack:
        type: boolean
  MACCommandBeaconFreqReq:
    type: object
    properties:
      frequency:
        type: string
        format: uint64
        description: Frequency of the Class B beacons (Hz).
  MACCommandBeaconTimingAns:
    type: object
    properties:
      delay:
        type: integer
        format: int64
        description: (uint16) See LoRaWAN specification.
      channel_index:
        type: integer
        format: int64
  MACCommandDLChannelAns:
    type: object
    properties:
      channel_index_ack:
        type: boolean
      frequency_ack:
        type: boolean
  MACCommandDLChannelReq:
    type: object
    properties:
      channel_index:
        type: integer
        format: int64
      frequency:
        type: string
        format: uint64
        description: Downlink channel frequency (Hz).
  MACCommandDevStatusAns:
    type: object
    properties:
      battery:
        type: integer
        format: int64
        description: 'Device battery status.

          0 indicates that the device is connected to an external power source.

          1..254 indicates a battery level.

          255 indicates that the device was not able to measure the battery level.'
      margin:
        type: integer
        format: int32
        description: SNR of the last downlink (dB; [-32, +31]).
  MACCommandDeviceModeConf:
    type: object
    properties:
      class:
        $ref: '#/definitions/v3Class'
  MACCommandDeviceModeInd:
    type: object
    properties:
      class:
        $ref: '#/definitions/v3Class'
  MACCommandDeviceTimeAns:
    type: object
    properties:
      time:
        type: string
        format: date-time
  MACCommandDutyCycleReq:
    type: object
    properties:
      max_duty_cycle:
        $ref: '#/definitions/v3AggregatedDutyCycle'
  MACCommandForceRejoinReq:
    type: object
    properties:
      rejoin_type:
        $ref: '#/definitions/v3RejoinRequestType'
      data_rate_index:
        $ref: '#/definitions/v3DataRateIndex'
      max_retries:
        type: integer
        format: int64
      period_exponent:
        $ref: '#/definitions/v3RejoinPeriodExponent'
        description: Exponent e that configures the rejoin period = 32 * 2^e + rand(0,32) seconds.
  MACCommandLinkADRAns:
    type: object
    properties:
      channel_mask_ack:
        type: boolean
      data_rate_index_ack:
        type: boolean
      tx_power_index_ack:
        type: boolean
  MACCommandLinkADRReq:
    type: object
    properties:
      data_rate_index:
        $ref: '#/definitions/v3DataRateIndex'
      tx_power_index:
        type: integer
        format: int64
      channel_mask:
        type: array
        items:
          type: boolean
      channel_mask_control:
        type: integer
        format: int64
      nb_trans:
        type: integer
        format: int64
  MACCommandLinkCheckAns:
    type: object
    properties:
      margin:
        type: integer
        format: int64
        description: Indicates the link margin in dB of the received LinkCheckReq, relative to the demodulation floor.
      gateway_count:
        type: integer
        format: int64
  MACCommandNewChannelAns:
    type: object
    properties:
      frequency_ack:
        type: boolean
      data_rate_ack:
        type: boolean
  MACCommandNewChannelReq:
    type: object
    properties:
      channel_index:
        type: integer
        format: int64
      frequency:
        type: string
        format: uint64
        description: Channel frequency (Hz).
      min_data_rate_index:
        $ref: '#/definitions/v3DataRateIndex'
      max_data_rate_index:
        $ref: '#/definitions/v3DataRateIndex'
  MACCommandPingSlotChannelAns:
    type: object
    properties:
      frequency_ack:
        type: boolean
      data_rate_index_ack:
        type: boolean
  MACCommandPingSlotChannelReq:
    type: object
    properties:
      frequency:
        type: string
        format: uint64
        description: Ping slot channel frequency (Hz).
      data_rate_index:
        $ref: '#/definitions/v3DataRateIndex'
  MACCommandPingSlotInfoReq:
    type: object
    properties:
      period:
        $ref: '#/definitions/v3PingSlotPeriod'
  MACCommandRejoinParamSetupAns:
    type: object
    properties:
      max_time_exponent_ack:
        type: boolean
  MACCommandRejoinParamSetupReq:
    type: object
    properties:
      max_count_exponent:
        $ref: '#/definitions/v3RejoinCountExponent'
        description: Exponent e that configures the rejoin counter = 2^(e+4) messages.
      max_time_exponent:
        $ref: '#/definitions/v3RejoinTimeExponent'
        description: Exponent e that configures the rejoin timer = 2^(e+10) seconds.
  MACCommandRekeyConf:
    type: object
    properties:
      minor_version:
        $ref: '#/definitions/v3Minor'
  MACCommandRekeyInd:
    type: object
    properties:
      minor_version:
        $ref: '#/definitions/v3Minor'
  MACCommandRelayConfAns:
    type: object
    properties:
      second_channel_frequency_ack:
        type: boolean
      second_channel_ack_offset_ack:
        type: boolean
      second_channel_data_rate_index_ack:
        type: boolean
      second_channel_index_ack:
        type: boolean
      default_channel_index_ack:
        type: boolean
      cad_periodicity_ack:
        type: boolean
  MACCommandRelayConfReq:
    type: object
    properties:
      configuration:
        $ref: '#/definitions/MACCommandRelayConfReqConfiguration'
  MACCommandRelayConfReqConfiguration:
    type: object
    properties:
      second_channel:
        $ref: '#/definitions/v3RelaySecondChannel'
      default_channel_index:
        type: integer
        format: int64
      cad_periodicity:
        $ref: '#/definitions/v3RelayCADPeriodicity'
  MACCommandRelayConfigureFwdLimitAns:
    type: object
  MACCommandRelayConfigureFwdLimitReq:
    type: object
    properties:
      reset_limit_counter:
        $ref: '#/definitions/v3RelayResetLimitCounter'
      join_request_limits:
        $ref: '#/definitions/v3RelayForwardLimits'
      notify_limits:
        $ref: '#/definitions/v3RelayForwardLimits'
      global_uplink_limits:
        $ref: '#/definitions/v3RelayForwardLimits'
      overall_limits:
        $ref: '#/definitions/v3RelayForwardLimits'
  MACCommandRelayCtrlUplinkListAns:
    type: object
    properties:
      rule_index_ack:
        type: boolean
      w_f_cnt:
        type: integer
        format: int64
  MACCommandRelayCtrlUplinkListReq:
    type: object
    properties:
      rule_index:
        type: integer
        format: int64
      action:
        $ref: '#/definitions/v3RelayCtrlUplinkListAction'
  MACCommandRelayEndDeviceConfAns:
    type: object
    properties:
      second_channel_frequency_ack:
        type: boolean
      second_channel_data_rate_index_ack:
        type: boolean
      second_channel_index_ack:
        type: boolean
      backoff_ack:
        type: boolean
  MACCommandRelayEndDeviceConfReq:
    type: object
    properties:
      configuration:
        $ref: '#/definitions/MACCommandRelayEndDeviceConfReqConfiguration'
  MACCommandRelayEndDeviceConfReqConfiguration:
    type: object
    properties:
      always:
        $ref: '#/definitions/v3RelayEndDeviceAlwaysMode'
      dynamic:
        $ref: '#/definitions/v3RelayEndDeviceDynamicMode'
      end_device_controlled:
        $ref: '#/definitions/v3RelayEndDeviceControlledMode'
      backoff:
        type: integer
        format: int64
      second_channel:
        $ref: '#/definitions/v3RelaySecondChannel'
      serving_device_id:
        type: string
  MACCommandRelayNotifyNewEndDeviceReq:
    type: object
    properties:
      dev_addr:
        type: string
        format: string
        example: 2600ABCD
      snr:
        type: integer
        format: int32
      rssi:
        type: integer
        format: int32
  MACCommandRelayUpdateUplinkListAns:
    type: object
  MACCommandRelayUpdateUplinkListReq:
    type: object
    properties:
      rule_index:
        type: integer
        format: int64
      forward_limits:
        $ref: '#/definitions/v3RelayUplinkForwardLimits'
      dev_addr:
        type: string
        format: string
        example: 2600ABCD
      w_f_cnt:
        type: integer
        format: int64
      root_wor_s_key:
        type: string
        format: string
        example: 0123456789ABCDEF0123456789ABCDEF
      device_id:
        type: string
      session_key_id:
        type: string
        format: byte
  MACCommandResetConf:
    type: object
    properties:
      minor_version:
        $ref: '#/definitions/v3Minor'
  MACCommandResetInd:
    type: object
    properties:
      minor_version:
        $ref: '#/definitions/v3Minor'
  MACCommandRxParamSetupAns:
    type: object
    properties:
      rx2_data_rate_index_ack:
        type: boolean
      rx1_data_rate_offset_ack:
        type: boolean
      rx2_frequency_ack:
        type: boolean
  MACCommandRxParamSetupReq:
    type: object
    properties:
      rx2_data_rate_index:
        $ref: '#/definitions/v3DataRateIndex'
      rx1_data_rate_offset:
        $ref: '#/definitions/v3DataRateOffset'
      rx2_frequency:
        type: string
        format: uint64
        description: Rx2 frequency (Hz).
  MACCommandRxTimingSetupReq:
    type: object
    properties:
      delay:
        $ref: '#/definitions/v3RxDelay'
  MACCommandTxParamSetupReq:
    type: object
    properties:
      max_eirp_index:
        $ref: '#/definitions/v3DeviceEIRP'
        title: 'Indicates the maximum EIRP value in dBm, indexed by the following vector:

          [ 8 10 12 13 14 16 18 20 21 24 26 27 29 30 33 36 ]'
      uplink_dwell_time:
        type: boolean
      downlink_dwell_time:
        type: boolean
  MACStateDataRateRange:
    type: object
    properties:
      min_data_rate_index:
        $ref: '#/definitions/v3DataRateIndex'
      max_data_rate_index:
        $ref: '#/definitions/v3DataRateIndex'
  MACStateDataRateRanges:
    type: object
    properties:
      ranges:
        type: array
        items:
          type: object
          $ref: '#/definitions/MACStateDataRateRange'
  MACStateDownlinkMessageMessage:
    type: object
    properties:
      m_hdr:
        $ref: '#/definitions/DownlinkMessageMessageMHDR'
      mac_payload:
        $ref: '#/definitions/DownlinkMessageMessageMACPayload'
  MACStateJoinAccept:
    type: object
    properties:
      payload:
        type: string
        format: byte
        description: Payload of the join-accept received from Join Server.
      request:
        $ref: '#/definitions/v3MACStateJoinRequest'
      keys:
        $ref: '#/definitions/v3SessionKeys'
        description: Network session keys associated with the join.
      correlation_ids:
        type: array
        items:
          type: string
      dev_addr:
        type: string
        format: string
        example: 2600ABCD
      net_id:
        type: string
        format: string
        example: '000013'
  MACStateUplinkMessageRxMetadata:
    type: object
    properties:
      gateway_ids:
        $ref: '#/definitions/lorawanv3GatewayIdentifiers'
      channel_rssi:
        type: number
        format: float
      snr:
        type: number
        format: float
      downlink_path_constraint:
        $ref: '#/definitions/v3DownlinkPathConstraint'
      uplink_token:
        type: string
        format: byte
      packet_broker:
        $ref: '#/definitions/UplinkMessageRxMetadataPacketBrokerMetadata'
      relay:
        $ref: '#/definitions/UplinkMessageRxMetadataRelayMetadata'
  MACStateUplinkMessageTxSettings:
    type: object
    properties:
      data_rate:
        $ref: '#/definitions/v3DataRate'
  PictureEmbedded:
    type: object
    properties:
      mime_type:
        type: string
        description: MIME type of the picture.
      data:
        type: string
        format: byte
        description: 'Picture data. A data URI can be constructed as follows:

          `data:<mime_type>;base64,<data>`.'
  ProvisionEndDevicesRequestIdentifiersFromData:
    type: object
    properties:
      join_eui:
        type: string
        format: string
        example: 70B3D57ED000ABCD
  ProvisionEndDevicesRequestIdentifiersList:
    type: object
    properties:
      join_eui:
        type: string
        format: string
        example: 70B3D57ED000ABCD
      end_device_ids:
        type: array
        items:
          type: object
          $ref: '#/definitions/v3EndDeviceIdentifiers'
  ProvisionEndDevicesRequestIdentifiersRange:
    type: object
    properties:
      join_eui:
        type: string
        format: string
        example: 70B3D57ED000ABCD
      start_dev_eui:
        type: string
        format: string
        example: 70B3D57ED000ABCD
        description: DevEUI to start issuing from.
  UplinkMessageRxMetadataPacketBrokerMetadata:
    type: object
  UplinkMessageRxMetadataRelayMetadata:
    type: object
  googlerpcStatus:
    type: object
    properties:
      code:
        type: integer
        format: int32
      message:
        type: string
      details:
        type: array
        items:
          type: object
          $ref: '#/definitions/protobufAny'
  lorawanv3BoolValue:
    type: object
    properties:
      value:
        type: boolean
  lorawanv3GatewayIdentifiers:
    type: object
    properties:
      gateway_id:
        type: string
      eui:
        type: string
        format: string
        example: 70B3D57ED000ABCD
        description: Secondary identifier, which can only be used in specific requests.
  lorawanv3Location:
    type: object
    properties:
      latitude:
        type: number
        format: double
        description: The North–South position (degrees; -90 to +90), where 0 is the equator, North pole is positive, South
          pole is negative.
      longitude:
        type: number
        format: double
        description: The East-West position (degrees; -180 to +180), where 0 is the Prime Meridian (Greenwich), East is positive
          , West is negative.
      altitude:
        type: integer
        format: int32
        description: The altitude (meters), where 0 is the mean sea level.
      accuracy:
        type: integer
        format: int32
        description: The accuracy of the location (meters).
      source:
        $ref: '#/definitions/v3LocationSource'
        description: Source of the location information.
  lorawanv3MACPayload:
    type: object
    properties:
      f_hdr:
        $ref: '#/definitions/v3FHDR'
      f_port:
        type: integer
        format: int64
      frm_payload:
        type: string
        format: byte
      decoded_payload:
        type: object
      full_f_cnt:
        type: integer
        format: int64
        description: Full 32-bit FCnt value. Used internally by Network Server.
  lorawanv3MHDR:
    type: object
    properties:
      m_type:
        $ref: '#/definitions/v3MType'
      major:
        $ref: '#/definitions/v3Major'
  lorawanv3Message:
    type: object
    properties:
      m_hdr:
        $ref: '#/definitions/lorawanv3MHDR'
      mic:
        type: string
        format: byte
      mac_payload:
        $ref: '#/definitions/lorawanv3MACPayload'
      join_request_pay

# --- truncated at 32 KB (126 KB total) ---
# Full source: https://raw.githubusercontent.com/api-evangelist/the-things-network/refs/heads/main/openapi/the-things-stack-join-server-openapi.yml