Modular Inputs

Automated data collection: health check, threat intel, attack surface, watchlist.

Updated April 2026Splunk Integration

Modular Inputs Documentation

The Whisper Security Add-on includes five modular inputs for automated data collection. All are configured via the Inputs page in the add-on UI and disabled by default.

API Health Check

Monitors the Whisper Knowledge Graph API availability and response time.

SettingDefaultRangeDescription
Interval300s (5 min)60-86400Check frequency
AccountrequiredWhisper API account
Index_internalDestination index

Output: sourcetype=whisper:health

FieldDescription
statusUP or DOWN
node_countPhysical (persisted) graph nodes
edge_countPhysical (persisted) graph edges
virtual_node_countVirtual (computed at query time) nodes
virtual_edge_countVirtual (computed at query time) edges
total_node_countTotal nodes (physical + virtual)
total_edge_countTotal edges (physical + virtual)
object_countTotal object count across all types
threat_intel_loadedWhether threat feeds are active
feed_source_countNumber of active threat feeds
asn_enrichment_loadedWhether ASN enrichment layer is active
prefix_bgp_enrichment_loadedWhether BGP prefix enrichment layer is active
threat_intel_refresh_in_progressWhether a threat intel feed refresh is currently running
quota_planAPI plan name (e.g., Free, Professional)
quota_daily_limitMaximum daily API queries allowed
quota_daily_usedAPI queries used today
quota_daily_remainingAPI queries remaining today
quota_hourly_remainingAPI queries remaining this hour
quota_max_timeout_msMaximum query timeout allowed (ms)
quota_max_response_limitMaximum response row limit
quota_max_concurrent_queriesMaximum concurrent queries allowed
quota_concurrent_activeCurrently active concurrent queries
response_time_msAPI response time in milliseconds
errorError message (if status is DOWN)

Verification:

index=_internal sourcetype="whisper:health" | head 5

ES Threat Intelligence Feed

Populates the Splunk ES threat intelligence framework with scored indicators from the Whisper explain() API.

SettingDefaultRangeDescription
Interval21600s (6 hr)300-86400Collection frequency
Max Indicators100001-100000Indicators per run
Include InfrastructureoffAdd ASN/country/prefix context
AccountrequiredWhisper API account
Index_internalDestination index

Output: sourcetype=whisper:threat_intel

Where do threat indicators come from?

The input populates two KV Store collections:

CollectionKey FieldDescription
whisper_ip_intelipIP indicators with threat scores, ASN, country
whisper_domain_inteldomainDomain indicators with threat scores

These integrate with ES via the threat intelligence framework. Correlation searches reference them automatically.

Automatic seeding: On first run, when both KV Store collections are empty, the input automatically queries the Whisper Knowledge Graph for IPV4 and HOSTNAME nodes with threatScore > 0. This bootstraps the collections so threat intelligence flows immediately without manual setup.

After the first run, the input re-assesses all existing indicators in the collections on each interval. To add new indicators, insert them into the appropriate collection:

| makeresults
| eval ip="203.0.113.50", description="Suspicious IP from investigation"
| outputlookup whisper_ip_intel append=true
| makeresults
| eval domain="malicious-example.com", description="Phishing domain"
| outputlookup whisper_domain_intel append=true

Verification:

| inputlookup whisper_ip_intel | head 10
| inputlookup whisper_domain_intel | head 10

Attack Surface Baseline

Collects DNS infrastructure snapshots for monitored domains. Used by the DNS Infrastructure Change Detection correlation search.

SettingDefaultRangeDescription
Interval86400s (24 hr)3600-604800Collection frequency
DomainsrequiredComma-separated domain list
AccountrequiredWhisper API account
IndexwhisperDestination index

How to specify domains

Enter the domains you want to monitor as a comma-separated list in the Domains field when configuring the input. For example:

example.com, corp.example.com, subsidiary.com

The input discovers the full DNS infrastructure for each domain (A records, nameservers, mail servers, CNAME chains, and subdomains). You do not need to list subdomains individually — they are discovered automatically.

Records collected per domain:

