Workflows

Workflow SDK Reference

Complete reference for the versus and integrations objects available inside Versus workflow scripts — device inventory, F5 TMSH/iControl access, troubleshooting helpers, ServiceNow/AWX/CrowdStrike clients, the step catalog, and built-in workflow library.

Reference documentation for custom script steps inside Versus workflows — the versus and integrations objects exposed to script code, the full step catalog available to the visual workflow builder, FQL (Falcon Query Language) syntax for CrowdStrike filtering, and the library of built-in workflows shipped with Versus.

Covers device inventory and direct F5 TMSH/iControl REST access, generic SSH/troubleshooting helpers, ServiceNow and AI shortcuts on versus itself, and integration clients for ServiceNow, AWX/Tower, and CrowdStrike. Zscaler and F5 are not exposed as general-purpose SDK client objects — see the notes below.

📄 Download as PDF: versus-sdk-reference.pdf — the complete method surface for offline reading. The always-current copy is the SDK Reference panel inside any Python step, which autocompletes as you type versus.; the full auto-generated list is also at the bottom of this page.


Script step globals

Which globals are injected depends on the step type — the two script-capable steps do not receive the same objects. ctx is an internal object passed to built-in step implementations; it is not exposed to user-written scripts.

  • Python Script (core.python_script) — only versus is injected. Reach integrations via versus.integrations.
  • HTTP Request (core.http_request) — only http (a get/post/put/patch/delete client) and integrations are injected. versus is not available here.

Never import from apps.* directly inside a script — the sandbox restricts builtins to a safe subset (no file I/O, no __import__, no subprocess, no open()); network and database access happens only through the injected objects.

# Example — core.python_script step (versus injected, integrations reached via versus.integrations)
cs = versus.integrations.crowdstrike()
host = cs.find_host(versus.get_input('target_hostname'))
if host and host['containment_status'] == 'normal':
    cs.contain_hosts([host['aid']])
    versus.log(f"Contained {host['hostname']}")
    versus.set_output('contained_aid', host['aid'])

The versus object (VersusSDK)

Injected as versus in Python Script steps. Read access to Versus inventory data, controlled write access to devices (TMSH / iControl REST / SSH), and shortcuts for ServiceNow and the default AI provider.

Logging & variables

MethodReturnsDescription
.log(*args)NoneWrite a message to the step log
.get_input(key, default=None)AnyRead a variable set by a previous step
.set_output(key, value)NoneSet a variable downstream steps can read with get_input()

Devices & applications

MethodReturnsDescription
.devices(vendor, hostname, status, device_type, limit=200)list[dict]Query managed devices — all keyword args optional, AND-combined
.get_device(device_id)dict|NoneSingle device by ID
.virtual_servers(device_id, name, status, limit=200)list[dict]Query virtual servers across managed ADCs
.certificates(expiring_within_days, expired, common_name, limit=200)list[dict]Query the certificate inventory
.wideips(device_id, name, enabled, limit=200)list[dict]Query GTM WideIPs
.firewall_rules(device_id, name, action, limit=200)list[dict]Query firewall rules

Device dict keys: id, hostname, mgmt_ip, vendor, device_type, status, model, software_version, ha_state

F5 direct access (TMSH / iControl REST)

MethodReturnsDescription
.run_tmsh(device_id, command)strRun a TMSH command, e.g. 'show /ltm virtual'
.http_get(device_id, path)dictiControl REST GET, e.g. '/mgmt/tm/ltm/virtual'
.http_patch(device_id, path, payload)dictiControl REST PATCH with a JSON body

All three raise RuntimeError if the target device has no credential configured. There is no separate F5 integration client — this direct access is the F5 SDK surface (see F5 BIG-IP below).

Generic device access & troubleshooting

