* * deny — ~/reference/zia-nss-fields

ZIA NSS web log fields — the practical reference

The tokens you put in an NSS feed decide what your SIEM can answer at 2 a.m. — and the official field list tells you the names but not the gotchas. This page is the working reference: what each commonly used web-log token means, and the footnotes that matter when the logs land in Splunk or LogScale. Scope note: v1 covers ZIA web logs — firewall, DNS, and tunnel feeds are planned. Spot an error? Tell me — this page trades on being right.

feed syntax in 30 seconds

NSS format strings substitute tokens: %s{name} for strings, %d{name} for decimal numbers, %02d{name} zero-pads. Token names are case-sensitive. The single best decision you can make: emit key=value pairs (e.g. action=%s{action}) — Splunk and LogScale auto-extract them, field order stops mattering, and future feed edits stop breaking parsers. Positional CSV feeds break the first time anyone adds a field, and URLs containing commas will corrupt naive delimiters — use the feed escaping options and test with ugly URLs.

time

tokenwhat it isgotchas
%s{time}full timestamp of the transactionNSS emits in the timezone configured on the feed — set it to UTC and keep every SIEM in UTC, or enjoy DST-shaped incident timelines
%d{epochtime}epoch secondsprefer this for SIEM ingestion; strings are for humans
%s{mon} %d{dd} %02d{hh}…timestamp componentsonly useful for legacy positional formats — use epochtime instead

who & where

tokenwhat it isgotchas
%s{login}authenticated userif feed obfuscation is enabled this is a pseudonym — decide your privacy posture per region before promising user-level searches
%s{dept}user's departmentonly as good as your IdP/SCIM hygiene; blank often means provisioning lag, not "no department"
%s{location}ZIA location nameroad warriors show the special roaming value, not an office — filter accordingly before per-office reports
%s{cip}client IPfor roaming users this is the pre-NAT client address seen by the service edge — pair with location before assuming geography
%s{deviceowner} / %s{devicehostname}device identity (client-connector traffic)empty for tunnel/GRE traffic without ZCC — don't build device dashboards on web feeds alone

the request

tokenwhat it isgotchas
%s{url}requested URLcommas/quotes inside URLs are why positional feeds corrupt — if you must stay positional, use %s{eurl}
%s{eurl}URL, encodedURL-encoded variant safe for delimited feeds; remember to decode at search time
%s{ehost}destination hosthost only — use it for tstats-style acceleration instead of wildcarding into url
%s{reqmethod}HTTP methodCONNECT entries are the TLS tunnels — a spike usually means inspection scope changed
%s{ua}user agenttruncated at feed limits; also your best signal for "which non-browser app is doing this"
%s{ereferer}referring URL (encoded)frequently empty on https-to-https navigation — absence proves nothing
%s{proto}protocol of the transactionHTTP vs HTTPS vs tunnel-ssl values — know them before writing "all TLS" searches

the verdict

tokenwhat it isgotchas
%s{action}what ZIA did (allowed / blocked / …)action values differ per policy engine — inventory the distinct values in YOUR tenant before building block-rate dashboards
%s{reason}why — the policy reason stringthe single most useful triage field; pair every action search with reason
%s{ruletype} / %s{rulelabel}which policy type + which named rule firedrulelabel is your change-correlation field — "when did rule X start hitting" answers most 'since when' tickets
%d{respcode}HTTP status returned to the clienta Zscaler block page is still a 200 to the browser in some flows — never use respcode alone to find blocks; that's what action/reason are for ⚠ verify current behavior in your tenant

categories & apps

tokenwhat it isgotchas
%s{urlsupercat}URL super-categorythe coarse bucket — good for exec reporting, useless for triage
%s{urlcat}URL categorythe field that changes when a vendor recategorization breaks something — alert on category transitions for business-critical hosts
%s{urlclass}URL class (bandwidth/legal/etc. grouping)rarely what you want in searches; know it exists so you don't confuse it with urlcat
%s{appname} / %s{appclass}cloud app + app classapp identification catches what URL categories miss (API endpoints, CDNs) — use both in shadow-IT hunts

threats & DLP

tokenwhat it isgotchas
%s{malwareclass} / %s{malwarecat}threat classificationempty ≠ clean — unscanned traffic (bypasses, size limits) never got a verdict; pair with unscannabletype
%s{threatname}specific threat namethe field your IR team wants verbatim in tickets
%d{riskscore}site risk scoreuseful as a hunt filter; don't alert on it alone
%s{dlpeng} / %s{dlpdict}DLP engine + dictionary that matchedonly populated when DLP evaluated the transaction — absence usually means "not scanned," not "no match"
%s{filetype} / %s{filename}file type + name on up/downloadsfiletype is detected type, not extension — that mismatch is itself a detection
%s{bamd5}file MD5 (sandbox/behavioral analysis)your pivot key to sandbox reports and threat intel ⚠ verify token name in your feed builder
%s{unscannabletype}why content couldn't be scannedthe honest counterpart to every "we inspect everything" slide

sizes & performance

tokenwhat it isgotchas
%d{reqsize} / %d{respsize}request / response bytesexfil hunts want reqsize; capacity dashboards want respsize; don't sum them into one "traffic" number without saying so
%d{totalsize}request + response totalconvenient, but ambiguous in reports — label your units and direction
%s{contenttype}response content typepairs with filetype for download hunts; often generic (octet-stream) exactly when you care most
latency tokenstransaction timing fields⚠ the web feed exposes timing tokens for transaction latency, but names and semantics vary by feed builder version — confirm them in your own builder before you rely on them for slow-site triage

building the feed: the five decisions

  1. key=value, always. Auto-extraction beats positional parsing everywhere it's supported.
  2. UTC, everywhere. Feed timezone, SIEM index time, dashboards — one zone or none.
  3. Emit reason and rulelabel from day one. The two fields every "why was this blocked / since when" ticket needs, and the ones most default feeds omit.
  4. Test with hostile URLs. Commas, quotes, non-ASCII — before production, not after the first corrupted day of logs.
  5. Write the field names down where the SIEM team can see them. The feed format is config; treat it like the firewall policy it is — golden copy included.

Primary sources: Zscaler NSS web log format · NSS feed guidelines. Rows marked ⚠ await verification against the current feed builder — corrections welcome.