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 or HTTPS for outlet power control, sequencing, event triggers, power monitoring, and device configuration. Authentication is required for API features. Basic Authentication and session tokens via the x-auth-token header are supported.

Transport

protocols:
  - http
  - https
addressing:
  base_url: /api/v1
  port: 80
auth:
  type: UNRESOLVED
  notes: Authentication is required for access to all API features. Basic Authentication and web session tokens using the x-auth-token header are supported.

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
        nullable: true
        description: Null for a 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
        required: true
        description: UUID of the trigger to modify
      - name: enabled
        type: boolean
        required: true
      - name: name
        type: string
        required: true
      - name: type
        type: string
        required: true
        description: "ThresholdSamples, Schedule, Autoping, or GpioStateChange"
      - name: actions
        type: array
        required: true
        description: Action objects for on and off state transitions
      - name: expressions
        type: object
        required: true
        description: On/off evaluation criteria
    response:
      type: string
      description: UUID of the changed trigger
    notes: Request body is an array containing the trigger object.

  - 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, and device measurements
      - name: sequences
        type: array
        description: Sequence objects
      - name: startupProcedure
        type: object
        description: Startup procedure configuration

  - 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
      - name: passwd
        type: string
        required: false
        description: Required when authmode is "internal"; ignored when authmode is "ldap"
    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
    query_command: GET /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
    query_command: GET /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
    query_command: GET /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
    query_command: GET /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
    query_command: GET /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
    query_command: GET /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
    query_command: GET /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
    query_command: POST /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
    query_command: POST /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-10-07T16:11:38.721Z

Verification Summary

verdict: verified
checked_at: 2026-10-07T16:11:38.721Z
matched_actions: 27
action_count: 27
confidence: medium
summary: "All 27 action units (18 actions, 9 query feedbacks) match documented endpoints; port 80 and /api/v1 are supported; no unrepresented source commands. (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