Summary

The Kiloview N40 is a bi-directional NDI converter supporting both NDI High Bandwidth (HB) and NDI|HX encoding/decoding. This spec covers its HTTP REST API for device management, video encoding/decoding control, PTZ pass-through, network configuration, voice intercom, and recording. The API source document is titled for the N60 model; the N40 is assumed to share the same API surface within the product family.

Transport

protocols:
  - http
addressing:
  base_url: "http://{device_ip}/api"
  port: 80  # default HTTP port; HTTPS port 443 also available
auth:
  type: token
  description: >
    Login via POST /api/systemctrl/users/login with username/password.
    Returns a token and alias. Construct a cookie with user, alias, and token
    values, then validate via POST /api/systemctrl/users/session.
    Subsequent requests must include the cookie in the request header.

Traits

- powerable    # inferred from reboot and factory reset commands
- queryable    # inferred from extensive get/status query endpoints
- recordable   # inferred from recording start/stop and file management endpoints

Actions

- id: user_login
  label: User Login
  kind: action
  params:
    - name: username
      type: string
      description: Username (default "admin")
    - name: password
      type: string
      description: Password
  endpoint: POST /api/systemctrl/users/login

- id: user_session_verify
  label: Verify Login Session
  kind: action
  params:
    - name: cookie
      type: string
      description: "Cookie string: language={}; user={}; alias={}; token={}"
  endpoint: POST /api/systemctrl/users/session

- id: set_working_mode
  label: Set Working Mode
  kind: action
  params:
    - name: mode
      type: string
      description: "encode or decode"
  endpoint: "POST /api/codec/mode/set?mode={mode}"
  notes: Device restarts after switching; takes ~1 minute.

- id: reboot_device
  label: Reboot Device
  kind: action
  params: []
  endpoint: POST /api/systemctrl/system/reboot

- id: factory_reset
  label: Factory Reset
  kind: action
  params: []
  endpoint: POST /api/systemctrl/system/reFactory

- id: restore_codec
  label: Restart Codec Service
  kind: action
  params: []
  endpoint: POST /api/systemctrl/system/restore

- id: set_hostname
  label: Set Device Name
  kind: action
  params:
    - name: name
      type: string
      description: Device hostname
  endpoint: POST /api/systemctrl/system/setHostname

- id: set_http_protocol
  label: Set HTTP/HTTPS Ports
  kind: action
  params:
    - name: http
      type: boolean
      description: Enable HTTP
    - name: https
      type: boolean
      description: Enable HTTPS
    - name: httpPort
      type: integer
      description: HTTP port number
    - name: httpsPort
      type: integer
      description: HTTPS port number
  endpoint: POST /api/systemctrl/system/setProtocol
  notes: HTTP and HTTPS cannot both be disabled simultaneously.

- id: choose_encode_stream
  label: Select Encoding Streams
  kind: action
  params:
    - name: main
      type: integer
      description: "NDI|HX stream - 0: off, 1: on"
    - name: main_full
      type: integer
      description: "NDI|HB stream - 0: off, 1: on"
    - name: srt
      type: integer
      description: "SRT stream - 0: off, 1: on"
  endpoint: POST /api/codec/encoders/choose_encode

- id: set_encoder_main
  label: Set NDI|HX Encoding Parameters
  kind: action
  params:
    - name: key
      type: string
      description: "Must be \"main\""
    - name: target_bitrate
      type: integer
      description: "Bitrate quality - 55: Very Low, 75: Low, 100: Default, 150: High, 200: Very High"
    - name: mode_version
      type: integer
      description: "1: x-h264, 2: x-h265"
    - name: hx_version
      type: integer
      description: "2: NDI|HX2, 3: NDI|HX3"
  endpoint: POST /api/codec/encoder/main/set