MethodReturnsDescription
.run_ssh(device_id, command, timeout=30)strSSH command on any credentialed device — Cisco, Arista, FortiGate, Juniper, Palo Alto, etc.
.ping(device_id, target, count=4)strVendor-aware ping (TMSH / IOS / EOS / JunOS / PAN-OS syntax)
.traceroute(device_id, target)strVendor-aware traceroute
.dns_lookup(device_id, hostname)strnslookup executed from the device
.check_port(device_id, target_ip, port, protocol='tcp', timeout=5)strTCP/UDP reachability via nc — 'open', 'closed', or raw error
.get_vs_status(device_id, vs_name=None)strVirtual server status — F5 / NetScaler / A10-aware
.get_pool_status(device_id, pool_name=None)strPool / pool-member health — F5 / NetScaler-aware
.get_device_stats(device_id)strCPU, memory, and throughput statistics
.check_ha_status(device_id)strHA / failover state — F5, ASA, Fortinet, Palo Alto
.get_interfaces(device_id)strInterface status and error counters
.get_arp_table(device_id)strARP table entries
.get_route_table(device_id, prefix=None)strRouting table, optionally filtered by prefix
.get_logs(device_id, pattern=None, lines=50)strRecent system / error log entries, optional grep pattern

All of these return raw CLI/API output as a string for the script to parse — they do not return structured dicts.

Native vendor troubleshooting (versus.probe)

Beyond the generic helpers above, versus.probe(device_id, kind) runs a read-only probe using the device's own native driver — the same drivers Diagnostics AutoPilot uses — across 23 vendor families (NetScaler, PAN-OS, FortiGate, Check Point incl. SMS Web API, Cisco ACI/ASA/IOS-XE/NX-OS, Arista, AVI, Kemp, Alteon, NSX-T, Infoblox, EfficientIP, BlueCat, Cloudflare, AWS/Azure LB, F5 XC, F5OS (rSeries/VELOS), A10). versus.available_probes(device_id) lists what a device supports; versus.vendor_family(device_id) returns the detected family. See the Complete method reference for every family's probe kinds.

# Check HA state on every ADC in a device group, natively per vendor
for dev in versus.devices(device_type="adc"):
    fam = versus.vendor_family(dev["id"])           # 'netscaler' | 'avi' | 'f5xc' | ...
    if not fam:
        continue                                    # no native driver — use versus.run_ssh() instead
    versus.log(dev["hostname"], fam, versus.probe(dev["id"], "ha"))
    versus.log(versus.probe(dev["id"], "vs_status", vs_name="app1"))   # kinds can take args

versus.probe returns a formatted string, or None when that vendor has no native driver for the requested kind.

Vulnerability tracking

MethodReturnsDescription
.update_vuln_result(device_id, cve_id, status, evidence='')NoneRecord a per-device CVE determination — status: confirmed | patched | not_affected | potentially_affected

AI

MethodReturnsDescription
.ai(prompt, system='', max_tokens=2048)strOne-shot call to the default AI provider — shortcut for versus.integrations.ai().complete(prompt)

ServiceNow shortcuts

MethodReturnsDescription
.create_snow_incident(short_description, description, urgency='2', impact='2', category='Network', **kwargs)dictCreate an Incident
.create_snow_change(short_description, description, risk='3', impact='3', category='Network', **kwargs)dictCreate a Normal Change Request
.close_snow_change(change_number, close_notes, work_notes='')NoneClose a CHG or CTASK
.check_snow_approval(change_number)tuple(approved: bool, state_label: str, message: str)
.get_snow_info(change_number)dictSummary dict for a CHG or CTASK
.get_snow_change_state(change_number)dictLightweight state/approval fetch
.add_snow_work_notes(change_number, notes)NoneAppend work notes to an existing CHG or CTASK
.query_snow_changes(start_dt, end_dt, category=None)listChange requests overlapping a datetime window

Note: create_snow_incident() and create_snow_change() catch integration errors internally, log a warning, and return {} instead of raising — check for an empty dict before using the result. The read-oriented shortcuts (check_snow_approval, get_snow_info, etc.) raise RuntimeError if no ServiceNow instance is configured. These shortcuts use the first configured instance only — for named-instance access or the full method set, use versus.integrations.snow().

Integrations access

MethodReturnsDescription
.integrationsIntegrationsSDKProperty — factory for all configured integration clients, documented below

ServiceNow

Authentication: Basic auth or OAuth2 password grant, plus an optional outbound proxy (proxy_host / proxy_port under System Settings). Configure the instance under Integrations → Service Now.

integrations.snow(name=None) → ServiceNowClient (the first/only configured instance — Versus supports one ServiceNow instance per environment today, so name is rarely needed)

