Summary

The SurgeX SX-VS-1 Series (Vertical Series +) is a networked power distribution unit with individually switchable AC outlets. It exposes a RESTful JSON API over HTTP/HTTPS for outlet power control, sequencing, event triggers, power monitoring, and device configuration. All endpoints require Basic Authentication or a session token via the x-auth-token header.

Transport

protocols:
  - http
addressing:
  base_url: /api/v1
  port: 80
auth:
  type: basic
  notes: Basic Authentication required for all API endpoints. Session tokens also supported via x-auth-token header.

Traits

traits:
  - powerable  # inferred from PowerOn/PowerOff/Reboot outlet commands
  - queryable  # inferred from currentStatus, WhoAreYou query endpoints

Actions

actions:
  - id: power_on_outlet
    label: Power On Outlet
    kind: action
    method: POST
    path: /api/v1/{id}/{outlet}/PowerOn
    params:
      - name: id
        type: string
        description: Device ID (always "1" for Vertical Series +)
      - name: outlet
        type: string
        description: Outlet ID or group ID (e.g. "/1/1", "/1/25")
    response:
      type: boolean
      description: "true" for success, "false" for failure
    notes: User must have DeviceControl privilege

  - id: power_off_outlet
    label: Power Off Outlet
    kind: action
    method: POST
    path: /api/v1/{id}/{outlet}/PowerOff
    params:
      - name: id
        type: string
        description: Device ID (always "1" for Vertical Series +)
      - name: outlet
        type: string
        description: Outlet ID or group ID
    response:
      type: boolean
    notes: User must have DeviceControl privilege

  - id: reboot_outlet
    label: Reboot Outlet
    kind: action
    method: POST
    path: /api/v1/{id}/{outlet}/Reboot
    params:
      - name: id
        type: string
        description: Device ID (always "1" for Vertical Series +)
      - name: outlet
        type: string
        description: Outlet ID or group ID
    response:
      type: boolean
    notes: User must have DeviceControl privilege. Reboot time is configurable per outlet (rebootTime field).

  - id: run_sequence
    label: Run Sequence
    kind: action
    method: POST
    path: /api/v1/RunSequence
    params:
      - name: id
        type: integer
        description: Sequence ID to execute
    response:
      type: boolean

  - id: enter_shutdown_state
    label: Enter Shutdown State
    kind: action
    method: POST
    path: /api/v1/EnterShutdownState
    params: []
    response:
      type: boolean
    notes: Prevents any outlet from turning on until cleared. Requires Admin privileges.

  - id: clear_shutdown_state
    label: Clear Shutdown State
    kind: action
    method: POST
    path: /api/v1/ClearShutdownState
    params: []
    response:
      type: boolean
    notes: Returns device to running state. Requires Admin privileges.

  - id: reset_energy_usage
    label: Reset Energy Usage
    kind: action
    method: POST
    path: /api/v1/ResetEnergyUsage
    params: []
    response:
      type: boolean

  - id: add_sequence
    label: Add Sequence
    kind: action
    method: POST
    path: /api/v1/AddSequence
    params:
      - name: id
        type: integer
        description: "null for new sequence"
      - name: name
        type: string
        description: User-friendly sequence name
      - name: steps
        type: array
        description: Array of step objects with "method" and "delay" keys
    response:
      type: integer
      description: ID of the newly created sequence

  - id: change_sequence
    label: Change Sequence
    kind: action
    method: POST
    path: /api/v1/ChangeSequence
    params:
      - name: id
        type: integer
        description: Sequence ID to modify
      - name: name
        type: string
      - name: steps
        type: array
    response:
      type: boolean

  - id: remove_sequence
    label: Remove Sequence
    kind: action
    method: POST
    path: /api/v1/RemoveSequence
    params:
      - name: id
        type: integer
        description: Sequence ID to delete
    response:
      type: boolean

  - id: add_trigger
    label: Add Trigger
    kind: action
    method: POST
    path: /api/v1/AddTrigger
    params:
      - name: id
        type: integer
        description: "0 for new trigger"
      - name: enabled
        type: boolean
      - name: name
        type: string
      - name: type
        type: string
        description: "ThresholdSamples, Schedule, Autoping, or GpioStateChange"
      - name: expressions
        type: object
        description: On/off evaluation criteria
      - name: actions
        type: array
        description: Actions to take on state transitions
    response:
      type: object
      description: The newly created trigger object

  - id: change_trigger
    label: Change Trigger
    kind: action
    method: POST
    path: /api/v1/ChangeTrigger
    params:
      - name: id
        type: string
        description: UUID of the trigger to modify
    response:
      type: string
      description: UUID of the changed trigger

  - id: change_network_settings
    label: Change Network Settings
    kind: action
    method: PUT
    path: /api/v1/networkSettings
    params:
      - name: httpd
        type: object
        description: Web server settings (enabled, ssl, port)
      - name: ethInterfaces
        type: array
        description: Ethernet interface configurations

  - id: change_device_settings
    label: Change Device Settings
    kind: action
    method: PUT
    path: /api/v1/deviceSettings
    params:
      - name: verticalseries
        type: object
        description: Device object including name, outlets, groups, sequences, startup procedure

  - id: change_user
    label: Change User
    kind: action
    method: POST
    path: /api/v1/UserChange
    params:
      - name: username
        type: string
        required: true
      - name: authmode
        type: string
      - name: email
        type: string
      - name: admin
        type: string
        description: "admin" or "user"
      - name: passwd
        type: string
      - name: name
        type: string
      - name: privs
        type: array
        description: "Array of: TriggerConfig, DeviceControl, NetworkSettings, SoftwareUpdate, UserAdmin"

  - id: add_user
    label: Add User
    kind: action
    method: POST
    path: /api/v1/UserAdd
    params:
      - name: username
        type: string
        required: true
      - name: authmode
        type: string
        required: true
        description: "internal" or "ldap"
      - name: name
        type: string
        required: true
      - name: admin
        type: string
        required: true
      - name: privs
        type: array
        required: true
    response:
      type: array
      description: "[index, username]"

  - id: delete_user
    label: Delete User
    kind: action
    method: POST
    path: /api/v1/UserDel
    params:
      - name: username
        type: string
        required: true
    response:
      type: array
      description: "[index, username]"

  - id: upload_file
    label: Upload File
    kind: action
    method: POST
    path: /api/v1/UploadFile
    params:
      - name: file
        type: file
        description: "multipart/form-data. name options: fwupdate.img, verticalseriesPlus.cfg, snmpd.conf, ssl.crt, ssl.key, cert.ca, wpa_supplicant.conf, wpa_cert.ca, wpa_user.crt, wpa_user.prv, wpa_fast.pac"

