Juniper Mist AI Installer API

In a typical enterprise, a separate group of people, Installers, are responsible for install new devices. May it be a new installation (e.g. new stores), a replacement installation (e.g. replacing Cisco APs with Mist APs), or addition (e.g. adding new APs for better coverage). Instead of granting them Admin/Write privilege, it's more desirable to grant them minimum privileges to do the initial provisioning so they cannot read sensible information (e.g. PSK of a WLAN), or change configs of running APs. At a high level, Installer APs try to achieve the following: 1. identifying a device by MAC (that\u2019\ s what they see) 2. they can only touch configurations of the devices they\u2019\ re installing 3. allow the following configurations: * name * site assignment * device profile assignment * map and location (x/y) assignment * claim (if not already in the inventory) * replace existing device with the device being installed **Grace Period** Grace period provides a dynamic way to limit what devices / sites installer can work on. Generally installers work on recent deployments - bringing up new sites, add newly claimed devices to new / existing sites. They make mistakes, too, and may need to further tweak some of the parameters. Default grace period is 7 days and can be set from 1 day to 365 days.

OpenAPI Specification

mist-ai-installer-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 Installer 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: "In a typical enterprise, a separate group of people, Installers, are responsible for install new devices. May it be a new installation (e.g. new stores), a replacement installation (e.g. replacing Cisco APs with Mist APs), or addition (e.g. adding new APs for better coverage). Instead of granting them Admin/Write privilege, it's more desirable to grant them minimum privileges to do the initial provisioning so they cannot read sensible information (e.g. PSK of a WLAN), or change configs of running APs.\nAt a high level, Installer APs try to achieve the following:\n1. identifying a device by MAC (that\\u2019\\ \ns what they see)\n2. they can only touch configurations of the devices they\\u2019\\\nre installing\n3. allow the following configurations: \n  * name * site assignment \n  * device profile assignment \n  * map and location (x/y) assignment \n  * claim (if not already in the inventory) \n  * replace existing device with the device being installed\n\n**Grace Period**\n\nGrace period provides a dynamic way to limit what devices / sites installer can work on. Generally installers work on recent deployments - bringing up new sites, add newly claimed devices to new / existing sites. They make mistakes, too, and may need to further tweak some of the parameters. Default grace period is 7 days and can be set from 1 day to 365 days."
  name: Installer