- id: set_encoder_main_full
  label: Set NDI|HB Encoding Parameters
  kind: action
  params:
    - name: key
      type: string
      description: "Must be \"main_full\""
    - name: target_bitrate
      type: integer
      description: "Bitrate quality - 55: Very Low, 75: Low, 100: Default, 150: High, 200: Very High"
  endpoint: POST /api/codec/encoder/main_full/set

- id: set_stream_config
  label: Set Stream Configuration
  kind: action
  params:
    - name: stream_name
      type: string
      description: "Path param - main, main_full, or multi_protocol"
    - name: stream_key
      type: string
      description: "Path param - ndi-hx, ndi-full, or srt"
    - name: group
      type: string
      description: NDI group name
    - name: channel_name
      type: string
      description: NDI channel name
    - name: connection
      type: string
      description: "Connection method - disable_rudp, rudp, udp, multicast"
  endpoint: "POST /api/codec/streams/{stream_name}/{stream_key}/set"

- id: reset_stream
  label: Re-stream
  kind: action
  params:
    - name: stream_name
      type: string
      description: "main, main_full, or multi_protocol"
  endpoint: "POST /api/codec/streams/{stream_name}/reset"

- id: decode_select_stream
  label: Select Decoding Stream
  kind: action
  params:
    - name: name
      type: string
      description: NDI source name
    - name: url
      type: string
      description: "NDI source URL (IP:port format)"
    - name: group
      type: string
      description: NDI group
  endpoint: POST /api/codec/decode/addSpec

- id: decode_select_preset
  label: Select Decoding Preset
  kind: action
  params:
    - name: id
      type: integer
      description: "Preset ID 0-9 (0 = blank output)"
  endpoint: POST /api/codec/decode/add

- id: decode_output_set
  label: Set Decoding Output Parameters
  kind: action
  params:
    - name: output_resolution
      type: string
      description: "auto / 1280x720 / 1920x1080 / 3840x2160"
    - name: hdmi_channels
      type: integer
      description: "HDMI audio channel count - 2, 4, 6, or 8"
    - name: line_out_channels
      type: integer
      description: Line-out audio channel count
    - name: hdcp
      type: integer
      description: "0: disabled, 1: enabled"
    - name: out_colorspace
      type: integer
      description: "0: RGB444, 1: YUV422, 2: YUV444"
  endpoint: POST /api/codec/decode/output_set

- id: set_decode_connection_mode
  label: Set NDI Connection Mode
  kind: action
  params:
    - name: ndi_connection
      type: string
      description: "tcp, rudp, unicast, or multicast"
  endpoint: POST /api/codec/decode/setConnection

- id: set_discovery_server
  label: Set Discovery Server
  kind: action
  params:
    - name: enable
      type: boolean
      description: Enable discovery server
    - name: address
      type: string
      description: Discovery server address
  endpoint: POST /api/codec/discovery/setDiscoveryServer

- id: add_manual_ndi_source
  label: Add Manual NDI Source
  kind: action
  params:
    - name: groups
      type: array
      description: NDI group names
    - name: manuals
      type: array
      description: List of IP addresses
  endpoint: POST /api/codec/discovery/addManualIpsGroups

- id: preset_add
  label: Add Preset
  kind: action
  params:
    - name: position
      type: integer
      description: "Preset slot 1-9"
    - name: name
      type: string
      description: NDI source name
    - name: url
      type: string
      description: NDI source URL
    - name: group
      type: string
      description: NDI group
  endpoint: POST /api/codec/preset/add

- id: preset_remove
  label: Remove Preset
  kind: action
  params:
    - name: id
      type: integer
      description: "Preset ID 1-9"
  endpoint: POST /api/codec/preset/remove

- id: preset_set_blank_color
  label: Set Blank Screen Color
  kind: action
  params:
    - name: BlankColor
      type: string
      description: Hex color code (e.g. "#ffffff")
  endpoint: POST /api/codec/preset/set_blank_color

