The following API clients are available based on these API docs:
- vizio-smart-cast (JavaScript)
- pyvizio (Python)
-
On firmware versions older than 4.0 the API server runs on port
9000
, on 4.0 and newer the API server runs on port7345
. Both are using https and will not respond to http.Don't port forward it. There are some commands that can be executed without authentication.
-
Certificate's CN is
BG2.prod.vizio.com
so will likely fail SSL validation. -
API includes a
Status
object,URI
requested, and Executiontime
on every response. It's included below, but excluded in all of the examples for redundancy.{ ... "STATUS": { "RESULT": String, "DETAIL": String }, "URI": String, "TIME": String }
API does not seem to be fully restful, and doesn't apply proper status codes in responses. Verify request's result from the
status
object. Result codes included where applicable. -
All requests made should contain a JSON body with the header
Content-Type: application/json
set. -
When authentication is required, send
Auth: AUTH_TOKEN
header with request. -
This does not cover any MyVizio Account APIs.
-
See an issue? Have a question? Open an issue, or find me on Mastodon @exiva@social.lol
Perform an SSDP query for ST: urn:schemas-kinoma-com:device:shell:1
M-SEARCH * HTTP/1.1
HOST: 239.255.255.250:1900
MAN: "ssdp:discover"
MX: 1
ST: urn:schemas-kinoma-com:device:shell:1
required to control set.
PUT /pairing/start
{
"DEVICE_NAME": String,
"DEVICE_ID": String
}
{
"ITEM": {
"PAIRING_REQ_TOKEN": Integer,
"CHALLENGE_TYPE": Integer
},
...
}
curl -k -H "Content-Type: application/json" -X PUT -d '{"DEVICE_ID":"12345","DEVICE_NAME":"cURL Example"}' https://myVizioTV:9000/pairing/start
Save DEVICE_ID
, you'll need it for the challenge or to cancel pairing.
PUT /pairing/pair
{
"DEVICE_ID": String,
"CHALLENGE_TYPE": Integer,
"RESPONSE_VALUE": String,
"PAIRING_REQ_TOKEN": Integer
}
{
"ITEM": {
"AUTH_TOKEN": String
},
...
}
curl -k -H "Content-Type: application/json" -X PUT -d '{"DEVICE_ID": "12345","CHALLENGE_TYPE": 1,"RESPONSE_VALUE": "1234","PAIRING_REQ_TOKEN": 654321}' https://myVizioTV:9000/pairing/pair
RESPONSE_VALUE
key is the code displayed on the TV.
PAIRING_REQ_TOKEN
key is returned from the /pairing/start request.
PUT /pairing/cancel
{
"DEVICE_ID": String,
"CHALLENGE_TYPE": Integer,
"RESPONSE_VALUE": "1111",
"PAIRING_REQ_TOKEN": Integer
}
{
"ITEM": {},
...
}
curl -k -H "Content-Type: application/json" -X PUT -d '{"DEVICE_ID":"12345","CHALLENGE_TYPE": 1,"RESPONSE_VALUE": "1111","PAIRING_REQ_TOKEN": 0}' https://myVizioTV:9000/pairing/cancel
For cancellation, RESPONSE_VALUE
should be hard-coded to "1111".
RESULT | Meaning |
---|---|
INVALID_PARAMETER | Malformed Request |
MAX_CHALLENGES_EXCEEDED | Too many failed pair attempts |
SUCCESS | Successfully Paired |
PAIRING_DENIED | Incorrect Pin |
VALUE_OUT_OF_RANGE | Pin out of range |
CHALLENGE_INCORRECT | Incorrect challenge |
BLOCKED | Pairing in progress already |
The HTTP API server turns off when the set is sleeping. Send a WoL magic packet to turn it on. not supported when set runs in Eco mode.
Authenticated
GET /state/device/power_mode
{
"ITEMS": [{
"TYPE": "T_VALUE_V1",
"CNAME": "power_mode",
"NAME": "Power Mode",
"VALUE": 1
}],
"PARAMETERS": {
"HASHONLY": "FALSE",
"FLAT": "TRUE",
"HELPTEXT": "FALSE"
}
...
}
curl -k -H "Content-Type: application/json" -H "AUTH: 123A456B" -X GET https://myVizioTV:9000/state/device/power_mode
Authenticated
PUT /key_command/
{
"KEYLIST": [{
"CODESET": Integer,
"CODE": Integer,
"ACTION": String
}]
}
curl -k -H "Content-Type: application/json" -H "AUTH: 123A456B" -X PUT -d '{"KEYLIST": [{"CODESET": 5,"CODE": 0,"ACTION":"KEYPRESS"}]}' https://myVizioTV:9000/key_command/
You can string together long remote actions by adding to the keylist
array.
Action |
---|
KEYDOWN |
KEYUP |
KEYPRESS |
Event Name | Codeset | Code |
---|---|---|
Volume Down | 5 | 0 |
Volume Up | 5 | 1 |
Mute Off | 5 | 2 |
Mute On | 5 | 3 |
Mute Toggle | 5 | 4 |
Cycle Input | 7 | 1 |
Channel Down | 8 | 0 |
Channel Up | 8 | 1 |
Previous Ch | 8 | 2 |
Power Off | 11 | 0 |
Power On | 11 | 1 |
Power Toggle | 11 | 2 |
Authenticated
GET /menu_native/dynamic/tv_settings/devices/current_input
{
"ITEMS": [{
"NAME": String,
"CNAME": String,
"TYPE": String,
"VALUE": String,
"ENABLED": Boolean,
"HASHVAL": Integer
}],
"NAME": String,
"HASHLIST": Array,
"GROUP": String,
"PARAMETERS": {
"HASHONLY": String,
"FLAT": String,
"HELPTEXT": String
},
...
}
curl -k -H "Content-Type: application/json" -H "AUTH: 123A456B" -X GET https://myVizioTV:9000/menu_native/dynamic/tv_settings/devices/current_input
Authenticated
GET /menu_native/dynamic/tv_settings/devices/name_input
{
"ITEMS": [{
"NAME": String,
"CNAME": String,
"TYPE": String,
"VALUE": {
"NAME": String,
"METADATA": String
},
"ENABLED": Boolean,
"HASHVAL": Integer
},
...
],
"NAME": String,
"HASHLIST": Array,
"GROUP": String,
"PARAMETERS": {
"HASHONLY": String,
"FLAT": String,
"HELPTEXT": String
},
...
}
curl -k -H "Content-Type: application/json" -H "AUTH: 123A456B" -X GET https://myVizioTV:9000/menu_native/dynamic/tv_settings/devices/name_input
Authenticated
PUT /menu_native/dynamic/tv_settings/devices/current_input
{
"REQUEST": "MODIFY",
"VALUE": String,
"HASHVAL": Integer
}
PUT current_input |
From name_input |
---|---|
VALUE | ITEMS[x].NAME |
HASHVAL | Current HashValue from a "get" of current_input |
Note: The hashvalue is from the current input, not the list of inputs.
curl -k -H "Content-Type: application/json" -H "AUTH: 123A456B" -X PUT -d '{"REQUEST": "MODIFY","VALUE": "HDMI-1","HASHVAL": 1384176329}' https://myVizioTV:9000/menu_native/dynamic/tv_settings/devices/current_input
Authenticated
PUT /app/launch
{
"VALUE": {
"MESSAGE": String,
"NAME_SPACE": Integer,
"APP_ID": String
}
}
See App IDs for Values
Authenticated
GET /menu_native/dynamic/tv_settings/SETTINGS_CNAME
(See Settings CNAMEs for SETTINGS_CNAME
values)
{
"ITEMS": [{
"NAME": String,
"CNAME": String,
"TYPE": String,
"VALUE": String,
"ENABLED": Boolean,
"HASHVAL": Int,
"ELEMENTS": Array
},
...
],
"NAME": String,
"HASHLIST": Array,
"GROUP": String,
"PARAMETERS": {
"HASHONLY": String,
"FLAT": String,
"HELPTEXT": String
},
...
}
ELEMENTS
array is conditional.
curl -k -H "Content-Type: application/json" -H "AUTH: 123A456B" -X GET https://myVizioTV:9000/menu_native/dynamic/tv_settings/picture
Authenticated
Warning Writing an invalid value may have the potential to brick sets. Use the TYPE
key from SETTINGS_CNAME
ITEMS
array to determine the data type to write.
PUT /menu_native/dynamic/tv_settings/SETTINGS_CNAME/ITEMS_CNAME
{
"REQUEST": "MODIFY",
"HASHVAL": Integer,
"VALUE": String/Integer/Boolean
}
Obtain ITEMS_CNAME
and HASHVAL
values from the SETTINGS_CNAME
ITEMS
array.
curl -k -H "Content-Type: application/json" -H "AUTH: 123A456B" -X PUT -d '{"REQUEST": "MODIFY", "HASHVAL": 831638627, "VALUE": "On"}' https://myVizioTV:9000/menu_native/dynamic/tv_settings/picture/game_low_latency
SETTINGS_CNAME |
---|
picture |
picture/picture_size |
picture/picture_position |
picture/picture_mode_edit |
picture/color_calibration |
picture/color_calibration/color_tuner |
picture/color_calibration/calibration_tests |
audio |
timers |
network |
channels |
closed_captions |
devices |
system |
system/system_information |
system/system_information/tv_information |
system/system_information/tuner_information |
system/system_information/network_information |
system/system_information/uli_information |
mobile_devices |
cast |
Name | Name_Space | App_id | Message |
---|---|---|---|
Hulu | 2 | 3 | None |
Prime Video | 2 | 4 | None |
Crackle | 2 | 5 | None |
iHeartRadio | 2 | 6 | None |
Fandango Now | 2 | 7 | None |
Plex | 2 | 9 | None |
NBC | 2 | 10 | None |
Baeble | 2 | 11 | None |
Curiosity Stream | 2 | 12 | None |
Newsy | 2 | 15 | None |
Dove Channel | 2 | 16 | None |
ConTV | 2 | 18 | None |
Toon Goggles | 2 | 21 | None |
Vudu | 2 | 21 | https://my.vudu.com/castReceiver/index.html?launch-source=app-icon |
WatchFree | 2 | 22 | None |
FilmRise | 2 | 24 | None |
TasteIt | 2 | 26 | None |
AsianCrush | 2 | 27 | https://html5.asiancrush.com/?ua=viziosmartcast |
DAZN | 2 | 34 | None |
Flixfling | 2 | 36 | None |
CBS All Access | 2 | 37 | None |
FitFusion by Jillian Michaels | 2 | 39 | None |
Redbox | 2 | 41 | None |
CBS CBS News | 2 | 42 | None |
Cocoro TV | 2 | 55 | None |
Love Destination | 2 | 57 | None |
Haystack TV | 0 | 898AF734 | {"CAST_NAMESPACE":"urn:x-cast:com.google.cast.media","CAST_MESSAGE":{"type":"LOAD","media":{},"autoplay":true,"currentTime":0,"customData":{"platform":"sctv"}}} |
XUMO | 0 | 36E1EA1F | {"CAST_NAMESPACE":"urn:x-cast:com.google.cast.media","CAST_MESSAGE":{"type":"LOAD","media":{},"autoplay":true,"currentTime":0,"customData":{}}} |
Pluto TV | 0 | E6F74C01 | {"CAST_NAMESPACE":"urn:x-cast:tv.pluto","CAST_MESSAGE":{"command":"initializePlayback","channel":"","episode":"","time":0}} |
Netflix | 3 | 1 | None |
YouTubeTV | 5 | 1 | None |
A current list of
app_id
's can be found at http://hometest.buddytv.netdna-cdn.com/appservice/vizio_apps_prod.json andNAME_SPACE
andMESSAGE
values needed can be found in http://hometest.buddytv.netdna-cdn.com/appservice/app_availability_prod.json
RESULT |
---|
success |
failure |
uri_not_found |
aborted |
busy |
blocked |
requires_pairing |
requires_system_pin |
requires_new_system_pin |
net_wifi_needs_valid_ssid |
net_wifi_already_connected |
net_wifi_missing_password |
net_wifi_not_existed |
net_wifi_missing_password |
net_wifi_needs_valid_ssid |
net_wifi_auth_rejected |
net_wifi_connect_timeout |
net_wifi_connect_aborted |
net_wifi_connection_error |
net_ip_manual_config_error |
net_ip_dhcp_failed |
net_unknown_error |
ITEM |
---|
T_UNKNOWN_V1 |
T_NO_TYPE_V1 |
T_HIDDEN_NETWORK_V1 |
T_DST_LIST_V1 |
T_MENU_V1 |
T_MENU_X_V1 |
T_LIST_V1 |
T_LIST_X_V1 |
T_VALUE_ABS_V1 |
T_VALUE_V1 |
T_STRING_V1 |
T_PIN_V1 |
T_IP_ADDRESS_V1 |
T_MAC_ADDRESS_V1 |
T_MATRIX_V1 |
T_HEADER_V1 |
T_ROW_V1 |
T_DEVICE_V1 |
T_ACTION_V1 |
T_APS_V1 |
T_AP_V1 |
T_PASSWORD_V1 |
T_SOFTAP_CONFIG_V1 |
T_LIST_PAIRED_DEVICES_V1 |
T_TEST_CONNECTION_V1 |
T_IETF_2822_STRING_V1 |
T_DATE_V1 |
T_LIST_CEC_DEVICE_V1 |
T_MANUAL_IP_CONFIG_V1 |
T_VIZIO_DEVICE_INFO_V1 |
T_UPDATE_INFO_V1 |
T_ARRAY_V1 |
T_EMAIL_V1 |
T_LIST_VALUES_V1 |
T_CEC_DEVICE_V1 |
ed: I can't see where these are used, but included anyway for completion.
Add a MODIFIER
pair to /key_command
request if used.
Event Name | Codeset | Code | Modifier |
---|---|---|---|
0 | 0 | 48 | |
1 | 0 | 49 | |
& | 0 | 38 | |
* | 0 | 42 | |
Backspace | 0 | 8 | |
Bel | 0 | 7 | |
Cancel | 0 | 14 | |
, | 0 | 44 | |
$ | 0 | 36 | |
Esc | 0 | 27 | |
! | 0 | 33 | |
\ | 0 | 47 | |
- | 0 | 45 | |
( | 0 | 40 | |
Linefeed | 0 | 10 | |
% | 0 | 37 | |
. | 0 | 46 | |
+ | 0 | 43 | |
# | 0 | 35 | |
" | 0 | 34 | |
Return | 0 | 13 | |
) | 0 | 41 | |
' | 0 | 39 | |
Space | 0 | 52 | |
Tab | 0 | 9 | |
Audio MTS | 5 | 5 | TYPE |
MTS Cycle | 5 | 6 | TYPE |
Picture Mode | 6 | 0 | |
Wide Mode | 6 | 1 | |
Wide Cycle | 6 | 2 |
Name | Codeset |
---|---|
ASCII | 0 |
Key Modifier | 1 |
Transport | 2 |
D-Pad | 3 |
Nav | 4 |
Audio | 5 |
Video | 6 |
Input | 7 |
CH | 8 |
Color | 9 |
Launch | 10 |
Power | 11 |
3D | 12 |
CC | 13 |
Factor | 14 |