Summary

MusicCast-enabled Yamaha A/V device controlled via Yamaha Extended Control (YXC), an HTTP/REST API over Ethernet/Wi-Fi. This spec covers the Advanced API surface (Link distribution, zone link control, stereo pair query). Basic playback/zone/power commands live in the YXC Basic specification and are not represented here.

Transport

protocols:
  - http
addressing:
  base_url: "http://{host}/YamahaExtendedControl"
  port: null  # UNRESOLVED: port number not stated in source
auth:
  type: null  # UNRESOLVED: source mentions optional `[/secure]` URI prefix for setLinkAudioQuality but auth procedure is not described in this Advanced document

Traits

- queryable  # inferred from query command examples (getDistributionInfo, getStereoPairInfo)

Actions

- id: set_link_control
  label: Set Link Control
  kind: action
  command: "GET /v1/{zone}/setLinkControl?control={control}"
  params:
    - name: zone
      type: enum
      values: [main, zone2, zone3, zone4]
      description: Target zone
    - name: control
      type: string
      description: Link Control setting; valid values returned by /system/getFeatures (e.g. "normal", "stability")

- id: set_link_audio_delay
  label: Set Link Audio Delay
  kind: action
  command: "GET /v1/{zone}/setLinkAudioDelay?delay={delay}"
  params:
    - name: zone
      type: enum
      values: [main, zone2, zone3, zone4]
      description: Target zone
    - name: delay
      type: string
      description: Link Audio Delay setting; valid values returned by /system/getFeatures (e.g. "lip_sync")
  notes: Setting is invalid when Link Control is "Stability Boost"

- id: set_link_audio_quality
  label: Set Link Audio Quality
  kind: action
  command: "GET /v1/{zone}/setLinkAudioQuality?mode={mode}"
  params:
    - name: zone
      type: enum
      values: [main, zone2, zone3, zone4]
      description: Target zone
    - name: mode
      type: string
      description: Link Audio Quality setting; valid values returned by /system/getFeatures (e.g. "compressed")
  notes: Source documents an optional secure variant `<BaseURL>/secure/v1/<zone>/setLinkAudioQuality?mode=<mode>`

- id: get_distribution_info
  label: Get Distribution Info
  kind: query
  command: "GET /v1/dist/getDistributionInfo"
  params: []

- id: set_server_info
  label: Set Server Info (Link Master)
  kind: action
  command: "POST /v1/dist/setServerInfo"
  params:
    - name: group_id
      type: string
      description: 32-digit hex Group ID; empty string ("") cancels Link distribution server status
    - name: zone
      type: enum
      values: [main, zone2, zone3, zone4]
      description: Target zone for Link distribution server (optional; keeps current setting if omitted)
    - name: type
      type: enum
      values: [add, remove]
      description: Add or remove clients (optional; not needed when cancelling master status)
    - name: client_list
      type: array
      description: IP addresses of clients to add/remove; up to 9 entries (optional)
  notes: JSON POST body. Example body shown in source.

- id: set_client_info
  label: Set Client Info
  kind: action
  command: "POST /v1/dist/setClientInfo"
  params:
    - name: group_id
      type: string
      description: 32-digit hex Group ID; empty string ("") cancels Link distributed client status
    - name: zone
      type: array
      description: Array of zone IDs to be Link distributed client; values from [main, zone2, zone3, zone4] (optional when cancelling client status)
    - name: server_ip_address
      type: string
      description: IP address of the Link distribution server (optional)
  notes: JSON POST body. If device is already configured as Link server, this call is denied - cancel server first via setServerInfo.

- id: start_distribution
  label: Start Distribution
  kind: action
  command: "GET /v1/dist/startDistribution?num={num}"
  params:
    - name: num
      type: integer
      description: Link distribution number on current MusicCast Network
  notes: Valid only on a device configured as Link distribution server

- id: stop_distribution
  label: Stop Distribution
  kind: action
  command: "GET /v1/dist/stopDistribution"
  params: []
  notes: Valid only on a device configured as Link distribution server

- id: set_group_name
  label: Set Group Name
  kind: action
  command: "POST /v1/dist/setGroupName"
  params:
    - name: name
      type: string
      description: Group Name in UTF-8, up to 128 bytes; empty string ("") restores default. Stored in volatile memory.
  notes: JSON POST body.