MethodReturnsDescription
.is_approved(number)tuple(approved: bool, state_label: str, message: str) for a CHG or CTASK
.get_info(number)dict{number, table, state, approval, short_description, sys_id, priority}
.get_change_state(number)dict{number, sys_id, state, state_label, approval, approved}
.add_work_notes(number, notes)NoneAppend work notes to a CHG or CTASK
.close_change(number, close_notes, work_notes='')NoneClose a CHG (state → Review) or CTASK (state → Closed Complete)
.create_change_request(short_description, description, category, risk, impact, priority, change_type, …)dictCreate a Change Request — returns {number, sys_id, state, short_description}
.create_incident(short_description, description, urgency, impact, priority, category, subcategory, …)dictCreate a Security Incident
.query_changes_in_window(start_dt, end_dt, category=None)list[dict]Change requests overlapping a datetime window
.test_connection()tuple(ok: bool, message: str)

There is no generic .get_record(table, sys_id) or .update_change_request(sys_id, work_notes, state) method — use add_work_notes() to append notes and close_change() to terminate a change. Change/task lookups are by number (e.g. 'CHG0001234'), not sys_id.

# Create a change, wait for approval, then close it on success
snow = versus.integrations.snow()
chg = snow.create_change_request(
    short_description='Deploy new WAF policy to bigip-01',
    description=versus.get_input('change_description', ''),
    risk='3', impact='3',
)
versus.set_output('change_number', chg['number'])

approved, state_label, msg = snow.is_approved(chg['number'])
if not approved:
    raise RuntimeError(f"Change {chg['number']} not approved yet: {msg}")

snow.close_change(chg['number'], close_notes='Deployed successfully via Versus workflow')

Rundeck

integrations.rundeck(name=None) → UnifiedRundeckClient

System & projects: .test_connection(), .system_info(), .list_projects(), .get_project(project=None)

Jobs: .list_jobs(project, group_path, job_filter), .get_job(job_id), .find_job(job_name, project, group_path), .export_job_yaml(job_id)

Triggering & tracking: .run_job(job_id, options=None, node_filter=None, as_user=None), .run_job_by_name(job_name, project, options, node_filter, …), .run_and_wait(job_id=None, job_name=None, project=None, options=None, node_filter=None, timeout=300, poll_interval=3), .get_execution(execution_id), .list_executions(job_id, status=None, max_results=20), .list_running_executions(project=None), .abort_execution(execution_id), .wait_for_completion(execution_id, poll_interval=3, timeout=300)

Output & nodes: .get_output(execution_id, offset=0, max_lines=500), .get_full_output(execution_id), .get_output_text(execution_id), .list_nodes(project=None, node_filter=None), .get_node(node_name, project=None)

Also available: .list_keys(path='/'), .get_scm_status(), and .perform_scm_action() for Key Storage and job SCM integration.

For simple "trigger this job and wait" use cases, the visual builder's core.rundeck step (see Step Catalog) wraps run_job + polling without needing a Python Script step at all.

# Run a Rundeck job and check the result
rd = versus.integrations.rundeck()
result = rd.run_and_wait('Deploy ACL', options={'vlan': '100', 'device': 'bigip-01'})
if result['status'] != 'succeeded':
    log = rd.get_output_text(result['id'])
    raise RuntimeError(f"Rundeck job failed: {result['status']}\n{log[:1000]}")

AWX / Ansible Tower

Authentication: Bearer token (Personal Access Token from AWX user settings). Configure under Integrations → AWX / Tower.

integrations.awx_list() — Returns all enabled AWX sources: {id, name, url, status}

integrations.awx(name=None) → UnifiedAWXClient

Job Templates: .list_job_templates(name=None), .get_job_template(id), .find_job_template(name) (raises RuntimeError if not found), .launch_job_template(template_id, extra_vars, inventory, limit, credential_ids), .run_and_wait(template_id, extra_vars, inventory, limit, credential_ids, timeout=600, poll_interval=10)

Jobs: .get_job(job_id), .list_jobs(template_id=None, status=None), .get_job_stdout(job_id), .cancel_job(job_id), .wait_for_completion(job_id, timeout=600, poll_interval=10)

Projects & Inventory: .list_inventories(), .list_projects(), .sync_project(project_id)

Workflow Templates: .list_workflow_templates(), .launch_workflow_template(template_id, extra_vars, inventory)

# Run an AWX job template and surface output on failure
awx = versus.integrations.awx()
job = awx.run_and_wait(
    template_id=42,
    extra_vars={'target': versus.get_input('hostname')},
    limit=versus.get_input('hostname'),
    timeout=3600,
)
if job['status'] != 'successful':
    versus.log(awx.get_job_stdout(job['id']))
    raise RuntimeError(f"Job {job['id']} failed: {job['status']}")

