Summary
Network Hi-Fi receiver controllable over Ethernet/Wi-Fi via the Yamaha Extended Control (YXC) HTTP/JSON API. This spec covers the v1 YXC endpoints documented in the Yamaha Extended Control API Specification (Basic, Rev. 1.00) as exposed by MusicCast-enabled devices including the R-N602, plus the YXC event notification channel over UDP.
Transport
protocols:
- http
- udp
addressing:
base_url: http://{host}/YamahaExtendedControl
auth:
type: none # inferred: no auth procedure in source
Notes on transport (from source):
- HTTP requests are GET unless documented otherwise; one endpoint (
setSearchString) is documented as POST with a JSON body. - Events are sent as UDP unicast to the port given in the
X-AppPortrequest header, triggered when requests carryX-AppName: MusicCast/<app-version>andX-AppPort: <port>. Event timeout is 10 minutes and resets on each new request. - The TCP port for the HTTP API is not stated in the source (standard first-party Yamaha deployments use port 80 but is not asserted by this document).
Traits
- powerable # inferred: setPower endpoint
- routable # inferred: setInput / setSoundProgram endpoints
- queryable # inferred: getDeviceInfo, getStatus, getPlayInfo, etc.
- levelable # inferred: setVolume, setMute, tone_control / equalizer fields
Actions
- id: system_get_device_info
label: Get Device Info
kind: query
command: "GET /YamahaExtendedControl/v1/system/getDeviceInfo"
params: []
- id: system_get_features
label: Get Features
kind: query
command: "GET /YamahaExtendedControl/v1/system/getFeatures"
params: []
- id: system_get_network_status
label: Get Network Status
kind: query
command: "GET /YamahaExtendedControl/v1/system/getNetworkStatus"
params: []
- id: system_get_func_status
label: Get Func Status
kind: query
command: "GET /YamahaExtendedControl/v1/system/getFuncStatus"
params: []
- id: system_set_auto_power_standby
label: Set Auto Power Standby
kind: action
command: "GET /YamahaExtendedControl/v1/system/setAutoPowerStandby?enable={enable}"
params:
- name: enable
type: boolean
- id: system_get_location_info
label: Get Location Info
kind: query
command: "GET /YamahaExtendedControl/v1/system/getLocationInfo"
params: []
- id: system_send_ir_code
label: Send IR Code
kind: action
command: "GET /YamahaExtendedControl/v1/system/sendIrCode?code={code}"
params:
- name: code
type: string
description: "8-digit hex IR code from device IR list"
- id: zone_get_status
label: Get Zone Status
kind: query
command: "GET /YamahaExtendedControl/v1/{zone}/getStatus"
params:
- name: zone
type: string
description: "main / zone2 / zone3 / zone4"
- id: zone_get_sound_program_list
label: Get Sound Program List
kind: query
command: "GET /YamahaExtendedControl/v1/{zone}/getSoundProgramList"
params:
- name: zone
type: string
- id: zone_set_power
label: Set Zone Power
kind: action
command: "GET /YamahaExtendedControl/v1/{zone}/setPower?power={power}"
params:
- name: zone
type: string
description: "main / zone2 / zone3 / zone4"
- name: power
type: string
description: "on / standby / toggle"
- id: zone_set_sleep
label: Set Sleep Timer
kind: action
command: "GET /YamahaExtendedControl/v1/{zone}/setSleep?sleep={sleep}"
params:
- name: zone
type: string
- name: sleep
type: integer
description: "0 / 30 / 60 / 90 / 120 minutes"
- id: zone_set_volume
label: Set Zone Volume
kind: action
command: "GET /YamahaExtendedControl/v1/{zone}/setVolume?volume={volume}&step={step}"
params:
- name: zone
type: string
- name: volume
type: string
description: "integer value, or up / down (API 1.17+)"
- name: step
type: integer
description: "Optional step value when volume is up/down (API 1.17+)"
- id: zone_set_mute
label: Set Zone Mute
kind: action
command: "GET /YamahaExtendedControl/v1/{zone}/setMute?enable={enable}"
params:
- name: zone
type: string
- name: enable
type: boolean
- id: zone_set_input
label: Set Zone Input
kind: action
command: "GET /YamahaExtendedControl/v1/{zone}/setInput?input={input}&mode={mode}"
params:
- name: zone
type: string
- name: input
type: string
description: "Input ID from getFeatures input_list"
- name: mode
type: string
description: "Optional: autoplay_disabled (API 1.12+)"
- id: zone_set_sound_program
label: Set Sound Program
kind: action
command: "GET /YamahaExtendedControl/v1/{zone}/setSoundProgram?program={program}"
params:
- name: zone
type: string
- name: program
type: string
description: "Sound Program ID from getFeatures sound_program_list"
- id: zone_prepare_input_change
label: Prepare Input Change
kind: action
command: "GET /YamahaExtendedControl/v1/{zone}/prepareInputChange?input={input}"
params:
- name: zone
type: string
- name: input
type: string
- id: tuner_get_preset_info
label: Get Tuner Preset Info
kind: query
command: "GET /YamahaExtendedControl/v1/tuner/getPresetInfo?band={band}"
params:
- name: band
type: string
description: "common / am / fm / dab (per getFeatures preset.type)"
- id: tuner_get_play_info
label: Get Tuner Play Info
kind: query
command: "GET /YamahaExtendedControl/v1/tuner/getPlayInfo"
params: []
- id: tuner_set_freq
label: Set Tuner Frequency
kind: action
command: "GET /YamahaExtendedControl/v1/tuner/setFreq?band={band}&tuning={tuning}&num={num}"
params:
- name: band
type: string
description: "am / fm"
- name: tuning
type: string
description: "up / down / cancel / auto_up / auto_down / tp_up / tp_down / direct"
- name: num
type: integer
description: "Frequency in kHz (required only when tuning=direct)"
- id: tuner_recall_preset
label: Recall Tuner Preset
kind: action
command: "GET /YamahaExtendedControl/v1/tuner/recallPreset?zone={zone}&band={band}&num={num}"
params:
- name: zone
type: string
- name: band
type: string
description: "common / am / fm / dab"
- name: num
type: integer
- id: tuner_switch_preset
label: Switch Tuner Preset
kind: action
command: "GET /YamahaExtendedControl/v1/tuner/switchPreset?dir={dir}"
params:
- name: dir
type: string
description: "next / previous"
- id: tuner_store_preset
label: Store Tuner Preset
kind: action
command: "GET /YamahaExtendedControl/v1/tuner/storePreset?num={num}"
params:
- name: num
type: integer
- id: tuner_set_dab_service
label: Set DAB Service
kind: action
command: "GET /YamahaExtendedControl/v1/tuner/setDabService?dir={dir}"
params:
- name: dir
type: string
description: "next / previous"
- id: netusb_get_preset_info
label: Get NetUSB Preset Info
kind: query
command: "GET /YamahaExtendedControl/v1/netusb/getPresetInfo"
params: []
- id: netusb_get_play_info
label: Get NetUSB Play Info
kind: query
command: "GET /YamahaExtendedControl/v1/netusb/getPlayInfo"
params: []
- id: netusb_set_playback
label: Set NetUSB Playback
kind: action
command: "GET /YamahaExtendedControl/v1/netusb/setPlayback?playback={playback}"
params:
- name: playback
type: string
description: "play / stop / pause / play_pause / previous / next / fast_reverse_start / fast_reverse_end / fast_forward_start / fast_forward_end"
- id: netusb_toggle_repeat
label: Toggle NetUSB Repeat
kind: action
command: "GET /YamahaExtendedControl/v1/netusb/toggleRepeat"
params: []
- id: netusb_toggle_shuffle
label: Toggle NetUSB Shuffle
kind: action
command: "GET /YamahaExtendedControl/v1/netusb/toggleShuffle"
params: []
- id: netusb_get_list_info
label: Get NetUSB List Info
kind: query
command: "GET /YamahaExtendedControl/v1/netusb/getListInfo?input={input}&index={index}&size={size}&lang={lang}"
params:
- name: list_id
type: string
description: "Optional: main / auto_complete / search_artist / search_track"
- name: input
type: string
description: "NetUSB Input ID"
- name: index
type: integer
description: "Multiple of 8, 0..64992"
- name: size
type: integer
description: "1..8"
- name: lang
type: string
description: "en / ja / fr / de / es / ru / it / zh"
- id: netusb_set_list_control
label: NetUSB List Control
kind: action
command: "GET /YamahaExtendedControl/v1/netusb/setListControl?list_id={list_id}&type={type}&index={index}&zone={zone}"
params:
- name: list_id
type: string
- name: type
type: string
description: "select / play / return"
- name: index
type: integer
description: "Required for select/play; 0..64999"
- name: zone
type: string
description: "main / zone2 / zone3 / zone4 (used with type=play)"
- id: netusb_set_search_string
label: Set NetUSB Search String
kind: action
command: "POST /YamahaExtendedControl/v1/netusb/setSearchString"
params:
- name: body
type: json
description: 'JSON body e.g. {"list_id":"auto_complete","string":"michael"}'
- id: netusb_recall_preset
label: Recall NetUSB Preset
kind: action
command: "GET /YamahaExtendedControl/v1/netusb/recallPreset?zone={zone}&num={num}"
params:
- name: zone
type: string
- name: num
type: integer
- id: netusb_store_preset
label: Store NetUSB Preset
kind: action
command: "GET /YamahaExtendedControl/v1/netusb/storePreset?num={num}"
params:
- name: num
type: integer
- id: netusb_get_account_status
label: Get NetUSB Account Status
kind: query
command: "GET /YamahaExtendedControl/v1/netusb/getAccountStatus"
params: []
- id: netusb_switch_account
label: Switch NetUSB Account
kind: action
command: "GET /YamahaExtendedControl/v1/netusb/switchAccount?input={input}&index={index}&timeout={timeout}"
params:
- name: input
type: string
description: "pandora"
- name: index
type: integer
description: "0..7"
- name: timeout
type: integer
description: "0..60000 ms"
- id: netusb_get_service_info
label: Get NetUSB Service Info
kind: query
command: "GET /YamahaExtendedControl/v1/netusb/getServiceInfo?input={input}&type={type}&timeout={timeout}"
params:
- name: input
type: string
description: "pandora / rhapsody / napster"
- name: type
type: string
description: "account_list / licensing / activation_code"
- name: timeout
type: integer
- id: cd_get_play_info
label: Get CD Play Info
kind: query
command: "GET /YamahaExtendedControl/v1/cd/getPlayInfo"
params: []
- id: cd_set_playback
label: Set CD Playback
kind: action
command: "GET /YamahaExtendedControl/v1/cd/setPlayback?playback={playback}&num={num}"
params:
- name: playback
type: string
description: "play / stop / pause / previous / next / fast_reverse_start / fast_reverse_end / fast_forward_start / fast_forward_end / track_select"
- name: num
type: integer
description: "Track number 1..512 (only when playback=track_select)"
- id: cd_toggle_tray
label: Toggle CD Tray
kind: action
command: "GET /YamahaExtendedControl/v1/cd/toggleTray"
params: []
- id: cd_toggle_repeat
label: Toggle CD Repeat
kind: action
command: "GET /YamahaExtendedControl/v1/cd/toggleRepeat"
params: []
- id: cd_toggle_shuffle
label: Toggle CD Shuffle
kind: action
command: "GET /YamahaExtendedControl/v1/cd/toggleShuffle"
params: []
Feedbacks
# Observable response shapes returned by query endpoints.
# - id: power_state
# type: enum
# values: [on, standby]
# - id: zone_volume
# type: integer
# description: Range from /system/getFeatures range_step volume
# - id: zone_mute
# type: boolean
# - id: zone_input
# type: string
# description: Input ID from /system/getFeatures input_list
# - id: response_code
# type: integer
# description: "0 success / 1 initializing / 2 internal error / 3 invalid request / 4 invalid parameter / 5 guarded / 6 timeout / 99 firmware updating / 100s streaming service errors (see Response Code List)"
# - id: auto_power_standby
# type: boolean
# - id: ir_sensor
# type: boolean
# - id: speaker_a
# type: boolean
# - id: speaker_b
# type: boolean
# - id: headphone
# type: boolean
# - id: dimmer
# type: integer
# description: "-1 = auto dimmer, 0+ = manual"
# - id: network_connection
# type: string
# description: "wired_lan / wireless_lan / wireless_direct / extend_1 / extend_2 / extend_3 / unknown"
# - id: ip_address
# type: string
# - id: mac_address_wired_lan
# type: string
# - id: mac_address_wireless_lan
# type: string
# - id: mac_address_wireless_direct
# type: string
# - id: musiccast_network_device_type
# type: string
# description: "root / node / leaf / standard / unknown"
# - id: model_name
# type: string
# - id: api_version
# type: float
# - id: system_version
# type: float
# - id: netusb_playback
# type: string
# description: "play / stop / pause / fast_reverse / fast_forward"
# - id: netusb_repeat
# type: string
# description: "off / one / all"
# - id: netusb_shuffle
# type: string
# description: "off / on / songs / albums"
# - id: netusb_artist
# type: string
# - id: netusb_album
# type: string
# - id: netusb_track
# type: string
# - id: netusb_play_time
# type: integer
# - id: netusb_total_time
# type: integer
# - id: cd_device_status
# type: string
# description: "open / close / ready / not_ready"
# - id: cd_track_number
# type: integer
# - id: cd_total_tracks
# type: integer
# - id: tuner_band
# type: string
# description: "am / fm / dab"
# - id: tuner_freq
# type: integer
# description: "kHz (AM/FM) or station ID (DAB)"
# - id: tuner_tuned
# type: boolean
# - id: tuner_preset
# type: integer
Variables
# Settable parameters exposed as range_step objects under getFeatures.
# - id: volume
# type: integer
# description: "min/max/step from getFeatures range_step per zone"
# - id: tone_control
# type: integer
# - id: equalizer
# type: integer
# - id: balance
# type: integer
# - id: dialogue_level
# type: integer
# - id: dialogue_lift
# type: integer
# - id: subwoofer_volume
# type: integer
# - id: am_tuning
# type: integer
# description: "kHz; min/max/step from getFeatures tuner range_step"
# - id: fm_tuning
# type: integer
# - id: dimmer
# type: integer
Events
# Events are UDP unicast sent when the client request carries
# X-AppName: MusicCast/<version> and X-AppPort: <port> headers.
# Event timeout 10 minutes; reset by each new request.
#
# - id: system_event
# description: |
# Top-level system changes. Notify-flags include
# bluetooth_info_updated, func_status_updated, speaker_settings_updated,
# name_text_updated, tag_updated, location_info_updated,
# stereo_pair_info_updated.
# - id: zone_event
# description: |
# Per-zone status change. Notify fields: power, input, volume, mute,
# status_updated, signal_info_updated (main only).
# - id: tuner_event
# description: "play_info_updated, preset_info_updated"
# - id: netusb_event
# description: |
# play_error (code 0..100), multiple_play_errors (bitfield), play_message,
# account_updated, play_time, preset_info_updated, recent_info_updated,
# preset_control {type, num, result}, trial_status, trial_time_left,
# play_info_updated, list_info_updated.
# - id: cd_event
# description: "device_status, play_time, play_info_updated"
# - id: dist_event
# description: "dist_info_updated (Link distribution change)"
# - id: device_id_event
# description: "Device ID (API 1.17+)"
Macros
# - id: change_input_browse_play
# label: Change input, browse USB, then play a track
# description: |
# Documented end-to-end example in section 12.1 of the YXC Basic spec.
# Steps:
# 1. prepare_input_change on zone main, input=usb
# 2. set_input on zone main, input=usb, mode=autoplay_disabled
# 3. netusb get_list_info (input=usb, index=0, size=8, lang=en) to root
# 4. netusb set_list_control (list_id=main, type=select, index=<folder>)
# 5. netusb get_list_info with index stepped by 8 to page through list
# 6. netusb set_list_control (list_id=main, type=play, index=<file>)
# 7. netusb set_list_control (list_id=main, type=return) to go back a layer
# steps: []
Safety
confirmation_required_for: []
interlocks: []
# UNRESOLVED: no safety warnings, interlocks, or power-on sequencing
# requirements appear in this YXC spec. R-N602 hardware-specific
# cautions live in the Owner's Manual, not in this document.
Notes
- Source is the generic Yamaha Extended Control API Specification (Basic, Rev. 1.00), which covers MusicCast-enabled devices including the R-N602 but is not R-N602-specific.
- All endpoints use HTTP GET with URL-encoded parameters except
/netusb/setSearchString, which is HTTP POST with a JSON body. - Range/step values for volume, tone_control, equalizer, balance, dialogue_level, dialogue_lift, subwoofer_volume, AM/FM tuning, and dimmer are device-specific — read them from
/system/getFeaturesat runtime. - Input IDs and Sound Program IDs are enumerated in section 11 of the source (
All ID List); not all apply to the R-N602 — filter via/system/getFeaturesfor the actual device. setSearchStringuses HTTP POST; remaining endpoints in this spec are HTTP GET.- Events require the
X-AppNameandX-AppPortrequest headers to be set; otherwise the device does not emit events. getListInfois blocking and may take up to 30 s; other commands are rejected while it runs.- API version is reported in
/system/getDeviceInfoasapi_version; capabilities documented as "API Version 1.17+" are gated on the device's reported version. - The R-N602 Owner's Manual (yamaha.com) was identified as a complementary first-party source but was not parsed here; verify R-N602-specific input list, zone count, and any feature gating against it.
Provenance
source_domains:
- raw.githubusercontent.com
- github.com
source_urls:
- https://raw.githubusercontent.com/rsc-dev/pyamaha/master/doc/YXC_API_Spec_Basic.pdf
- https://raw.githubusercontent.com/rsc-dev/pyamaha/master/doc/YXC_API_Spec_Basic_v1.1.pdf
- https://raw.githubusercontent.com/rsc-dev/pyamaha/master/doc/YXC_API_Spec_Advanced.pdf
- https://github.com/mvdwetering/ynca/blob/master/docs/PROTOCOL.md
retrieved_at: 2026-07-22T00:49:56.964Z
last_checked_at: 2026-07-22T08:08:43.691Z
Verification Summary
verdict: verified
checked_at: 2026-07-22T08:08:43.691Z
matched_actions: 41
action_count: 41
confidence: medium
summary: "All 41 spec actions map 1:1 to the source's 41 documented YXC v1 endpoints (System/Zone/Tuner/NetUSB/CD) with matching query params and verbatim base URL. (7 unresolved item(s) noted in Known Gaps.)"
Known Gaps
- "R-N602-specific input list, zone count, and feature set not enumerated in this generic YXC spec — run /system/getFeatures on a real R-N602 to confirm"
- "endpoints from the Advanced YXC spec (distribution / link control, getDistributionInfo, etc.) are not represented in this Basic v1 spec — pull from the Advanced v2.0 mirror if those features are needed for R-N602"
- "full feedback enumeration should be generated from /main/getStatus response example on a real R-N602"
- "per-zone min/max/step values are device-specific — populate from /system/getFeatures on a real R-N602"
- "getListInfo blocks other commands for up to 30 s while fetching the list"
- "no safety warnings, interlocks, or power-on sequencing"
- "R-N602-specific input list, zone_num, and feature flags not enumerated in the generic YXC spec. UNRESOLVED: HTTP TCP port not stated in this source — first-party Yamaha deployments commonly use 80 but that is not asserted here. UNRESOLVED: Advanced YXC endpoints (distribution / link control) not represented — pull from YXC_API_Spec_Advanced_v2.0.pdf mirror if needed."
From the AI4AV catalog (https://ai4av.net) · ODbL-1.0