Summary
Barco Pulse projectors use a JSON-RPC 2.0 API available over TCP/IP on port 9090 and over RS-232 serial. The same JSON-RPC method/property/signal/object vocabulary drives authentication, property read/write/subscribe, signal subscribe/unsubscribe, introspection, and file upload over HTTP endpoints under /api.
Transport
protocols:
- tcp
- serial
- http
addressing:
port: 9090
base_url: http://<projector-ip>/api
auth:
type: code # source states a secret "code" pass code is required for elevated access; normal end-user level can skip auth
# UNRESOLVED: auth token format (only `code: 98765` shown), default user/access level name, session lifecycle
serial:
baud_rate: 19200
data_bits: 8
parity: none
stop_bits: 1
flow_control: none
Traits
- powerable # power on/off commands present
- routable # input source selection commands present
- queryable # property.get query commands present
- levelable # brightness/contrast/gamma/saturation/sharpness/illumination.power present
- subscribable # property.subscribe / signal.subscribe for change notifications
- introspectable # introspect method for object/method/property/signal enumeration
Actions
- id: authenticate
label: Authenticate (elevated access)
kind: action
command: '{"jsonrpc": "2.0", "method": "authenticate", "params": { "code": 98765 }, "id": 1}'
params:
- name: code
type: integer
description: Secret pass code granting elevated access level
- id: system_poweron
label: Power On
kind: action
command: '{"jsonrpc": "2.0", "method": "system.poweron", "params": { "id": 3, "property": "system.state" }, "id": 3}'
notes: Best practice: verify system.state is "standby" or "ready" before issuing. Method returns result:null, not an error.
params: []
- id: system_poweroff
label: Power Off
kind: action
command: '{"jsonrpc": "2.0", "method": "system.poweroff", "params": { "id": 4, "property": "system.state" }, "id": 4}'
notes: Best practice: verify system.state is "on" before issuing.
params: []
- id: property_set
label: Set Property Value
kind: action
command: '{"jsonrpc": "2.0", "method": "property.set", "params": { "property": "objectname.propertyname", "value": 100 }, "id": 3}'
notes: Wait for confirmation before re-setting the same property to avoid request flooding.
params:
- name: property
type: string
description: Dot-notation property name (e.g. image.window.main.source, image.brightness)
- name: value
type: string # type depends on property (string / float / int / bool)
description: New value, JSON-encoded
- id: property_get
label: Get Property Value
kind: query
command: '{"jsonrpc": "2.0", "method": "property.get", "params": { "property": "objectname.propertyname" }, "id": 4}'
params:
- name: property
type: string
description: Dot-notation property name
- id: property_get_multiple
label: Get Multiple Properties
kind: query
command: '{"jsonrpc": "2.0", "method": "property.get", "params": { "property": ["image.brightness","image.contrast"] }, "id": 5}'
params:
- name: property
type: array
description: List of dot-notation property names
- id: property_subscribe
label: Subscribe to Property Changes
kind: action
command: '{"jsonrpc": "2.0", "method": "property.subscribe", "params": { "property": "image.brightness" }, "id": 6}'
notes: Notifications arrive as property.changed method calls (no response expected for notifications).
params:
- name: property
type: string
description: Single property name or array of property names
- id: property_unsubscribe
label: Unsubscribe from Property Changes
kind: action
command: '{"jsonrpc": "2.0", "method": "property.unsubscribe", "params": { "property": "image.brightness" }, "id": 8}'
params:
- name: property
type: string
description: Single property name or array of property names
- id: signal_subscribe
label: Subscribe to Signal
kind: action
command: '{"jsonrpc": "2.0", "method": "signal.subscribe", "params": { "signal": "modelupdated" }, "id": 10}'
params:
- name: signal
type: string
description: Signal name or array of signal names
- id: signal_unsubscribe
label: Unsubscribe from Signal
kind: action
command: '{"jsonrpc": "2.0", "method": "signal.unsubscribe", "params": { "signal": "modelupdated" }, "id": 12}'
params:
- name: signal
type: string
description: Signal name or array of signal names
- id: introspect
label: Introspect Object (recursive)
kind: query
command: '{"jsonrpc": "2.0", "method": "introspect", "params": { "object": "foo", "recursive": true }, "id": 1}'
params:
- name: object
type: string
description: Object name (dot notation allowed); empty/default introspects everything
- name: recursive
type: boolean
description: If false, only direct children are listed (one level)
- id: introspect_non_recursive
label: Introspect Object (non-recursive)
kind: query
command: '{"jsonrpc": "2.0", "method": "introspect", "params": { "object": "motors", "recursive": false }, "id": 2}'
params:
- name: object
type: string
description: Object name
- name: recursive
type: boolean
description: Set to false for one-level listing
- id: ledctrl_blink
label: Blink Status LED
kind: action
command: '{"jsonrpc": "2.0", "method": "ledctrl.blink", "params": { "led": "systemstatus", "color": "red", "period": 42 }, "id": 3}'
params:
- name: led
type: string
description: LED identifier (e.g. systemstatus)
- name: color
type: string
description: LED color
- name: period
type: integer
description: Blink period
- id: image_source_list
label: List Available Sources
kind: query
command: '{"jsonrpc": "2.0", "method": "image.source.list", "id": 1}'
notes: Returns array of source names; contents vary by projector model.
params: []
- id: image_connector_list
label: List Available Connectors
kind: query
command: '{"jsonrpc": "2.0", "method": "image.connector.list", "id": 3}'
notes: Returns array of connector names; availability depends on projector model.
params: []
- id: image_source_listconnectors
label: List Connectors Used by Source
kind: query
command: '{"jsonrpc": "2.0", "method": "image.source.displayport1.listconnectors", "id": 4}'
params:
- name: sourceName
type: string
description: Source object name - translate from display name by stripping non-word chars and lowercasing (e.g. "DisplayPort 1" -> "displayport1")
- id: environment_getcontrolblocks
label: Get Environment Sensor Blocks
kind: query
command: '{"jsonrpc": "2.0", "method": "environment.getcontrolblocks", "params": { "type": "Sensor", "valuetype": "Temperature" }, "id": 18}'
params:
- name: type
type: string
description: "Sensor block type: Sensor | Filter | Controller | Actuator | Alarm | GenericBlock"
- name: valuetype
type: string
description: "Sensor value type: Temperature | Speed | PWM | Voltage | Current | Power | Altitude | Pressure | Humidity | ADC | Coordinate | Peltier | Waveform | Average | Delay | Difference | Interpolation | Limit | Median | Noise | Weighting | Comparison | Threshold | Formula | Driver | PID | Mode | State | Pump | Resistance | Simulation | Constant | Manual | Range | Any"
- id: environment_getalarminfo
label: Get Alarm Info
kind: query
command: '{"jsonrpc": "2.0", "method": "environment.getalarminfo"}'
notes: Returns array of alarm objects with severity, timestamp, source, description, custommessage.
params: []
- id: dmx_listchannels
label: List DMX Channels
kind: query
command: '{"jsonrpc": "2.0", "method": "dmx.listchannels"}'
params: []
- id: dmx_listmodes
label: List DMX Modes
kind: query
command: '{"jsonrpc": "2.0", "method": "dmx.listmodes"}'
notes: Extended mode exposes more channels than basic mode.
params: []
- id: firmware_listcomponents
label: List Firmware Components
kind: query
command: '{"jsonrpc": "2.0", "method": "firmware.listcomponents"}'
params: []
- id: firmware_listcomponentversionstatus
label: List Firmware Versions and Upgrade Status
kind: query
command: '{"jsonrpc": "2.0", "method": "firmware.listcomponentversionstatus"}'
params: []
- id: firmware_schedulecomponentupgrade
label: Schedule Firmware Component Upgrade
kind: action
command: '{"jsonrpc": "2.0", "method": "firmware.schedulecomponentupgrade"}'
notes: Forces upgrade at next reboot.
params: []
- id: illumination_clo_engage
label: Engage CLO (Constant Light Output)
kind: action
command: '{"jsonrpc": "2.0", "method": "illumination.clo.engage"}'
notes: Engages CLO at the current light level.
params: []
- id: illumination_laser_getserialnumber
label: Get Laser Serial Number
kind: query
command: '{"jsonrpc": "2.0", "method": "illumination.laser.getserialnumber"}'
params: []
- id: image_color_p7_custom_copypresettocustom
label: P7 Color: Copy Preset to Custom
kind: action
command: '{"jsonrpc": "2.0", "method": "image.color.p7.custom.copypresettocustom", "params": { "presetname": "<name>" }}'
params:
- name: presetname
type: string
description: Name of preset to copy
- id: image_color_p7_custom_resetpreset
label: P7 Color: Reset Preset to Defaults
kind: action
command: '{"jsonrpc": "2.0", "method": "image.color.p7.custom.resetpreset", "params": { "presetname": "<name>" }}'
params:
- name: presetname
type: string
description: Name of preset to reset
- id: image_color_p7_custom_resettonative
label: P7 Color: Reset to Native
kind: action
command: '{"jsonrpc": "2.0", "method": "image.color.p7.custom.resettonative"}'
params: []
- id: image_color_rgbmode_nextrgbmode
label: Cycle RGB Mode
kind: action
command: '{"jsonrpc": "2.0", "method": "image.color.rgbmode.nextrgbmode"}'
notes: Cycles through all available RGB modes.
params: []
- id: warp_upload_file
label: Upload Warp Grid File
kind: action
command: 'curl -X POST -F file=@warp.xml http://<projector-ip>/api/image/processing/warp/file/transfer'
notes: HTTP POST to file endpoint.
params:
- name: filename
type: string
description: Local path to warp grid XML file
- id: blend_mask_upload
label: Upload Blend Mask
kind: action
command: 'curl -X POST -F file=@mask.png http://<projector-ip>/api/image/processing/blend/file/transfer'
notes: PNG 8 or 16 bit grayscale; resolution must match blend layer. Supported: PNG up to 16 bit, JPEG, TIFF (color accepted, only blue channel used).
params:
- name: filename
type: string
description: Local path to blend mask
- id: blacklevel_upload
label: Upload Black Level Mask
kind: action
command: 'curl -X POST -F file=@blacklevel.png http://<projector-ip>/api/image/processing/blacklevel/file/transfer'
notes: PNG 8 or 16 bit grayscale; resolution must match blacklevel layer.
params:
- name: filename
type: string
description: Local path to black level mask
- id: eco_mode_wake_serial
label: Wake from ECO Mode via Serial
kind: action
command: ':POWR1\r'
notes: ASCII wake sequence sent on RS-232 when projector is in ECO mode. Other wake paths: WoL packet to MAC address, remote power button, keypad power button.
params: []
Feedbacks
- id: system_state
type: enum
values: [boot, eco, standby, ready, conditioning, on, deconditioning]
# source enum also lists "service" and "error"
- id: illumination_state
type: enum
values: [On, Off]
- id: environment_alarmstate
type: enum
values: [Fatal, Error, Alert, Warning, Ok]
- id: detected_signal_active
type: boolean
# from image.connector.<name>.detectedsignal.active
- id: detected_signal_name
type: string
# from image.connector.<name>.detectedsignal.name (e.g. "2560x1600 @ 50.10Hz")
- id: network_lan_state
type: enum
values: [CONNECTED, DISCONNECTED]
- id: optics_shutter_position
type: enum
values: [Open, Closed]
- id: property_changed_notification
type: object
# server-pushed notification: {"method":"property.changed","params":{"property":[{"object.name": value}, ...]}}
- id: signal_callback_notification
type: object
# server-pushed notification: {"method":"signal.callback","params":{"signal":[{"signal.name": {"arg1":...}}, ...]}}
- id: object_changed_notification
type: object
# server-pushed notification: {"method":"signal.callback","params":{"signal":[{"introspect.objectchanged":{"object":"...","newobject":true|false}}]}}
Variables
- id: image_brightness
type: float
range: [-1, 1]
step: 0.01
default: 0 # 0 = default, 1 = 100% offset
property: image.brightness
- id: image_contrast
type: float
range: [0, 2]
step: 0.01
default: 1 # 1 = default
property: image.contrast
- id: image_gamma
type: float
range: [1, 3]
step: 0.1
default: 2.2
property: image.gamma
- id: image_saturation
type: float
range: [0, 2]
step: 0.01
default: 1
property: image.saturation
- id: image_sharpness
type: integer
range: [-2, 8]
step: 1
property: image.sharpness
- id: image_orientation
type: enum
values: [DESKTOP_FRONT, DESKTOP_REAR, CEILING_FRONT, CEILING_REAR]
property: image.orientation
- id: image_window_main_source
type: string
property: image.window.main.source
# values depend on projector; examples: DisplayPort 1, HDMI
- id: image_window_main_scalingmode
type: enum
values: [Fill, OneToOne, FillScreen, Stretch]
property: image.window.main.scalingmode
- id: image_window_main_position
type: object
properties: {x: int, y: int}
property: image.window.main.position
- id: image_window_main_size
type: object
properties: {width: int, height: int}
property: image.window.main.size
- id: illumination_sources_laser_power
type: float
range: [0, 100] # percent; minpower/maxpower dynamic, lens dependent
property: illumination.sources.laser.power
- id: illumination_sources_laser_minpower
type: float
property: illumination.sources.laser.minpower
# UNRESOLVED: dynamic; specific range for this model not stated
- id: illumination_sources_laser_maxpower
type: float
property: illumination.sources.laser.maxpower
# UNRESOLVED: dynamic; specific range for this model not stated
- id: image_processing_warp_enable
type: boolean
property: image.processing.warp.enable
- id: image_processing_warp_file_enable
type: boolean
property: image.processing.warp.file.enable
- id: image_processing_warp_file_selected
type: string
property: image.processing.warp.file.selected
- id: image_processing_blend_file_enable
type: boolean
property: image.processing.blend.file.enable
- id: image_processing_blend_file_selected
type: array
items: string
property: image.processing.blend.file.selected
- id: image_processing_blacklevel_file_enable
type: boolean
property: image.processing.blacklevel.file.enable
- id: image_processing_blacklevel_file_selected
type: string
property: image.processing.blacklevel.file.selected
- id: optics_shutter_target
type: enum
values: [Open, Closed]
property: optics.shutter.target
- id: optics_zoom_position
type: integer
property: optics.zoom.position
- id: optics_focus_position
type: integer
property: optics.focus.position
- id: optics_lensshift_horizontal_position
type: integer
property: optics.lensshift.horizontal.position
- id: optics_lensshift_vertical_position
type: integer
property: optics.lensshift.vertical.position
- id: dmx_startchannel
type: integer
range: [1, 512]
property: dmx.startchannel
- id: dmx_mode
type: string
property: dmx.mode
- id: dmx_shutdown
type: boolean
property: dmx.shutdown
- id: system_standby_enable
type: boolean
property: system.standby.enable
# UNRESOLVED: feature availability per model
- id: system_eco_enable
type: boolean
property: system.eco.enable
# UNRESOLVED: feature availability per model
- id: network_device_lan_ip4config
type: object
properties:
Address: string
Mask: string
Gateway: string
NameServers: string
property: network.device.lan.ip4config
Events
- id: property_changed
description: Server-pushed notification when a subscribed property value changes. Client must implement property.changed listener.
payload: '{"jsonrpc": "2.0", "method": "property.changed", "params": { "property": [ {"objectname.propertyname": value} ] }}'
- id: signal_callback
description: Server-pushed notification when a subscribed signal is emitted. Client must implement signal.callback listener.
payload: '{"jsonrpc": "2.0", "method": "signal.callback", "params": { "signal": [ {"signalname": {"arg1": v}} ] }}'
- id: modelupdated
description: Signal triggered when the object structure changes (objects added or removed). Subscribe via signal.subscribe.
property: modelupdated
- id: introspect_objectchanged
description: Signal emitted via signal.callback when introspect detects object addition/removal.
payload: '{"introspect.objectchanged": {"object": "<name>", "newobject": true|false}}'
- id: source_change_notifications
description: Two notifications on source switch: first deselects the previous source (empty string), then sets the new one.
payload: '{"jsonrpc": "2.0", "method": "property.changed", "params": { "property": [ {"image.window.main.source": ""} ] }}'
Macros
- id: power_on_with_state_check
description: Power-on with state pre-check (recommended by source).
steps:
- "property.get system.state"
- "if state in {standby, ready}: system.poweron"
- id: power_off_with_state_check
description: Power-off with state pre-check (recommended by source).
steps:
- "property.get system.state"
- "if state == on: system.poweroff"
- id: upload_and_activate_warp
description: Upload warp grid, select, enable.
steps:
- "curl -X POST -F file=@warp.xml http://<projector-ip>/api/image/processing/warp/file/transfer"
- "property.set image.processing.warp.file.selected <warp.xml>"
- "property.set image.processing.warp.file.enable true"
- id: upload_and_activate_blend
description: Upload blend mask, select, enable.
steps:
- "curl -X POST -F file=@mask.png http://<projector-ip>/api/image/processing/blend/file/transfer"
- "property.set image.processing.blend.file.selected mask.png"
- "property.set image.processing.blend.file.enable true"
- id: upload_and_activate_blacklevel
description: Upload black level mask, select, enable.
steps:
- "curl -X POST -F file=@blacklevel.png http://<projector-ip>/api/image/processing/blacklevel/file/transfer"
- "property.set image.processing.blacklevel.file.selected blacklevel.png"
- "property.set image.processing.blacklevel.file.enable true"
- id: set_active_source
description: Set the active input source.
steps:
- "image.source.list"
- "property.set image.window.main.source <source-name>"
- id: subscribe_to_signal_changes
description: Source and signal change tracking (multi-step).
steps:
- "image.source.list"
- "for each source: image.source.<name>.listconnectors"
- "for each connector: property.subscribe image.connector.<name>.detectedsignal"
Safety
confirmation_required_for: []
interlocks: []
# UNRESOLVED: source provides no explicit safety warnings, interlocks, or power-on sequencing hazards.
# Best-practice notes from source: verify system.state before power on/off; await property.set confirmation before re-setting same property.
Notes
All method, property, signal, and object names are case-sensitive and lowercase.
JSON-RPC 2.0 framing required. Parameter order within params does not matter; method/payload order in the request object also does not matter.
TCP port 9090 reserved for JSON-RPC service on network interface. Same JSON-RPC available over RS-232 with serial params above.
Auth: authenticate with code is required only for higher-than-end-user access levels; end-user level can skip authentication. Only numeric example (98765) shown.
File endpoints: download directly via http://<ip>/api/<path> or curl -O -J <url>. Upload via curl -F file=@<file> http://<ip>/api/<path> (POST implied by -F). Example: /api/image/processing/warp/file/transfer[warpgrid.xml].
ECO-mode wake paths: WoL packet to projector MAC, remote power button, keypad power button, or ASCII :POWR1\r on RS-232.
Source notes API is dynamic — feature availability depends on installed peripherals (e.g. motorized zoom lens), projector model, and configuration. Introspection (introspect) is the canonical way to enumerate available objects/methods/properties/signals for a given installed unit.
Notifications carry no id and require no response.
Source explicitly notes the catalogue shown is illustrative; complete list per installed unit requires introspection.
Provenance
source_domains:
- audiogeneral.com
source_urls:
- "https://www.audiogeneral.com/barco/UDX%20Series/JSON_ReferenceGuide.pdf"
retrieved_at: 2026-08-18T18:17:49.834Z
last_checked_at: 2026-08-19T08:57:37.167Z
Verification Summary
verdict: verified
checked_at: 2026-08-19T08:57:37.167Z
matched_actions: 33
action_count: 33
confidence: medium
summary: "All 33 spec actions are present verbatim in the source, transport parameters match, and no significant commands are unrepresented. (6 unresolved item(s) noted in Known Gaps.)"
Known Gaps
- "full property/method/signal catalog documented for Pulse API generally; only a subset of properties (image.brightness/contrast/gamma/saturation/sharpness, illumination, image.window.main.source, warp/blend/blacklevel file enable/selected, optics shutter/zoom/focus/lensshift, dmx, network) explicitly illustrated in examples."
- "auth token format (only `code: 98765` shown), default user/access level name, session lifecycle"
- "dynamic; specific range for this model not stated"
- "feature availability per model"
- "source provides no explicit safety warnings, interlocks, or power-on sequencing hazards."
- "firmware version compatibility, model-specific source list contents, default DMX mode, full method/property/signal catalogue (only the subset illustrated in the source is fully captured; the alphabetical appendix lists additional properties/methods/signals as documented), default auth access level name, session/connection lifecycle semantics, whether HTTP API uses the same auth as TCP JSON-RPC."
From the AI4AV catalog (https://ai4av.net) · ODbL-1.0