CrowdStrike Falcon

Authentication: OAuth2 client-credentials. Token auto-refreshes every 30 min (60 s buffer). Configure Client ID and Secret under Integrations → CrowdStrike. Base URL defaults to https://api.crowdstrike.com — change to US-2, EU-1, or US-GOV-1 as needed.

integrations.crowdstrike_list() — Returns enabled sources: {id, name, base_url, status}

integrations.crowdstrike(name=None) → UnifiedCrowdStrikeClient

Hosts: .find_host(hostname) → dict|None, .list_hosts(filter_fql, limit=100) → list[dict], .get_host_details(aids) → list[dict], .search_hosts(filter_fql, limit=100) → list[str]

Host dict keys: aid, hostname, platform, os_version, agent_version, status, containment_status, external_ip, local_ip, mac_address, first_seen, last_seen, groups, tags

Containment: .contain_hosts(aids), .lift_containment(aids)

Detections: .search_detections(filter_fql, limit=50) → list[str], .list_detections(filter_fql, limit=50) → list[dict], .get_detection_details(detection_ids), .update_detection(detection_id, status, assigned_to_uuid, comment)

Status values: new · in_progress · true_positive · false_positive · ignored · closed · reopened

Alerts & Incidents: .search_alerts(filter_fql, limit=50), .list_alerts(filter_fql, limit=50), .update_alerts(alert_ids, action_params), .search_incidents(filter_fql, limit=50), .list_incidents(filter_fql, limit=50)

Spotlight (Vulnerabilities): .get_host_vulnerabilities(aid, limit=100), .search_vulnerabilities(filter_fql, limit=100), .get_vulnerability_details(vuln_ids)

Vuln dict keys: id, aid, hostname, cve_id, severity, severity_name, description, status, remediation, created, updated

Real Time Response (RTR): .run_rtr_script(aid, script, timeout=120), .init_rtr_session(aid), .run_rtr_command(session_id, command, base_command='runscript', timeout=120), .get_rtr_result(cloud_request_id, sequence_id=0), .delete_rtr_session(session_id)

Policies & Groups: .list_prevention_policies(), .list_host_groups(), .get_host_group_members(group_id)

FQL (Falcon Query Language) examples

"hostname:'BIGIP-01'"
"platform_name:'Windows'"
"status:'contained'"
"tags:'CriticalInfra'"
"status:'new'+max_severity_displayname:'Critical'"
"aid:'abc123'+status:'open'"
# Contain a host and log open CVEs
cs = versus.integrations.crowdstrike()
host = cs.find_host(versus.get_input('target_hostname'))
if not host:
    raise RuntimeError('Host not found in Falcon')

cs.contain_hosts([host['aid']])
versus.log(f"Contained {host['hostname']} (AID {host['aid']})")

vulns = cs.get_host_vulnerabilities(host['aid'])
critical = [v for v in vulns if v['severity_name'] == 'CRITICAL']
versus.log(f"{len(critical)} critical CVEs on {host['hostname']}")
versus.set_output('contained_aid', host['aid'])
versus.set_output('critical_vuln_count', len(critical))

Zscaler

Unlike ServiceNow, AWX, and CrowdStrike, Zscaler has no integrations.zscaler() SDK client — there is no UnifiedZscalerClient and no general-purpose firewall-rule API reachable from a custom script. Zscaler ZIA/ZPA access is a fixed set of workflow steps (zscaler.zia_* / zscaler.zpa_*) built for the Zscaler upgrade-orchestration workflow — see the Zscaler group in the Step Catalog below for the full list.


F5 BIG-IP

F5 also has no integrations.f5() client / UnifiedF5Client. F5 BIG-IP is a first-class device type, so access from a custom script goes through versus directly: run_tmsh(), http_get(), and http_patch() (documented under "F5 direct access" above), plus the vendor-aware helpers (get_vs_status, get_pool_status, check_ha_status, etc.) that work across F5 and other ADC vendors. Software upgrades, decommissioning, and pool/WideIP maintenance are handled by a large dedicated f5.* step family used by the built-in F5 workflows — see the F5 BIG-IP group in the Step Catalog below.

