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.comso will likely fail SSL validation. -
API includes a
Statusobject,URIrequested, and Executiontimeon 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
statusobject. Result codes included where applicable. -
All requests made should contain a JSON body with the header
Content-Type: application/jsonset. -
When authentication is required, send
Auth: AUTH_TOKENheader 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_SPACEandMESSAGEvalues 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 |