paths:
  /api/v1/installer/orgs/{org_id}/alarmtemplates:
    parameters:
    - $ref: '#/components/parameters/org_id'
    get:
      description: Get List of alarm templates
      operationId: listInstallerAlarmTemplates
      responses:
        '200':
          $ref: '#/components/responses/InstallerAlarmtemplates'
        '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: listInstallerAlarmTemplates
      tags:
      - Installer
  /api/v1/installer/orgs/{org_id}/deviceprofiles:
    parameters:
    - $ref: '#/components/parameters/org_id'
    get:
      description: Get List of Device Profiles
      operationId: listInstallerDeviceProfiles
      parameters:
      - in: query
        name: type
        schema:
          $ref: '#/components/schemas/device_type_default_ap'
      responses:
        '200':
          $ref: '#/components/responses/InstallerDeviceProfiles'
        '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: listInstallerDeviceProfiles
      tags:
      - Installer
  /api/v1/installer/orgs/{org_id}/devices:
    parameters:
    - $ref: '#/components/parameters/org_id'
    get:
      description: Get List of recently claimed devices
      operationId: listInstallerListOfRecentlyClaimedDevices
      parameters:
      - description: Device Model
        in: query
        name: model
        schema:
          examples:
          - AP43
          type: string
      - description: Site Name
        in: query
        name: site_name
        schema:
          examples:
          - SJ1
          type: string
      - description: Site ID
        in: query
        name: site_id
        schema:
          examples:
          - 72771e6a-6f5e-4de4-a5b9-1266c4197811
          format: uuid
          type: string
      - $ref: '#/components/parameters/limit'
      - $ref: '#/components/parameters/page'
      responses:
        '200':
          $ref: '#/components/responses/InstallerDevicesArray'
        '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: listInstallerListOfRecentlyClaimedDevices
      tags:
      - Installer
    post:
      description: This mirrors `POST /api/v1/orgs/{org_id}/inventory` (see Inventory API)
      operationId: claimInstallerDevices
      requestBody:
        content:
          application/json:
            examples:
              Example:
                value:
                - 6JG8E-PTFV2-A9Z2N
                - DVH4V-SNMSZ-PDXBR
            schema:
              $ref: '#/components/schemas/claim_codes'
        description: Request Body
      responses:
        '200':
          $ref: '#/components/responses/OrgInventoryAdd'
        '400':
          $ref: '#/components/responses/OrgInventoryAdd'
        '401':
          $ref: '#/components/responses/HTTP401'
        '403':
          $ref: '#/components/responses/HTTP403'
        '404':
          $ref: '#/components/responses/HTTP404'
        '429':
          $ref: '#/components/responses/HTTP429'
      summary: claimInstallerDevices
      tags:
      - Installer
  /api/v1/installer/orgs/{org_id}/devices/{device_mac}:
    parameters:
    - $ref: '#/components/parameters/org_id'
    - $ref: '#/components/parameters/device_mac'
    delete:
      description: Unassign recently claimed devices
      operationId: unassignInstallerRecentlyClaimedDevice
      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: unassignInstallerRecentlyClaimedDevice
      tags:
      - Installer
    put:
      description: "Provision or Replace a device \n\nIf replacing_mac is in the request payload, other attributes are ignored, we attempt to replace existing device (with mac replacing_mac) with the inventory device being configured. The replacement device must be in the inventory but not assigned, and the replacing_mac device must be assigned to a site, and satisfy grace period requirements. The Device replaced will become unassigned."
      operationId: provisionInstallerDevices
      requestBody:
        content:
          application/json:
            examples:
              Example:
                value:
                  deviceprofile_name: SJ1
                  height: 2.7
                  name: SJ1-AP1
                  orientation: 90
                  site_id: 72771e6a-6f5e-4de4-a5b9-1266c4197811
                  site_name: SJ1
                  x: 150
                  y: 300
            schema:
              $ref: '#/components/schemas/installer_provision_device'
        description: Request Body
      responses:
        '200':
          $ref: '#/components/responses/OK'
        '400':
          $ref: '#/components/responses/OrgInventoryUnassignFailed'
        '401':
          $ref: '#/components/responses/HTTP401'
        '403':
          $ref: '#/components/responses/HTTP403'
        '404':
          $ref: '#/components/responses/OrgInventoryUnassignNotFound'
        '429':
          $ref: '#/components/responses/HTTP429'
      summary: provisionInstallerDevices
      tags:
      - Installer
  /api/v1/installer/orgs/{org_id}/devices/{device_mac}/locate:
    parameters:
    - $ref: '#/components/parameters/org_id'
    - $ref: '#/components/parameters/device_mac'
    post:
      description: Locate a Device by blinking it’s LED, it’s a persisted state that has to be stopped by calling Stop Locating API
      operationId: startInstallerLocateDevice
      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: startInstallerLocateDevice
      tags:
      - Installer
  /api/v1/installer/orgs/{org_id}/devices/{device_mac}/unlocate:
    parameters:
    - $ref: '#/components/parameters/org_id'
    - $ref: '#/components/parameters/device_mac'
    post:
      description: Stop it
      operationId: stopInstallerLocateDevice
      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: stopInstallerLocateDevice
      tags:
      - Installer
  /api/v1/installer/orgs/{org_id}/devices/{device_mac}/{image_name}:
    parameters:
    - $ref: '#/components/parameters/org_id'
    - $ref: '#/components/parameters/image_name'
    - $ref: '#/components/parameters/device_mac'
    delete:
      description: Delete image
      operationId: deleteInstallerDeviceImage
      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: deleteInstallerDeviceImage
      tags:
      - Installer
    post:
      description: Add image
      operationId: addInstallerDeviceImage
      requestBody:
        content:
          multipart/form-data:
            schema:
              $ref: '#/components/schemas/map_site_import_file'
        description: Request Body
      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: addInstallerDeviceImage
      tags:
      - Installer
  /api/v1/installer/orgs/{org_id}/devices/{fpc0_mac}/vc:
    parameters:
    - $ref: '#/components/parameters/org_id'
    - description: FPC0 MAC Address
      in: path
      name: fpc0_mac
      required: true
      schema:
        examples:
        - aff827549235
        type: string
    get:
      description: 'Get VC Status


        The API returns a combined view of the VC status which includes topology and stats'
      operationId: getInstallerDeviceVirtualChassis
      responses:
        '200':
          $ref: '#/components/responses/VirtualChassis'
        '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: getInstallerDeviceVirtualChassis
      tags:
      - Installer
    post:
      description: 'For models (e.g. EX3400 and up) having dedicated VC ports, it is easier to form a VC by just connecting cables with the dedicated VC ports. Cloud will detect the new VC and update the inventory.


        In case that the user would like to choose the dedicated switch as a VC master or for EX2300-C-12P and EX2300-C-12T which doesn''t have dedicated VC ports, below are procedures to automate the VC creation:


        1. Power on the switch that is chosen as the VC master first. And then powering on the other member switches.

        2. Claim or adopt all these switches under the same organization’s Inventory

        3. Assign these switches into the same Site

        4. Invoke vc command on the switch chosen to be the VC master. For EX2300-C-12P, VC ports will be created automatically.

        5. Connect the cables to the VC ports for these switches

        6. Wait for the VC to be formed. The Org’s inventory will be updated for the new VC.'
      operationId: createInstallerVirtualChassis
      requestBody:
        content:
          application/json:
            examples:
              create-a-VC-with-three-members:
                value:
                  members:
                  - mac: aff827549235
                    vc_ports:
                    - xe-0/1/0
                    - xe-0/1/1
                    vc_role: master
                  - mac: 8396cd006c8c
                    vc_ports:
                    - xe-0/1/0
                    - xe-0/1/1
                    vc_role: backup
                  - mac: 8396cd00888c
                    vc_ports:
                    - xe-0/1/0
                    - xe-0/1/1
                    vc_role: linecard
              create-a-pre-provisioned-VC-with-three-members:
                value:
                  members:
                  - mac: aff827549235
                    member_id: 0
                    vc_ports:
                    - xe-0/1/0
                    - xe-0/1/1
                    vc_role: master
                  - mac: 8396cd006c8c
                    member_id: 1
                    vc_ports:
                    - xe-0/1/0
                    - xe-0/1/1
                    vc_role: linecard
                  - mac: 8396cd00888c
                    member_id: 2
                    vc_ports:
                    - xe-0/1/0
                    - xe-0/1/1
                    vc_role: backup
                  preprovisioned: true
            schema:
              $ref: '#/components/schemas/virtual_chassis_config'
        description: Request Body
      responses:
        '200':
          $ref: '#/components/responses/VirtualChassis'
        '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: createInstallerVirtualChassis
      tags:
      - Installer
    put:
      description: "The VC creation and adding member switch API will update the device’ s virtual chassis config which is applied after VC is formed to create JUNOS pre-provisioned virtual chassis configuration.\n\n## Change to use preprovisioned VC\nTo switch the VC to use preprovisioned VC, enable preprovisioned in virtual_chassis config. Both vc_role master and backup will be matched to routing-engine role in Junos preprovisioned VC config.\n\nIn this config, fpc0 has to be the same as the mac of device_id. Use renumber if you want to replace fpc0 which involves device_id change.\n\nNotice: to configure preprovisioned VC, every member of the VC must be in the inventory.\n\n## Add new members\nFor models (e.g. EX4300 and up) having dedicated VC ports, it is easier to add new member switches into a VC by just connecting cables with the dedicated VC ports. Cloud will detect the new members and update the inventory.\n\nFor EX2300 VC, adding new members requires to follow the procedures below:\n1. Powering on the new member switches and ensuring cables are not connected to any VC ports.\n2. Claim or adopt all new member switches under the VC’s organization Inventory\n3. Assign all new member switches to the same Site as the VC\n4. Invoke vc command to add switches to the VC.\n5. Connect the cables to the VC ports for these switches\n6. After a while, the Org’s Inventory shows this new switches has been added into the VC.\n\n## Removing member switch\nTo remove a member switch from the VC, following the procedures below:\n\n1. Ensuring the VC is connected to the cloud first\n2. Unplug the cable from the VC port of the switch\n3. Waiting for the VC state (vc_state) of this switch is changed to not-present\n4. Invoke update_vc with remove to remove this switch from the VC\n5. The Org’s Inventory shows the switch is removed.\n\nPlease notice that member ID 0 (fpc0) cannot be removed. When a VC has two switches left, unplugging the cable may result in the situation that fpc0 becomes a line card (LC). When this situation is happening, please re-plug in the cable, wait for both switches becoming present (show virtual-chassis) and then removing the cable again.\n\n## Renumber a member switch\nWhen a member switch doesn't' work properly and needed to be replaced, the renumber API could be used. The following two types of renumber are supported:\n\n1. Replace a non-fpc0 member switch\n2. Replace fpc0. When fpc0 is replaced, PAPI device config and JUNOS config will be both updated.\n\nFor renumber to work, the following procedures are needed: \n1. Ensuring the VC is connected to the cloud and the state of the member switch to be replaced must be non present. \n2. Adding the new member switch to the VC \n3. Waiting for the VC state (vc_state) of this VC to be updated to API server \n4. Invoke vc with renumber to replace the new member switch from fpc X to\n\n## Perprovision VC members\nBy specifying \"preprovision\" op, you can convert the current VC to pre-provisioned mode, update VC members as well as specify vc_ports when adding new members for device models without dedicated vc ports. Use renumber for fpc0 replacement which involves device_id change.\n\nNote: \n1. vc_ports is used for adding new members and not needed if * the device model has dedicated vc ports, or * no new member is added \n2. New VC members to be added should exist in the same Site as the VC\n\nUpdate Device’s VC config can achieve similar purpose by directly modifying current virtual_chassis config. However, it cannot fulfill requests to enabling vc_ports on new members that are yet to belong to current VC."
      operationId: updateInstallerVirtualChassisMember
      requestBody:
        content:
          application/json:
            examples:
              adding-two-new-switches-as-line-cards-into-the-VC:
                value:
                  members:
                  - mac: aff827549235
                    member_id: 2
                    vc_ports:
                    - xe-0/1/0
                    - xe-0/1/1
                    vc_role: linecard
                  - mac: 8396cd00777c
                    member_id: 3
                    vc_ports:
                    - xe-0/1/0
                    - xe-0/1/1
                    vc_role: linecard
                  op: add
              convert-to-pre-provisioned-VC:
                value:
                  member: 0
                  members:
                  - mac: string
                    member_id: 0
                    vc_ports:
                    - xe-0/1/0
                    - xe-0/1/1
                    vc_role: master
                  new-member: 0
                  op: add
              removing-two-switches-from-VC:
                value:
                  members:
                  - member: 2
                  - member: 3
                  op: remove
              renumber-member-ID-3-to-member-ID-2:
                value:
                  member: 3
                  new-member: 2
                  op: renumber
            schema:
              $ref: '#/components/schemas/virtual_chassis_update'
        description: Request Body
      responses:
        '200':
          $ref: '#/components/responses/VirtualChassis'
        '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: updateInstallerVirtualChassisMember
      tags:
      - Installer
  /api/v1/installer/orgs/{org_id}/rftemplates:
    parameters:
    - $ref: '#/components/parameters/org_id'
    get:
      description: Get List of RF Templates
      operationId: listInstallerRfTemplatesNames
      responses:
        '200':
          $ref: '#/components/responses/InstallerRftemplatesArray'
        '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: listInstallerRfTemplatesNames
      tags:
      - Installer
  /api/v1/installer/orgs/{org_id}/sitegroups:
    parameters:
    - $ref: '#/components/parameters/org_id'
    get:
      description: Get List of Site Groups
      operationId: listInstallerSiteGroups
      responses:
        '200':
          $ref: '#/components/responses/InstallerSitegroupsArray'
        '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: listInstallerSiteGroups
      tags:
      - Installer
  /api/v1/installer/orgs/{org_id}/sites:
    parameters:
    - $ref: '#/components/parameters/org_id'
    get:
      description: Get List of Sites
      operationId: listInstallerSites
      responses:
        '200':
          $ref: '#/components/responses/InstallerSitesArray'
        '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: listInstallerSites
      tags:
      - Installer
  /api/v1/installer/orgs/{org_id}/sites/{site_name}:
    parameters:
    - $ref: '#/components/parameters/org_id'
    - $ref: '#/components/parameters/site_name'
    put:
      description: Often the Installers are asked to assign Devices to Sites. The Sites can either be pre-created or created/modified by the Installer. If this is an update, the same grace period also applies.
      operationId: createOrUpdateInstallerSites
      requestBody:
        content:
          application/json:
            examples:
              Example:
                value:
                  address: 1601 S. Deanza Blvd., Cupertino, CA, 95014
                  country_code: US
                  latlng:
                    lat: 37.295833
                    lng: -122.032946
                  name: string
                  rftemplate_name: rftemplate1
                  sitegroup_names:
                  - sg1
                  - sg2
                  timezone: America/Los_Angeles
            schema:
              $ref: '#/components/schemas/installer_site'
        description: Request Body
      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: createOrUpdateInstallerSites
      tags:
      - Installer
  /api/v1/installer/orgs/{org_id}/sites/{site_name}/maps:
    parameters:
    - $ref: '#/components/parameters/org_id'
    - $ref: '#/components/parameters/site_name'
    get:
      description: Get List of Maps
      operationId: listInstallerMaps
      responses:
        '200':
          $ref: '#/components/responses/MapsArray'
        '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: listInstallerMaps
      tags:
      - Installer
  /api/v1/installer/orgs/{org_id}/sites/{site_name}/maps/import:
    parameters:
    - $ref: '#/components/parameters/org_id'
    - $ref: '#/components/parameters/site_name'
    post:
      description: Import data from files is a multipart POST which has an file, an optional json, and an optional csv, to create floorplan, assign & place ap if name or mac matches
      operationId: importInstallerMap
      requestBody:
        content:
          multipart/form-data:
            schema:
              $ref: '#/components/schemas/map_site_import_file'
      responses:
        '200':
          $ref: '#/components/responses/MapImport'
        '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: importInstallerMap
      tags:
      - Installer
  /api/v1/installer/orgs/{org_id}/sites/{site_name}/maps/{map_id}:
    parameters:
    - $ref: '#/components/parameters/org_id'
    - $ref: '#/components/parameters/site_name'
    - $ref: '#/components/parameters/map_id'
    delete:
      description: Delete Map
      operationId: deleteInstallerMap
      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: deleteInstallerMap
      tags:
      - Installer
    post:
      description: Create a MAP
      operationId: createInstallerMap
      requestBody:
        content:
          application/json:
            examples:
              Example:
                value:
                  height: 0
                  latlng_br:
                    lat: string
                    lng: string
                  latlng_tl:
                    lat: string
                    lng: string
                  locked: true
                  name: string
                  orientation: 0
                  origin_x: 0
                  origin_y: 0
                  ppm: 0
                  sitesurvey_path:
                  - coordinate: string
                    name: string
                    nodes:
                    - edges:
                        N2: string
                      name: string
                      position:
                        x: 0
                        y: 0
                  type: image
                  view: roadmap
                  wall_path:
                    coordinate: string
                    nodes:
                    - edges:
                        N2: string
                      name: string
                      position:
                        x: 0
                        y: 0
                  wayfinding:
                    micello:
                      account_key: string
                      default_level_id: 0
                    snap_to_path: true
                  wayfinding_path:
                    coordinate: string
                    nodes:
                    - edges:
                        N2: string
                      name: string
                      position:
                        x: 0
                        y: 0
                  width: 0
            schema:
              $ref: '#/components/schemas/map'
        description: Request Body
      responses:
        '200':
          $ref: '#/components/responses/Map'
        '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: createInstallerMap
      tags:
      - Installer
    put:
      description: Update map
      operationId: updateInstallerMap
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/map'
        description: Request Body
      responses:
        '200':
          $ref: '#/components/responses/Map'
        '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: updateInstallerMap
      tags:
      - Installer
  /api/v1/installer/sites/{site_name}/optimize:
    parameters:
    - $ref: '#/components/parameters/site_name'
    get:
      description: After installation is considered complete (APs are placed on maps, all powered up), you can trigger an optimize operation where RRM will kick in (and maybe other things in the future) before it’s automatically scheduled.
      operationId: optimizeInstallerRrm
      responses:
        '200':
          $ref: '#/components/responses/OK'
        '400':
          $ref: '#/components/responses/HTTP400'
        '401':
          $ref: '#/components/responses/HTTP401'
        '403':
          $ref: '#/components/re

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