Documenting RenewedVision's undocumented network protocols with examples
This document refers to ProPresenter 7.6.
Warning: Be careful! It's easy to CRASH ProPresenter when sending invalid messages!
Both the Remote Control and the Stage Display protocols are unencrypted text-based websocket connections from the client to the ProPresenter instance.
NOTE: if both the Remote Control and the Stage Display interface are enabled in ProPresenter, they both operate over the Remote Control network port.
"Channels" refers to the communication channels opened up by ProPresenter. Both versions 6 and 7 expose two channels. One is the "remote" channel, and the other is the "stagedisplay" channel. They have two separate websocket endpoints that take the following form:
ws://[hostname]:[port]/[channel]
Pro 7 implements a slightly different WebSocket protocol that most websocket clients should handle transparently; however, in rare cases this implementation can cause problems for developers. Of note is that the protocol requires two HTTP request headers to be included in addition to the standard WebSocket upgrade headers.
Sec-WebSocket-Key
and Sec-WebSocket-Version
The key must be a Base64 encoded key similar to this: a8STpzZ6qXqaQvnHNehseA==
The Version must be at least 13.
Note also that Pro7 incorrectly expects the HTTP header keys to appear in CamelCase which violates the HTTP spec, but nonetheless is what it is.
Therefore, a correctly formed connection to the Pro7 server must have headers looking like this:
GET /stagedisplay HTTP/1.1
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Key: /8STpzZ6qXqaQvnHNehseA==
Sec-WebSocket-Version: 13
Connecting to ProPresenter involves making a Websocket connection using this address and then immediately following the connection with an authentication message (as described below) for the relevant "channel."
The hostname or ip address of the computer running ProPresenter 6
The port specified in the ProPresenter Network settings
remote for the remote control channel, or stagedisplay for the stage display channel
Remote Control
Send messages to the API
The remote
channel carries all the
information from the "ProPresenter Remote" app
CONNECT WITH:
ws://[hostname]:[port]/remote
Accepts one of the following messages:
RemoteAuthentication
This is the first command ProPresenter expects to receive over the websocket. This command requests authentication.
For ProPresenter 7.4.2 and later, the protocol must be 701
RELATED RESPONSE: authenticate (subscribe)
{
"action": "authenticate",
"protocol": 701,
"password": "myGreatPassword"
}
Get Library (all presentations)
Will return all items in the ProPresenter library.
RELATED RESPONSE: libraryRequest (subscribe)
{
"action": "libraryRequest"
}
Get Playlists
Will return all presentation playlists.
playlistTypePlaylist
or a playlistTypeGroup
playlistTypePlaylist
will contain a list of playlistItemTypePresentation
(or playlistItemTypeAudio
for audio playlists)playlistTypeGroup
may contain both playlistTypePlaylist
and playlistTypeGroup
RELATED RESPONSE: playlistRequestAll (subscribe)
{
"action": "playlistRequestAll"
}
Request a Playlist by Location
NOTE: even though the requested action is presentationRequest
ProPresenter responds with
an action value of presentationCurrent
but it will be slightly different from the response to
an actual presentationCurrent
request. See below.
RELATED RESPONSE: presentationRequest (subscribe)
{
"action": "presentationRequest",
"presentationPath": "/Path/To/ProPresenter/Library/Song 1 Title.pro6",
"presentationSlideQuality": 25
}
Request Current Presentation
Requests the currently active presentation if there is one. If no presentation has a slide active, then nothing will be returned.
NOTE: You can distinguish this response from a presentationRequest
request
because this response will include presentationDestination
as a field at the root level
of the response.
NOTE: In Pro6, the extra field was presentationPath
at the root level. Now, both
requests return a presentationPath
. I still consider this a bug.
NOTE: Pro7 ignores the presentationSlideQuality
field unless it is a string
. This is a bug.
RELATED RESPONSE: presentationCurrent (subscribe)
{
"action": "presentationCurrent",
"presentationSlideQuality": "string"
}
Get the Index of the Current Slide
string
valuepresentationRequest
NOTE: The ProPresenter remote issues this action every time it issues a presentationRequest
action.
NOTE; In Pro7, when a presentation is automatically advancing on the announcements layer while a user is triggering slides in another presentation on the normal output layer, the index returns can sometimes vary between the two different presentations!
RELATED RESPONSE: presentationSlideIndex (subscribe)
{
"action": "presentationSlideIndex"
}
Activate a Slide
Works just like clicking on a slide.
NOTE: This is different from Pro6. Only string numerics are accepted for slideIndex
even though the presentationTriggerMessage
responds with an integer. This is a bug.
RELATED RESPONSE: presentationTriggerIndex (subscribe)
{
"action": "presentationTriggerIndex",
"slideIndex": "string",
"presentationPath": "C:/Path/To/ProPresenter/Library/Song 1 Title.pro6"
}
Activate the Next Slide
Works just like hitting the right arrow or spacebar.
RELATED RESPONSE: presentationTriggerNext (subscribe)
{
"action": "presentationTriggerNext"
}
Activate the Previous Slide
Works just like hitting the left arrow.
RELATED RESPONSE: presentationTriggerPrevious (subscribe)
{
"action": "presentationTriggerPrevious"
}
Get Audio Library
Will return all the items in the audio library
RELATED RESPONSE: audioRequest (subscribe)
{
"action": "audioRequest"
}
Get the Current Song
Will return the data for the currently playing song, if there is one.
RELATED RESPONSE: audioCurrentSong (subscribe)
{
"action": "audioCurrentSong"
}
Is Audio Playing (BROKEN)
This api request exists, but in Pro7 always reports true
RELATED RESPONSE: audioIsPlaying (subscribe)
{
"action": "audioIsPlaying"
}
Start Audio Cue
This command will result in an audioTriggered
message, but since the
play/pause status has changed, ProPresenter will also send an audioPlayPause
message.
RELATED RESPONSE: audioStartCue (subscribe)
{
"action": "audioStartCue",
"audioChildPath": "C:/Path/To/ProPresenter/Library/Song 1 Title.pro6",
"audioPath": "string"
}
Toggle the Audio Play State
NOTE: this is different from Pro6. Pro6 used Play
but Pro7 uses Playing
RELATED RESPONSE: audioPlayPause (subscribe)
{
"action": "audioPlayPause"
}
Toggle the Timeline Play State
If presentationPath
is missing, Pro6 would crash, but Pro7 doesn't.
NO RESPONSE
{
"action": "timelinePlayPause",
"presentationPath": "C:/Path/To/ProPresenter/Library/Song 1 Title.pro6"
}
Reset the Timeline for a Presentation
If presentationPath
is missing, Pro6 will crash.
NO RESPONSE
{
"action": "timelineRewind",
"presentationPath": "C:/Path/To/ProPresenter/Library/Song 1 Title.pro6"
}
Request all Clock data
RELATED RESPONSE: clockRequest (subscribe)
{
"action": "clockRequest"
}
Get Current Times for All Clocks
REMOVED FROM PRO7 !!
RELATED RESPONSE: clockCurrentTimes (subscribe)
{
"action": "clockCurrentTimes"
}
Subscribe to Clock Updates
ProPresenter will send one clock update every second even if no clock values have changed.
The response payload is exactly the same as clockCurrentTimes
RELATED RESPONSE: clockStartSendingCurrentTime (subscribe)
{
"action": "clockStartSendingCurrentTime"
}
Unsubscribe from Clock Updates
NO RESPONSE
{
"action": "clockStopSendingCurrentTime"
}
Start a Specific Clock
RELATED RESPONSE: clockStart (subscribe)
{
"action": "clockStart",
"clockIndex": 0
}
Stop a Specific Clock
RELATED RESPONSE: clockStop (subscribe)
{
"action": "clockStop",
"clockIndex": 0
}
Reset a clock back to initial settings
RELATED RESPONSE: clockReset (subscribe)
{
"action": "clockReset",
"clockIndex": 0
}
Update a Clock (Timer) (eg edit time)
NO RESPONSE
{
"action": "clockUpdate",
"clockIndex": 1,
"clockType": 0,
"clockTime": "09:04:00",
"clockOverrun": false,
"clockIsPM": 1,
"clockName": "Countdown 2",
"clockElapsedTime": "0:02:00"
}
NO RESPONSE
{
"action": "clockResetAll"
}
NO RESPONSE
{
"action": "clockStopAll"
}
NO RESPONSE
{
"action": "clockStartAll"
}
Get all Messages
${}
so that the key for a countdown looks like this Countdown 1: H:MM:SS
.duration
field of the countdown timer, but will not perform a "reset".RELATED RESPONSE: messageRequest (subscribe)
{
"action": "messageRequest"
}
Display a Message
Display a message identified by its index. Add as many key, value pairs as you like.
See messageRequest
for more information about keys.
NO RESPONSE
{
"action": "messageSend",
"messageIndex": 0,
"messageKeys": [
"string"
],
"messageValues": [
"string"
]
}
Hide a Message
Hide a message identified by its index
NO RESPONSE
{
"action": "messageHide",
"messageIndex": 0
}
Show Stage Display Message
NO RESPONSE
{
"action": "stageDisplaySendMessage",
"stageDisplayMessage": "Type a Message Here"
}
Hide Stage Display Message
NO RESPONSE
{
"action": "stageDisplayHideMessage"
}
Select Stage Display Layout
EXPECTED RESPONSE IS THE SAME AS THE SENT COMMAND
RELATED RESPONSE: stageDisplaySetIndex (subscribe)
{
"action": "stageDisplaySetIndex",
"stageDisplayIndex": 0
}
Get Stage Display Layouts
NOTE: this is much different from Pro6 also.
RELATED RESPONSE: stageDisplaySets (subscribe)
{
"action": "stageDisplaySets"
}
Select Stage Display Layout
RELATED RESPONSE: stageDisplayChangeLayout (subscribe)
{
"action": "stageDisplayChangeLayout",
"stageLayoutUUID": "687e061b-c3fc-48a7-be8c-40837b622fed",
"stageScreenUUID": "8e383232-2a89-4802-a507-93c09642fa68"
}
Trigger a Macro
Trigger a macro using macroName
, macroID
, or macroIndex
, must have at least one.
If you send multiple identifier parameters, they are handled in the following order of precedence:
NO RESPONSE
{
"action": "macrosTrigger",
"macroName": "string",
"macroID": "string",
"macroIndex": 0
}
Request a list of Pro7 Macros
RELATED RESPONSE: macrosRequest (subscribe)
{
"action": "macrosRequest"
}
Trigger a Look
Trigger a look. Similar to triggering a Macro.
If you send multiple identifier parameters, they are handled in the following order of precedence:
NO RESPONSE
{
"action": "looksTrigger",
"macroName": "string",
"macroID": "string",
"macroIndex": 0
}
Request a list of Pro7 Looks
Includes the currently active Look (activeLook)
RELATED RESPONSE: looksRequest (subscribe)
{
"action": "looksRequest"
}
Clear All
NO RESPONSE
{
"action": "clearAll"
}
Clear Slide
NO RESPONSE
{
"action": "clearText"
}
Clear Messages
NO RESPONSE
{
"action": "clearMessages"
}
Clear Announcements
NO RESPONSE
{
"action": "clearAnnouncements"
}
Clear Props
NO RESPONSE
{
"action": "clearProps"
}
Clear Audio
NO RESPONSE
{
"action": "clearAudio"
}
Clear Video
NO RESPONSE
{
"action": "clearVideo"
}
Clear Telestrator
NO RESPONSE
{
"action": "clearTelestrator"
}
Clear To Logo
NO RESPONSE
{
"action": "clearToLogo"
}
Remote Control
Receive messages from the API
The remote
channel carries all the
information from the "ProPresenter Remote" app
CONNECT WITH:
ws://[hostname]:[port]/remote
Accepts one of the following messages:
RemoteAuthentication
This is the first command ProPresenter expects to receive over the websocket. This command requests authentication.
For ProPresenter 7.4.2 and later, the protocol must be 701
RELATED COMMAND: authenticate (publish)
{
"controller": 1,
"authenticated": 1,
"error": "",
"majorVersion": 7,
"minorVersion": 6,
"action": "authenticate"
}
Get Library (all presentations)
Will return all items in the ProPresenter library.
RELATED COMMAND: libraryRequest (publish)
{
"library": [
"/Path/To/ProPresenter/Library/Come Alive (Dry Bones).pro6",
"/Path/To/ProPresenter/Library/Pour Out My Heart.pro6",
"/Path/To/ProPresenter/Library/Away in a manger.pro6",
"... ALL PRESENTATIONS IN THE LIBRARY ..."
],
"action": "libraryRequest"
}
Get Playlists
Will return all presentation playlists.
playlistTypePlaylist
or a playlistTypeGroup
playlistTypePlaylist
will contain a list of playlistItemTypePresentation
(or playlistItemTypeAudio
for audio playlists)playlistTypeGroup
may contain both playlistTypePlaylist
and playlistTypeGroup
RELATED COMMAND: playlistRequestAll (publish)
{
"playlistAll": [
{
"playlistLocation": "0",
"playlistType": "playlistTypePlaylist",
"playlistName": "Default",
"playlist": [
{
"playlistItemName": "!~ PRE-SERVICE",
"playlistItemLocation": "0:0",
"playlistItemType": "playlistItemTypePresentation"
}
]
},
{
"playlistLocation": "1",
"playlistType": "playlistTypeGroup",
"playlistName": "2017",
"playlist": [
{
"playlistLocation": "1.0",
"playlistType": "playlistTypePlaylist",
"playlistName": "2017-01-28-Vision Dinner",
"playlist": [
{
"playlistItemName": "!MISC2",
"playlistItemLocation": "1.0:0",
"playlistItemType": "playlistItemTypePresentation"
},
{
"playlistItemName": "!MISC1",
"playlistItemLocation": "1.0:1",
"playlistItemType": "playlistItemTypePresentation"
}
]
}
]
}
],
"action": "playlistRequestAll"
}
Request a Playlist by Location
NOTE: even though the requested action is presentationRequest
ProPresenter responds with
an action value of presentationCurrent
but it will be slightly different from the response to
an actual presentationCurrent
request. See below.
RELATED COMMAND: presentationRequest (publish)
{
"presentationPath": "/Volumes/Jeff/Documents/ProPresenter/Libraries/Default 1/2020-08-16 We Are Chosen-Chosen for This.pro",
"action": "presentationCurrent",
"presentation": {
"presentationSlideGroups": [
{
"groupName": "Group",
"groupColor": "",
"groupSlides": [
{
"slideEnabled": true,
"slideNotes": "",
"slideText": "",
"slideImage": "",
"slideIndex": "0",
"slideLabel": "162. Chosen Bumper",
"slideColor": "0 0 0 0"
},
{
"slideEnabled": true,
"slideNotes": "[sermon_end]\nvmixoverlay[2,Out]\nvmixoverlay[1,In,10]\nlive[999]",
"slideText": "",
"slideImage": "",
"slideIndex": "0",
"slideLabel": "",
"slideColor": "0 0 0 0"
}
]
}
],
"presentationName": "2020-08-16 We Are Chosen-Chosen for This",
"presentationHasTimeline": 0,
"presentationCurrentLocation": "/Volumes/Jeff/Documents/ProPresenter/Libraries/Default 1/2020-08-16 We Are Chosen-Chosen for This.pro",
"presentationDestination": 0
}
}
Request Current Presentation
Requests the currently active presentation if there is one. If no presentation has a slide active, then nothing will be returned.
NOTE: You can distinguish this response from a presentationRequest
request
because this response will include presentationDestination
as a field at the root level
of the response.
NOTE: In Pro6, the extra field was presentationPath
at the root level. Now, both
requests return a presentationPath
. I still consider this a bug.
NOTE: Pro7 ignores the presentationSlideQuality
field unless it is a string
. This is a bug.
RELATED COMMAND: presentationCurrent (publish)
{
"action": "presentationCurrent",
"presentationPath": "C:/Path/To/ProPresenter/Library/Song 1 Title.pro6",
"presentation": {
"presentationSlideGroups": [
{
"groupsummary": "string",
"groupColor": "0.5 0.8 1 0.5",
"groupSlides": [
{
"slideEnabled": true,
"slideNotes": "string",
"slideAttachmentMask": 0,
"slideText": "string",
"slideImage": "string",
"slideIndex": "string",
"slideTransitionType": 0,
"slideLabel": "string",
"slideColor": "0.5 0.8 1 0.5"
}
]
}
],
"presentationsummary": "string",
"presentationHasTimeline": 0,
"presentationDestination": 0,
"presentationCurrentLocation": "C:/Path/To/ProPresenter/Library/Song 1 Title.pro6"
},
"presentationDestination": 0
}
Get the Index of the Current Slide
string
valuepresentationRequest
NOTE: The ProPresenter remote issues this action every time it issues a presentationRequest
action.
NOTE; In Pro7, when a presentation is automatically advancing on the announcements layer while a user is triggering slides in another presentation on the normal output layer, the index returns can sometimes vary between the two different presentations!
RELATED COMMAND: presentationSlideIndex (publish)
{
"action": "presentationSlideIndex",
"slideIndex": 0
}
Activate a Slide
Works just like clicking on a slide.
NOTE: This is different from Pro6. Only string numerics are accepted for slideIndex
even though the presentationTriggerMessage
responds with an integer. This is a bug.
RELATED COMMAND: presentationTriggerIndex (publish)
{
"action": "presentationTriggerIndex",
"slideIndex": 0,
"presentationPath": "C:/Path/To/ProPresenter/Library/Song 1 Title.pro6",
"presentationDestination": 0
}
Activate the Next Slide
Works just like hitting the right arrow or spacebar.
RELATED COMMAND: presentationTriggerNext (publish)
{
"action": "presentationTriggerIndex",
"slideIndex": 0,
"presentationPath": "C:/Path/To/ProPresenter/Library/Song 1 Title.pro6",
"presentationDestination": 0
}
Activate the Previous Slide
Works just like hitting the left arrow.
RELATED COMMAND: presentationTriggerPrevious (publish)
{
"action": "presentationTriggerIndex",
"slideIndex": 0,
"presentationPath": "C:/Path/To/ProPresenter/Library/Song 1 Title.pro6",
"presentationDestination": 0
}
Get Audio Library
Will return all the items in the audio library
RELATED COMMAND: audioRequest (publish)
{
"action": "audioRequest",
"audioPlaylist": [
{
"playlistType": "playlistTypeGroup",
"playlistsummary": "string",
"playlistLocation": "C:/Path/To/ProPresenter/Library/Song 1 Title.pro6",
"playlist": [
{}
]
}
]
}
Get the Current Song
Will return the data for the currently playing song, if there is one.
RELATED COMMAND: audioCurrentSong (publish)
{
"audioArtist": "",
"action": "audioCurrentSong",
"audioName": "Peaceful Instrumental - C"
}
Is Audio Playing (BROKEN)
This api request exists, but in Pro7 always reports true
RELATED COMMAND: audioIsPlaying (publish)
{
"action": "audioIsPlaying",
"audioIsPlaying": true
}
Start Audio Cue
This command will result in an audioTriggered
message, but since the
play/pause status has changed, ProPresenter will also send an audioPlayPause
message.
RELATED COMMAND: audioStartCue (publish)
{
"audioArtist": "",
"action": "audioTriggered",
"audioName": "Peaceful Instrumental - C"
}
Toggle the Audio Play State
NOTE: this is different from Pro6. Pro6 used Play
but Pro7 uses Playing
RELATED COMMAND: audioPlayPause (publish)
{
"action": "audioPlayPause",
"audioPlayPause": "Playing"
}
Request all Clock data
RELATED COMMAND: clockRequest (publish)
{
"action": "clockRequest",
"clockInfo": [
{
"clockType": 0,
"clockState": true,
"clockName": "string",
"clockIsPM": 0,
"clockTime": "string",
"clockEndTime": "string",
"clockDuration": "string",
"clockOverrun": true,
"clockTimePeriodFormat": 0,
"clockFormat": {
"clockMillisecondFormat": 2,
"clockWallTimeFormat": true,
"clockSecondFormat": 2,
"clockTimePeriodFormat": 0,
"clockMinuteFormat": 2,
"clockHourForma\"": 2
}
}
]
}
Get Current Times for All Clocks
REMOVED FROM PRO7 !!
RELATED COMMAND: clockCurrentTimes (publish)
{
"action": "clockCurrentTimes",
"clockTimes": [
"0:10:00",
"--:--:--",
"13:52:23"
]
}
Subscribe to Clock Updates
ProPresenter will send one clock update every second even if no clock values have changed.
The response payload is exactly the same as clockCurrentTimes
RELATED COMMAND: clockStartSendingCurrentTime (publish)
{
"action": "clockCurrentTimes",
"clockTimes": [
"0:10:00",
"--:--:--",
"13:52:23"
]
}
Start a Specific Clock
RELATED COMMAND: clockStart (publish)
Pro7 no longer sends the clockInfo
parameter.
{
"action": "clockStartStop",
"clockTime": "string",
"clockState": 0,
"clockIndex": 0
}
Stop a Specific Clock
RELATED COMMAND: clockStop (publish)
Pro7 no longer sends the clockInfo
parameter.
{
"action": "clockStartStop",
"clockTime": "string",
"clockState": 0,
"clockIndex": 0
}
Reset a clock back to initial settings
RELATED COMMAND: clockReset (publish)
{
"action": "clockResetIndex"
}
Get all Messages
${}
so that the key for a countdown looks like this Countdown 1: H:MM:SS
.duration
field of the countdown timer, but will not perform a "reset".RELATED COMMAND: messageRequest (publish)
{
"action": "messageRequest",
"messages": [
{
"messageComponents": [
"message:",
"${Message}"
],
"messageTitle": "Message"
},
{
"messageComponents": [
"Session will begin in: ",
"${Countdown 1: H:MM:SS}"
],
"messageTitle": "Countdown"
},
{
"messageComponents": [
"${Message}"
],
"messageTitle": "Message"
},
{
"messageComponents": [
"Service starts in ",
"${countDownTimerName_1: H:MM:SS}"
],
"messageTitle": "Countdown"
}
]
}
Select Stage Display Layout
EXPECTED RESPONSE IS THE SAME AS THE SENT COMMAND
RELATED COMMAND: stageDisplaySetIndex (publish)
{
"action": "stageDisplaySetIndex",
"stageDisplayIndex": 0
}
Get Stage Display Layouts
NOTE: this is much different from Pro6 also.
RELATED COMMAND: stageDisplaySets (publish)
{
"action": "stageDisplaySets",
"stageScreens": [
{
"stageLayoutSelectedLayoutUUID": "12CB7383-FA02-47BB-B501-747ADCA860D3",
"stageScreenName": "Stage Screen 1",
"stageScreenUUID": "22B3B653-97AB-4371-9958-E42915C8F24A"
}
],
"stageLayouts": [
{
"stageLayoutName": "Default",
"stageLayoutUUID": "753B184F-CCCD-42F9-A883-D1DF86E1FFB8"
},
{
"stageLayoutName": "Slides",
"stageLayoutUUID": "89A2AC43-B47F-44C5-8E21-CE0E424A70C1"
}
]
}
Select Stage Display Layout
RELATED COMMAND: stageDisplayChangeLayout (publish)
{
"action": "stageDisplaySets",
"stageScreens": [
{
"stageLayoutSelectedLayoutUUID": "12CB7383-FA02-47BB-B501-747ADCA860D3",
"stageScreenName": "Stage Screen 1",
"stageScreenUUID": "22B3B653-97AB-4371-9958-E42915C8F24A"
}
],
"stageLayouts": [
{
"stageLayoutName": "Default",
"stageLayoutUUID": "753B184F-CCCD-42F9-A883-D1DF86E1FFB8"
},
{
"stageLayoutName": "Slides",
"stageLayoutUUID": "89A2AC43-B47F-44C5-8E21-CE0E424A70C1"
}
]
}
Request a list of Pro7 Macros
RELATED COMMAND: macrosRequest (publish)
{
"action": "macrosRequest",
"macros": [
{
"macroName": "<Case-sensitive name of Macro>",
"macroID": "<Internal ID of Macro>",
"macroColor": "<red> <green> <blue>",
"macroIndex": "<Zero-based index of Macro>"
}
]
}
Request a list of Pro7 Looks
Includes the currently active Look (activeLook)
RELATED COMMAND: looksRequest (publish)
{
"action": "looksRequest",
"looks": [
{
"lookName": "<Case-sensitive name of Look>",
"lookID": "<Internal ID of Look>",
"lookIndex": "<Zero-based index of Look>"
}
],
"activeLook": {
"lookName": "<name>",
"lookID": "<identifier>"
}
}
Stage Display API
Send messages to the API
NOTE: Pro7 maintains the same protocol number as Pro6: 610
The stagedisplay
channel carries all the
information from the "ProPresenter Stage" app
CONNECT WITH:
ws://[hostname]:[port]/stagedisplay
ProPresenter also provides a mechanism for getting a high quality thumbnail image for any slide or chord chart in the current presentation:
http://PROPRESENTER_IP:PROPRESENTER_PORT/stage/image/SLIDE_UID
In ProPresenter 6, the response will be the raw bytes of a jpeg image but the
response will NOT contain the proper Content-Type of image/jpeg
.
In ProPresenter 7, the response will be the raw bytes of a TIFF image, but the
response will INCORRECTLY claim it is a Content-Type of image/jpeg
.
Accepts one of the following messages:
{
"pwd": "PASSWORD",
"ptl": 610,
"acn": "ath"
}
Get All Stage Display Layouts
acn
of asl
means "all stage layouts"ary
indicates array of stage layoutsRELATED RESPONSE: asl (subscribe)
{
"acn": "asl"
}
{
"acn": "psl"
}
Request Frame Values for Stage Display
When the frame value is pushed as a result of a slide trigger event,
only cs
, ns
, csn
, nsn
will be sent.
Applications should listen for all the other acn
values separately.
RELATED RESPONSE: fv (subscribe)
{
"acn": "fv",
"uid": "F8260B13-9C5B-4D2C-80F1-C72346759F11"
}
Stage Display API
Receive messages from the API
NOTE: Pro7 maintains the same protocol number as Pro6: 610
The stagedisplay
channel carries all the
information from the "ProPresenter Stage" app
CONNECT WITH:
ws://[hostname]:[port]/stagedisplay
ProPresenter also provides a mechanism for getting a high quality thumbnail image for any slide or chord chart in the current presentation:
http://PROPRESENTER_IP:PROPRESENTER_PORT/stage/image/SLIDE_UID
In ProPresenter 6, the response will be the raw bytes of a jpeg image but the
response will NOT contain the proper Content-Type of image/jpeg
.
In ProPresenter 7, the response will be the raw bytes of a TIFF image, but the
response will INCORRECTLY claim it is a Content-Type of image/jpeg
.
Accepts one of the following messages:
{
"acn": "ath",
"ath": true,
"err": ""
}
Get All Stage Display Layouts
acn
of asl
means "all stage layouts"ary
indicates array of stage layoutsRELATED COMMAND: asl (publish)
{
"acn": "asl",
"ary": [
{
"brd": true,
"uid": "753B184F-CCCD-42F9-A883-D1DF86E1FFB8",
"zro": 0,
"oCl": "1.000000 0.000000 0.000000",
"fme": [
{
"ufr": "{{0.025000000000000001, 0.37418655097613884}, {0.40000000000000002, 0.50108459869848154}}",
"mde": 1,
"tCl": "1.000000 1.000000 1.000000",
"tAl": 2,
"tSz": 60,
"nme": "Current Slide",
"typ": 1
}
],
"ovr": true,
"acn": "sl",
"nme": "Default"
}
]
}
{
"acn": "psl",
"uid": "F8260B13-9C5B-4D2C-80F1-C72346759F11"
}
Request Frame Values for Stage Display
When the frame value is pushed as a result of a slide trigger event,
only cs
, ns
, csn
, nsn
will be sent.
Applications should listen for all the other acn
values separately.
RELATED COMMAND: fv (publish)
{
"acn": "fv",
"ary": [
{
"acn": "cs",
"uid": "FAFCA1CB-8CB8-4E53-8B7C-8D61154516D0",
"txt": ""
},
{
"acn": "ns",
"uid": "95D16968-589A-11EB-8D62-FCAA147AEF2F",
"txt": ""
},
{
"acn": "csn",
"txt": "[sermon_start]\nevent[2888]\nvmixoverlay[1,Out]\nlive[1]"
},
{
"acn": "nsn",
"txt": "vmixoverlay[2,Out]"
},
{
"acn": "msg",
"txt": ""
},
{
"acn": "sys",
"txt": " 9:57 AM"
},
{
"acn": "tmr",
"uid": "47E8B48C-0D61-4EFC-9517-BF9FB894C8E2",
"txt": "0:09:59"
},
{
"acn": "vid",
"txt": ""
},
{
"acn": "cc",
"uid": ""
}
]
}
On New Stage Display Selected
acn
of sl
indicates this is a single stage layoutTHIS IS A SUBSCRIBE-ONLY MESSAGE
nme
indicates layout nameovr
indicates if overrun color should be usedoCl
indicates color for timer overrunsbrd
indicates if borders and labels should be useduid
indicates layout uidzro
indicates if zeroes should be removed from timesfme
indicates array of frame layout specifications{
"nme": "string",
"brd": true,
"uid": "string",
"zro": 0,
"ovr": true,
"oCl": "1.000000 1.000000 1.000000 1.000000",
"fme": [
{
"ufr": "{{0.025000000000000001, 0.37418655097613884}, {0.40000000000000002, 0.50108459869848154}}\n",
"mde": 0,
"tAl": 0,
"tCl": "1.000000 1.000000 1.000000 1.000000",
"tSz": 0,
"nme": "string",
"typ": 1,
"fCl": "1.000000 1.000000 1.000000 1.000000",
"fCh": true,
"uid": "string"
}
],
"acn": "sl"
}
On New System Time
THIS IS A SUBSCRIBE-ONLY MESSAGE
{
"acn": "sys",
"txt": " 11:17 AM"
}
On New Video Countdown Time
Time follows the same H:MM:SS format as the remote protocol.
THIS IS A SUBSCRIBE-ONLY MESSAGE
{
"acn": "vid",
"txt": "0:00:18"
}
On New Chord Chart
Chord chart images can be downloaded in the same way as slide preview images
http://PROPRESENTER_IP:PROPRESENTER_PORT/stage/image/UID
THIS IS A SUBSCRIBE-ONLY MESSAGE
{
"acn": "cc",
"uid": "E65DF4DF-960D-4CF5-ADF5-60F200F6AFF7"
}
On Timer Update
THIS IS A SUBSCRIBE-ONLY MESSAGE
{
"acn": "tmr",
"uid": "[TIMER UID]",
"txt": "--:--:--"
}
RemoteAuthentication
This is the first command ProPresenter expects to receive over the websocket. This command requests authentication.
For ProPresenter 7.4.2 and later, the protocol must be 701
RELATED RESPONSE: authenticate (subscribe)
RemoteAuthentication
This is the first command ProPresenter expects to receive over the websocket. This command requests authentication.
For ProPresenter 7.4.2 and later, the protocol must be 701
RELATED COMMAND: authenticate (publish)
Get Library (all presentations)
Will return all items in the ProPresenter library.
RELATED RESPONSE: libraryRequest (subscribe)
Get Library (all presentations)
Will return all items in the ProPresenter library.
RELATED COMMAND: libraryRequest (publish)
Get Playlists
Will return all presentation playlists.
playlistTypePlaylist
or a playlistTypeGroup
playlistTypePlaylist
will contain a list of playlistItemTypePresentation
(or playlistItemTypeAudio
for audio playlists)playlistTypeGroup
may contain both playlistTypePlaylist
and playlistTypeGroup
RELATED RESPONSE: playlistRequestAll (subscribe)
Get Playlists
Will return all presentation playlists.
playlistTypePlaylist
or a playlistTypeGroup
playlistTypePlaylist
will contain a list of playlistItemTypePresentation
(or playlistItemTypeAudio
for audio playlists)playlistTypeGroup
may contain both playlistTypePlaylist
and playlistTypeGroup
RELATED COMMAND: playlistRequestAll (publish)
Request a Playlist by Location
NOTE: even though the requested action is presentationRequest
ProPresenter responds with
an action value of presentationCurrent
but it will be slightly different from the response to
an actual presentationCurrent
request. See below.
RELATED RESPONSE: presentationRequest (subscribe)
Request a Playlist by Location
NOTE: even though the requested action is presentationRequest
ProPresenter responds with
an action value of presentationCurrent
but it will be slightly different from the response to
an actual presentationCurrent
request. See below.
RELATED COMMAND: presentationRequest (publish)
Request Current Presentation
Requests the currently active presentation if there is one. If no presentation has a slide active, then nothing will be returned.
NOTE: You can distinguish this response from a presentationRequest
request
because this response will include presentationDestination
as a field at the root level
of the response.
NOTE: In Pro6, the extra field was presentationPath
at the root level. Now, both
requests return a presentationPath
. I still consider this a bug.
NOTE: Pro7 ignores the presentationSlideQuality
field unless it is a string
. This is a bug.
RELATED RESPONSE: presentationCurrent (subscribe)
Request Current Presentation
Requests the currently active presentation if there is one. If no presentation has a slide active, then nothing will be returned.
NOTE: You can distinguish this response from a presentationRequest
request
because this response will include presentationDestination
as a field at the root level
of the response.
NOTE: In Pro6, the extra field was presentationPath
at the root level. Now, both
requests return a presentationPath
. I still consider this a bug.
NOTE: Pro7 ignores the presentationSlideQuality
field unless it is a string
. This is a bug.
RELATED COMMAND: presentationCurrent (publish)
Get the Index of the Current Slide
string
valuepresentationRequest
NOTE: The ProPresenter remote issues this action every time it issues a presentationRequest
action.
NOTE; In Pro7, when a presentation is automatically advancing on the announcements layer while a user is triggering slides in another presentation on the normal output layer, the index returns can sometimes vary between the two different presentations!
RELATED RESPONSE: presentationSlideIndex (subscribe)
Get the Index of the Current Slide
string
valuepresentationRequest
NOTE: The ProPresenter remote issues this action every time it issues a presentationRequest
action.
NOTE; In Pro7, when a presentation is automatically advancing on the announcements layer while a user is triggering slides in another presentation on the normal output layer, the index returns can sometimes vary between the two different presentations!
RELATED COMMAND: presentationSlideIndex (publish)
Activate a Slide
Works just like clicking on a slide.
NOTE: This is different from Pro6. Only string numerics are accepted for slideIndex
even though the presentationTriggerMessage
responds with an integer. This is a bug.
RELATED RESPONSE: presentationTriggerIndex (subscribe)
Activate a Slide
Works just like clicking on a slide.
NOTE: This is different from Pro6. Only string numerics are accepted for slideIndex
even though the presentationTriggerMessage
responds with an integer. This is a bug.
RELATED COMMAND: presentationTriggerIndex (publish)
Activate the Next Slide
Works just like hitting the right arrow or spacebar.
RELATED RESPONSE: presentationTriggerNext (subscribe)
Activate the Next Slide
Works just like hitting the right arrow or spacebar.
RELATED COMMAND: presentationTriggerNext (publish)
Activate the Previous Slide
Works just like hitting the left arrow.
RELATED RESPONSE: presentationTriggerPrevious (subscribe)
Activate the Previous Slide
Works just like hitting the left arrow.
RELATED COMMAND: presentationTriggerPrevious (publish)
Get Audio Library
Will return all the items in the audio library
RELATED RESPONSE: audioRequest (subscribe)
Get Audio Library
Will return all the items in the audio library
RELATED COMMAND: audioRequest (publish)
Get the Current Song
Will return the data for the currently playing song, if there is one.
RELATED RESPONSE: audioCurrentSong (subscribe)
Get the Current Song
Will return the data for the currently playing song, if there is one.
RELATED COMMAND: audioCurrentSong (publish)
Is Audio Playing (BROKEN)
This api request exists, but in Pro7 always reports true
RELATED RESPONSE: audioIsPlaying (subscribe)
Is Audio Playing (BROKEN)
This api request exists, but in Pro7 always reports true
RELATED COMMAND: audioIsPlaying (publish)
Start Audio Cue
This command will result in an audioTriggered
message, but since the
play/pause status has changed, ProPresenter will also send an audioPlayPause
message.
RELATED RESPONSE: audioStartCue (subscribe)
Start Audio Cue
This command will result in an audioTriggered
message, but since the
play/pause status has changed, ProPresenter will also send an audioPlayPause
message.
RELATED COMMAND: audioStartCue (publish)
Toggle the Audio Play State
NOTE: this is different from Pro6. Pro6 used Play
but Pro7 uses Playing
RELATED RESPONSE: audioPlayPause (subscribe)
Toggle the Audio Play State
NOTE: this is different from Pro6. Pro6 used Play
but Pro7 uses Playing
RELATED COMMAND: audioPlayPause (publish)
Toggle the Timeline Play State
If presentationPath
is missing, Pro6 would crash, but Pro7 doesn't.
NO RESPONSE
Reset the Timeline for a Presentation
If presentationPath
is missing, Pro6 will crash.
NO RESPONSE
Request all Clock data
RELATED RESPONSE: clockRequest (subscribe)
Request all Clock data
RELATED COMMAND: clockRequest (publish)
Get Current Times for All Clocks
REMOVED FROM PRO7 !!
RELATED RESPONSE: clockCurrentTimes (subscribe)
Get Current Times for All Clocks
REMOVED FROM PRO7 !!
RELATED COMMAND: clockCurrentTimes (publish)
Subscribe to Clock Updates
ProPresenter will send one clock update every second even if no clock values have changed.
The response payload is exactly the same as clockCurrentTimes
RELATED RESPONSE: clockStartSendingCurrentTime (subscribe)
Subscribe to Clock Updates
ProPresenter will send one clock update every second even if no clock values have changed.
The response payload is exactly the same as clockCurrentTimes
RELATED COMMAND: clockStartSendingCurrentTime (publish)
Unsubscribe from Clock Updates
NO RESPONSE
Start a Specific Clock
RELATED RESPONSE: clockStart (subscribe)
Start a Specific Clock
RELATED COMMAND: clockStart (publish)
Pro7 no longer sends the clockInfo
parameter.
Stop a Specific Clock
RELATED RESPONSE: clockStop (subscribe)
Stop a Specific Clock
RELATED COMMAND: clockStop (publish)
Pro7 no longer sends the clockInfo
parameter.
Reset a clock back to initial settings
RELATED RESPONSE: clockReset (subscribe)
Reset a clock back to initial settings
RELATED COMMAND: clockReset (publish)
Update a Clock (Timer) (eg edit time)
NO RESPONSE
NO RESPONSE
NO RESPONSE
NO RESPONSE
Get all Messages
${}
so that the key for a countdown looks like this Countdown 1: H:MM:SS
.duration
field of the countdown timer, but will not perform a "reset".RELATED RESPONSE: messageRequest (subscribe)
Get all Messages
${}
so that the key for a countdown looks like this Countdown 1: H:MM:SS
.duration
field of the countdown timer, but will not perform a "reset".RELATED COMMAND: messageRequest (publish)
Display a Message
Display a message identified by its index. Add as many key, value pairs as you like.
See messageRequest
for more information about keys.
NO RESPONSE
Hide a Message
Hide a message identified by its index
NO RESPONSE
Show Stage Display Message
NO RESPONSE
Hide Stage Display Message
NO RESPONSE
Select Stage Display Layout
EXPECTED RESPONSE IS THE SAME AS THE SENT COMMAND
RELATED RESPONSE: stageDisplaySetIndex (subscribe)
Select Stage Display Layout
EXPECTED RESPONSE IS THE SAME AS THE SENT COMMAND
RELATED COMMAND: stageDisplaySetIndex (publish)
Get Stage Display Layouts
NOTE: this is much different from Pro6 also.
RELATED RESPONSE: stageDisplaySets (subscribe)
Get Stage Display Layouts
NOTE: this is much different from Pro6 also.
RELATED COMMAND: stageDisplaySets (publish)
Select Stage Display Layout
RELATED RESPONSE: stageDisplayChangeLayout (subscribe)
Select Stage Display Layout
RELATED COMMAND: stageDisplayChangeLayout (publish)
Trigger a Macro
Trigger a macro using macroName
, macroID
, or macroIndex
, must have at least one.
If you send multiple identifier parameters, they are handled in the following order of precedence:
NO RESPONSE
Request a list of Pro7 Macros
RELATED RESPONSE: macrosRequest (subscribe)
Request a list of Pro7 Macros
RELATED COMMAND: macrosRequest (publish)
Trigger a Look
Trigger a look. Similar to triggering a Macro.
If you send multiple identifier parameters, they are handled in the following order of precedence:
NO RESPONSE
Request a list of Pro7 Looks
Includes the currently active Look (activeLook)
RELATED RESPONSE: looksRequest (subscribe)
Request a list of Pro7 Looks
Includes the currently active Look (activeLook)
RELATED COMMAND: looksRequest (publish)
Clear All
NO RESPONSE
Clear Slide
NO RESPONSE
Clear Messages
NO RESPONSE
Clear Announcements
NO RESPONSE
Clear Props
NO RESPONSE
Clear Audio
NO RESPONSE
Clear Video
NO RESPONSE
Clear Telestrator
NO RESPONSE
Clear To Logo
NO RESPONSE
Get All Stage Display Layouts
acn
of asl
means "all stage layouts"ary
indicates array of stage layoutsRELATED RESPONSE: asl (subscribe)
Get All Stage Display Layouts
acn
of asl
means "all stage layouts"ary
indicates array of stage layoutsRELATED COMMAND: asl (publish)
Request Current Stage Display Layout
RELATED RESPONSE: psl (subscribe)
Request Frame Values for Stage Display
When the frame value is pushed as a result of a slide trigger event,
only cs
, ns
, csn
, nsn
will be sent.
Applications should listen for all the other acn
values separately.
RELATED RESPONSE: fv (subscribe)
Request Frame Values for Stage Display
When the frame value is pushed as a result of a slide trigger event,
only cs
, ns
, csn
, nsn
will be sent.
Applications should listen for all the other acn
values separately.
RELATED COMMAND: fv (publish)
On New Stage Display Selected
acn
of sl
indicates this is a single stage layoutTHIS IS A SUBSCRIBE-ONLY MESSAGE
nme
indicates layout nameovr
indicates if overrun color should be usedoCl
indicates color for timer overrunsbrd
indicates if borders and labels should be useduid
indicates layout uidzro
indicates if zeroes should be removed from timesfme
indicates array of frame layout specificationsOn New System Time
THIS IS A SUBSCRIBE-ONLY MESSAGE
On New Video Countdown Time
Time follows the same H:MM:SS format as the remote protocol.
THIS IS A SUBSCRIBE-ONLY MESSAGE
On New Chord Chart
Chord chart images can be downloaded in the same way as slide preview images
http://PROPRESENTER_IP:PROPRESENTER_PORT/stage/image/UID
THIS IS A SUBSCRIBE-ONLY MESSAGE
On Timer Update
THIS IS A SUBSCRIBE-ONLY MESSAGE
0 for false, 1 for true, (in Pro6, these sometimes show up as strings)
four space-delimited numbers describing the r,g,b values of a color r,g,b values are 0-1
four space-delimited doubles describing the r,g,b,a values of a color from 0-1
Unlike Pro6, Pro7 handles pathnames correctly without superfluous slashes.
Also, unlike Pro6, Pro7 always sends and expects the full pathname. No basenames here.
Playlist locations are specified by a zero-based index of the playlist and playlist group in which the item may be found.
The first item in the first playlist would be "0:0"
.
If the first playlist item is a playlist group, then the first item
in the first playlist in the first playlist group would be "0.0:0"
.
That is, the generalized location is this:
playlist_index[.child_playlist_index[.deeper_child_index[...]]]:item
NOTE:
/
in ProPresenter 7, the "Play" option becomes "Playing"
NOTE: This is different from Pro6
"HH:MM:SS.mm"
with milliseconds-
."00:00:00.00"
0
is Countdown, 1
is Countdown to Time, 2
is Elapsed Time
UNKNOWN / TODO
clockDetail is greatly expanded over Pro6
Pro7 no longer sends the clockInfo
parameter.
Frame Geometry is delivered in x,y coordinates based on screen percentages in the following format:
{{upper_left_x_pct, upper_left_y_pct}, {lower_right_x_pct, lower_right_y_pct}}
NOTE: this is not valid JSON, so don't parse it that way!
Stage Display colors are strings of three or four space-delimited float values for RGB(A) from 0-1
A Stage Display Frame is a box of stage display information.
nme
indicates layout nameovr
indicates if overrun color should be usedoCl
indicates color for timer overrunsbrd
indicates if borders and labels should be useduid
indicates layout uidzro
indicates if zeroes should be removed from timesfme
indicates array of frame layout specifications