# Pull VS status and pool health directly from an F5 via TMSH
device = versus.devices(vendor='f5_bigip', hostname='bigip-01')[0]
vs_status = versus.get_vs_status(device['id'], vs_name='vs_https_443')
versus.log(vs_status)

pool_health = versus.http_get(device['id'], '/mgmt/tm/ltm/pool/~Common~pool_web/members')
down = [m for m in pool_health.get('items', []) if m.get('state') != 'up']
if down:
    versus.set_output('pool_members_down', [m['name'] for m in down])

Step Catalog

Steps are the building blocks of visual workflows. Each step has a key (e.g. crowdstrike.contain_host), a display label, and a config schema. Steps store outputs as context variables accessible by downstream steps.

There is no dedicated "ServiceNow" step category in the palette. ServiceNow actions are performed from a Python Script step using the versus.create_snow_* shortcuts or versus.integrations.snow(). A handful of narrowly-scoped ServiceNow steps do exist (snow.create_cr, snow.check_change, snow.close_change, checkpoint.snow_create_cr, and siblings) but they're wired into the internals of specific built-in upgrade workflows rather than general-purpose palette items.

Core

Step keyLabelDescription
core.manual_triggerManual TriggerStart node — collects run input from the "Run workflow" form
core.flag_checkInclude Step?Branches yes/no based on a boolean run-context flag set at run creation
core.approvalApproval GatePauses the run until an authorized user approves or rejects
core.approval_gateApproval Required?Branches required/skip based on the run's require_approval flag
core.delayDelayPauses execution for a fixed number of seconds
core.python_scriptPython ScriptRun arbitrary Python with the versus SDK injected
core.http_requestHTTP RequestRun a Python script with an http client + integrations injected, for calling any REST API
core.webhookWebhookCall any URL with a configurable method, headers, auth, and body; supports {{variable}} interpolation
core.rundeckRundeck JobTrigger a Rundeck job by UUID with JSON options, optionally wait for completion

AWX / Ansible Tower

Step keyLabelDescription
awx.check_connectivityCheck ConnectivityVerify AWX /ping/ and store version in ctx
awx.launch_job_templateLaunch Job TemplateLaunch by ID or name, optional extra_vars, limit, wait
awx.wait_for_jobWait for JobPoll a job ID until successful or failed
awx.get_job_outputGet Job OutputFetch job stdout and store in a ctx variable
awx.sync_projectSync AWX ProjectTrigger SCM update for a project, optionally wait

CrowdStrike Falcon

Step keyLabelDescription
crowdstrike.check_connectivityCheck ConnectivityVerify OAuth2 token exchange with Falcon API
crowdstrike.get_host_detailsGet Host DetailsLook up host by hostname; stores AID + containment status in ctx
crowdstrike.contain_hostContain HostNetwork-isolate a host; reads AID from ctx
crowdstrike.lift_containmentLift ContainmentRemove network isolation from a host
crowdstrike.list_detectionsList DetectionsFetch detections with optional FQL filter; stores list in ctx
crowdstrike.get_vulnerabilitiesGet Vulnerabilities (Spotlight)Open CVEs for a host AID; stores count and list in ctx
crowdstrike.run_rtr_scriptRun RTR ScriptExecute PowerShell/shell on a live host via Real Time Response
crowdstrike.update_detectionUpdate Detection StatusClose, escalate, or reassign a Falcon detection

Zscaler

Step keyLabelDescription
zscaler.zia_check_connectivityCheck ZIA ConnectivityVerify Zscaler Internet Access API auth and tenant reachability
zscaler.zia_get_pse_statusGet Current PSE VersionRead the installed version of ZIA Private Service Edge node(s)
zscaler.zia_activateActivate ZIA ChangesPush pending ZIA policy/config changes to production
zscaler.zia_upgrade_pseInitiate PSE UpgradeStart a firmware upgrade of ZIA PSE node(s)
zscaler.zia_check_upgrade_statusCheck PSE Upgrade StatusPoll the PSE upgrade job until terminal state
zscaler.zpa_check_connectivityCheck ZPA ConnectivityVerify Zscaler Private Access API auth and tenant reachability
zscaler.zpa_get_connector_statusInventory ZPA ConnectorsList App Connectors and their versions/health
zscaler.zpa_upgrade_connectorsInitiate Connector UpgradesStart an upgrade of the selected App Connectors
zscaler.zpa_check_connector_upgrade_statusCheck Connector Upgrade StatusPoll connector upgrade jobs until terminal state
zscaler.zpa_list_access_rulesList ZPA Access Policy RulesEnumerate ZPA access policy rules
zscaler.zpa_create_non_uba_ruleCreate ZPA Non-UBA Access RuleAdd an access rule that bypasses User Behavior Analytics
zscaler.zpa_verify_access_ruleVerify ZPA Access RuleConfirm a policy rule is present and correctly ordered
zscaler.zpa_verify_connectorsVerify Connector ConnectivityConfirm upgraded connectors are healthy and reachable

