API documentation for Vizio SmartCast TV's
The following API clients are available based on these API docs:
On firmware versions older than 4.0 the API server runs on port 9000
, on 4.0 and newer the API server runs on port 7345
. 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 Execution time
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 @[email protected]
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 |