- id: get_stereo_pair_info
  label: Get Stereo Pair Info
  kind: query
  command: "GET /v1/system/getStereoPairInfo"
  params: []
  notes: Referenced in Application Notes section 9.3; documented via example only

Feedbacks

- id: response_code
  type: integer
  description: Returned by every API call. 0 = success; non-zero = error per Response Code List
  values:
    - 0    # Successful request
    - 1    # Initializing
    - 2    # Internal Error
    - 3    # Invalid Request
    - 4    # Invalid Parameter
    - 5    # Guarded
    - 6    # Time Out
    - 99   # Firmware Updating
    - 100  # Access Error (streaming)
    - 101  # Other Errors (streaming)
    - 102  # Wrong User Name
    - 103  # Wrong Password
    - 104  # Account Expired
    - 105  # Account Disconnected
    - 106  # Account Number Limit
    - 107  # Server Maintenance
    - 108  # Invalid Account
    - 109  # License Error
    - 110  # Read Only Mode
    - 111  # Max Stations
    - 112  # Access Denied
    - 113  # Additional Playlist destination required
    - 114  # New Playlist required
    - 115  # Simultaneous login limit reached
    - 200  # Linking in progress
    - 201  # Unlinking in progress

- id: distribution_role
  type: enum
  description: Returned by getDistributionInfo - role of device in Link distribution
  values: [server, client, none]

- id: distribution_status
  type: enum
  description: Returned by getDistributionInfo when role is server - construction state of distribution system (valid for API >= 2.00)
  values: [building, working, deleting]

- id: distribution_server_zone
  type: enum
  description: Returned by getDistributionInfo - target zone that can act as client of distributing server
  values: [main, zone2, zone3, zone4]

- id: distribution_client_list
  type: array
  description: Returned by getDistributionInfo when role is server - array of {ip_address, data_type} where data_type is "base" or "ext"

- id: distribution_group_id
  type: string
  description: Returned by getDistributionInfo - 32-digit hex Group ID; all-zeros means no group

- id: distribution_group_name
  type: string
  description: Returned by getDistributionInfo - current Group Name

- id: distribution_build_disable
  type: array
  description: Returned by getDistributionInfo - array of {role, reasons[]} indicating distribution construction prohibitions; reasons include "unknown", "not_implemented"

- id: distribution_audio_dropout
  type: boolean
  description: Returned by getDistributionInfo - true if sound interruption was detected during distribution. Cleared on CONNECT or Network Module reset.

- id: stereo_pair_status
  type: enum
  description: Returned by getStereoPairInfo - stereo pair role
  values: [master_left, master_right, slave_left, slave_right]  # UNRESOLVED: source shows "master_left" and "slave_right" examples only; full enum not enumerated
  # UNRESOLVED: full value set not enumerated in source

- id: stereo_pair_info
  type: object
  description: Returned by getStereoPairInfo - {alive: boolean, ip_address: string, mac_address: string} for the paired device

Variables

# UNRESOLVED: settable parameters are exposed via the action commands above; no separate variable surface documented in this Advanced spec

Events

# Source section 9.2 states events are spread as UDP unicast and recommends polling because of UDP packet loss.
# Specific event payload formats are not enumerated in this Advanced document.
# UNRESOLVED: event payload formats and UDP port not specified in source

Macros

# Source documents the following multi-step procedures in Application Notes (section 9.1):
- id: create_group
  label: Make a Group (Link Master + Clients)
  description: |
    1. Create a random 16-byte Group ID.
    2. For each client: POST setClientInfo with group_id and zone.
    3. POST setServerInfo on master with group_id, zone, type="add", client_list of client IPs.
    4. GET startDistribution?num=<N> on master with current system distribution number.
    When complete, getDistributionInfo status changes to "working".

- id: remove_client_from_group
  label: Remove Client from Group
  description: |
    1. On the client: POST setClientInfo with group_id="" and the zone array.
    2. On the master: POST setServerInfo with group_id, zone, type="remove", client_list of IPs to remove.
       (If removing all clients, set group_id="" in setServerInfo instead.)
    3. GET startDistribution?num=<N> on master to reflect new distribution number.

- id: add_client_to_group
  label: Add Client to Existing Group
  description: |
    1. On the new client: POST setClientInfo with group_id and zone.
    2. On the master: POST setServerInfo with group_id, zone, type="add", client_list of new client IPs.
    3. GET startDistribution?num=<N> on master to reflect new distribution number.

