Search Commands
Reference for whisperlookup, whisperquery, whisperschema, whisperflush, whisperevict.
Search Commands Documentation
Diagram
| whisperquery | Raw Cypher queries against the Knowledge Graph |
| whisperexplain | Threat intelligence assessment for indicators |
| whisperlookup | Inline enrichment of events in SPL |
| whisperevict / whisperflush | Cache management |
whisperlookup
Streaming command that enriches events with IOC context from the Knowledge Graph. It appends enrichment fields to each event inline.
Syntax
| whisperlookup field=<field_name> [type=auto|domain|ip] [include_threat_intel=true|false] [include_cname=true|false] [include_nameserver=true|false] [include_feeds=true|false] [add_prefix=<prefix>]
Parameters
| Parameter | Required | Default | Description |
|---|---|---|---|
field | Yes | — | Event field containing the indicator to enrich |
type | No | auto | Indicator type: auto (detect from value), domain, or ip |
include_threat_intel | No | true | Include all threat-related fields (threat score, level, boolean indicators, ASN threat data, and explain API results) |
include_cname | No | true | Include CNAME chain resolution |
include_nameserver | No | true | Include nameserver information |
include_feeds | No | true | Include threat feed listings |
add_prefix | No | whisper_ | Prefix added to enrichment field names |
Output fields
For domain enrichment, these fields are appended (with the configured prefix):
| Field | Description | Example |
|---|---|---|
whisper_ip | Resolved IP address(es) | 93.184.216.34 |
whisper_prefix | BGP prefix (CIDR block) | 93.184.216.0/24 |
whisper_asn | Autonomous System Number | AS15133 |
whisper_asn_name | ASN organization name | Edgecast Inc. |
whisper_country | Country code | US |
whisper_cohost_count | Number of co-hosted domains | 42 |
whisper_cname_chain | CNAME alias chain | www.example.com,example.com |
whisper_cname_depth | CNAME chain depth | 1 |
whisper_cname_target | Final CNAME target | example.com |
whisper_nameservers | Nameserver list | a.iana-servers.net,b.iana-servers.net |
whisper_threat_score | Threat score (unbounded float, 0-100+) | 15 |
whisper_threat_level | Threat level (from API or derived) | LOW |
whisper_is_threat | Boolean: known threat indicator | true |
whisper_is_tor | Boolean: Tor exit node | false |
whisper_is_c2 | Boolean: command-and-control | false |
whisper_is_malware | Boolean: malware distribution | false |
whisper_is_phishing | Boolean: phishing host | false |
whisper_is_spam | Boolean: spam source | false |
whisper_is_bruteforce | Boolean: brute-force source | false |
whisper_is_scanner | Boolean: network scanner | false |
whisper_is_blacklist | Boolean: on public blacklist | false |
whisper_is_proxy | Boolean: open proxy | false |
whisper_is_vpn | Boolean: VPN exit node | false |
whisper_is_anonymizer | Boolean: anonymization service | false |
whisper_is_whitelist | Boolean: explicitly whitelisted | false |
whisper_threat_explanation | Human-readable threat summary | Low risk indicator... |
whisper_threat_factors | Contributing factors (multivalue) | listed_in_blocklist_de |
whisper_threat_sources | Per-feed source data | (structured list) |
whisper_threat_feed_ids | Feed IDs for ES threat_key | blocklist_de,spamhaus |
whisper_threat_first_seen | Earliest feed observation date | 2024-01-15 |
whisper_threat_last_seen | Most recent feed observation date | 2024-06-30 |
whisper_feed_names | Threat feed names | blocklist_de,spamhaus |
whisper_feed_count | Number of feeds listing this indicator | 2 |
whisper_feed_categories | Feed categories (from CATEGORY nodes) | Malware,Spam |
whisper_type | Indicator type used | domain |
whisper_risk_score | Normalized risk score (0-100), maps to ES risk_score | 45 |
whisper_risk_level | Risk level: informational, low, medium, high, critical | medium |
whisper_risk_factors_list | Comma-separated contributing risk factor names | no_dnssec, threat_feed_medium |
whisper_risk_components | JSON per-factor score breakdown | {"no_dnssec": {"points": 15, ...}} |
The inline threat fields also include:
| Field | Description | Example |
|---|---|---|
whisper_threat_sources_count | Number of threat intelligence sources listing this indicator | 3 |
whisper_threat_first_seen | Earliest date this indicator appeared in any feed | 2024-01-15 |
whisper_threat_last_seen | Most recent date this indicator appeared in any feed | 2024-06-30 |
For IP enrichment, the same threat fields apply plus:
| Field | Description | Example |
|---|---|---|
whisper_reverse_dns_count | Number of reverse DNS hostnames | 5 |
whisper_asn_threat_level | ASN overall threat level: NONE/LOW/MEDIUM/HIGH/CRITICAL | MEDIUM |
whisper_asn_threat_score | ASN composite threat score (numeric) | 45.2 |
whisper_asn_max_threat_score | Highest single-prefix threat score within the ASN | 82.0 |
whisper_asn_avg_threat_score | Average threat score across the ASN's prefixes | 31.5 |
whisper_asn_has_threatening_prefixes | Boolean: ASN contains at least one high-risk prefix | true |
Inline threat data:
whisper_threat_scoreand the booleanwhisper_is_*fields come from inline properties on the IPV4 node in the graph. Theexplain()API is only called when those inline properties are absent. It returns explanation text, per-feed sources, and first/last seen dates. Both paths populatewhisper_threat_scoreandwhisper_threat_level.
CIM field aliases are also created:
| CIM Field | Source |
|---|---|
dest_ip | whisper_ip |
dest_country | whisper_country |
dest_asn | whisper_asn |
threat_score | whisper_threat_score |
threat_level | whisper_threat_level |
risk_score | whisper_risk_score |
risk_level | whisper_risk_level |
is_threat | whisper_is_threat |
is_c2 | whisper_is_c2 |
is_tor | whisper_is_tor |
is_malware | whisper_is_malware |
is_phishing | whisper_is_phishing |
is_anonymizer | whisper_is_anonymizer |
is_spam | whisper_is_spam |
is_bruteforce | whisper_is_bruteforce |
is_scanner | whisper_is_scanner |
is_blacklist | whisper_is_blacklist |
is_proxy | whisper_is_proxy |
is_vpn | whisper_is_vpn |
is_whitelist | whisper_is_whitelist |
Examples
Enrich firewall logs with domain context:
index=firewall sourcetype=pan:traffic
| whisperlookup field=dest_host type=domain
| where whisper_threat_score > 50
| table _time dest_host whisper_asn_name whisper_threat_level whisper_feed_names
Enrich IP addresses with auto-detection:
index=proxy sourcetype=squid
| whisperlookup field=src_ip
| stats count by whisper_asn_name whisper_country
Domain enrichment without threat intel (faster):
index=dns sourcetype=dns
| whisperlookup field=query type=domain include_threat_intel=false include_feeds=false
| table query whisper_ip whisper_asn whisper_asn_name whisper_cohost_count
Custom field prefix:
index=web sourcetype=access_combined
| whisperlookup field=clientip type=ip add_prefix="w_"
| table clientip w_asn_name w_country w_threat_level
Private IP addresses: Private IP addresses (10.0.0.0/8, 172.16.0.0/12, 192.168.0.0/16) are automatically skipped — no API call is made and no enrichment fields are added.
Caching: Results are automatically cached in the
whisper_enrichment_cacheKV Store collection. Subsequent lookups for the same indicator within the TTL window (default: 1 hour) are served from cache without an API call. Use| whisperflushto clear the cache.
whisperquery
Generating command that runs ad-hoc Cypher queries against the Knowledge Graph.
Syntax
| whisperquery query="<cypher_query>" [params="<parameters>"] [params_b64="<base64_json>"] [max_results=<N>]
Parameters
| Parameter | Required | Default | Description |
|---|---|---|---|
query | Yes | — | Cypher query string (must include LIMIT clause) |
params | No | — | Query parameters as key=value,key2=value2 or JSON string |
params_b64 | No | — | Base64-encoded JSON parameters (avoids SPL quote-escaping issues with arrays) |
max_results | No | 10000 | Maximum number of results to return |
Examples
Look up a domain's infrastructure:
| whisperquery query="MATCH (h:HOSTNAME {name: $domain})-[:RESOLVES_TO]->(ip:IPV4)-[:BELONGS_TO]->(p:PREFIX)<-[:ROUTES]-(a:ASN)-[:HAS_NAME]->(n:ASN_NAME) RETURN h.name AS hostname, ip.name AS ip, p.name AS prefix, a.name AS asn, n.name AS asn_name LIMIT 10" params="domain=example.com"
Find co-hosted domains:
| whisperquery query="MATCH (h:HOSTNAME {name: $domain})-[:RESOLVES_TO]->(ip:IPV4)<-[:RESOLVES_TO]-(cohost:HOSTNAME) WHERE cohost.name <> $domain RETURN ip.name AS ip, cohost.name AS cohost LIMIT 100" params="domain=example.com"
Get ASN routing information:
| whisperquery query="MATCH (a:ASN {name: $asn})-[:ROUTES]->(p:PREFIX) RETURN a.name AS asn, p.name AS prefix LIMIT 200" params="asn=AS13335"
Use JSON parameters:
| whisperquery query="MATCH (h:HOSTNAME {name: $domain}) RETURN h LIMIT 1" params='{"domain": "example.com"}'
Warning: Queries containing
CREATE,DELETE,SET,MERGE,DROP,REMOVE, orDETACHkeywords are rejected before being sent to the API. The Knowledge Graph is read-only.
whisperschema
Generating command that shows the Knowledge Graph schema -- node labels, relationship types, property keys, and metadata (descriptions, examples, counts, query patterns).
Syntax
| whisperschema mode=<labels|relationships|properties|schema|full>
Parameters
| Parameter | Required | Default | Description |
|---|---|---|---|
mode | No | labels | Schema query mode |
Modes
| Mode | Description | Cypher Equivalent |
|---|---|---|
labels | List all node labels | CALL db.labels() |
relationships | List all relationship types | CALL db.relationshipTypes() |
properties | List all property keys in the graph | CALL db.propertyKeys() |
schema | Schema with descriptions, examples, counts, fast/slow patterns | CALL db.schema() |
full | Combined schema + property keys | CALL db.schema() + CALL db.propertyKeys() |
All events include a whisper_schema_mode field for filtering.
Schema mode output fields
When using mode=schema or mode=full, each event includes all fields listed below. Fields that do not apply to a particular event type (e.g., sourceLabels on a node event) are present as empty strings. This ensures all events have a uniform field set, which is required by the Splunk chunked v2 protocol for correct field display.
| Field | Description |
|---|---|
type | Entity type: node, relationship, or tips |
name | Label or relationship name (e.g., HOSTNAME, RESOLVES_TO) |
count | Number of entities in the graph |
description | Human-readable description |
example | Example value |
sourceLabels | Source node labels (populated for relationships, JSON array) |
targetLabels | Target node labels (populated for relationships, JSON array) |
fastPatterns | Efficient query patterns (populated for relationships and tips, JSON array) |
slowPatterns | Patterns to avoid (populated for relationships and tips, JSON array) |
bestPractices | Query best practices (populated for relationships and tips, JSON array) |
Examples
List all node types in the graph:
| whisperschema mode=labels
List all relationship types:
| whisperschema mode=relationships
List all property keys:
| whisperschema mode=properties
Explore the full schema with descriptions and examples:
| whisperschema mode=schema
| search type=node
| table name, count, description, example
View query best practices:
| whisperschema mode=schema
| search type=tips
| table bestPractices, fastPatterns, slowPatterns
Get combined schema and property keys:
| whisperschema mode=full
| stats count by whisper_schema_mode
whisperflush
Generating command that flushes the enrichment cache. Requires admin or sc_admin role.
Syntax
| whisperflush [collection=cache|precomputed|all]
Parameters
| Parameter | Required | Default | Description |
|---|---|---|---|
collection | No | cache | Which collection to flush |
Targets
| Collection | KV Store | Description |
|---|---|---|
cache | whisper_enrichment_cache | TTL-based enrichment cache |
precomputed | whisper_precomputed_enrichment | Pre-computed watchlist enrichments |
all | Both | Flush both cache and precomputed collections |
Examples
Flush the enrichment cache:
| whisperflush
Flush pre-computed enrichments:
| whisperflush collection=precomputed
Flush everything:
| whisperflush collection=all
whisperevict
Generating command that evicts expired entries from the enrichment cache using the KV Store REST API. More efficient than loading all records through the SPL pipeline, especially for large caches. This command is used by the "Whisper - Evict Expired Cache Entries" saved search.
Syntax
| whisperevict
How it works
The command uses two phases:
- Bulk delete: Queries the KV Store for expired entries with the default TTL and deletes them in a single REST API call.
- Custom TTL: Scans entries with non-default TTLs and deletes expired ones individually.
This avoids loading all cache records into the search pipeline, which matters for large caches.
Output fields
| Field | Description |
|---|---|
collection | The KV Store collection name |
action | Always evict_expired |
status | success, skipped, or error |
evicted | Number of entries removed |
ttl_seconds | TTL used for expiration calculation |
error | Error message if status is error |
Examples
Run cache eviction manually:
| whisperevict