Record TypeCypher QueryDescription
ARESOLVES_TO → IPV4DNS A records
NSNAMESERVER_FOR → HOSTNAMENameservers
MXMAIL_FOR → HOSTNAMEMail servers
CNAMEALIAS_OF → HOSTNAME (up to 5 hops)CNAME chains
SUBDOMAINCHILD_OF → HOSTNAME (up to 1000)Subdomains

Output: sourcetype=whisper:attack_surface

Each record is stored in the whisper_dns_baseline KV Store collection for change detection. This collection is also the seed source for the Watchlist Enrichment input (see below).

Verification:

`whisper_index` sourcetype="whisper:attack_surface" | stats count by domain, record_type

Watchlist Enrichment

Pre-computes enrichment for a custom list of indicators, storing results in KV Store for instant lookup without live API calls.

SettingDefaultRangeDescription
Interval14400s (4 hr)300-86400Enrichment frequency
Max Indicators100001-100000Indicators per run
AccountrequiredWhisper API account
Index_internalDestination index

Output: sourcetype=whisper:watchlist

Results are stored in the whisper_precomputed_enrichment KV Store collection. The whisperlookup command checks this collection before making live API calls.

How to populate the watchlist

The input enriches all indicators in the whisper_watchlist KV Store collection. Each record has three fields:

FieldRequiredDescription
indicatoryesDomain name or IP address
indicator_typeno"domain" or "ip" (auto-detected if omitted)
descriptionnoFree-text note (e.g., why this indicator is watched)

Add indicators via SPL:

| makeresults
| eval indicator="example.com", indicator_type="domain", description="Primary domain"
| append [| makeresults | eval indicator="203.0.113.50", indicator_type="ip", description="Critical server"]
| outputlookup whisper_watchlist append=true

Bulk-load from existing Splunk data:

index=firewall action=blocked
| stats count by dest_ip
| where count > 100
| rename dest_ip AS indicator
| eval indicator_type="ip", description="Frequently blocked IP"
| outputlookup whisper_watchlist append=true

View current watchlist:

| inputlookup whisper_watchlist

Automatic seeding: When the watchlist collection is empty and an Attack Surface Baseline input has already run, the watchlist input automatically seeds itself with domains from the whisper_dns_baseline collection. This means your organization's known infrastructure domains are enriched by default without manual setup. You can add or remove indicators at any time after seeding.

Verification:

| inputlookup whisper_precomputed_enrichment | head 10

Multi-Tenant Attack Surface

Extends the baseline collection for MSSP/multi-tenant deployments. Create one input instance per client tenant.

SettingDefaultRangeDescription
Interval86400s (24 hr)3600-604800Collection frequency
Client IDrequiredUnique tenant identifier
DomainsrequiredComma-separated domain list
Max Domains5001-10000Domains per run
AccountrequiredWhisper API account
IndexwhisperDestination index

How to configure tenants

Create a separate input instance for each client. In each instance:

  • Set Client ID to a unique tenant identifier (e.g., acme-corp, tenant-123)
  • Enter the client's domains as a comma-separated list in the Domains field
  • Optionally set Max Domains to limit the number of domains processed per run

For example, to monitor two clients you would create two input instances — one with Client ID = acme-corp and Domains = acme.com, acme.net, and another with Client ID = globex and Domains = globex.com.

Output: sourcetype=whisper:attack_surface (with client_id field) and sourcetype=whisper:attack_surface_change for detected changes.

DNS infrastructure changes are automatically detected by comparing against the previous checkpoint. High-priority changes (NS record changes) generate risk events.

Verification:

`whisper_index` sourcetype="whisper:attack_surface" client_id="acme-corp" | stats count by domain
`whisper_index` sourcetype="whisper:attack_surface_change" | table _time, domain, record_type, change_type

Input scheduling guidelines

InputRecommended IntervalNotes
Health Check5 minutesFrequent — lightweight API call
Threat Intel6 hoursModerate — processes many indicators
Baseline24 hoursInfrequent — DNS changes slowly
Watchlist4 hoursModerate — depends on watchlist size
Multi-Tenant24 hoursInfrequent — per-tenant baseline

All inputs respect the API rate limit. Intervals shorter than the minimum are rejected during configuration.