F5 BIG-IP

Step keyLabelDescription
f5.check_ha_statusCheck HA StatusConfirm the pair's failover state before starting maintenance
f5.copy_codeCopy CodeTransfer a software image to the device
f5.ucsSave UCS BackupCreate a full configuration archive before changes
f5.qkviewCreate QKViewGenerate a diagnostic QKView for F5 Support / iHealth
f5.calculate_volumeCalculate VolumeDetermine the target boot volume for the new image
f5.deploy_volumeDeploy VolumeInstall the new image to the target boot volume
f5.reboot_volumeReboot into New VolumeReboot into the newly installed volume
f5.save_syncSave & Sync ConfigSave and sync configuration across an HA pair
f5.force_offlineForce OfflineManually flip a unit's HA state during a controlled upgrade
f5.force_onlineForce OnlineReturn a unit to active/standby service
f5.failoverFailover PairForce an HA failover
f5.relicenseRelicenseRe-activate licensing after a version change
f5.disk_utilization_checkDisk Utilization CheckAlert on low disk space
f5.security_auditF5 Security AuditRun the built-in F5 configuration security audit
f5.run_ansible_playbookRun F5 Ansible PlaybookExecute an Ansible playbook against the device
f5.pool_updateUpdate PoolAdd, remove, or modify pool members

Partial list — F5 has the largest step catalog in Versus (~20 more covering config-load verification, NTP/license checks, HA member snapshots, auto-sync toggling, decommissioning, and WideIP decommissioning). Browse the full set from the step palette under the F5 category.


Built-in Workflows

Built-in workflows are pre-built, version-controlled templates seeded into every Versus instance. Use them as-is or clone and customise. Find them under Workflows → All Workflows → Built-in. The table below covers the workflows built directly on the integrations documented on this page (ServiceNow, AWX, CrowdStrike) — Versus also ships a much larger library of vendor upgrade/decommission workflows (F5, NetScaler, Palo Alto, Cisco IOS, Check Point, Zscaler, Alteon, vSphere) that isn't reproduced here.

SlugNameCategoryDescription
awx-job-template-launchAWX / Tower Job Template LaunchAutomationLaunches any AWX job template with optional extra variables, host limiting, and change-control gating via ServiceNow
awx-config-deployAWX Configuration DeploymentAutomationDeploys config changes via AWX with a normal ServiceNow change request, approval gate, output capture, and CR close
awx-compliance-scanAWX Compliance ScanSecurityRuns a compliance scan (NIST, CIS, PCI, custom) via AWX against a target host group; surfaces scan output in the run log
cs-host-containmentCrowdStrike Host ContainmentSecurityNetwork-isolates a compromised host via Falcon — emergency CHG, approval, contain, collect Spotlight CVEs, update CR
cs-vulnerability-scanCrowdStrike Vulnerability Scan (Spotlight)SecurityQueries Falcon Spotlight for open CVEs on a host; creates a ServiceNow incident with Critical/High findings
cs-detection-investigationCrowdStrike Detection InvestigationSecurityFetches detections by FQL filter, opens a ServiceNow security incident, requires analyst approval, updates detection status

Built-in workflows are seeded by migrations and updated with each Versus release. Cloning a built-in workflow lets you customise it without losing the ability to compare against the original.


Complete method reference

Everything below is generated by introspecting the live SDK, so it matches the current platform exactly. The always-current copy is the SDK Reference panel in any Python step (it autocompletes as you type versus.); this page and the downloadable PDF are a point-in-time snapshot for reading offline.

At a glance: 41 core methods, 34 integration methods across the providers below, and native troubleshooting across 23 vendor families.

Core — versus.* (41)