- id: ptz_decode_control
  label: PTZ Decode Control
  kind: action
  params:
    - name: action
      type: string
      description: "Direction or command - up, left, down, right, and others"
    - name: speed
      type: integer
      description: "Speed 0-100, default 50"
    - name: id
      type: integer
      description: "Position for preset commands, 1-16"
  endpoint: POST /api/codec/ptz_decode/ptzControl

- id: ptz_encode_control
  label: PTZ Encode Control
  kind: action
  params:
    - name: action
      type: string
      description: "Direction or command - up, left, down, right, and others"
    - name: speed
      type: integer
      description: "Speed 0-100, default 50"
    - name: id
      type: integer
      description: "Position for preset commands, 1-16"
  endpoint: POST /api/codec/ptz/ptzControl

- id: ptz_modify
  label: Configure PTZ Connection
  kind: action
  params:
    - name: enable
      type: integer
      description: "0: off, 1: on"
    - name: typ
      type: string
      description: "network or serial"
    - name: ptz_protocol
      type: string
      description: "Sony Visca, Pelco-d, or Pelco-p"
    - name: protocol
      type: string
      description: "Network protocol - TCP or UDP (for network type)"
    - name: addr
      type: string
      description: PTZ camera IP address (for network type)
    - name: port
      type: integer
      description: PTZ camera port (for network type)
    - name: baudrate
      type: integer
      description: Baud rate (for serial type)
  endpoint: POST /api/codec/ptz/modify

- id: set_network_ethernet
  label: Set Network Card Configuration
  kind: action
  params:
    - name: ifname
      type: string
      description: "Network card - eth0 or eth1"
    - name: address
      type: string
      description: IP address
    - name: netmask
      type: string
      description: Subnet mask
    - name: gw
      type: string
      description: Gateway
    - name: method
      type: string
      description: "dhcp or static"
    - name: dns
      type: string
      description: "DNS servers, semicolon-separated"
  endpoint: POST /api/networkmanager/network/SetEthernets

- id: set_network_switch
  label: Enable/Disable Network Card
  kind: action
  params:
    - name: ifname
      type: string
      description: "Network card - eth0 or eth1"
    - name: enable
      type: boolean
      description: Enable or disable
  endpoint: POST /api/networkmanager/network/SetSwitch

- id: set_timezone
  label: Set Timezone
  kind: action
  params:
    - name: timezone
      type: string
      description: "Standard timezone string (e.g. Asia/Shanghai)"
    - name: offset
      type: integer
      description: "GMT offset -14 to 12, fallback if timezone not found"
  endpoint: POST /api/systemctrl/systime/setLocation

- id: set_system_time
  label: Set System Time
  kind: action
  params:
    - name: timetype
      type: string
      description: "pc, manual, or ntp"
    - name: time
      type: string
      description: "Time string Y-m-d H:M:S (for pc or manual)"
    - name: ntp
      type: string
      description: "NTP server addresses, space-separated (for ntp)"
  endpoint: POST /api/systemctrl/systime/setTime

- id: recording_start_stop
  label: Start/Stop Recording
  kind: action
  params:
    - name: start
      type: boolean
      description: "true: start, false: stop"
  endpoint: POST /api/record/ndi_hx/recording

- id: set_recording_settings
  label: Set Recording Configuration
  kind: action
  params:
    - name: disk_choose
      type: object
      description: "Selected NAS and USB disk IDs"
    - name: format
      type: string
      description: "Video file format (e.g. mov)"
    - name: limit_type
      type: string
      description: "None, size-loop, time-loop, size, or time"
    - name: limit_size
      type: integer
      description: Size limit in MB
    - name: limit_time
      type: integer
      description: Time limit in seconds
    - name: disk_policy
      type: string
      description: "overwrite or noSpace"
  endpoint: POST /api/record/record/settings

- id: upload_firmware
  label: Upload Firmware
  kind: action
  params:
    - name: file
      type: binary
      description: Firmware .bin file (multipart/form-data)
  endpoint: POST /api/systemctrl/system/upload