Feedbacks

feedbacks:
  - id: current_status
    label: Current Status
    method: GET
    path: /api/v1/currentStatus
    type: object
    description: Full device status including model, serial, activeState, firmware, devices with measurements, groups, and outlets
    fields:
      - name: activeState
        type: enum
        values: [Startup, Running, Shutdown]
      - name: firmware
        type: string
      - name: model
        type: string
      - name: serial
        type: string

  - id: outlet_state
    label: Outlet State
    type: enum
    values: ["0", "1", "2"]
    description: "0 = off, 1 = on, 2 = rebooting. Found in currentStatus.outlets[].state"

  - id: who_are_you
    label: Device Identity
    method: GET
    path: /api/v1/WhoAreYou
    type: object
    description: Device identity including model, serial, MAC, hostname, firmware, manufacturer, deviceType

  - id: network_settings
    label: Network Settings
    method: GET
    path: /api/v1/networkSettings
    type: object
    description: Network interface config, HTTP server settings, SNMP config, NTP, mDNS

  - id: device_settings
    label: Device Settings
    method: GET
    path: /api/v1/deviceSettings
    type: object
    description: Device configuration including sequences, startup procedure, outlet/group settings

  - id: sequences
    label: Sequences
    method: GET
    path: /api/v1/sequences
    type: array
    description: List of all configured sequences with steps, running state, and current step

  - id: event_settings
    label: Event Settings
    method: GET
    path: /api/v1/EventSettings
    type: object
    description: Trigger configurations including threshold, schedule, autoping, and GPIO state change triggers

  - id: users
    label: Users
    method: GET
    path: /api/v1/users
    type: array
    description: List of configured users with privileges

  - id: time_stamped_events
    label: Time Stamped Events
    method: POST
    path: /api/v1/TimeStampedEvents
    type: object
    params:
      - name: startDate
        type: string
        required: true
      - name: endDate
        type: string
        required: true
    description: Events logged between specified dates. Returns trigger events, system events, control events.

  - id: historical_data_info
    label: Historical Data Info
    method: POST
    path: /api/v1/LogFileInfo
    type: object
    params:
      - name: logType
        type: string
        description: "e.g. \"VerticalSeriesData\""
    description: Schema and file list for historical power measurement data logs

  - id: device_measurements
    label: Device Measurements
    type: object
    description: Power measurements found in currentStatus.devices[].deviceMeasurements
    fields:
      - name: voltageLN
        type: number
        description: Line to neutral voltage (V)
      - name: current
        type: number
        description: Total AC current (A)
      - name: power
        type: number
        description: Average power (W)
      - name: frequency
        type: number
        description: Frequency (Hz)
      - name: temperature
        type: number
        description: Internal temperature (units per temperatureUnits setting)
      - name: pf
        type: number
        description: Power factor (0 to 1)
      - name: energyUsage
        type: number
        description: Energy usage since last reset (Wh)
      - name: crestFactor
        type: number
        description: Line to neutral voltage crest factor
      - name: crestFactorNG
        type: number
        description: Neutral to ground voltage crest factor

  - id: input_state
    label: Input State
    type: enum
    values: [No Ground, Reverse Polarity, Wiring Fault]
    description: Reports input power abnormalities

