openapi: 3.1.0
info:
contact:
email: tmunzer@juniper.net
name: Thomas Munzer
description: '> Version: **2604.1.1**
>
> Date: **May 13, 2026**
NOTE:
Some important API changes will be introduced. Please make sure to read the
announcements
---
## 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 Sites Synthetic Tests 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: 'Synthetic Tests (Marvis Minis) are a feature of Juniper Networks'' Mist platform, designed to proactively identify and resolve network issues before they impact users by simulating user connections and validating network configurations.
Here are the key points about Marvis Minis:
* Proactive Testing: Marvis Minis perform user connection tests to validate connectivity and application reachability issues on your network. These tests run automatically every hour and can also be initiated manually by an admin user.
* Scope and Stress Management: By default, Marvis Minis run on a few APs based on the scope it automatically learns, and it can expand the scope to other APs and switches if necessary, without causing additional stress on network services.
* Integration with Mist AI: Data from Marvis Minis is continuously fed back into the Mist AI engine, providing additional insights for AIOps responses. This data is also integrated into Marvis Actions for proactive resolution and validation.
* Subscription and Accessibility: Marvis Minis are available at no extra charge with a Marvis VNA subscription and do not require additional hardware or software.'
name: Sites Synthetic Tests
paths:
/api/v1/sites/{site_id}/devices/{device_id}/check_radius_server:
parameters:
- $ref: '#/components/parameters/site_id'
- $ref: '#/components/parameters/device_id'
post:
description: "Ping test from the AP to confirm 'reachability' of the Radius server. \n\nUtilize Juniper EX switch(to which an AP is connected to) radius test capabilities to get details on the Radius Server 'availability'.\n\n\n\n#### Subscribe to Device Command outputs\n\n`WS /api-ws/v1/stream`\n\n\n```json\n{\n \"subscribe\": \"/sites/{site_id}/devices/{device_id}/cmd\"\n}\n```\n\n#### Example output from ws stream\n\n```json\n{\n \"event\": \"data\",\n \"channel\": \"/sites/d6fb4f96-3ba4-4cf5-8af2-a8d7b85087ac/devices/00000000-0000-0000-1000-2093390b3580/cmd\",\n \"data\": \"{\\\"event\\\": \\\"data\\\", \\\"channel\\\": \\\"/sites/d6fb4f96-3ba4-4cf5-8af2-a8d7b85087ac/devices/2093390b3580/cmd\\\", \\\"data\\\": {\\\"session\\\": \\\"6043daff-884e-48bc-aa9a-810d268aceb1\\\", \\\"raw\\\": \\\" Reason : fail\\\"}}\"\n}\n{\n \"event\": \"data\",\n \"channel\": \"/sites/d6fb4f96-3ba4-4cf5-8af2-a8d7b85087ac/devices/00000000-0000-0000-1000-2093390b3580/cmd\",\n \"data\": \"{\\\"event\\\": \\\"data\\\", \\\"channel\\\": \\\"/sites/d6fb4f96-3ba4-4cf5-8af2-a8d7b85087ac/devices/2093390b3580/cmd\\\", \\\"data\\\": {\\\"session\\\": \\\"6043daff-884e-48bc-aa9a-810d268aceb1\\\", \\\"raw\\\": \\\" Test complete. Exiting\\\"}}\"\n}\n```"
operationId: startSiteSwitchRadiusSyntheticTest
requestBody:
content:
application/json:
examples:
Example:
value:
password: string
profile: dot1x
user: string
schema:
$ref: '#/components/schemas/synthetictest_radius_server'
responses:
'200':
$ref: '#/components/responses/WebsocketSession'
'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: triggerSiteSwitchRadiusSyntheticTest
tags:
- Sites Synthetic Tests
/api/v1/sites/{site_id}/devices/{device_id}/synthetic_test:
parameters:
- $ref: '#/components/parameters/site_id'
- $ref: '#/components/parameters/device_id'
get:
description: Get Device Synthetic Test
operationId: getSiteDeviceSyntheticTest
responses:
'200':
$ref: '#/components/responses/SynthetictestStatus'
'400':
description: Device not online / Device not supported / Already in progress
'401':
$ref: '#/components/responses/HTTP401'
'403':
$ref: '#/components/responses/HTTP403'
'404':
$ref: '#/components/responses/HTTP404'
'429':
$ref: '#/components/responses/HTTP429'
summary: getSiteDeviceSyntheticTest
tags:
- Sites Synthetic Tests
post:
description: Trigger Device Synthetic Test
operationId: triggerSiteDeviceSyntheticTest
requestBody:
content:
application/json:
schema:
$ref: '#/components/schemas/synthetictest_device'
responses:
'200':
description: Scheduled
'400':
description: Device not online / Device not supported / Already in progress
'401':
$ref: '#/components/responses/HTTP401'
'403':
$ref: '#/components/responses/HTTP403'
'404':
$ref: '#/components/responses/HTTP404'
'429':
$ref: '#/components/responses/HTTP429'
summary: triggerSiteDeviceSyntheticTest
tags:
- Sites Synthetic Tests
/api/v1/sites/{site_id}/synthetic_test:
parameters:
- $ref: '#/components/parameters/site_id'
post:
description: Trigger Synthetic Testing
operationId: triggerSiteSyntheticTest
requestBody:
content:
application/json:
examples:
Example:
value:
email: test@mist.com
schema:
$ref: '#/components/schemas/synthetictest'
responses:
'200':
$ref: '#/components/responses/SyntheticTest'
'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: triggerSiteSyntheticTest
tags:
- Sites Synthetic Tests
/api/v1/sites/{site_id}/synthetic_test/search:
parameters:
- $ref: '#/components/parameters/site_id'
get:
description: Search Site Synthetic Testing
operationId: searchSiteSyntheticTest
parameters:
- description: Device MAC Address
in: query
name: mac
schema:
examples:
- 5c5b350e0410
type: string
- description: Port_id used to run the test (for SSR only)
in: query
name: port_id
schema:
examples:
- ge-1/0/1
type: string
- description: VLAN ID
in: query
name: vlan_id
schema:
examples:
- '100'
type: string
- description: Entity who triggers the test
in: query
name: by
schema:
examples:
- user
type: string
- description: Test failure reason
in: query
name: reason
schema:
examples:
- test failed
type: string
- description: Synthetic test type
in: query
name: type
schema:
$ref: '#/components/schemas/synthetictest_type'
- description: Connectivity protocol
in: query
name: protocol
schema:
$ref: '#/components/schemas/synthetictest_protocol'
- description: Tenant network in which lan_connectivity test was run
in: query
name: tenant
schema:
type: string
- $ref: '#/components/parameters/limit'
- $ref: '#/components/parameters/start'
- $ref: '#/components/parameters/end'
- $ref: '#/components/parameters/duration'
- $ref: '#/components/parameters/search_after'
responses:
'200':
$ref: '#/components/responses/SynthetictestSearch'
'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: searchSiteSyntheticTest
tags:
- Sites Synthetic Tests
components:
schemas:
synthetictest_info:
additionalProperties: false
properties:
by:
examples:
- user
type: string
device_type:
$ref: '#/components/schemas/device_type'
failed:
examples:
- false
type: boolean
latency:
examples:
- 40
type: integer
mac:
type: string
port_id:
examples:
- ge-0/0/2
type: string
reason:
examples:
- interface not ready to perform test
type: string
rx_mbps:
examples:
- 322
type: integer
start_time:
examples:
- 1675718807
type: integer
status:
type: string
timestamp:
$ref: '#/components/schemas/timestamp'
tx_mbps:
examples:
- 199
type: integer
type:
$ref: '#/components/schemas/synthetictest_type'
vlan_id:
examples:
- 20
type: integer
type: object
id:
description: Unique ID of the object instance in the Mist Organization
examples:
- 53f10664-3ce8-4c27-b382-0ef66432349f
format: uuid
readOnly: true
type: string
synthetictest_device_vlan_id:
description: Required for AP
oneOf:
- type: string
- maximum: 4094
minimum: 1
type: integer
response_synthetictest_search:
additionalProperties: false
properties:
end:
type: integer
limit:
type: integer
next:
type: string
results:
$ref: '#/components/schemas/response_synthetictest_search_results'
start:
type: integer
total:
type: integer
required:
- end
- limit
- results
- start
- total
type: object
response_synthetictest:
additionalProperties: false
properties:
id:
$ref: '#/components/schemas/id'
message:
examples:
- Successfully queued synthetic test for the site.
type: string
status:
examples:
- success
type: string
type: object
response_http403:
additionalProperties: false
properties:
detail:
examples:
- You do not have permission to perform this action.
type: string
type: object
response_synthetictest_search_results:
items:
$ref: '#/components/schemas/synthetictest_info'
type: array
synthetictest_radius_server:
properties:
password:
description: Specify the password associated with the username
format: password
type: string
profile:
default: dot1x
description: Specify the access profile associated with the subscriber
type: string
user:
description: Specify the subscriber username to test
type: string
required:
- user
- password
type: object
synthetictest_device:
properties:
host:
description: If `type`==`lan_connectivity`
examples:
- www.example.com
type: string
hostname:
description: If `type`==`dns`
examples:
- google.com"
type: string
ip:
description: If `type`==`arp`
examples:
- 192.168.3.5
type: string
password:
description: If `type`==`radius`
examples:
- test123
format: password
type: string
ping_count:
default: 10
description: If `type`==`lan_connectivity`
maximum: 60
minimum: 10
type: integer
ping_details:
default: false
description: If `type`==`lan_connectivity`
type: boolean
ping_size:
default: 56
description: If `type`==`lan_connectivity`
maximum: 65535
minimum: 56
type: integer
port_id:
description: If `type`==`speedtest`, required for ssr
examples:
- wan0
type: string
protocol:
$ref: '#/components/schemas/synthetictest_device_protocol'
tenant:
description: If `type`==`curl` or `type`==`lan_connectivity`
examples:
- lan_network1
type: string
timeout:
default: 60
description: If `type`==`curl`
examples:
- 60
maximum: 120
minimum: 30
type: integer
traceroute_udp_port:
default: 33434
description: SRX only, traceroute udp port
maximum: 65535
minimum: 0
type: integer
type:
$ref: '#/components/schemas/synthetictest_type'
url:
description: If `type`==`curl`
examples:
- https://www.example.com
type: string
username:
description: If `type`==`radius`
examples:
- user
type: string
vlan_id:
$ref: '#/components/schemas/synthetictest_device_vlan_id'
required:
- type
type: object
response_http404:
additionalProperties: false
properties:
id:
type: string
type: object
synthetictest:
properties:
email:
examples:
- test@mist.com
format: email
type: string
type: object
timestamp:
description: Epoch (seconds)
format: double
readOnly: true
type: number
synthetictest_device_protocol:
default: ping+traceroute
description: 'if `type`==`lan_connectivity`. enum: `ping`, `traceroute`, `ping+traceroute`'
enum:
- ping
- ping+traceroute
- traceroute
type: string
response_http400:
additionalProperties: false
properties:
detail:
examples:
- 'JSON parse error - Expecting value: line 5 column 8 (char 56)'
type: string
type: object
response_http429:
additionalProperties: false
properties:
detail:
examples:
- Too Many Request. The API Token used for the request reached the 5000 API Calls per hour threshold
type: string
type: object
websocket_session:
additionalProperties: false
properties:
session:
examples:
- 19e73828-937f-05e6-f709-e29efdb0a82b
type: string
required:
- session
type: object
synthetictest_protocol:
description: 'enum: `ping`, `traceroute`'
enum:
- ping
- traceroute
type: string
synthetictest_type:
description: 'enum: `arp`, `curl`, `dhcp`, `dhcp6`, `dns`, `lan_connectivity`, `radius`, `speedtest`'
enum:
- arp
- curl
- dhcp
- dhcp6
- dns
- lan_connectivity
- radius
- speedtest
type: string
device_type:
description: 'enum: `ap`, `gateway`, `switch`'
enum:
- ap
- gateway
- switch
type: string
response_http401:
additionalProperties: false
properties:
detail:
examples:
- Authentication credentials were not provided.
type: string
type: object
examples:
SynthetictestSearchExample:
value:
end: 0
limit: 0
next: string
results:
- by: user
device_type: gateway
failed: false
latency: 40
mac: aff827549235
port_id: ge-0/0/2
rx_mbps: 322
timestamp: 1706824045.059036
tx_mbps: 199
type: speedtest
vlan_id: 20
- by: marvis
device_type: gateway
failed: true
latency: 0
mac: 8396cd006c8c
port_id: ge-0/0/2
reason: interface not ready to perform test
rx_mbps: 0
timestamp: 1706824045.059036
tx_mbps: 0
type: speedtest
vlan_id: 100
start: 0
total: 0
SynthetictestStatusExample:
value:
device_type: gateway
mac: 5c5b35584a6f
port_id: ge-0/0/1.100
start_time: 1675718807
status: inprogress
type: speedtest
SyntheticTestExample:
value:
id: a42775f6-edc8-69b5-f979-542fa1b43ff9
message: Successfully queued synthetic test for the site.
status: string
HTTP400Example:
value:
detail: 'JSON parse error - Expecting value: line 5 column 8 (char 56)'
HTTP403Example:
value:
detail: You do not have permission to perform this action.
HTTP429Example:
value:
detail: Too Many Request. The API Token used for the request reached the 5000 API Calls per hour threshold
HTTP401Example:
value:
detail: Authentication credentials were not provided.
parameters:
device_id:
in: path
name: device_id
required: true
schema:
examples:
- 000000ab-00ab-00ab-00ab-0000000000ab
format: uuid
type: string
start:
description: Start time (epoch timestamp in seconds, or relative string like "-1d", "-1w")
in: query
name: start
schema:
type: string
duration:
description: Duration like 7d, 2w
in: query
name: duration
schema:
default: 1d
examples:
- 10m
type: string
search_after:
description: Pagination cursor for retrieving subsequent pages of results. This value is automatically populated by Mist in the `next` URL from the previous response and should not be manually constructed.
in: query
name: search_after
schema:
type: string
end:
description: End time (epoch timestamp in seconds, or relative string like "-1d", "-2h", "now")
in: query
name: end
schema:
type: string
site_id:
in: path
name: site_id
required: true
schema:
examples:
- 000000ab-00ab-00ab-00ab-0000000000ab
format: uuid
type: string
limit:
in: query
name: limit
schema:
default: 100
minimum: 0
type: integer
responses:
WebsocketSession:
content:
application/json:
schema:
$ref: '#/components/schemas/websocket_session'
application/vnd.api+json:
schema:
$ref: '#/components/schemas/websocket_session'
description: OK
SyntheticTest:
content:
application/json:
examples:
Example:
$ref: '#/components/examples/SyntheticTestExample'
schema:
$ref: '#/components/schemas/response_synthetictest'
application/vnd.api+json:
examples:
Example:
$ref: '#/components/examples/SyntheticTestExample'
schema:
$ref: '#/components/schemas/response_synthetictest'
description: Synthetic Test Started
SynthetictestStatus:
content:
application/json:
examples:
Example:
$ref: '#/components/examples/SynthetictestStatusExample'
schema:
$ref: '#/components/schemas/synthetictest_info'
application/vnd.api+json:
examples:
Example:
$ref: '#/components/examples/SynthetictestStatusExample'
schema:
$ref: '#/components/schemas/synthetictest_info'
description: Synthetic Test Status
HTTP404:
content:
application/json:
schema:
$ref: '#/components/schemas/response_http404'
application/vnd.api+json:
schema:
$ref: '#/components/schemas/response_http404'
description: Not found. The API endpoint doesn’t exist or resource doesn’ t exist
HTTP429:
content:
application/json:
examples:
Example:
$ref: '#/components/examples/HTTP429Example'
schema:
$ref: '#/components/schemas/response_http429'
application/vnd.api+json:
examples:
Example:
$ref: '#/components/examples/HTTP429Example'
schema:
$ref: '#/components/schemas/response_http429'
description: Too Many Request. The API Token used for the request reached the 5000 API Calls per hour threshold
SynthetictestSearch:
content:
application/json:
examples:
Example:
$ref: '#/components/examples/SynthetictestSearchExample'
schema:
$ref: '#/components/schemas/response_synthetictest_search'
application/vnd.api+json:
examples:
Example:
$ref: '#/components/examples/SynthetictestSearchExample'
schema:
$ref: '#/components/schemas/response_synthetictest_search'
description: Synthetic Test Search Result
HTTP403:
content:
application/json:
examples:
Example:
$ref: '#/components/examples/HTTP403Example'
schema:
$ref: '#/components/schemas/response_http403'
application/vnd.api+json:
examples:
Example:
$ref: '#/components/examples/HTTP403Example'
schema:
$ref: '#/components/schemas/response_http403'
description: Permission Denied
HTTP400:
content:
application/json:
examples:
Example:
$ref: '#/components/examples/HTTP400Example'
schema:
$ref: '#/components/schemas/response_http400'
application/vnd.api+json:
examples:
Example:
$ref: '#/components/examples/HTTP400Example'
schema:
$ref: '#/components/schemas/response_http400'
description: Bad Syntax
HTTP401:
content:
application/json:
examples:
Example:
$ref: '#/components/examples/HTTP401Example'
schema:
$ref: '#/components/schemas/response_http401'
application/vnd.api+json:
examples:
Example:
$ref: '#/components/examples/HTTP401Example'
schema:
$ref: '#/components/schemas/response_http401'
description: Unauthorized
securitySchemes:
apiToken:
description: "Like many other API providers, it’s also possible to generate API Tokens to be used (in HTTP Header) for authentication. An API token ties to a Admin with equal or less privileges.\n\n**Format**:\n API Token value format is `Token {apitoken}`\n\n**Notes**:\n* an API token generated for a specific admin has the same privilege as the user\n* an API token will be automatically removed if not used for > 90 days\n* SSO admins cannot generate these API tokens. Refer Org level API tokens which can have privileges of a specific Org/Site for more information."
in: header
name: Authorization
type: apiKey
basicAuth:
description: While our current UI uses Session / Cookie-based authentication, it’s also possible to do Basic Auth.
scheme: basic
type: http
csrfToken:
description: "This protects the website against [Cross Site Request Forgery](https://en.wikipedia.org/wiki/Cross-site_request_forgery), all the POST / PUT / DELETE APIs needs to have CSRF token in the AJAX Request header when using Login/Password authentication (with or without MFA)\n\n\nThe CSRF Token is sent back by Mist in the Cookies from the Login Response API Call:\n`cookies[csrftoken]` \n\nThe CSRF Token must be added in the HTTP Request Headers:\n```\nX-CSRFToken: vwvBuq9qkqaKh7lu8tNc0gkvBfEaLAmx\n```"
in: header
name: X-CSRFToken
type: apiKey