Feedbacks

- id: working_mode
  type: enum
  values: [encode, decode]
  description: Current encoding or decoding mode
  endpoint: GET /api/codec/mode/get

- id: hostname
  type: string
  description: Device name
  endpoint: GET /api/systemctrl/system/getHostname

- id: system_info
  type: object
  description: >
    Firmware version, CPU usage, memory usage, disk usage, uptime.
    Query params: version, cpu, memory, disk, persisTime (all boolean).
  endpoint: GET /api/systemctrl/system/getSystemInfo

- id: http_protocol_status
  type: object
  description: "HTTP/HTTPS enabled state and port numbers"
  endpoint: GET /api/systemctrl/system/getProtocol

- id: decode_info
  type: object
  description: >
    Current decoding source name, IP, resolution, codec, bitrate, frame rate,
    audio info, output resolution, HDCP status, channel mappings.
  endpoint: GET /api/codec/decode/get

- id: ndi_source_list
  type: array
  description: >
    Discovered NDI sources with name, group, URL, IP, port, device_name,
    channel_name.
  endpoint: GET /api/codec/discovery/scan

- id: discovery_server
  type: object
  description: "Discovery server enable state and address"
  endpoint: GET /api/codec/discovery/getDiscoveryServer

- id: manual_ndi_sources
  type: object
  description: "Manually added NDI source groups and addresses"
  endpoint: GET /api/codec/discovery/getManualIpsGroups

- id: preset_list
  type: array
  description: "All 9 preset slots with NDI source info and online status"
  endpoint: GET /api/codec/preset/get

- id: encoder_params
  type: object
  description: >
    Encoding parameters for the specified stream (bitrate, codec, profile,
    rate control, etc.).
  endpoint: "GET /api/codec/encoder/{encoder_stream}/get"

- id: encoder_capture
  type: object
  description: >
    Video source parameters - resolution, frame rate, signal status,
    source type (sdi/hdmi).
  endpoint: "GET /api/codec/encoder/{encoder_stream}/get_capture"

- id: stream_info
  type: object
  description: >
    Stream configuration - group, channel name, connection method,
    discovery server, enable state.
  endpoint: "GET /api/codec/streams/{stream_name}/{stream_key}/get"

- id: stream_dynamic_state
  type: object
  description: "Real-time bitrate and connection count for a stream"
  endpoint: "GET /api/codec/streams/{stream_name}/{stream_key}/get_dynamic_state"

- id: network_info
  type: array
  description: "Network settings for both NICs (eth0, eth1)"
  endpoint: GET /api/networkmanager/network/GetLinkinfo

- id: network_card_info
  type: object
  description: "Single NIC settings"
  endpoint: "GET /api/networkmanager/network/GetEthernets?ifname={ifname}"

- id: network_speed
  type: object
  description: "NIC receive/transmit speed and link speed"
  endpoint: "GET /api/systemctrl/system/getNetworkSpeed?ifname={ifname}"

- id: ptz_info
  type: object
  description: "PTZ connection config - type (network/serial), protocol, address, port"
  endpoint: GET /api/codec/ptz/getPtzInfo

- id: ptz_protocols
  type: array
  values: ["Sony Visca", "Pelco-d", "Pelco-p"]
  description: Supported PTZ protocols
  endpoint: GET /api/codec/ptz/getPtzProtocol

- id: recording_info
  type: object
  description: "Recording settings - format, limit type/size/time, disk policy"
  endpoint: GET /api/record/record/get_record_info

- id: disk_list
  type: object
  description: "Mounted USB and NAS disks with capacity info"
  endpoint: GET /api/record/storage/disk_list

- id: recorded_files
  type: array
  description: "List of recorded files with path, size, timestamps"
  endpoint: "GET /api/record/storage/get_disk_files?device={device}"

Variables