Variables

variables:
  - id: outlet_name
    label: Outlet Name
    path: currentStatus.outlets[].name
    type: string
    description: User-configurable outlet name

  - id: outlet_initial_state
    label: Outlet Initial State
    path: deviceSettings.outlets[].initialState
    type: enum
    values: ["0", "1", "2", "3", "4", "5"]
    description: "Startup behavior: 0=always on, 1=always off, 2=shutdown, 3=on, 4=off, 5=last state"

  - id: outlet_reboot_time
    label: Outlet Reboot Time
    path: currentStatus.outlets[].rebootTime
    type: integer
    description: Delay in seconds between off and on during reboot

  - id: temperature_units
    label: Temperature Units
    type: enum
    values: [F, C]

  - id: auto_logout_time
    label: Auto Logout Time
    type: integer
    description: Minutes before web session auto-logout

  - id: http_port
    label: HTTP Server Port
    type: integer
    description: Configurable web server port (default 80)

Events

events:
  - id: trigger_on
    description: Trigger entered active/on state (alertLevel 2)
    fields:
      - name: type
        values: [Trigger (On)]
      - name: message.action.type
        values: [PowerOn, PowerOff, Reboot]

  - id: trigger_off
    description: Trigger returned to off/clear state
    fields:
      - name: type
        values: [Trigger (Off)]

  - id: system_event
    description: System events (login, logout, NTP sync)
    fields:
      - name: type
        values: [System]

  - id: device_control_event
    description: Outlet control confirmation events
    fields:
      - name: type
        values: [DeviceControl]

Macros

macros:
  - id: startup_sequence
    label: Startup Sequence
    description: >
      A configured sequence of outlet power-on commands with delays between steps.
      Executed automatically on power-up when startupProcedure is set to RunSequence.
      Steps use syntax /{ID}/{OUTLET}/{COMMAND} where COMMAND is PowerOn, PowerOff, or Reboot.
    params:
      - name: steps
        type: array
        description: Array of {method: string, delay: integer_seconds}

Safety

confirmation_required_for:
  - enter_shutdown_state
  - clear_shutdown_state
interlocks:
  - shutdown_state: When device is in shutdown state, no outlets can be turned on via manual control until shutdown is cleared
  - admin_required: EnterShutdownState and ClearShutdownState require Admin privileges
  - privilege_check: Outlet control commands require DeviceControl privilege; user admin requires UserAdmin privilege
# UNRESOLVED: specific power-on sequencing safety requirements not stated in source
# UNRESOLVED: maximum inrush current or simultaneous outlet power-on limits not stated

Notes

  • Protocol version is embedded in the URI (currently v1). Firmware updates may introduce new protocol versions; multiple versions may coexist.
  • Outlet IDs follow the pattern /{device_id}/{outlet_number} where device_id is always "1" for Vertical Series +.
  • Groups (e.g. "All Outlets" with id "/1/25") can be used as targets for power commands.
  • mDNS discovery is supported on port 5353 for dynamic device discovery on the network.
  • Sequence steps support the commands: PowerOn, PowerOff, Reboot. Step delay is in seconds.
  • Trigger types: ThresholdSamples (power measurement thresholds), Schedule (date/time), Autoping (IP ping monitoring), GpioStateChange (GPIO feedback).
  • Historical data logs are stored as gzipped CSV files accessible via HTTP GET.
  • Default HTTP port is 80, but is configurable. Examples in the source use port 8080.

Provenance

source_domains:
  - ametekesp.com
source_urls:
  - https://www.ametekesp.com/-/media/ametekesp/downloads/manuals/vertical-series-plus/api-definition-vertical-series.pdf
retrieved_at: 2026-04-30T04:31:27.393Z
last_checked_at: 2026-06-02T22:15:22.459Z

Verification Summary

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

Known Gaps

- "exact model variants in the SX-VS-1 Series family beyond SX-VS-1216 are not enumerated in source"
- "HTTPS/TLS configuration details beyond ssl boolean flag not documented"
- "specific power-on sequencing safety requirements not stated in source"
- "maximum inrush current or simultaneous outlet power-on limits not stated"
- "maximum number of outlets per model variant not explicitly stated (SX-VS-1216 has 16)"
- "SNMP trap payload format not documented"
- "firmware update procedure details beyond file upload not documented"

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