Validin Query Language
Use the Validin Query Language (VQL) in Advanced Search to discover infrastructure using complex queries
Query Structure
All queries use a group prefix to specify the data source, followed by one or more criteria enclosed in parentheses:
services: (key="value")Multiple criteria within a group can be combined with AND:
services: (http.title="Validin" AND ip="1.1.1.1")Queries can also join multiple data sources, each with their own group:
services: (http.title="Login") AND registration: (registrar="NameCheap, Inc.") AND dns: (a="1.2.3.4")Rules
- Group prefix required. All queries must begin with a group prefix (
services:,registration:, ordns:) followed by parentheses containing your criteria. - One group per source. You may include at most one group per data source — at most one
services:group, oneregistration:group, and onedns:group per query. - All criteria must be inside a group. Bare predicates outside of a group are not supported. For example,
services.http.title="Validin" AND services.ip="1.1.1.1"is not valid — you must writeservices: (http.title="Validin" AND ip="1.1.1.1"). - At least one primary key required per group. Every group must include at least one criterion using a primary key. Secondary keys can only be used to further narrow results alongside a primary key.
- Only
ANDis supported. Criteria within a group, and groups with one another, are combined conjunctively. - Exact match (
=) is supported for all fields. Integer fields (port,length) additionally support!=,>,>=,<, and<=. Date fields additionally support relative modifiers — see Date Modifiers below.
Operators
| Operator | Description | Applies to |
|---|---|---|
= | Exact match | All field types |
!= | Does not equal | Integer fields only |
> | Strictly greater than | Integer fields only |
>= | Greater than or equal | Integer fields only |
< | Strictly less than | Integer fields only |
<= | Less than or equal | Integer fields only |
Date Modifiers
Date fields support relative modifiers that express a range around a given date value:
| Modifier | Description |
|---|---|
~ | Within N units of the date |
+ | N units after the date |
- | N units before the date |
| Unit | Meaning |
|---|---|
s | Seconds |
m | Minutes |
h | Hours |
d | Days |
Examples:
Find certificates expiring within 30 days of a specific date:
services: (cert.not_after="2025-05-01T17:30:25Z~30d" AND cert.issuer="/C=US/O=Let's Encrypt/CN=R3")Find domains registered up to one day after a known date:
registration: (registered="2026-01-01T13:02:13Z+1d" AND registrar="GoDaddy, Inc.")Find services whose certificate became valid within the last hour of a given time:
services: (cert.not_before="2025-05-01T17:30:25Z-1h" AND cert.domain="example.com")Global Filters
Global filters are appended to the end of a query using WITH and apply across all groups:
services: (http.title="Example") WITH lookback=30 AND tld="com"| Filter | Description | Type |
|---|---|---|
lookback | Only search the past N days | Integer |
tld | Limit results to domains with the given TLD | String |
after | Start of observation window (ISO-8601) | Date |
before | End of observation window (ISO-8601) | Date |
Warning
lookbackandafter/beforeare mutually exclusive: use one or the other to filter by time.
Examples
Search for hosts serving a specific page title:
services: (http.title="Example Domain")Search for a specific IP hosting a specific title on port 8080:
services: (ip="203.0.113.50" AND http.title="Admin Panel" AND port=8080)Search for hosts with a specific certificate issuer and JARM fingerprint:
services: (cert.issuer="/C=US/O=Let's Encrypt/CN=R3" AND jarm="29d29d15d29d29d00042d43d00041d598ac0c1012db967bb1ad0ff2491b3ae")Search for services running on high ports:
services: (http.title="Admin Panel" AND port>8000)Search for certificates expiring within 30 days of a given date:
services: (cert.not_after~30d AND cert.issuer="/C=US/O=Let's Encrypt/CN=R3")Find domains registered with a specific registrar and confirm they are actively resolving:
registration: (registrar="NameCheap, Inc.") AND dns: (a="203.0.113.50")Find domains using a specific nameserver that are also serving a known page title, registered in the past 30 days:
services: (http.title="Login Portal") AND registration: (ns="ns1.example.com") WITH lookback=30Cross-source investigation — services, registration, and DNS together:
services: (http.title="Phishing Page") AND registration: (registrar="GoDaddy") AND dns: (ns="ns1.example.com") WITH lookback=14Supported Keys
services: Keys
services: Keys| Key | Description | Value Type | Primary |
|---|---|---|---|
services.ip | IP address | IPv4 address | Yes |
services.host | Domain or virtual host in the request | Domain | Yes |
services.jarm | JARM fingerprint | Hash | Yes |
services.port | The port on which the response was observed | Integer | No |
| HTTP Features | |||
services.http.title | Value of the <title> tag | String | Yes |
services.http.body_hash | HTTP response body hash (SHA-1) | Hash | Yes |
services.http.favicon_hash | MD5 hash of the favicon | Hash | Yes |
services.http.gtag | Google Tag Manager ID found on the page | String | Yes |
services.http.meta | Canonicalized <meta> tag | String | Yes |
services.http.path | The HTTP path that was requested from the server | String | Yes |
services.http.class_0_hash | CSS class hash (v0) | Hash | Yes |
services.http.class_1_hash | CSS class hash (v1) | Hash | Yes |
services.http.length | HTTP response length in bytes | Integer | No |
services.http.ext_links.meta | Domain found in HTML <meta> tag | Domain | Yes |
services.http.ext_links.links | Domain found in HTML <link> tag | Domain | Yes |
services.http.ext_links.js | Domain found in HTML <script> tag | Domain | Yes |
services.http.ext_links.anchor | Domain found in HTML <a> tag | Domain | Yes |
services.http.ext_links.iframe | Domain found in HTML <iframe> tag | Domain | Yes |
| Banner | |||
services.banner.start_line | First line of the HTTP banner (e.g. "HTTP/1.1 200 OK") | String | Yes |
services.banner.server | The "Server" header value | String | Yes |
services.banner.etag | Value of the "ETag" header | String | Yes |
services.banner.last_modified | Value of the "Last-Modified" header, when significantly different than request time | String | Yes |
services.banner.http_date | Value of the "Date" header, when significantly different than request time | String | Yes |
services.banner.location.raw | The verbatim "Location" header value | String | Yes |
services.banner.location.domain | The domain in the "Location" header value, if present | Domain | Yes |
services.banner.location.ip | IP address in the "Location" header value, if present | IPv4 address | Yes |
services.banner.header_hash | HTTP header key hash | Hash | Yes |
services.banner.banner_0_hash | Banner hash (v0) | Hash | Yes |
| Certificate | |||
services.cert.domain | Domain name found anywhere in the certificate, including the common name and extensions | Domain | Yes |
services.cert.issuer | Certificate issuer distinguished name string | String | Yes |
services.cert.common_name | Certificate Common Name | String | Yes |
services.cert.country | Certificate Country | String | Yes |
services.cert.state | Certificate Region (State) | String | Yes |
services.cert.locale | Certificate Locale (City) | String | Yes |
services.cert.organization_name | Certificate Organization Name | String | Yes |
services.cert.organization_unit_name | Certificate Organization Unit Name | String | Yes |
services.cert.not_before | ISO-8601 timestamp of the certificate "Not Before" value | Date | Yes |
services.cert.not_after | ISO-8601 timestamp of the certificate "Not After" value | Date | Yes |
services.cert.fingerprint.sha1 | Certificate fingerprint (SHA-1) | Hash | Yes |
services.cert.fingerprint.sha256 | Certificate fingerprint (SHA-256) | Hash | Yes |
services.cert.fingerprint.ja4x | Certificate fingerprint (JA4X) | String | Yes |
registration: Keys
registration: Keys| Key | Description | Value Type | Primary |
|---|---|---|---|
registration.registrar | The registrar responsible for the domain registration | String | Yes |
registration.registered | The date the domain was first registered (ISO-8601) | Date | Yes |
registration.ns | A nameserver delegated to the domain at registration time | Domain | Yes |
dns: Keys
dns: Keys| Key | Description | Value Type | Primary |
|---|---|---|---|
dns.a | IP address observed as an A record for this domain | IPv4 address | Yes |
dns.aaaa | IP address observed as an AAAA record for this domain | IPv6 address | Yes |
dns.ns | Domain Name observed as an NS records for this domain | Domain | Yes |
Updated about 15 hours ago
