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.
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.
core.python_script) — only versus is injected. Reach integrations via versus.integrations.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'])
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.
| Method | Returns | Description |
|---|---|---|
.log(*args) | None | Write a message to the step log |
.get_input(key, default=None) | Any | Read a variable set by a previous step |
.set_output(key, value) | None | Set a variable downstream steps can read with get_input() |
| Method | Returns | Description |
|---|---|---|
.devices(vendor, hostname, status, device_type, limit=200) | list[dict] | Query managed devices — all keyword args optional, AND-combined |
.get_device(device_id) | dict|None | Single 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
| Method | Returns | Description |
|---|---|---|
.run_tmsh(device_id, command) | str | Run a TMSH command, e.g. 'show /ltm virtual' |
.http_get(device_id, path) | dict | iControl REST GET, e.g. '/mgmt/tm/ltm/virtual' |
.http_patch(device_id, path, payload) | dict | iControl 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).
| Method | Returns | Description |
|---|---|---|
.run_ssh(device_id, command, timeout=30) | str | SSH command on any credentialed device — Cisco, Arista, FortiGate, Juniper, Palo Alto, etc. |
.ping(device_id, target, count=4) | str | Vendor-aware ping (TMSH / IOS / EOS / JunOS / PAN-OS syntax) |
.traceroute(device_id, target) | str | Vendor-aware traceroute |
.dns_lookup(device_id, hostname) | str | nslookup executed from the device |
.check_port(device_id, target_ip, port, protocol='tcp', timeout=5) | str | TCP/UDP reachability via nc — 'open', 'closed', or raw error |
.get_vs_status(device_id, vs_name=None) | str | Virtual server status — F5 / NetScaler / A10-aware |
.get_pool_status(device_id, pool_name=None) | str | Pool / pool-member health — F5 / NetScaler-aware |
.get_device_stats(device_id) | str | CPU, memory, and throughput statistics |
.check_ha_status(device_id) | str | HA / failover state — F5, ASA, Fortinet, Palo Alto |
.get_interfaces(device_id) | str | Interface status and error counters |
.get_arp_table(device_id) | str | ARP table entries |
.get_route_table(device_id, prefix=None) | str | Routing table, optionally filtered by prefix |
.get_logs(device_id, pattern=None, lines=50) | str | Recent 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.
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.
| Method | Returns | Description |
|---|---|---|
.update_vuln_result(device_id, cve_id, status, evidence='') | None | Record a per-device CVE determination — status: confirmed | patched | not_affected | potentially_affected |
| Method | Returns | Description |
|---|---|---|
.ai(prompt, system='', max_tokens=2048) | str | One-shot call to the default AI provider — shortcut for versus.integrations.ai().complete(prompt) |
| Method | Returns | Description |
|---|---|---|
.create_snow_incident(short_description, description, urgency='2', impact='2', category='Network', **kwargs) | dict | Create an Incident |
.create_snow_change(short_description, description, risk='3', impact='3', category='Network', **kwargs) | dict | Create a Normal Change Request |
.close_snow_change(change_number, close_notes, work_notes='') | None | Close a CHG or CTASK |
.check_snow_approval(change_number) | tuple | (approved: bool, state_label: str, message: str) |
.get_snow_info(change_number) | dict | Summary dict for a CHG or CTASK |
.get_snow_change_state(change_number) | dict | Lightweight state/approval fetch |
.add_snow_work_notes(change_number, notes) | None | Append work notes to an existing CHG or CTASK |
.query_snow_changes(start_dt, end_dt, category=None) | list | Change requests overlapping a datetime window |
Note:
create_snow_incident()andcreate_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.) raiseRuntimeErrorif no ServiceNow instance is configured. These shortcuts use the first configured instance only — for named-instance access or the full method set, useversus.integrations.snow().
| Method | Returns | Description |
|---|---|---|
.integrations | IntegrationsSDK | Property — factory for all configured integration clients, documented below |
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)
| Method | Returns | Description |
|---|---|---|
.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) | None | Append work notes to a CHG or CTASK |
.close_change(number, close_notes, work_notes='') | None | Close a CHG (state → Review) or CTASK (state → Closed Complete) |
.create_change_request(short_description, description, category, risk, impact, priority, change_type, …) | dict | Create a Change Request — returns {number, sys_id, state, short_description} |
.create_incident(short_description, description, urgency, impact, priority, category, subcategory, …) | dict | Create 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')
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.rundeckstep (see Step Catalog) wrapsrun_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]}")
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']}")
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)
"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))
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 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])
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 orversus.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.
| Step key | Label | Description |
|---|---|---|
core.manual_trigger | Manual Trigger | Start node — collects run input from the "Run workflow" form |
core.flag_check | Include Step? | Branches yes/no based on a boolean run-context flag set at run creation |
core.approval | Approval Gate | Pauses the run until an authorized user approves or rejects |
core.approval_gate | Approval Required? | Branches required/skip based on the run's require_approval flag |
core.delay | Delay | Pauses execution for a fixed number of seconds |
core.python_script | Python Script | Run arbitrary Python with the versus SDK injected |
core.http_request | HTTP Request | Run a Python script with an http client + integrations injected, for calling any REST API |
core.webhook | Webhook | Call any URL with a configurable method, headers, auth, and body; supports {{variable}} interpolation |
core.rundeck | Rundeck Job | Trigger a Rundeck job by UUID with JSON options, optionally wait for completion |
| Step key | Label | Description |
|---|---|---|
awx.check_connectivity | Check Connectivity | Verify AWX /ping/ and store version in ctx |
awx.launch_job_template | Launch Job Template | Launch by ID or name, optional extra_vars, limit, wait |
awx.wait_for_job | Wait for Job | Poll a job ID until successful or failed |
awx.get_job_output | Get Job Output | Fetch job stdout and store in a ctx variable |
awx.sync_project | Sync AWX Project | Trigger SCM update for a project, optionally wait |
| Step key | Label | Description |
|---|---|---|
crowdstrike.check_connectivity | Check Connectivity | Verify OAuth2 token exchange with Falcon API |
crowdstrike.get_host_details | Get Host Details | Look up host by hostname; stores AID + containment status in ctx |
crowdstrike.contain_host | Contain Host | Network-isolate a host; reads AID from ctx |
crowdstrike.lift_containment | Lift Containment | Remove network isolation from a host |
crowdstrike.list_detections | List Detections | Fetch detections with optional FQL filter; stores list in ctx |
crowdstrike.get_vulnerabilities | Get Vulnerabilities (Spotlight) | Open CVEs for a host AID; stores count and list in ctx |
crowdstrike.run_rtr_script | Run RTR Script | Execute PowerShell/shell on a live host via Real Time Response |
crowdstrike.update_detection | Update Detection Status | Close, escalate, or reassign a Falcon detection |
| Step key | Label | Description |
|---|---|---|
zscaler.zia_check_connectivity | Check ZIA Connectivity | Verify Zscaler Internet Access API auth and tenant reachability |
zscaler.zia_get_pse_status | Get Current PSE Version | Read the installed version of ZIA Private Service Edge node(s) |
zscaler.zia_activate | Activate ZIA Changes | Push pending ZIA policy/config changes to production |
zscaler.zia_upgrade_pse | Initiate PSE Upgrade | Start a firmware upgrade of ZIA PSE node(s) |
zscaler.zia_check_upgrade_status | Check PSE Upgrade Status | Poll the PSE upgrade job until terminal state |
zscaler.zpa_check_connectivity | Check ZPA Connectivity | Verify Zscaler Private Access API auth and tenant reachability |
zscaler.zpa_get_connector_status | Inventory ZPA Connectors | List App Connectors and their versions/health |
zscaler.zpa_upgrade_connectors | Initiate Connector Upgrades | Start an upgrade of the selected App Connectors |
zscaler.zpa_check_connector_upgrade_status | Check Connector Upgrade Status | Poll connector upgrade jobs until terminal state |
zscaler.zpa_list_access_rules | List ZPA Access Policy Rules | Enumerate ZPA access policy rules |
zscaler.zpa_create_non_uba_rule | Create ZPA Non-UBA Access Rule | Add an access rule that bypasses User Behavior Analytics |
zscaler.zpa_verify_access_rule | Verify ZPA Access Rule | Confirm a policy rule is present and correctly ordered |
zscaler.zpa_verify_connectors | Verify Connector Connectivity | Confirm upgraded connectors are healthy and reachable |
| Step key | Label | Description |
|---|---|---|
f5.check_ha_status | Check HA Status | Confirm the pair's failover state before starting maintenance |
f5.copy_code | Copy Code | Transfer a software image to the device |
f5.ucs | Save UCS Backup | Create a full configuration archive before changes |
f5.qkview | Create QKView | Generate a diagnostic QKView for F5 Support / iHealth |
f5.calculate_volume | Calculate Volume | Determine the target boot volume for the new image |
f5.deploy_volume | Deploy Volume | Install the new image to the target boot volume |
f5.reboot_volume | Reboot into New Volume | Reboot into the newly installed volume |
f5.save_sync | Save & Sync Config | Save and sync configuration across an HA pair |
f5.force_offline | Force Offline | Manually flip a unit's HA state during a controlled upgrade |
f5.force_online | Force Online | Return a unit to active/standby service |
f5.failover | Failover Pair | Force an HA failover |
f5.relicense | Relicense | Re-activate licensing after a version change |
f5.disk_utilization_check | Disk Utilization Check | Alert on low disk space |
f5.security_audit | F5 Security Audit | Run the built-in F5 configuration security audit |
f5.run_ansible_playbook | Run F5 Ansible Playbook | Execute an Ansible playbook against the device |
f5.pool_update | Update Pool | Add, 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 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.
| Slug | Name | Category | Description |
|---|---|---|---|
awx-job-template-launch | AWX / Tower Job Template Launch | Automation | Launches any AWX job template with optional extra variables, host limiting, and change-control gating via ServiceNow |
awx-config-deploy | AWX Configuration Deployment | Automation | Deploys config changes via AWX with a normal ServiceNow change request, approval gate, output capture, and CR close |
awx-compliance-scan | AWX Compliance Scan | Security | Runs a compliance scan (NIST, CIS, PCI, custom) via AWX against a target host group; surfaces scan output in the run log |
cs-host-containment | CrowdStrike Host Containment | Security | Network-isolates a compromised host via Falcon — emergency CHG, approval, contain, collect Spotlight CVEs, update CR |
cs-vulnerability-scan | CrowdStrike Vulnerability Scan (Spotlight) | Security | Queries Falcon Spotlight for open CVEs on a host; creates a ServiceNow incident with Critical/High findings |
cs-detection-investigation | CrowdStrike Detection Investigation | Security | Fetches 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.
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.
versus.* (41)| Method | What it does |
|---|---|
versus.add_snow_work_notes(change_number: str, notes: str) -> None | Append work notes to an existing CHG or CTASK. |
versus.ai(prompt: str, system: str = '', max_tokens: int = 2048) -> str | Call 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) -> tuple | Check whether a CHG or CTASK is approved / in an active state. |
versus.close_snow_change(change_number: str, close_notes: str, work_notes: str = '') -> None | Close 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) -> dict | Create a ServiceNow Normal Change Request. |
versus.create_snow_incident(short_description: str, description: str, urgency: str = '2', impact: str = '2', category: str = 'Network', **kwargs) -> dict | Create 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) -> dict | Lightweight fetch of just the state/approval for a CHG. |
versus.get_snow_info(change_number: str) -> dict | Return 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.integrations | Access 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: str | None = 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. |
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.
| Method | What it does |
|---|---|
| `versus.integrations.ai(name: str | None = None)` |
versus.integrations.ai_list() -> list[dict] | Return all enabled AI providers. |
| `versus.integrations.appviewx(name: str | None = None)` |
| `versus.integrations.awx(name: str | None = None)` |
versus.integrations.awx_list() -> list[dict] | Return all enabled Ansible Tower / AWX sources. |
| `versus.integrations.cert_platform(name: str | None = 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: str | None = None, provider: str |
versus.integrations.cloud_list() -> list[dict] | Return all enabled Cloud Account sources. |
| `versus.integrations.confluence(name: str | None = None)` |
versus.integrations.confluence_list() -> list[dict] | Return all enabled Confluence sources. |
| `versus.integrations.crowdstrike(name: str | None = None)` |
versus.integrations.crowdstrike_list() -> list[dict] | Return all enabled CrowdStrike sources. |
| `versus.integrations.ipam(name: str | None = None)` |
versus.integrations.ipam_list() -> list[dict] | Return all enabled IPAM sources. |
| `versus.integrations.jira(name: str | None = None)` |
versus.integrations.jira_list() -> list[dict] | Return all enabled Jira sources. |
| `versus.integrations.keyfactor(name: str | None = None)` |
| `versus.integrations.pager(name: str | None = None)` |
versus.integrations.pager_list() -> list[dict] | Return all enabled pager sources. |
| `versus.integrations.rundeck(name: str | None = None)` |
versus.integrations.rundeck_list() -> list[dict] | Return all enabled Rundeck sources. |
| `versus.integrations.scm(name: str | None = 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: str | None = None)` |
versus.integrations.slack_list() -> list[dict] | Return all enabled Slack sources. |
| `versus.integrations.snow(name: str | None = None)` |
versus.integrations.snow_list() -> list[dict] | Return all configured ServiceNow instances. |
| `versus.integrations.venafi(name: str | None = None, variant: str |
| `versus.integrations.vsphere(name: str | None = None)` |
versus.integrations.vsphere_list() -> list[dict] | Return all configured vSphere/vCenter connections. |
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 family | Native probe kinds |
|---|---|
a10 | certs, ha, health, objects, pool_status, stats, vs_status |
aci | events, ha, health, objects, stats |
alteon | certs, ha, health, objects, pool_status, stats, vs_status |
arista | bgp, capture, cpu, ha, health, interfaces, objects |
asa | ha, health, objects |
avi | certs, ha, health, objects, pool_status, stats, vs_status |
aws_alb | health, pool_status, vs_status |
azure_alb | health, vs_status |
bluecat | health, objects |
checkpoint | arp, bgp, capture, cpu, events, gateways, ha, health, interfaces, objects, packages, routes, rules, sessions, stats |
cisco | arp, bgp, cpu, health, interfaces, objects, ping, routes |
cloudflare | events, health, objects |
efficientip | events, health, objects |
f5os | ha, health, interfaces, objects, slots, stats |
f5xc | events, health, pool_status, stats, vs_status |
fortigate | arp, bgp, capture, cpu, ha, health, interfaces, objects, routes, sessions |
infoblox | ha, health, objects |
kemp | certs, ha, health, pool_status, stats, vs_status |
netscaler | certs, ha, health, objects, pool_status, sessions, stats, vs_stats, vs_status |
nexus | arp, bgp, capture, cpu, health, interfaces, objects, ping, routes |
nsx_fw | ha, health, objects, stats |
nsxt | ha, health, objects |
panos | arp, bgp, cpu, events, ha, health, interfaces, objects, routes, sessions, stats |