The Sony Bravia Pro displays expose a REST API over HTTP using JSON-RPC 2.0 protocol. The API is organized into services, each accessible at a dedicated endpoint path. Authentication is via Pre-Shared Key (PSK) in a custom HTTP header.
- Header:
X-Auth-PSK: <key> - Configured on TV: Settings > Network & Internet > Local network setup > IP control > Authentication
- The PSK can be any character string
Each API method has one of three auth levels:
- none — No authentication required (read-only status queries)
- generic — Requires PSK header (control/write operations)
- private — Requires PSK header with elevated access (sensitive data like app lists, network settings)
POST /sony/<service> HTTP/1.1
Host: <TV_IP>
X-Auth-PSK: <PSK>
Content-Type: application/json; charset=UTF-8
{
"method": "<methodName>",
"id": 1,
"params": [{}],
"version": "1.0"
}method: API method nameid: Integer request identifier (arbitrary, returned in response)params: Array of parameter objects (often[{}]or[]for no params)version: API version string (e.g., "1.0", "1.1", "1.2")
{"result": [<data>], "id": 1}{"error": [<code>, "<message>"], "id": 1}| Method | Version | Auth | Description |
|---|---|---|---|
| getSupportedApiInfo | 1.0 | none | Returns all available services and their supported API methods |
getSupportedApiInfo — Discovery endpoint. Returns array of service objects:
{
"service": "system",
"protocols": ["xhrpost:jsonizer"],
"apis": [{"name": "getSystemInformation", "versions": ["1.0", "1.7"]}],
"notifications": [{"name": "notifyPowerStatus", "versions": ["1.0"]}]
}Use this to discover what the specific TV model supports at runtime.
| Method | Version | Auth | Description |
|---|---|---|---|
| getSystemInformation | 1.0, 1.7 | none | Device info (model, serial, MAC, firmware) |
| getPowerStatus | 1.0 | none | Current power state |
| setPowerStatus | 1.0 | generic | Power on/off |
| getRemoteControllerInfo | 1.0 | none | Available IRCC remote codes |
| getNetworkSettings | 1.0 | private | Network configuration (IP, DNS) |
| getInterfaceInformation | 1.0 | none | Interface info |
| getSystemSupportedFunction | 1.0 | none | Supported features list |
| getLEDIndicatorStatus | 1.0 | none | LED status |
| setLEDIndicatorStatus | 1.0, 1.1 | generic | Control LED indicator |
| getPowerSavingMode | 1.0 | none | Power saving mode status |
| setPowerSavingMode | 1.0 | generic | Set power saving mode |
| getCurrentTime | 1.0, 1.1 | none | Device time |
| getWolMode | 1.0 | none | Wake-on-LAN status |
| setWolMode | 1.0 | generic | Enable/disable WoL |
| getRemoteDeviceSettings | 1.0 | private | Remote device settings |
| requestReboot | 1.0 | generic | Reboot device |
| getScreenshot | 1.0 | generic | Capture screen as PNG |
getSystemInformation (v1.0)
// Response: model name, serial, MAC address, firmware version, etc.
{"result": [{"product": "TV", "model": "FW-75BZ35L", "serial": "...", "macAddr": "...", "name": "..."}]}getPowerStatus (v1.0)
// Request: {"method": "getPowerStatus", "id": 1, "params": [], "version": "1.0"}
// Response when ON:
{"result": [{"status": "active"}], "id": 1}
// Response when STANDBY:
{"result": [{"status": "standby"}], "id": 1}setPowerStatus (v1.0)
// Power ON:
{"method": "setPowerStatus", "id": 1, "params": [{"status": true}], "version": "1.0"}
// Power OFF:
{"method": "setPowerStatus", "id": 1, "params": [{"status": false}], "version": "1.0"}getRemoteControllerInfo (v1.0) Returns array of IRCC button name/code mappings. Response varies by model.
{"result": [[{"name": "PowerOff", "value": "AAAAAQAAAAEAAAAvAw=="}, {"name": "Input", "value": "..."}, ...]]}setLEDIndicatorStatus
- v1.0:
{"status": true/false} - v1.1:
{"status": "on"/"off"}
setPowerSavingMode (v1.0)
{"mode": "off"/"low"/"high"/"pictureOff"}— values are device-specific
| Method | Version | Auth | Description |
|---|---|---|---|
| getVolumeInformation | 1.0 | none | Volume levels, mute state |
| setAudioVolume | 1.0, 1.2 | generic | Set volume (absolute or relative) |
| setAudioMute | 1.0 | generic | Mute/unmute |
| getSpeakerSettings | 1.0 | none | Speaker configuration |
| setSpeakerSettings | 1.0 | generic | Configure speakers |
| setSoundSettings | 1.1 | generic | Audio output settings |
getVolumeInformation (v1.0)
{"result": [[
{"target": "speaker", "volume": 25, "mute": false, "maxVolume": 100, "minVolume": 0},
{"target": "headphone", "volume": 15, "mute": false, "maxVolume": 100, "minVolume": 0}
]]}setAudioVolume
- v1.0:
{"target": "", "volume": "25"}— target: "" (all), "speaker", "headphone"- Absolute:
"25", Relative:"+5"or"-5"
- Absolute:
- v1.2: Adds
"ui": "on"/"off"to show/hide volume OSD
setAudioMute (v1.0)
{"method": "setAudioMute", "params": [{"status": true}], ...} // mute
{"method": "setAudioMute", "params": [{"status": false}], ...} // unmutegetSpeakerSettings (v1.0)
- Targets: "tvPosition", "subwooferLevel", "subwooferFreq", "subwooferPhase", "subwooferPower"
setSoundSettings (v1.1)
- Output terminal:
{"settings": [{"target": "outputTerminal", "value": "speaker"}]} - Values: "speaker", "speaker_hdmi", "hdmi", "audioSystem"
| Method | Version | Auth | Description |
|---|---|---|---|
| getPlayingContentInfo | 1.0 | private | Currently playing content |
| setPlayContent | 1.0 | generic | Switch input/play content |
| getCurrentExternalInputsStatus | 1.0, 1.1 | none | HDMI/input port status |
| getSchemeList | 1.0 | private | Available URI schemes |
| getSourceList | 1.0 | private | Sources for a scheme |
| getContentList | 1.5 | private | Browse content |
| getContentCount | 1.0, 1.1 | private | Content count |
getPlayingContentInfo (v1.0)
{"result": [{"uri": "extInput:hdmi?port=1", "source": "extInput:hdmi", "title": "HDMI 1"}]}Limitation: Returns null/empty for native apps (Netflix, YouTube). Only reliable for TV inputs.
setPlayContent (v1.0)
// Switch to HDMI 2:
{"method": "setPlayContent", "params": [{"uri": "extInput:hdmi?port=2"}], ...}
// Switch to HDMI 1:
{"method": "setPlayContent", "params": [{"uri": "extInput:hdmi?port=1"}], ...}getCurrentExternalInputsStatus
- v1.0: Returns
uri,title,connection(boolean),label,icon - v1.1: Adds
statusfield ("true"/"false"/null for signal detection)
URI Formats for Inputs:
- HDMI:
extInput:hdmi?port=N(N=1-4) - Component:
extInput:component?port=N - Composite:
extInput:composite?port=N - SCART:
extInput:scart?port=N - CEC:
extInput:cec?type=player&port=N
getSchemeList (v1.0)
{"result": [["extInput", "tv", "dlna", "storage"]]}getSourceList (v1.0)
// Request: {"params": [{"scheme": "extInput"}]}
// Response: [{"source": "extInput:hdmi"}, {"source": "extInput:component"}, ...]getContentList (v1.5)
// Request: {"params": [{"uri": "extInput:hdmi", "stIdx": 0, "cnt": 50}]}
// Response: [{"uri": "extInput:hdmi?port=1", "title": "HDMI 1", "index": 0}, ...]| Method | Version | Auth | Description |
|---|---|---|---|
| getApplicationList | 1.0 | private | List installed apps |
| setActiveApp | 1.0 | generic | Launch an app |
| getApplicationStatusList | 1.0 | none | App status (textInput, cursor, webBrowse) |
| getWebAppStatus | 1.0 | private | Web app status |
| terminateApps | 1.0 | generic | Kill all foreground apps |
| setTextForm | 1.0, 1.1 | generic | Input text to keyboard |
| getTextForm | 1.1 | private | Read text from keyboard |
| prepareAppUpload | 1.0 | generic | Prepare for sideload (BZ series only) |
| installApp | 1.0 | generic | Install sideloaded app (BZ series only) |
| uninstallApp | 1.0 | generic | Uninstall app (BZ series only) |
getApplicationList (v1.0)
{"result": [[
{"title": "Netflix", "uri": "com.sony.dtv.com.netflix.ninja.com.netflix.ninja.MainActivity", "icon": "http://..."},
{"title": "YouTube", "uri": "com.sony.dtv.com.google.android.youtube.tv.com.google.android.apps.youtube.tv.MainActivity", "icon": "http://..."}
]]}setActiveApp (v1.0)
// Launch Netflix:
{"method": "setActiveApp", "params": [{"uri": "com.sony.dtv.com.netflix.ninja.com.netflix.ninja.MainActivity"}]}
// Launch web app:
{"method": "setActiveApp", "params": [{"uri": "localapp://webappruntime?url=https://example.com"}]}getApplicationStatusList (v1.0)
{"result": [[
{"name": "textInput", "status": "off"},
{"name": "cursorDisplay", "status": "off"},
{"name": "webBrowse", "status": "off"}
]]}terminateApps (v1.0) — Terminates all foreground apps. Some system apps may not terminate (error 41403).
| Method | Version | Auth | Description |
|---|---|---|---|
| getPictureQualitySettings | 1.0 | none | Picture quality settings |
| setPictureQualitySettings | 1.0 | generic | Adjust picture quality |
| getScreenRotation | 1.0 | none | Screen rotation angle |
| setScreenRotation | 1.0 | generic | Rotate screen |
setPictureQualitySettings (v1.0)
{"method": "setPictureQualitySettings", "params": [{"settings": [
{"target": "brightness", "value": "50"},
{"target": "contrast", "value": "50"}
]}]}setScreenRotation (v1.0)
{"method": "setScreenRotation", "params": [{"angle": 0}]} // 0, 90, 180, 270| Method | Version | Auth | Description |
|---|---|---|---|
| setSceneSetting | 1.0 | generic | Set scene/picture mode |
Note: The official Bravia Pro documentation only lists setSceneSetting. Other methods
like blank screen may be handled via IRCC codes or power saving mode (setPowerSavingMode
with mode "pictureOff").
| Method | Version | Auth | Description |
|---|---|---|---|
| getPublicKey | 1.0 | none | RSA public key for text encryption |
Used with setTextForm v1.1 for encrypted keyboard input.
The IRCC endpoint uses SOAP/XML format, not JSON-RPC.
<?xml version="1.0" encoding="utf-8"?>
<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/"
s:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
<s:Body>
<u:X_SendIRCC xmlns:u="urn:schemas-sony-com:service:IRCC:1">
<IRCCCode>BASE64_CODE_HERE</IRCCCode>
</u:X_SendIRCC>
</s:Body>
</s:Envelope>Content-Type: text/xml; charset=UTF-8
X-Auth-PSK: <PSK>
SOAPACTION: "urn:schemas-sony-com:service:IRCC:1#X_SendIRCC"
Codes are obtained at runtime via getRemoteControllerInfo. Common codes include:
| Button | Code |
|---|---|
| PowerOff | AAAAAQAAAAEAAAAvAw== |
| Display/BlankScreen | AAAAAQAAAAEAAAA+Aw== |
| Input | AAAAAQAAAAEAAAAlAw== |
| Num1 | AAAAAQAAAAEAAAAAAw== |
| Num2 | AAAAAQAAAAEAAAABAw== |
| Num3 | AAAAAQAAAAEAAAACAw== |
| Num4 | AAAAAQAAAAEAAAADAw== |
| Num5 | AAAAAQAAAAEAAAAEAw== |
| Num6 | AAAAAQAAAAEAAAAFAw== |
| Num7 | AAAAAQAAAAEAAAAGAw== |
| Num8 | AAAAAQAAAAEAAAAHAw== |
| Num9 | AAAAAQAAAAEAAAAIAw== |
| Num0 | AAAAAQAAAAEAAAAJAw== |
| VolumeUp | AAAAAQAAAAEAAAASAw== |
| VolumeDown | AAAAAQAAAAEAAAATAw== |
| Mute | AAAAAQAAAAEAAAAUAw== |
| ChannelUp | AAAAAQAAAAEAAAAQAw== |
| ChannelDown | AAAAAQAAAAEAAAARAw== |
| Up | AAAAAQAAAAEAAAB0Aw== |
| Down | AAAAAQAAAAEAAAB1Aw== |
| Left | AAAAAQAAAAEAAAB2Aw== |
| Right | AAAAAQAAAAEAAAB3Aw== |
| Confirm/Enter | AAAAAQAAAAEAAABlAw== |
| Home | AAAAAQAAAAEAAABgAw== |
| Return/Back | AAAAAgAAAJcAAAAjAw== |
| Options | AAAAAgAAAJcAAAA2Aw== |
| Play | AAAAAgAAAJcAAAAaAw== |
| Pause | AAAAAgAAAJcAAAAZAw== |
| Stop | AAAAAgAAAJcAAAAYAw== |
| Next | AAAAAgAAAJcAAAA8Aw== |
| Prev | AAAAAgAAAJcAAAA7Aw== |
Important: The actual available codes vary by TV model. Always use getRemoteControllerInfo to discover them at runtime.
- active — TV is on, API fully available
- standby — TV is in standby, limited API available (getPowerStatus works, most others fail)
- suspend — HTTP server stops completely, no API access at all
- Get MAC address via
getSystemInformation(while TV is active) - Create magic packet:
FF FF FF FF FF FF+ MAC address repeated 16 times - Send UDP to broadcast address on port 9 or 7
- Wait for TV to boot (can take 10-30 seconds)
- Call
setPowerStatus(true)if in Normal Mode (Pro Mode auto-enables display)
- Enable remote control: Settings > Network & Internet > Remote device settings > Control remotely
- Enable Wake-on-LAN for standby recovery
- Set PSK: Settings > Network & Internet > Local network setup > IP control > Authentication
- Not all endpoints exist on all models — check with
getSupportedApiInfo - FW-BZxxx series has exclusive app sideloading (prepareAppUpload, installApp, uninstallApp)
- Newer models may drop older API versions
- Some endpoints return HTTP 404 on unsupported models
- Only returns data when source information is in the TV's OSD
- Returns null/empty for native Android apps (Netflix, YouTube, etc.)
- HDMI inputs may return incomplete data on some models
- Standby: Network stack running, can respond to some API calls
- Suspend: Network stack stopped, no HTTP response at all — need WoL
- Integration must handle both
ConnectionRefused(suspend) and error responses (standby)
- Volume range varies by model (typically 0-100)
- Supports relative volume changes: "+5", "-5"
- Some models have separate speaker and headphone volumes
- Format:
com.sony.dtv.<package>.<activity> - Not standardized across models — must discover via
getApplicationList - Web apps:
localapp://webappruntime?url=<encoded_url>
Returned by many methods when the TV is powered off or in a state that doesn't support the operation.
- No WebSocket/push notification support documented for HTTP API
- Poll at reasonable intervals (10-30 seconds) to avoid overwhelming the TV
getPowerStatusis lightweight and suitable for frequent polling- Batch multiple status queries when TV is active
// Discover all supported APIs:
POST /sony/guide
{"method": "getSupportedApiInfo", "id": 1, "params": [{"services": []}], "version": "1.0"}// Discover methods for a specific service:
POST /sony/<service>
{"method": "getMethodTypes", "id": 1, "params": [""], "version": "1.0"}TV may expose UPnP descriptor at http://<TV_IP>:52323/dmr.xml with capability listing.
| API Endpoint | HA Platform | Purpose |
|---|---|---|
| system.getPowerStatus / setPowerStatus | media_player | Power on/off |
| audio.getVolumeInformation / setAudioVolume / setAudioMute | media_player | Volume control |
| avContent.getPlayingContentInfo / setPlayContent | media_player | Source selection |
| avContent.getCurrentExternalInputsStatus | media_player | Source list |
| appControl.getApplicationList / setActiveApp | media_player + select | App launching |
| system.getRemoteControllerInfo + IRCC | remote | Remote control |
| system.requestReboot | button | Reboot button |
| appControl.terminateApps | button | Kill apps button |
| system.setPowerSavingMode("pictureOff") | button | Blank screen |
| video.setPictureQualitySettings | select/number | Picture settings |
| video.setScreenRotation | select | Screen rotation |
| system.setLEDIndicatorStatus | switch/button | LED control |
| system.setWolMode | switch | WoL enable/disable |
| system.getSystemInformation | sensor | Model, firmware, serial |
| system.getCurrentTime | sensor | Device time |
| audio.getSpeakerSettings | sensor | Speaker info |