Summary
The Analog Way Midra 4K is a multi-screen presentation switcher supporting up to 2 program screens, 1 auxiliary screen, and a multiviewer output. This spec covers the REST API control interface (HTTP GET/POST) at /api/tpp/v1. The device supports layer-based source routing (live layers 1-4, background, foreground), memory/preset recall, preview/program workflow with TAKE transitions, audio routing (direct, follow-layer, Dante, line-out), and multiviewer widget control. Authentication is optional and JWT-cookie-based when the Web RCS is password-protected.
Transport
protocols:
- http
addressing:
base_url: http://{ipaddress}/api/tpp/v1
# UNRESOLVED: HTTP port not stated in source; default assumed but not confirmed
auth:
type: cookie_jwt # conditional: required only when Web RCS is password-protected
description: >
POST /auth/login?identifier={id}&password={pwd} returns Set-Cookie header
with auth-jwt token. Subsequent requests must include Cookie header.
Auth is optional - only enforced when Web RCS password protection is enabled.
Traits
- powerable # inferred: shutdown/standby and wakeup commands present
- queryable # inferred: extensive GET endpoints returning device state
- routable # inferred: layer source routing, audio routing, multiviewer widget routing
Actions
# --- System ---
- id: system_reboot
label: Reboot System
kind: action
method: POST
path: /system/reboot
params: []
- id: system_shutdown
label: Shutdown / Standby
kind: action
method: POST
path: /system/shutdown
params:
- name: standby
type: boolean
required: true
description: "true to activate standby mode"
- id: system_wakeup
label: Wake Up System
kind: action
method: POST
path: /system/wakeup
params: []
# --- Screen Memory ---
- id: screen_load_memory
label: Recall Screen Memory
kind: action
method: POST
path: /screens/{screenId}/load-memory
params:
- name: screenId
type: integer
in: url
description: "Screen number (1-2)"
- name: memoryId
type: integer
required: true
description: "Memory index (1-200)"
- name: target
type: string
required: false
description: "Destination: 'program' or 'preview'. Default: 'preview'"
- id: load_master_memory
label: Recall Master Memory
kind: action
method: POST
path: /load-master-memory
params:
- name: memoryId
type: integer
required: true
description: "Master memory index (1-50)"
- name: target
type: string
required: false
description: "Destination: 'program' or 'preview'. Default: 'preview'"
# --- Screen TAKE ---
- id: screen_take
label: Single Screen TAKE
kind: action
method: POST
path: /screens/{screenId}/take
params:
- name: screenId
type: integer
in: url
description: "Screen number (1-2)"
- id: global_take
label: Global TAKE
kind: action
method: POST
path: /take
params:
- name: screenIds
type: array
required: true
description: "List of screen indexes to transition"
- name: auxiliaryScreenIds
type: array
required: true
description: "List of auxiliary screen indexes to transition"
# --- Live Layer Source ---
- id: set_live_layer_source
label: Set Live Layer Source
kind: action
method: POST
path: /screens/{screenId}/live-layers/{layerId}/presets/{target}/source
params:
- name: screenId
type: integer
in: url
description: "Screen number (1-2)"
- name: layerId
type: integer
in: url
description: "Layer number (1-4)"
- name: target
type: string
in: url
description: "'program' or 'preview'"
- name: sourceType
type: string
required: true
description: "'none', 'color', or 'input'"
- name: sourceId
type: integer
required: true
description: "Source number"
# --- Background Layer Source ---
- id: set_background_layer_source
label: Set Background Layer Source
kind: action
method: POST
path: /screens/{screenId}/background-layer/presets/{target}/source
params:
- name: screenId
type: integer
in: url
description: "Screen number (1-2)"
- name: target
type: string
in: url
description: "'program' or 'preview'"
- name: sourceType
type: string
required: true
description: "'background-set' or 'none'"
- name: sourceId
type: integer
required: true
description: "Background set number (1-8)"
# --- Foreground Layer Source ---
- id: set_foreground_layer_source
label: Set Foreground Layer Source
kind: action
method: POST
path: /screens/{screenId}/foreground-layer/presets/{target}/source
params:
- name: screenId
type: integer
in: url
description: "Screen number (1-2)"
- name: target
type: string
in: url
description: "'program' or 'preview'"
- name: sourceType
type: string
required: true
description: "'foreground-image' or 'none'"
- name: sourceId
type: integer
required: true
description: "Foreground preset number (1-4)"
# --- Auxiliary Screen ---
- id: aux_screen_load_memory
label: Recall Auxiliary Screen Memory
kind: action
method: POST
path: /auxiliary-screens/{auxId}/load-memory
params:
- name: auxId
type: integer
in: url
description: "Auxiliary screen number (always 1)"
- name: memoryId
type: integer
required: true
description: "Memory index"
- name: target
type: string
required: false
description: "'program' or 'preview'. Default: 'preview'"
- id: set_aux_screen_source
label: Set Auxiliary Screen Source
kind: action
method: POST
path: /auxiliary-screens/{auxId}/background-layer/presets/{target}/source
params:
- name: auxId
type: integer
in: url
description: "Auxiliary screen number (always 1)"
- name: target
type: string
in: url
description: "'program' or 'preview'"
- name: sourceType
type: string
required: true
description: "'none', 'input', or 'screen'"
- name: sourceId
type: integer
required: true
description: "Source number (1 for screen, 1-10 for inputs)"
- id: aux_screen_take
label: Auxiliary Screen TAKE
kind: action
method: POST
path: /auxiliary-screens/{auxId}/take
params:
- name: auxId
type: integer
in: url
description: "Auxiliary screen number (1)"
# --- Multiviewer ---
- id: multiviewer_load_memory
label: Recall Multiviewer Memory
kind: action
method: POST
path: /multiviewer/load-memory
params:
- name: memoryId
type: integer
required: true
description: "Memory index (1-20)"
- id: set_multiviewer_widget_source
label: Set Multiviewer Widget Source
kind: action
method: POST
path: /multiviewer/widgets/{widgetId}/source
params:
- name: widgetId
type: integer
in: url
description: "Widget number (1-16)"
- name: sourceType
type: string
required: true
description: "'none', 'input', 'screen-program', 'screen-preview', or 'timer'"
- name: sourceId
type: integer
required: true
description: "Source number"
# --- Audio: Output ---
- id: set_output_audio_mode
label: Set Output Audio Mode
kind: action
method: POST
path: /outputs/{outputId}/audio/mode
params:
- name: outputId
type: integer
in: url
description: "Output number (1 or 2)"
- name: mode
type: string
required: true
description: "'none', 'auto', or 'direct routing'"
- name: sourceType
type: string
required: false
description: "'none', 'input', 'custom', 'dante in', 'line in'. Required for 'direct routing'"
- name: sourceId
type: integer
required: false
description: "Audio source ID. Required for 'direct routing'"
# --- Audio: Screen ---
- id: set_screen_audio_mode
label: Set Screen Audio Mode
kind: action
method: POST
path: /screens/{screenId}/audio/mode
params:
- name: screenId
type: integer
in: url
description: "Screen number (1 or 2)"
- name: mode
type: string
required: true
description: "'direct routing', 'follow audio layer', or 'follow live layer content'"
- name: layerId
type: integer
required: false
description: "Audio layer. Required for 'follow live layer content'"
- id: set_screen_audio_layer_source
label: Set Screen Audio Layer Source
kind: action
method: POST
path: /screens/{screenId}/audio-layer/presets/{presetId}/source
params:
- name: screenId
type: integer
in: url
description: "Screen number (1 or 2)"
- name: presetId
type: string
in: url
description: "'program' or 'preview'"
- name: sourceType
type: string
required: true
description: "'none', 'input', 'custom', 'dante in', 'line in'"
- name: sourceId
type: integer
required: true
description: "Audio source ID"
# --- Audio: Auxiliary Screen ---
- id: set_aux_screen_audio_mode
label: Set Auxiliary Screen Audio Mode
kind: action
method: POST
path: /auxiliary-screens/{auxScreenId}/audio/mode
params:
- name: auxScreenId
type: integer
in: url
description: "Auxiliary screen number (always 1)"
- name: mode
type: string
required: true
description: "'direct routing', 'follow audio layer', or 'follow content'"
- name: sourceType
type: string
required: false
description: "Required for 'direct routing'"
- name: sourceId
type: integer
required: false
description: "Required for 'direct routing'"
- id: set_aux_screen_audio_layer_source
label: Set Auxiliary Screen Audio Layer Source
kind: action
method: POST
path: /auxiliary-screens/{auxScreenId}/audio-layer/presets/{presetId}/source
params:
- name: auxScreenId
type: integer
in: url
description: "Auxiliary screen number (always 1)"
- name: presetId
type: string
in: url
description: "'program' or 'preview'"
- name: sourceType
type: string
required: true
description: "'none', 'input', 'custom', 'dante in', 'line in'"
- name: sourceId
type: integer
required: true
description: "Audio source ID"
# --- Audio: Dante ---
- id: set_dante_output_mode
label: Set Dante Output Mode
kind: action
method: POST
path: /dante/output-groups/{groupId}/mode
params:
- name: groupId
type: integer
in: url
description: "Output group number (1-4)"
- name: mode
type: string
required: true
description: "'follow screen' or 'direct routing'"
- name: screenId
type: integer
required: false
description: "Screen ID. Required for 'follow screen'"
- name: sourceType
type: string
required: false
description: "Required for 'direct routing'"
- name: sourceId
type: integer
required: false
description: "Required for 'direct routing'"
# --- Audio: Line-Out ---
- id: set_line_out_mode
label: Set Line-Out Audio Mode
kind: action
method: POST
path: /line-outs/{outputId}/mode
params:
- name: outputId
type: integer
in: url
description: "Line-out output number (1-2)"
- name: mode
type: string
required: true
description: "'follow screen' or 'direct routing'"
- name: channelPair
type: string
required: true
description: "'channels 1&2', 'channels 3&4', 'channels 5&6', 'channels 7&8'"
- name: screenId
type: integer
required: false
description: "Required for 'follow screen'"
- name: sourceType
type: string
required: false
description: "Required for 'direct routing'"
- name: sourceId
type: integer
required: false
description: "Required for 'direct routing'"
# --- Auth ---
- id: auth_login
label: Authenticate
kind: action
method: POST
path: /auth/login
params:
- name: identifier
type: string
in: query
required: true
description: "User identifier (e.g. 'Admin')"
- name: password
type: string
in: query
required: true
description: "User password"
response:
description: "Set-Cookie header with auth-jwt token; include in subsequent requests"
Feedbacks
- id: system_info
label: System Information
type: object
method: GET
path: /system
fields:
- name: type
type: string
description: "Device type: 'QVU 4K', 'QMX 4K', 'PLS 4K', 'EKS 4K'"
- name: label
type: string
description: "Device label"
- name: version
type: object
description: "Firmware version object {major, minor, patch, beta}"
- id: screen_info
label: Screen Information
type: object
method: GET
path: /screens/{screenId}
fields:
- name: isEnabled
type: boolean
description: "Screen enabled state"
- name: label
type: string
description: "Screen label"
- name: layerMode
type: string
description: "'mixing layers' or 'split layers'"
- id: live_layer_status
label: Live Layer Status
type: object
method: GET
path: /screens/{screenId}/live-layers/{layerId}/presets/{target}
fields:
- name: status
type: string
description: "'off', 'open', 'close', 'cross', 'flying', 'flying depth'"
- name: sourceType
type: string
description: "'none', 'color', or 'input'"
- name: sourceId
type: integer
description: "Source number"
- id: background_layer_status
label: Background Layer Status
type: object
method: GET
path: /screens/{screenId}/background-layer/presets/{target}
fields:
- name: status
type: string
description: "'off', 'open', 'close'"
- name: sourceType
type: string
description: "'background-set' or 'none'"
- name: sourceId
type: integer
description: "Background set number (1-8)"
- id: foreground_layer_status
label: Foreground Layer Status
type: object
method: GET
path: /screens/{screenId}/foreground-layer/presets/{target}
fields:
- name: status
type: string
description: "'off', 'open', 'close'"
- name: sourceType
type: string
description: "'foreground-image' or 'none'"
- name: sourceId
type: integer
description: "Foreground preset number (1-4)"
- id: aux_screen_info
label: Auxiliary Screen Information
type: object
method: GET
path: /auxiliary-screens/{auxId}
fields:
- name: isEnabled
type: boolean
- name: label
type: string
- id: aux_screen_source
label: Auxiliary Screen Source
type: object
method: GET
path: /auxiliary-screens/{auxId}/background-layer/presets/{target}/source
fields:
- name: sourceType
type: string
description: "'none', 'input', or 'screen'"
- name: sourceId
type: integer
- id: multiviewer_info
label: Multiviewer Output Information
type: object
method: GET
path: /multiviewer/
fields:
- name: isEnabled
type: boolean
- name: label
type: string
- id: multiviewer_widget_status
label: Multiviewer Widget Status
type: object
method: GET
path: /multiviewer/widgets/{widgetId}
fields:
- name: isEnabled
type: boolean
- id: multiviewer_widget_source
label: Multiviewer Widget Source
type: object
method: GET
path: /multiviewer/widgets/{widgetId}/source
fields:
- name: sourceType
type: string
description: "'none', 'input', 'screen-program', 'screen-preview', or 'timer'"
- name: sourceId
type: integer
- id: output_audio_mode
label: Output Audio Mode
type: object
method: GET
path: /outputs/{outputId}/audio/mode
fields:
- name: mode
type: string
description: "'none', 'auto', or 'direct routing'"
- name: sourceType
type: string
description: "'none', 'input', 'custom', 'dante in', 'line in' (direct routing only)"
- name: sourceId
type: integer
- id: output_audio_source
label: Output Audio Source
type: object
method: GET
path: /outputs/{outputId}/audio/source
fields:
- name: sourceType
type: string
- name: sourceId
type: integer
- id: screen_audio_mode
label: Screen Audio Mode
type: object
method: GET
path: /screens/{screenId}/audio/mode
fields:
- name: mode
type: string
description: "'direct routing', 'follow audio layer', 'follow live layer content'"
- name: sourceType
type: string
- name: sourceId
type: integer
- name: layerId
type: integer
- id: screen_audio_preset
label: Screen Audio Preset
type: object
method: GET
path: /screens/{screenId}/audio/presets/{presetId}
fields:
- name: target
type: string
description: "'program' or 'preview'"
- name: sourceType
type: string
- name: sourceId
type: integer
- id: screen_audio_layer_source
label: Screen Audio Layer Source
type: object
method: GET
path: /screens/{screenId}/audio-layer/presets/{presetId}/source
fields:
- name: sourceType
type: string
- name: sourceId
type: integer
- id: aux_screen_audio_mode
label: Auxiliary Screen Audio Mode
type: object
method: GET
path: /auxiliary-screens/{auxScreenId}/audio/mode
fields:
- name: mode
type: string
description: "'direct routing', 'follow audio layer', 'follow content'"
- name: sourceType
type: string
- name: sourceId
type: integer
- id: aux_screen_audio_preset
label: Auxiliary Screen Audio Preset
type: object
method: GET
path: /auxiliary-screens/{auxScreenId}/audio/presets/{presetId}
fields:
- name: target
type: string
- name: sourceType
type: string
- name: sourceId
type: integer
- id: aux_screen_audio_layer_source
label: Auxiliary Screen Audio Layer Source
type: object
method: GET
path: /auxiliary-screens/{auxScreenId}/audio-layer/presets/{presetId}/source
fields:
- name: sourceType
type: string
- name: sourceId
type: integer
- id: dante_output_mode
label: Dante Output Audio Mode
type: object
method: GET
path: /dante/output-groups/{groupId}/mode
fields:
- name: mode
type: string
description: "'direct routing' or 'follow screen'"
- name: sourceType
type: string
- name: sourceId
type: integer
- name: screenId
type: integer
- id: dante_output_source
label: Dante Output Audio Source
type: object
method: GET
path: /dante/output-groups/{groupId}/source
fields:
- name: sourceType
type: string
- name: sourceId
type: integer
- id: line_out_mode
label: Line-Out Audio Mode
type: object
method: GET
path: /line-outs/{outputId}/mode
fields:
- name: mode
type: string
description: "'direct routing' or 'follow screen'"
- name: channelPair
type: string
description: "'channels 1&2', 'channels 3&4', 'channels 5&6', 'channels 7&8'"
- name: sourceType
type: string
- name: sourceId
type: integer
- name: screenId
type: integer
- id: line_out_source
label: Line-Out Audio Source
type: object
method: GET
path: /line-outs/{outputId}/source
fields:
- name: sourceType
type: string
- name: sourceId
type: integer
- id: input_info
label: Input Information
type: object
method: GET
path: /inputs/{inputId}
fields:
- name: isEnabled
type: boolean
- name: label
type: string
- name: plugType
type: string
description: "'HDMI', 'DP', or 'SDI'"
- name: isValid
type: boolean
description: "Input signal validity"
- id: foreground_image_info
label: Foreground Image Information
type: object
method: GET
path: /screens/{screenId}/foreground-images/{foregroundImageId}
fields:
- name: isEmpty
type: boolean
- name: isValid
type: boolean
- name: label
type: string
- name: isEnabled
type: boolean
- id: background_image_info
label: Background Image Information
type: object
method: GET
path: /screens/{screenId}/background-images/{backgroundImageId}
fields:
- name: isEmpty
type: boolean
- name: isValid
type: boolean
- name: label
type: string
- name: isEnabled
type: boolean
- id: background_set_info
label: Background Set Information
type: object
method: GET
path: /screens/{screenId}/background-sets/{backgroundSetId}
fields:
- name: isEmpty
type: boolean
Variables
# No settable continuous variables documented - all control is via discrete actions.
Events
# UNRESOLVED: source does not document unsolicited notifications or event subscriptions
Macros
# UNRESOLVED: source does not document multi-step macro sequences
Safety
confirmation_required_for:
- system_reboot
- system_shutdown
interlocks: []
# Reboot and shutdown are destructive operations with no undo.
# UNRESOLVED: source does not document power-on sequencing or interlock procedures
Notes
- All API endpoints are relative to
http://{ipaddress}/api/tpp/v1except/auth/login. - Thumbnail snapshots available at
http://{ipaddress}/api/device/snapshots/for inputs (1-10), outputs (1-2), foreground/background images, and multiviewer. Max rate: 1 request/second. 256x256 PNG. - The
targetparameter (program/preview) and TAKE workflow enables a preview-before-program pipeline. sourceTypeandsourceIdare conditionally required depending on the audiomodevalue — see per-action param descriptions.- Auth is optional and only enforced when the device's Web RCS has been password-protected by configuration.
Provenance
source_domains:
- s3.eu-west-3.amazonaws.com
source_urls:
- "https://s3.eu-west-3.amazonaws.com/aw.store01/Site+Internet/Series/Midra+4k/Common/Rest+API+Programmer%27s+Guide/midra4k_rest_api_programmers_guide_v3_0_13.pdf"
- https://s3.eu-west-3.amazonaws.com/aw.store01/Site+Internet/Series/Midra+4k/Common/AWJ+Protocol/midra_4k_awj_programmers_guide_v3.2.pdf
- https://s3.eu-west-3.amazonaws.com/aw.store01/Site+Internet/Series/Midra+4k/Common/AW+VideoCompositor+for+Midra+4k/Software+Packages+And+Drivers/Software/awvideocompositor_for_midra_4k_v1.3.zip
- https://s3.eu-west-3.amazonaws.com/aw.store01/Site+Internet/Series/Midra+4k/Common/AW+VideoCompositor+for+Midra+4k/Software+Packages+And+Drivers/Introduction+Documents/aw_videocompositor_for_midra_4k_introduction_v1.3.0.pdf
- https://s3.eu-west-3.amazonaws.com/aw.store01/Site+Internet/Series/Midra+4k/Common/AW+VideoCompositor+for+Midra+4k/Technical+Datasheet/aw-videocompositor-mdr4k-datasheet-en.pdf
retrieved_at: 2026-05-15T00:42:44.342Z
last_checked_at: 2026-06-02T21:39:41.192Z
Verification Summary
verdict: verified
checked_at: 2026-06-02T21:39:41.192Z
matched_actions: 23
action_count: 23
confidence: medium
summary: "All 23 REST API actions documented in source with correct POST/GET methods, URL parameters (screenId 1-2, layerId 1-4, auxId=1), and request bodies. (8 unresolved item(s) noted in Known Gaps.)"
Known Gaps
- "HTTP port not stated in source; default assumed but not confirmed"
- "source does not document unsolicited notifications or event subscriptions"
- "source does not document multi-step macro sequences"
- "source does not document power-on sequencing or interlock procedures"
- "HTTP port number not stated in source"
- "no event/webhook/subscription mechanism documented"
- "no macro/preset sequencing documented beyond memory recall"
- "thumbnail endpoints not fully enumerated as actions (read-only image resources)"
From the AI4AV catalog (https://ai4av.net) · ODbL-1.0