Juniper Mist AI Orgs EVPN Topologies API

EVPN allows an alternative but more efficient LAN architecture utilizing VxLAN / MP-BGP - separating control plane (MAC / IP Learning) from forwarding plane. In our implementation, following the steps to deploy EVPN topologies in a Site

OpenAPI Specification

mist-ai-orgs-evpn-topologies-api-openapi.yml Raw ↑
openapi: 3.1.0
info:
  contact:
    email: tmunzer@juniper.net
    name: Thomas Munzer
  description: '> Version: **2604.1.1**

    >

    > Date: **May 13, 2026**

    <div class="notification"> NOTE:<br>Some important API changes will be introduced. Please make sure to read the <a href="https://www.juniper.net/documentation/us/en/software/mist/api/http/guides/important-api-changes">announcements</a> </div>


    ---

    ## Additional Documentation

    * [Mist Automation Guide](https://www.juniper.net/documentation/us/en/software/mist/automation-integration/index.html)

    * [Mist Location SDK](https://www.juniper.net/documentation/us/en/software/mist/location-services/topics/concept/mist-how-get-mist-sdk.html)

    * [Mist Product Updates](https://www.juniper.net/documentation/us/en/software/mist/product-updates/)


    ## Helpful Resources

    * [API Sandbox and Exercises](https://api-class.mist.com/)

    * [Postman Collection, Runners and Webhook Samples](https://www.postman.com/juniper-mist/workspace/mist-systems-s-public-workspace)

    * [Python Script Examples](https://github.com/tmunzer/mist_library)

    * [API Demo Apps](https://apps.mist-lab.fr/)

    * [Juniper Blog](https://blogs.juniper.net/)


    ## Mist Web Browser Extension:

    * Google Chrome, Microsoft Edge and other Chromium-based browser: [Chrome Web Store](https://chromewebstore.google.com/detail/mist-extension/ejhpdcljeamillfhdihkkmoakanpbplh)

    * Firefox: [Firefox Add-ons](https://addons.mozilla.org/en-US/firefox/addon/mist-extension/)


    ---'
  license:
    name: MIT
    url: https://raw.githubusercontent.com/tmunzer/Mist-OAS3.0/main/LICENSE
  title: Mist Admins Orgs EVPN Topologies API
  version: 2604.1.1
  x-logo:
    altText: Juniper-MistAI
    backgroundColor: '#FFFFFF'
    url: https://www.mist.com/wp-content/uploads/logo.png
servers:
- description: Mist Global 01
  url: https://api.mist.com
- description: Mist Global 02
  url: https://api.gc1.mist.com
- description: Mist Global 03
  url: https://api.ac2.mist.com
- description: Mist Global 04
  url: https://api.gc2.mist.com
- description: Mist Global 05
  url: https://api.gc4.mist.com
- description: Mist EMEA 01
  url: https://api.eu.mist.com
- description: Mist EMEA 02
  url: https://api.gc3.mist.com
- description: Mist EMEA 03
  url: https://api.ac6.mist.com
- description: Mist EMEA 04
  url: https://api.gc6.mist.com
- description: Mist APAC 01
  url: https://api.ac5.mist.com
- description: Mist APAC 02
  url: https://api.gc5.mist.com
- description: Mist APAC 03
  url: https://api.gc7.mist.com
security:
- apiToken: []
- basicAuth: []
- basicAuth: []
  csrfToken: []
tags:
- description: 'EVPN allows an alternative but more efficient LAN architecture utilizing VxLAN / MP-BGP - separating control plane (MAC / IP Learning) from forwarding plane.

    In our implementation, following the steps to deploy EVPN topologies in a Site'
  name: Orgs EVPN Topologies
paths:
  /api/v1/orgs/{org_id}/evpn_topologies:
    parameters:
    - $ref: '#/components/parameters/org_id'
    get:
      description: Get List of the existing Org EVPN topologies
      operationId: listOrgEvpnTopologies
      parameters:
      - description: Filter for org/site level EVPN Toplogies
        in: query
        name: for_site
        schema:
          $ref: '#/components/schemas/mxedge_for_site'
      - $ref: '#/components/parameters/limit'
      - $ref: '#/components/parameters/page'
      responses:
        '200':
          $ref: '#/components/responses/EvpnTopologiesArray'
        '400':
          $ref: '#/components/responses/HTTP400'
        '401':
          $ref: '#/components/responses/HTTP401'
        '403':
          $ref: '#/components/responses/HTTP403'
        '404':
          $ref: '#/components/responses/HTTP404'
        '429':
          $ref: '#/components/responses/HTTP429'
      summary: listOrgEvpnTopologies
      tags:
      - Orgs EVPN Topologies
    post:
      description: 'While all the `evpn_id` / `downlink_ips` can be specified by hand, the easiest way is to call the `build_vpn_topology` API, allowing you to examine the diff, and update it yourself. You can also simply call it with `overwrite=true` which will apply the updates for you.


        **Notes:**

        1. You can use `core` / `distribution` / `access` to create a CLOS topology

        2. You can also use `core` / `distribution` to form a 2-tier EVPN topology where ESI-Lag is configured distribution to connect to access switches

        3. In a small/medium campus, `collapsed-core` can be used where core switches are the inter-connected to do EVPN

        4. The API uses a few pre-defined parameters and best-practices to generate the configs. It can be customized by using `evpn_options` in Site Setting / Network Template. (e.g. a different subnet for the underlay)


        #### Collapsed Core

        In a small-medium campus, EVPN can also be enabled only at the core switches (up to 4) by assigning all participating switches with `collapsed-core role`. When there are more than 2 switches, a ring-like topology will be formed.


        #### ESI-Lag

        If the access switches does not have EVPN support, you can take advantage of EVPN by setting up ESI-Lag on distribution switches


        #### Leaf / Access / Collapsed-Core

        For leaf nodes in a EVPN topology, you’d have to configure the IPs for networks that would participate in EVPN. Optionally, VRFs to isolate traffic from one tenant versus another'
      operationId: createOrgEvpnTopology
      requestBody:
        content:
          application/json:
            examples:
              Example:
                value:
                  name: CC
                  pod_names:
                    '1': default
                    '2': default
                  switches:
                  - mac: 5c5b35000003
                    role: collapsed-core
                  - mac: 5c5b35000004
                    role: collapsed-core
            schema:
              $ref: '#/components/schemas/evpn_topology'
      responses:
        '200':
          $ref: '#/components/responses/EvpnTopology'
        '400':
          $ref: '#/components/responses/HTTP400'
        '401':
          $ref: '#/components/responses/HTTP401'
        '403':
          $ref: '#/components/responses/HTTP403'
        '404':
          $ref: '#/components/responses/HTTP404'
        '429':
          $ref: '#/components/responses/HTTP429'
      summary: createOrgEvpnTopology
      tags:
      - Orgs EVPN Topologies
  /api/v1/orgs/{org_id}/evpn_topologies/{evpn_topology_id}:
    parameters:
    - $ref: '#/components/parameters/org_id'
    - $ref: '#/components/parameters/evpn_topology_id'
    delete:
      description: Delete the Org EVPN Topology
      operationId: deleteOrgEvpnTopology
      responses:
        '200':
          $ref: '#/components/responses/OK'
        '400':
          $ref: '#/components/responses/HTTP400'
        '401':
          $ref: '#/components/responses/HTTP401'
        '403':
          $ref: '#/components/responses/HTTP403'
        '404':
          $ref: '#/components/responses/HTTP404'
        '429':
          $ref: '#/components/responses/HTTP429'
      summary: deleteOrgEvpnTopology
      tags:
      - Orgs EVPN Topologies
    get:
      description: Get One EVPN Topology Detail
      operationId: getOrgEvpnTopology
      responses:
        '200':
          $ref: '#/components/responses/EvpnTopology'
        '400':
          $ref: '#/components/responses/HTTP400'
        '401':
          $ref: '#/components/responses/HTTP401'
        '403':
          $ref: '#/components/responses/HTTP403'
        '404':
          $ref: '#/components/responses/HTTP404'
        '429':
          $ref: '#/components/responses/HTTP429'
      summary: getOrgEvpnTopology
      tags:
      - Orgs EVPN Topologies
    put:
      description: Update the EVPN Topology
      operationId: updateOrgEvpnTopology
      requestBody:
        content:
          application/json:
            examples:
              Example:
                value:
                  overwrite: false
                  switches:
                  - mac: 5c5b35000003
                    role: collapsed-core
                  - mac: 5c5b35000004
                    role: none
            schema:
              $ref: '#/components/schemas/evpn_topology'
      responses:
        '200':
          $ref: '#/components/responses/EvpnTopology'
        '400':
          $ref: '#/components/responses/HTTP400'
        '401':
          $ref: '#/components/responses/HTTP401'
        '403':
          $ref: '#/components/responses/HTTP403'
        '404':
          $ref: '#/components/responses/HTTP404'
        '429':
          $ref: '#/components/responses/HTTP429'
      summary: updateOrgEvpnTopology
      tags:
      - Orgs EVPN Topologies
components:
  schemas:
    evpn_options_overlay:
      additionalProperties: false
      properties:
        as:
          default: 65000
          description: Overlay BGP Local AS Number
          examples:
          - 65000
          maximum: 65535
          minimum: 1
          type: integer
      type: object
    switch_port_usage_reauth_interval:
      anyOf:
      - default: 3600
        maximum: 65535
        minimum: 10
        type: integer
      - type: string
      description: 'Only if `mode`!=`dynamic` and `port_auth`=`dot1x` reauthentication interval range (min: 10, max: 65535, default: 3600). Set to 0 to disable reauthentication (no-reauthentication).'
    strings:
      items:
        type: string
      type: array
      uniqueItems: true
    junos_port_config_duplex:
      default: auto
      description: 'enum: `auto`, `full`, `half`'
      enum:
      - auto
      - full
      - half
      type: string
    evpn_topology_switch_config_other_ip_configs:
      additionalProperties:
        $ref: '#/components/schemas/junos_other_ip_config'
      description: Additional IP Addresses configured on the switch. Property key is the port network name
      type: object
    switch_port_usage_mtu:
      anyOf:
      - maximum: 9216
        minimum: 256
        type: integer
      - type: string
      - type: 'null'
      description: Only if `mode`!=`dynamic` media maximum transmission unit (MTU) is the largest data unit that can be forwarded without fragmentation. The default value is 1514.
    evpn_topology_switch_uplinks:
      examples:
      - - 5c5b35000005
        - 5c5b35000006
      items:
        type: string
      type: array
    evpn_options_vs_instances:
      additionalProperties:
        $ref: '#/components/schemas/evpn_options_vs_instance'
      description: Optional, for EX9200 only to segregate virtual-switches
      examples:
      - guest:
          networks:
          - guest
        iot:
          networks:
          - iot-wifi
          - iot-lan
      type: object
    evpn_topologies_response:
      items:
        $ref: '#/components/schemas/evpn_topology_response'
      type: array
    switch_port_usage_networks:
      description: Only if `mode`==`trunk`, the list of network/vlans
      items:
        type: string
      type: array
    evpn_topology_switch_esilaglinks:
      examples:
      - - 5c5b35000005
        - 5c5b35000006
      items:
        type: string
      type: array
    evpn_topology_switches:
      items:
        $ref: '#/components/schemas/evpn_topology_switch'
      type: array
      uniqueItems: true
    switch_port_usage_mac_auth_protocol:
      default: eap-md5
      description: 'Only if `mode`!=`dynamic` and `enable_mac_auth` ==`true`. This type is ignored if mist_nac is enabled. enum: `eap-md5`, `eap-peap`, `pap`'
      enum:
      - eap-md5
      - eap-peap
      - pap
      type: string
    evpn_topology_switch_downlink_ips:
      items:
        readOnly: true
        type: string
      readOnly: true
      type: array
    evpn_topology_switch_pods:
      description: "By default, core switches are assumed to be connecting all pods. \nif you want to limit the pods, you can specify pods."
      items:
        type: integer
      type: array
    response_http401:
      additionalProperties: false
      properties:
        detail:
          examples:
          - Authentication credentials were not provided.
          type: string
      type: object
    evpn_topology_switch_suggested_uplinks:
      examples:
      - - 5c5b35000005
        - 5c5b35000006
      items:
        readOnly: true
        type: string
      readOnly: true
      type: array
    evpn_topology_switch_downlinks:
      examples:
      - - 5c5b35000005
        - 5c5b35000006
      items:
        type: string
      type: array
    switch_port_usage_dynamic_rule_equals_any:
      description: Use `equals_any` to match any item in a list
      items:
        type: string
      type: array
    evpn_topology_switch_suggested_esilaglinks:
      examples:
      - - 5c5b35000005
        - 5c5b35000006
      items:
        readOnly: true
        type: string
      readOnly: true
      type: array
    junos_port_config:
      additionalProperties: false
      description: Switch port config
      properties:
        ae_disable_lacp:
          description: To disable LACP support for the AE interface
          type: boolean
        ae_idx:
          description: Users could force to use the designated AE name
          type: integer
        ae_lacp_force_up:
          default: false
          description: 'If `aggregated`==`true`, sets the state of the interface as UP when the peer has limited LACP capability. Use case: When a device connected to this AE port is ZTPing for the first time, it will not have LACP configured on the other end. **Note:** Turning this on will enable force-up on one of the interfaces in the bundle only'
          type: boolean
        ae_lacp_slow:
          description: To use slow timeout
          type: boolean
        aggregated:
          default: false
          type: boolean
        critical:
          default: false
          description: To generate port up/down alarm
          type: boolean
        description:
          type: string
        disable_autoneg:
          default: false
          description: If `speed` and `duplex` are specified, whether to disable autonegotiation
          type: boolean
        duplex:
          $ref: '#/components/schemas/junos_port_config_duplex'
        dynamic_usage:
          description: Enable dynamic usage for this port. Set to `dynamic` to enable.
          type:
          - string
          - 'null'
        esilag:
          type: boolean
        mtu:
          default: 1514
          description: Media maximum transmission unit (MTU) is the largest data unit that can be forwarded without fragmentation
          type: integer
        networks:
          description: List of network names. Required if `usage`==`inet`
          items:
            type: string
          type: array
        no_local_overwrite:
          default: true
          description: Prevent helpdesk to override the port config
          type: boolean
        poe_disabled:
          default: false
          type: boolean
        port_network:
          description: Required if `usage`==`vlan_tunnel`. Q-in-Q tunneling using All-in-one bundling. This also enables standard L2PT for interfaces that are not encapsulation tunnel interfaces and uses MAC rewrite operation. [View more information](https://www.juniper.net/documentation/us/en/software/junos/multicast-l2/topics/topic-map/q-in-q.html#id-understanding-qinq-tunneling-and-vlan-translation)
          type: string
        speed:
          $ref: '#/components/schemas/junos_port_config_speed'
        usage:
          description: Port usage name. For Q-in-Q, use `vlan_tunnel`. If EVPN is used, use `evpn_uplink`or `evpn_downlink`
          type: string
      required:
      - usage
      type: object
    mxedge_for_site:
      default: any
      description: 'enum: `any`, `false`, `true`'
      enum:
      - any
      - 'false'
      - 'true'
      type: string
    vlan_id_with_variable:
      oneOf:
      - type: string
      - maximum: 4094
        minimum: 1
        type: integer
    evpn_options:
      additionalProperties: false
      description: EVPN Options
      properties:
        auto_loopback_subnet:
          default: 172.16.192.0/24
          description: Optional, for dhcp_relay, unique loopback IPs are required for ERB or IPClos where we can set option-82 server_id-overrides
          type: string
        auto_loopback_subnet6:
          default: fd33:ab00:2::/64
          description: Optional, for dhcp_relay, unique loopback IPs are required for ERB or IPClos where we can set option-82 server_id-overrides
          type: string
        auto_router_id_subnet:
          default: 172.16.254.0/23
          description: Optional, this generates router_id automatically, if specified, `router_id_prefix` is ignored
          type: string
        auto_router_id_subnet6:
          description: Optional, this generates router_id automatically, if specified, `router_id_prefix` is ignored
          examples:
          - fd31:5700:1::/64
          type: string
        core_as_border:
          default: false
          description: Optional, for ERB or CLOS, you can either use esilag to upstream routers or to also be the virtual-gateway. When `routed_at` != `core`, whether to do virtual-gateway at core as well
          type: boolean
        enable_inband_mgmt:
          default: false
          description: Whether to route management traffic inband; routes will be propagated to downstream switches
          type: boolean
        enable_inband_ztp:
          default: false
          description: if the mangement traffic goes inbnd, during installation, only the border/core switches are connected to the Internet to allow initial configuration to be pushed down and leave the downstream access switches stay in the Factory Default state enabling inband-ztp allows upstream switches to use LLDP to assign IP and gives Internet to downstream switches in that state
          type: boolean
        overlay:
          $ref: '#/components/schemas/evpn_options_overlay'
        per_vlan_vga_v4_mac:
          default: false
          description: Only for by Core-Distribution architecture when `evpn_options.routed_at`==`core`. By default, JUNOS uses 00-00-5e-00-01-01 as the virtual-gateway-address's v4_mac. If enabled, 00-00-5e-00-0X-YY will be used (where XX=vlan_id/256, YY=vlan_id%256)
          type: boolean
        per_vlan_vga_v6_mac:
          default: false
          description: Only for by Core-Distribution architecture when `evpn_options.routed_at`==`core`. By default, JUNOS uses 00-00-5e-00-02-01 as the virtual-gateway-address's v6_mac. If enabled, 00-00-5e-00-1X-YY will be used (where XX=vlan_id/256, YY=vlan_id%256)
          type: boolean
        routed_at:
          $ref: '#/components/schemas/evpn_options_routed_at'
        underlay:
          $ref: '#/components/schemas/evpn_options_underlay'
        vs_instances:
          $ref: '#/components/schemas/evpn_options_vs_instances'
      type: object
    switch_port_usage_dynamic_rules:
      description: Only if `mode`==`dynamic`
      items:
        $ref: '#/components/schemas/switch_port_usage_dynamic_rule'
      type: array
    junos_port_config_speed:
      default: auto
      description: 'enum: `100m`, `10m`, `1g`, `2.5g`, `5g`, `10g`, `25g`, `40g`, `100g`,`auto`'
      enum:
      - 10m
      - 100m
      - 1g
      - 2.5g
      - 5g
      - 10g
      - 25g
      - 40g
      - 100g
      - auto
      type: string
    switch_port_usage_mac_limit:
      anyOf:
      - default: 0
        maximum: 16383
        minimum: 0
        type: integer
      - type: string
      description: Only if `mode`!=`dynamic`, max number of mac addresses, default is 0 for unlimited, otherwise range is 1 to 16383 (upper bound constrained by platform)
    switch_port_usage_speed:
      default: auto
      description: 'Only if `mode`!=`dynamic`, Port speed, default is auto to automatically negotiate speed enum: `100m`, `10m`, `1g`, `2.5g`, `5g`, `10g`, `25g`, `40g`, `100g`,`auto`'
      enum:
      - 10m
      - 100m
      - 1g
      - 2.5g
      - 5g
      - 10g
      - 25g
      - 40g
      - 100g
      - auto
      type: string
    evpn_topology:
      properties:
        created_time:
          $ref: '#/components/schemas/created_time'
        evpn_options:
          $ref: '#/components/schemas/evpn_options'
        id:
          $ref: '#/components/schemas/id'
        modified_time:
          $ref: '#/components/schemas/modified_time'
        name:
          examples:
          - CC
          type: string
        org_id:
          $ref: '#/components/schemas/org_id'
        overwrite:
          type: boolean
        pod_names:
          additionalProperties:
            type: string
          description: Property key is the pod number
          type: object
        site_id:
          $ref: '#/components/schemas/site_id'
        switch_configs:
          $ref: '#/components/schemas/evpn_topology_switch_configs'
        switches:
          $ref: '#/components/schemas/evpn_topology_switches'
      required:
      - switches
      type: object
    switch_port_usage_dynamic_rule:
      additionalProperties: false
      properties:
        description:
          description: Optional description of the rule
          type: string
        equals:
          type: string
        equals_any:
          $ref: '#/components/schemas/switch_port_usage_dynamic_rule_equals_any'
        expression:
          description: '"[0:3]":"abcdef" -> "abc"

            "split(.)[1]": "a.b.c" -> "b"

            "split(-)[1][0:3]: "a1234-b5678-c90" -> "b56"'
          type: string
        src:
          $ref: '#/components/schemas/switch_port_usage_dynamic_rule_src'
        usage:
          description: '`port_usage` name'
          type: string
      required:
      - src
      type: object
    created_time:
      description: When the object has been created, in epoch
      format: double
      readOnly: true
      type: number
    switch_port_usage:
      additionalProperties: false
      description: Junos port usages
      properties:
        all_networks:
          default: false
          description: Only if `mode`==`trunk`. Whether to trunk all network/vlans
          type: boolean
        allow_dhcpd:
          description: 'Only applies when `mode`!=`dynamic`. Controls whether DHCP server traffic is allowed on ports using this configuration if DHCP snooping is enabled. This is a tri-state setting; `true`: ports become trusted ports allowing DHCP server traffic, `false`: ports become untrusted blocking DHCP server traffic, undefined: use system defaults (access ports default to untrusted, trunk ports default to trusted).'
          type: boolean
        allow_multiple_supplicants:
          default: false
          description: Only if `mode`!=`dynamic`
          type: boolean
        bypass_auth_when_server_down:
          default: false
          description: Only if `mode`!=`dynamic` and `port_auth`==`dot1x`. Bypass auth for known clients if set to true when RADIUS server is down
          type: boolean
        bypass_auth_when_server_down_for_unknown_client:
          default: false
          description: Only if `mode`!=`dynamic` and `port_auth`=`dot1x`. Bypass auth for all (including unknown clients) if set to true when RADIUS server is down
          type: boolean
        bypass_auth_when_server_down_for_voip:
          default: false
          description: Only if `mode`!=`dynamic` and `port_auth`==`dot1x`. Bypass auth for VOIP if set to true when RADIUS server is down
          type: boolean
        community_vlan_id:
          description: Only if `mode`!=`dynamic`. To be used together with `isolation` under networks. Signaling that this port connects to the networks isolated but wired clients belong to the same community can talk to each other
          type: integer
        description:
          description: Only if `mode`!=`dynamic`
          type: string
        disable_autoneg:
          default: false
          description: Only if `mode`!=`dynamic`. If speed and duplex are specified, whether to disable autonegotiation
          type: boolean
        disabled:
          default: false
          description: Only if `mode`!=`dynamic`. Whether the port is disabled
          type: boolean
        duplex:
          $ref: '#/components/schemas/switch_port_usage_duplex'
        dynamic_vlan_networks:
          $ref: '#/components/schemas/switch_port_usage_dynamic_vlan_networks'
        enable_mac_auth:
          default: false
          description: Only if `mode`!=`dynamic` and `port_auth`==`dot1x`. Whether to enable MAC Auth
          type: boolean
        enable_qos:
          default: false
          description: Only if `mode`!=`dynamic`
          type: boolean
        guest_network:
          description: Only if `mode`!=`dynamic` and `port_auth`==`dot1x`. Which network to put the device into if the device cannot do dot1x. default is null (i.e. not allowed)
          type:
          - string
          - 'null'
        inter_isolation_network_link:
          default: false
          description: Only if `mode`!=`dynamic`. `inter_isolation_network_link` is used together with `isolation` under networks, signaling that this port connects to isolated networks
          type: boolean
        inter_switch_link:
          default: false
          description: 'Only if `mode`!=`dynamic`. `inter_switch_link` is used together with `isolation` under networks. NOTE: `inter_switch_link` works only between Juniper devices. This has to be applied to both ports connected together'
          type: boolean
        mac_auth_only:
          description: Only if `mode`!=`dynamic` and `enable_mac_auth`==`true`
          type: boolean
        mac_auth_preferred:
          description: Only if `mode`!=`dynamic` + `enable_mac_auth`==`true` + `mac_auth_only`==`false`, dot1x will be given priority then mac_auth. Enable this to prefer mac_auth over dot1x.
          type: boolean
        mac_auth_protocol:
          $ref: '#/components/schemas/switch_port_usage_mac_auth_protocol'
        mac_limit:
          $ref: '#/components/schemas/switch_port_usage_mac_limit'
        mode:
          $ref: '#/components/schemas/switch_port_usage_mode'
        mtu:
          $ref: '#/components/schemas/switch_port_usage_mtu'
        networks:
          $ref: '#/components/schemas/switch_port_usage_networks'
        persist_mac:
          default: false
          description: Only if `mode`==`access` and `port_auth`!=`dot1x`. Whether the port should retain dynamically learned MAC addresses
          type: boolean
        poe_disabled:
          default: false
          description: Only if `mode`!=`dynamic`. Whether PoE capabilities are disabled for a port
          type: boolean
        poe_keep_state_when_reboot:
          default: false
          description: Only if `mode`!=`dynamic`. Whether Perpetual PoE is enabled; keeps PoE state across reboots
          type: boolean
        poe_priority:
          $ref: '#/components/schemas/poe_priority'
        port_auth:
          $ref: '#/components/schemas/switch_port_usage_dot1x'
        port_network:
          description: Only if `mode`!=`dynamic`. Native network/vlan for untagged traffic
          type: string
        reauth_interval:
          $ref: '#/components/schemas/switch_port_usage_reauth_interval'
        reset_default_when:
          $ref: '#/components/schemas/switch_port_usage_dynamic_reset_default_when'
        rules:
          $ref: '#/components/schemas/switch_port_usage_dynamic_rules'
        server_fail_network:
          description: Only if `mode`!=`dynamic` and `port_auth`==`dot1x`. Sets server fail fallback vlan
          type:
          - string
          - 'null'
        server_reject_network:
          description: Only if `mode`!=`dynamic` and `port_auth`==`dot1x`. When radius server reject / fails
          type:
          - string
          - 'null'
        speed:
          $ref: '#/components/schemas/switch_port_usage_speed'
        storm_control:
          $ref: '#/components/schemas/switch_port_usage_storm_control'
        stp_disable:
          default: false
          description: Only if `mode`!=`dynamic` and `stp_required`==`false`. Drop bridge protocol data units (BPDUs ) that enter any interface or a specified interface
          type: boolean
        stp_edge:
          default: false
          description: Only if `mode`!=`dynamic`. When enabled, the port is not expected to receive BPDU frames
          type: boolean
        stp_no_root_port:
          default: false
          description: Only if `mode`!=`dynamic`
          type: boolean
        stp_p2p:
          default: false
          description: Only if `mode`!=`dynamic`
          type: boolean
        stp_required:
          default: false
          description: Only if `mode`!=`dynamic`. Whether to remain in block state if no BPDU is received
          type: boolean
        ui_evpntopo_id:
          description: Optional for Campus Fabric Core-Distribution ESI-LAG profile. Helper used by the UI to select this port profile as the ESI-Lag between Distribution and Access switches
          format: uuid
          type: string
        use_vstp:
          default: false
          description: If this is connected to a vstp network
          type: boolean
        voip_network:
          description: Only if `mode`!=`dynamic`. Network/vlan for voip traffic, must also set port_network. to authenticate device, set port_auth
          type:
          - string
          - 'null'
      type: object
    evpn_topology_response:
      additionalProperties: false
      properties:
        created_time:
          $ref: '#/components/schemas/created_time'
        evpn_options:
          $ref: '#/components/schemas/evpn_options'
        for_site:
          type: boolean
        id:
          $ref: '#/components/schemas/id'
        modified_time:
          $ref: '#/components/schemas/modified_time'
        name:
          examples:
          - CC
          type: string
        org_id:
          $ref: '#/components/schemas/org_id'
        overwrite:
          type: boolean
        pod_names:
          additionalProperties:
            type: string
          description: Property key is the pod number
          type: object
        site_id:
          $ref: '#/components/schemas/site_id'
      type: object
    evpn_topology_switch:
      additionalProperties: false
      properties:
        config:
          $ref: '#/components/schemas/evpn_topology_switch_config'
        deviceprofile_id:
          examples:
          - 6a1deab1-96df-4fa2-8455-d5253f943d06
          format: uuid
          readOnly: true
          type: string
        downlink_ips:
          $ref: '#/components/schemas/evpn_topology_switch_downlink_ips'
        downlinks:
          $ref: '#/components/schemas/evpn_topology_switch_downlinks'
        esilaglinks:
          $ref: '#/components/schemas/evpn_topology_switch_esilaglinks'
        evpn_id:
          minimum: 1
          readOnly: true
          type: integer
        mac:
          examples:
          - 5c5b35000003
          minLength: 1
          type: string
        model:
          examples:
          - QFX10002-36Q
          readOnly: true
          type: string
        pod:
          default: 1
          description: "Optionally, for distribution / access / esilag-access, they can be placed into different pods. e.g. \n  * for CLOS, to group dist / access switches into pods\n  * for ERB/CRB, to group dist / esilag-access into pods"
          maximum: 255
          minimum: 1
          type: integer
        pods:
          $ref: '#/components/schemas/evpn_topology_switch_pods'
        role:
          $ref: '#/components/schemas/evpn_topology_switch_role'
        router_id:
          examples:
          - 172.16.254.4
          readOnly: true
          type: string
        site_id:
          $ref: '#/components/schemas/site_id'
        suggested_downlinks:
          $ref: '#/components/schemas/evpn_topology_switch_suggested_downlinks'
        suggested_esilaglinks:
          $ref: '#/components/schemas/evpn_topology_switch_suggested_esilaglinks'
        suggested_uplinks:
          $ref: '#/components/schemas/evpn_topology_switch_suggested_uplinks'
        uplinks:
          $ref: '#/components/schemas/evpn_topology_switch_uplinks'
      required:
      - mac
      - role
      type: object
    switch_port_usage_dynamic_rule_src:
      description: 'enum: `link_pee

# --- truncated at 32 KB (50 KB total) ---
# Full source: https://raw.githubusercontent.com/api-evangelist/mist-ai/refs/heads/main/openapi/mist-ai-orgs-evpn-topologies-api-openapi.yml