- id: target_bitrate_hx
  type: integer
  description: "NDI|HX encoding bitrate quality - 55: Very Low, 75: Low, 100: Default, 150: High, 200: Very High"
  set_endpoint: POST /api/codec/encoder/main/set

- id: target_bitrate_hb
  type: integer
  description: "NDI|HB encoding bitrate quality - same scale as HX"
  set_endpoint: POST /api/codec/encoder/main_full/set

- id: ndi_group
  type: string
  description: NDI group name for the encoding stream
  set_endpoint: "POST /api/codec/streams/{stream_name}/{stream_key}/set"

- id: ndi_channel_name
  type: string
  description: NDI channel name for the encoding stream
  set_endpoint: "POST /api/codec/streams/{stream_name}/{stream_key}/set"

- id: ndi_connection_mode
  type: enum
  values: [disable_rudp, rudp, udp, multicast]
  description: NDI connection method for encoding stream
  set_endpoint: "POST /api/codec/streams/{stream_name}/{stream_key}/set"

- id: decode_output_resolution
  type: enum
  values: [auto, "1280x720", "1920x1080", "3840x2160"]
  description: Decoding output resolution
  set_endpoint: POST /api/codec/decode/output_set

- id: hdcp_enable
  type: boolean
  description: HDCP enable/disable on decode output
  set_endpoint: POST /api/codec/decode/output_set

Events

# UNRESOLVED: the source does not describe unsolicited push events or WebSocket subscriptions.
# All data retrieval is via polling GET endpoints.

Macros

# UNRESOLVED: no multi-step macro sequences described in source

Safety

confirmation_required_for: []
interlocks: []
# UNRESOLVED: source contains no explicit safety warnings, interlock procedures,
# or power-on sequencing requirements. Note that set_working_mode triggers a device
# restart (~1 minute) and some encoder parameter changes cause brief black screen.

Notes

  • The API uses cookie-based session auth: login returns a token, which must be assembled into a cookie header for subsequent requests.
  • The source document is titled "Kiloview N60" — the N40 shares this API within the N-series product family.
  • Default HTTP port is 80, HTTPS port is 443. Both can be changed via /api/systemctrl/system/setProtocol.
  • Switching encode/decode mode triggers a full device restart (~1 minute downtime).
  • Changing certain encoder parameters (e.g., mode_version) causes the encoder to restart, resulting in a brief black screen.
  • Device has two NICs (eth0, eth1) and supports link aggregation (bond0).
  • PTZ control supports both network (TCP/UDP) and serial connections, with Sony Visca, Pelco-d, and Pelco-p protocols.
  • Recording is currently limited to NDI|HX streams.
  • Many endpoints use {"result": "ok"} as the standard success response.
  • The App request header with {"language":"en"} is recommended for correct error messages.

Provenance

source_domains:
  - enstatic.kiloview.com
source_urls:
  - https://enstatic.kiloview.com/wp-content/uploads/2026/03/N60N50-API-EN.pdf
retrieved_at: 2026-04-30T04:41:23.663Z
last_checked_at: 2026-06-02T22:08:36.467Z

Verification Summary

verdict: verified
checked_at: 2026-06-02T22:08:36.467Z
matched_actions: 32
action_count: 32
confidence: medium
summary: "All 32 spec actions traced to source (dip-safe re-verify). (9 unresolved item(s) noted in Known Gaps.)"

Known Gaps

- "source document is labeled \"Kiloview N60\" — N40 API parity not explicitly confirmed"
- "firmware version compatibility not stated in source"
- "the source does not describe unsolicited push events or WebSocket subscriptions."
- "no multi-step macro sequences described in source"
- "source contains no explicit safety warnings, interlock procedures,"
- "firmware version compatibility ranges not stated"
- "maximum concurrent API connections not stated"
- "error code catalog not provided beyond result=\"error\" with msg field"
- "whether unsolicited event/WebSocket push exists is not documented"

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