- id: stereo_pair_distribution
  label: Distribute to Stereo Pair as Clients
  description: |
    1. Confirm pair status via GET getStereoPairInfo on each pair member.
    2. On one pair member (e.g. master_left): POST setClientInfo with group_id, zone, and server_ip_address.
    3. On the distribution server: POST setServerInfo with group_id, zone, type="add", client_list containing the pair-member IP.
    4. GET startDistribution?num=<N> (>=3 per source example) on server.

Safety

confirmation_required_for: []
interlocks: []
# UNRESOLVED: no safety warnings, interlocks, or power-sequencing requirements stated in source.
# Source notes operational cautions (e.g. group creation may take up to 2-3 minutes when Link control is "standard"/"stability"; do not interrupt) but no device-safety hazards.

Notes

  • Source is "Yamaha Extended Control API Specification (Advanced) Rev. 2.00". Basic playback, volume, input, and power commands are defined in a separate Basic specification not provided here.
  • Backward compatibility statement: all APIs with version <= the value returned by getDeviceInfo are supported on a given device.
  • JSON responses in the source are formatted for readability; actual responses contain no spaces, indents, or carriage returns.
  • Group creation between mixed-generation MusicCast devices (pre-2017 vs 2018+) requires firmware compatibility checks via getFeatures.distribution.compatible_client and getDeviceInfo.netmodule_generation (source section 9.1.1, 9.1.8). For pre-API-2.00 devices, max Group size is 10; for API >= 2.00, max is dictated by getFeatures get_max + 1.
  • Group Name is stored in volatile memory only (lost on power cycle).
  • Multi-Zone receivers: each zone cannot join a different group independently; Zone A and B must join together as clients; one zone cannot be master and another client in the same group (section 9.1.7).
  • Events arrive as UDP unicast with potential packet loss — polling is recommended.
  • Group volume control: master records all room volumes at start of operation, then scales client volumes proportionally; sub-unit changes use setClientVolume (defined in Basic spec).

Provenance

source_domains:
  - wiki.elvis.science
  - community.symcon.de
  - github.com
source_urls:
  - "https://wiki.elvis.science/images/5/5c/Yamaha_Extended_Control_API_Specification_%28Advanced%29.pdf"
  - https://community.symcon.de/uploads/short-url/vRXaJXAn6vI2DSQYMHF0aqLbdir.pdf
  - https://github.com/opctim/yamaha-extended-control-openapi/blob/main/yamaha-extended-control.yaml
retrieved_at: 2026-06-02T00:21:26.799Z
last_checked_at: 2026-06-04T06:37:46.185Z

Verification Summary

verdict: verified
checked_at: 2026-06-04T06:37:46.185Z
matched_actions: 10
action_count: 10
confidence: medium
summary: "All 10 advanced API commands matched verbatim in source with correct transport and method signatures. Spec is complete for Advanced API surface. (16 unresolved item(s) noted in Known Gaps.)"

Known Gaps

- "TCP port number not stated (HTTP base URL given without explicit port)"
- "authentication details — source hints at optional `[/secure]` URI prefix in setLinkAudioQuality but no auth procedure is described in this Advanced document"
- "Basic API commands (power, input, volume, etc.) are referenced but defined in a separate document not provided here"
- "port number not stated in source"
- "source mentions optional `[/secure]` URI prefix for setLinkAudioQuality but auth procedure is not described in this Advanced document"
- "source shows \"master_left\" and \"slave_right\" examples only; full enum not enumerated"
- "full value set not enumerated in source"
- "settable parameters are exposed via the action commands above; no separate variable surface documented in this Advanced spec"
- "event payload formats and UDP port not specified in source"
- "no safety warnings, interlocks, or power-sequencing requirements stated in source."
- "TCP port for HTTP base URL not stated"
- "authentication mechanism for `/secure` URI variant not described in this document"
- "full enum of stereo pair status values; only \"master_left\" and \"slave_right\" appear in examples"
- "UDP port for event unicast not stated"
- "setClientVolume command referenced in section 9.1.9 but defined in Basic spec (not included here)"
- "getFeatures, getDeviceInfo, getStatus referenced throughout but defined in Basic spec"

From the AI4AV catalog (https://ai4av.net) · ODbL-1.0