MethodWhat it does
versus.add_snow_work_notes(change_number: str, notes: str) -> NoneAppend work notes to an existing CHG or CTASK.
versus.ai(prompt: str, system: str = '', max_tokens: int = 2048) -> strCall the default AI provider with a single prompt.
versus.available_probes(device_id)List the native probe kinds available for a device's vendor, e.g.
versus.certificates(expiring_within_days=None, expired=False, common_name=None, limit=200)Return a list of certificates from the applications inventory.
versus.check_ha_status(device_id)Check High Availability state for a managed device.
versus.check_port(device_id, target_ip, port, protocol='tcp', timeout=5)Test TCP/UDP port connectivity from a managed device using nc (netcat).
versus.check_snow_approval(change_number: str) -> tupleCheck whether a CHG or CTASK is approved / in an active state.
versus.close_snow_change(change_number: str, close_notes: str, work_notes: str = '') -> NoneClose a ServiceNow Change Request (sets state to Review / Closed).
versus.create_snow_change(short_description: str, description: str, risk: str = '3', impact: str = '3', category: str = 'Network', **kwargs) -> dictCreate a ServiceNow Normal Change Request.
versus.create_snow_incident(short_description: str, description: str, urgency: str = '2', impact: str = '2', category: str = 'Network', **kwargs) -> dictCreate a ServiceNow Incident.
versus.devices(vendor=None, hostname=None, status=None, device_type=None, limit=200)Return a list of managed devices.
versus.dns_lookup(device_id, hostname)Perform a DNS lookup from a managed device.
versus.dns_resolve(hostname)Resolve a PUBLIC hostname to its IPs, as an internet client would (this
versus.firewall_rules(device_id=None, name=None, action=None, limit=200)Return a list of firewall rules.
versus.get_arp_table(device_id)Get ARP table entries from a managed device.
versus.get_device(device_id)Return a single device dict by ID, or None if not found.
versus.get_device_stats(device_id)Get CPU, memory, and throughput statistics for a managed device.
versus.get_input(key, default=None)Read a variable set by a previous workflow step.
versus.get_interfaces(device_id)Get interface status and error counters from a managed device.
versus.get_logs(device_id, pattern=None, lines=50)Get recent system / error log entries from a managed device.
versus.get_pool_status(device_id, pool_name=None)Get pool and pool member health from an ADC.
versus.get_route_table(device_id, prefix=None)Get the routing table from a managed device.
versus.get_snow_change_state(change_number: str) -> dictLightweight fetch of just the state/approval for a CHG.
versus.get_snow_info(change_number: str) -> dictReturn a summary dict for a CHG or CTASK.
versus.get_vs_status(device_id, vs_name=None)Get virtual server availability and connection statistics from an ADC.
versus.http_get(device_id, path)Make an iControl REST GET request to an F5 BIG-IP.
versus.http_patch(device_id, path, payload)Make an iControl REST PATCH request to an F5 BIG-IP.
versus.http_probe(url, method='GET', timeout=15)HTTP GET/HEAD a URL from the platform's internet vantage — i.e. exactly
versus.integrationsAccess all configured integrations by type and name.
versus.log(*args)Write a message to the workflow step log.
versus.ping(device_id, target, count=4)Run a ping from a managed device to a target IP or hostname.
versus.probe(device_id, kind, **args)Run one native vendor troubleshooting probe against a device using its
`versus.query_snow_changes(start_dt, end_dt, category: strNone = None) -> list`
versus.run_ssh(device_id, command, timeout=30)Run an SSH command on any managed device using its stored credential.
versus.run_tmsh(device_id, command)Run a TMSH command on an F5 BIG-IP device.
versus.set_output(key, value)Set a variable that downstream steps can read with get_input().
versus.traceroute(device_id, target)Run a traceroute from a managed device to a target.
versus.update_vuln_result(device_id, cve_id, status, evidence='')Update a DeviceVulnerabilityResult record for this device + CVE.
versus.vendor_family(device_id)Native-driver family detected for a device — e.g. 'netscaler', 'panos',
versus.virtual_servers(device_id=None, name=None, status=None, limit=200)Return a list of virtual servers.
versus.wideips(device_id=None, name=None, enabled=None, limit=200)Return a list of GTM WideIPs.

Integrations — versus.integrations.* (34)

Each provider exposes a <name>_list() (list configured instances) and a <name>(name=None) accessor that returns a client with its own methods. Those per-client methods are documented inline in the in-app panel and the PDF.

MethodWhat it does
`versus.integrations.ai(name: strNone = None)`
versus.integrations.ai_list() -> list[dict]Return all enabled AI providers.
`versus.integrations.appviewx(name: strNone = None)`
`versus.integrations.awx(name: strNone = None)`
versus.integrations.awx_list() -> list[dict]Return all enabled Ansible Tower / AWX sources.
`versus.integrations.cert_platform(name: strNone = None, platform_type: str
versus.integrations.cert_platform_list() -> list[dict]Return all enabled cert platform sources.
versus.integrations.certs()Return a CertAuthoritySDK instance for certificate operations.
`versus.integrations.cloud(name: strNone = None, provider: str
versus.integrations.cloud_list() -> list[dict]Return all enabled Cloud Account sources.
`versus.integrations.confluence(name: strNone = None)`
versus.integrations.confluence_list() -> list[dict]Return all enabled Confluence sources.
`versus.integrations.crowdstrike(name: strNone = None)`
versus.integrations.crowdstrike_list() -> list[dict]Return all enabled CrowdStrike sources.
`versus.integrations.ipam(name: strNone = None)`
versus.integrations.ipam_list() -> list[dict]Return all enabled IPAM sources.
`versus.integrations.jira(name: strNone = None)`
versus.integrations.jira_list() -> list[dict]Return all enabled Jira sources.
`versus.integrations.keyfactor(name: strNone = None)`
`versus.integrations.pager(name: strNone = None)`
versus.integrations.pager_list() -> list[dict]Return all enabled pager sources.
`versus.integrations.rundeck(name: strNone = None)`
versus.integrations.rundeck_list() -> list[dict]Return all enabled Rundeck sources.
`versus.integrations.scm(name: strNone = None)`
versus.integrations.scm_list() -> list[dict]Return all enabled SCM sources.
versus.integrations.siem(name: str)Return a UnifiedSIEMClient for the named SIEMSource.
versus.integrations.siem_list() -> list[dict]Return all enabled SIEM sources.
`versus.integrations.slack(name: strNone = None)`
versus.integrations.slack_list() -> list[dict]Return all enabled Slack sources.
`versus.integrations.snow(name: strNone = None)`
versus.integrations.snow_list() -> list[dict]Return all configured ServiceNow instances.
`versus.integrations.venafi(name: strNone = None, variant: str
`versus.integrations.vsphere(name: strNone = None)`
versus.integrations.vsphere_list() -> list[dict]Return all configured vSphere/vCenter connections.

Native vendor troubleshooting — versus.probe(...)

versus.probe(device_id, kind, **args) runs one read-only probe using the device's own native driver (the same drivers Diagnostics AutoPilot uses), returning a formatted string — or None when that vendor has no native driver for the probe (fall back to versus.run_ssh(...)). versus.available_probes(device_id) lists what a device supports and versus.vendor_family(device_id) returns its detected family.

Probe kinds: health, ha, stats, vs_status, pool_status, interfaces, routes, arp, objects, certs, events, sessions, cpu, bgp, vs_stats, capture.

Vendor familyNative probe kinds
a10certs, ha, health, objects, pool_status, stats, vs_status
acievents, ha, health, objects, stats
alteoncerts, ha, health, objects, pool_status, stats, vs_status
aristabgp, capture, cpu, ha, health, interfaces, objects
asaha, health, objects
avicerts, ha, health, objects, pool_status, stats, vs_status
aws_albhealth, pool_status, vs_status
azure_albhealth, vs_status
bluecathealth, objects
checkpointarp, bgp, capture, cpu, events, gateways, ha, health, interfaces, objects, packages, routes, rules, sessions, stats
ciscoarp, bgp, cpu, health, interfaces, objects, ping, routes
cloudflareevents, health, objects
efficientipevents, health, objects
f5osha, health, interfaces, objects, slots, stats
f5xcevents, health, pool_status, stats, vs_status
fortigatearp, bgp, capture, cpu, ha, health, interfaces, objects, routes, sessions
infobloxha, health, objects
kempcerts, ha, health, pool_status, stats, vs_status
netscalercerts, ha, health, objects, pool_status, sessions, stats, vs_stats, vs_status
nexusarp, bgp, capture, cpu, health, interfaces, objects, ping, routes
nsx_fwha, health, objects, stats
nsxtha, health, objects
panosarp, bgp, cpu, events, ha, health, interfaces, objects, routes, sessions, stats