Harpia - harpy eagle emblemHARPIAExploitation Intelligence

Search syntax

One query language, three doors: the search box on the homepage, the term parameter on GET /api/v1/vulnerabilities/search, and the TAXII /search/ the STIX explorer calls. Same parser, same rules, same errors. This page is the complete reference - every qualifier, how they combine, and the queries worth stealing.

On this page: How it resolves · Boolean structure · Free text · Qualifier reference · Worked queries · Errors · Input handling

How a query resolves

Structured first, text last. A term carrying a qualifier is answered from an indexed column - product:log4j resolves the product to its component ids and probes the affected table, it never reads a description. Free text is the fallback for the part of the query that named no qualifier, which is why a precise query is also the fast one.

Four consequences worth knowing before you write anything complicated:

Boolean structure
FormExampleMeaning
implicit ANDkev:true has:fixAdjacent terms both have to match. This is the default.
ORkev:true OR ransomware:trueEither side matches.
NOTkev:true NOT ssvc:activeNegates what follows, and binds to a whole qualifier, a phrase or a group - not just to a word. - and ! are accepted shorthand for the same thing; this page spells out NOT because a leading hyphen is easy to misread beside ids and hyphenated words.
grouping(origin:CN OR origin:RU) vendor:microsoftParentheses set precedence. Nesting is bounded at 16 deep.
phrase"use after free"Quoted text is handled as one unit. Its main job is passing a value that contains a space to a qualifier - malware:"cobalt strike", tactic:"credential access". As free text a quoted phrase resolves to its weakness class where one exists (see below), never to a substring scan.

Precedence, loosest to tightest: OR < AND < NOT < a single term. So a OR b c reads as a OR (b AND c). When in doubt, use parentheses - they cost nothing.

Quote multi-word phrases across an OR. Because OR binds loosest, heap OR buffer overflow reads as heap OR (buffer AND overflow) - not what you meant, and buffer on its own matches almost nothing. Write heap OR "buffer overflow".

Repeating a qualifier inside one AND group ORs its values, which is usually what you meant: ecosystem:npm ecosystem:pypi is "either ecosystem", not "both at once", because no package is both.

Free text, and when to avoid it

Anything with no qualifier goes to a term index built over descriptions, summaries, alias ids, vendor and product names, package names, reference text and sources, repository names and actor names. Matching is exact on the token - there is no stemming, so logging and logged are different terms.

Very common words are not in the index. Any free-text term appearing in more than 20,000 records is pruned, among them remote, execution, overflow, sql and xss. Vendor, product and package names are exempt and always indexed, so linux still matches everything it names however common it is. The pruned words were never useful as filters - a word that matches a third of the corpus does not narrow anything - and every one of them has a better structured form:

Instead ofWriteWhy
xsscwe:xssThe weakness class, not the word. 51,631 CVEs.
sql injectioncwe:sqliCWE-89 directly.
remote code executioncwe:rce attack_vector:networkThe weakness plus the vector, which is what the phrase means.
buffer overflowcwe:overflowCWE-787/121/122/190 as one class.
use after freecwe:uafCWE-416. 8,748 CVEs.

The common phrases are recognised and expanded for you, quoted or not - "use after free", "remote code execution", "privilege escalation", "denial of service", "authentication bypass", "information disclosure", "type confusion", "race condition", "server side request forgery", "hardcoded credentials" and a dozen more. The response says which expansion ran, so the answer is never a guess you cannot see.

Class names typed bare resolve on their own. Anything the cwe: qualifier accepts also works as a plain word when the word itself is not indexed, so heap, uaf, cmdi, dos, idor, lfi, oob and priv-esc all answer as their weakness class rather than as nothing.

Type the prose form anyway and the engine answers with the expansion it ran, or a 400 naming the word and the qualifier to use instead. Words that are specific enough to be useful stay in the index and work normally: log4shell, rce, traversal, deserialization, tplink.

Numeric fragments also match ids. A token containing a run of three or more digits searches ids as well as text, so 44228 finds CVE-2021-44228. Full ids are exact-matched on a fast path.

Qualifier reference

Identity - what the software is

Matched exactly against indexed identity columns, case-insensitively. Siblings inside one AND group must describe the same affected row.

QualifierExampleNotes
vendor:vendor:microsoftExact vendor.
product:product:log4jExact product, or the package name for anything that has no product - every OSV, distro and malicious-package entry. product:spoint finds the malicious npm package.
purl: pkg:pkg:pkg:npm/lodashFull PURL or a bare package name.
cpe:cpe:2.3:a:apache:http_server:2.4.50Full CPE 2.3, or the vendor:product[:version] shorthand.
ecosystem: eco:ecosystem:npmPackage ecosystem. Hierarchical values match by prefix.
version: ver:product:log4j version:<2.15Range-aware and per-ecosystem, so npm, Maven and Debian orderings each behave correctly. Supports < <= > >=, exact and lo..hi. Refused unqualified.

Scores and counts

Bare value means "at least". > >= < <= and lo..hi ranges all work.

QualifierExampleNotes
epss:epss:>0.9EPSS probability, 0-1.
percentile:percentile:>0.99EPSS percentile.
cvss:cvss:>=9Headline CVSS. cvss_version: says which version produced it.
exploits:exploits:>5Exploit evidence count - repositories plus scoring references. It counts evidence, not working exploits.
refs:refs:>3Reference count.
repos: stars: forks:stars:>500Linked exploit repositories, and their best stars / forks.
risk:risk:>1.5Composite risk. The scale is 0-2, not 0-10.

Exploitation state

QualifierExampleNotes
exploited:exploited:trueExploited in the wild, from any source - not only KEV.
kev:kev:trueIn the CISA KEV catalogue.
ransomware:ransomware:trueKnown ransomware use.
weaponized:weaponized:trueReliable weaponized tooling exists.
maturity:maturity:weaponizedThe ladder: none · poc · weaponized · active.
tte:tte:<7Days from publication to the first public exploit artifact - weaponized exploit code or a CISA KEV listing. Negative means the artifact predates the advisory.
zeroday: 0day:zeroday:trueExploited on or before the publication date.
ssvc:ssvc:activeCISA's own SSVC exploitation call: none · poc · active. 183,393 CVEs adjudicated - useful precisely where it disagrees with the line above.
ssvc_automatable:ssvc_automatable:trueCISA's automatability call.

Trending and EPSS movement

epss: is a level. These are the change, which is the question that answers "what happened this week".

QualifierExampleNotes
trend:trend:trendingtrending · rising · active · stagnant. trending:true and rising:true are the boolean forms of the top two.
trend_score:trend_score:>30The score behind the tier.
epss_change: epss_7d:epss_change:>0.17-day EPSS delta. Negatives accepted: epss_7d:<-0.1 is "collapsing".
epss_30d:epss_30d:>0.230-day delta.
epss_trend:epss_trend:upup · down · flat, without picking a threshold. The cut is ±0.01, which is measured rather than chosen: the overwhelming majority of positive deltas are under 0.001 and are rounding, not movement.

Observed probing

Sensor telemetry: hosts were probed for this CVE. It is exposure to attempts, not confirmed compromise, and the vocabulary keeps that straight. 1,074 CVEs across 164 countries.

QualifierExampleNotes
observed_in:observed_in:AEProbing seen against hosts there. Takes an ISO-2 code, the full country name, or a partial word.
observed_from:observed_from:CNProbing originating there.
observed:observed:>100Unique probing source addresses.
observed_days:observed_days:<3How many distinct days it has been seen at all. Probing on 30 separate days is background noise; on 2 it is news.
scanning:scanning:upup · down · flat, last 7 days against the 7 before. The change, not the level.

Evidence and repositories

What is attached to the record, and what it actually is. 36,821 CVEs carry evidence; 11,053 carry a linked repository.

QualifierExampleNotes
ref_type:ref_type:exploitedexploited · poc · weapon · reference.
ref_source:ref_source:exploitdbWho reported it.
ref_since:ref_since:>2026-07-01Evidence published on or after a date.
repo_role:repo_role:exploitWhat the repository is, judged from its content: exploit · weapon · scanner · detection · writeup · patch · lab. A "PoC" that is a write-up is not exploit code.
repo_lang:repo_lang:pythonPrimary language.
repo_stars:repo_stars:>500The best-starred linked repository.
repo_since:repo_since:>2026-07-01A repository created after a date. New exploit code arrives before exploitation, not after it.
suspicious:suspicious:trueAt least one linked repository is flagged dangerous or scam.

Advisories, fixes and record shape

QualifierExampleNotes
advisory:advisory:DSA-5020-1Everything one erratum fixes.
issuer:issuer:debian28 issuers, 860,359 links over 103,674 CVEs - Debian, Ubuntu, Red Hat, SUSE, GitHub, Chainguard and more.
fixable:fixable:trueA fixed version exists.
alias:alias:GHSA-jfh8-c2jp-5v3qExact advisory-alias membership.
type:type:malicious_packagecve · osv_advisory · malicious_package.
malicious:malicious:trueA malicious-package advisory rather than a vulnerability.
status:status:analyzedNVD record status.
assigner:assigner:cve@mitre.orgThe CNA that assigned the id.
cluster:cluster:CVE-2021-44228Near-duplicates: everything grouped with that CVE. The closest thing the data supports to a related-vulnerabilities link.

Weakness and impact

QualifierExampleNotes
cwe:cwe:79 · cwe:CWE-416 · cwe:xss,sqliNumeric id, CWE- id, or a friendly class name. Comma lists are OR-ed. Classes: xss, sqli, injection, rce, cmdi, overflow, uaf, traversal, ssrf, xxe, deserialization, race, csrf, priv-esc, dos, idor, auth-bypass, ssti and more.
severity: sev:severity:criticalcritical · high · medium · low.
attack_vector: av:attack_vector:networknetwork · adjacent · local · physical.
cvss_version:cvss_version:4.0Which version produced the headline score. 200,149 CVEs carry two or more.
nvd_verified:nvd_verified:trueNVD analysed the record rather than passing the CNA's data through.
automatable:automatable:trueAutomatable exploitation.
initial_access:initial_access:trueAutomatable specifically for initial access.
post_exploit:post_exploit:trueAutomatable post-exploitation.

Time

QualifierExampleNotes
age:age:<30 · age:>365 · age:30..90Days since publication. Bare or < = within the last N days; > = older than N.
published:published:2024 · published:>=2024-01-01A date or a bare year. Ranges with ...
modified:modified:>2026-07-13The record's own last-modified date.
added:added:>2025-01-01CISA KEV date-added, so results self-scope to KEV.

Attribution and ATT&CK Pro

These read who is using the vulnerability, so they are the tier boundary: below Pro they return 403 naming the qualifier. The gate is on the compiled query, not on the text, so an ordinary search that merely mentions an actor's name is unaffected. Everything else on this page is open to any authenticated caller.

QualifierExampleNotes
actor:actor:qilin · actor:"midnight blizzard"Word match, so actor:apt finds APT29 without also matching unrelated text.
origin:origin:RU · origin:russia · origin:koreaWhere the actor is from. ISO-2 code, full name, or a partial word - origin:korea resolves to KP and KR.
target:target:AE · target:"united arab emirates"Who they hit. Same three input forms.
sector:sector:healthcareTargeted industry, from a 24-value taxonomy.
motivation:motivation:espionageWhy: espionage, financial, hacktivism, destruction, unknown.
ttp: technique:ttp:T1190 · ttp:"public-facing"ATT&CK technique by id or name. Matches if either view contains it: the CVE's own CWE→CAPEC→ATT&CK chain, or the playbook of an actor attributed to it.
tactic:tactic:TA0006 · tactic:"credential access"ATT&CK tactic by id or name.
capec:capec:CAPEC-233CAPEC pattern by id or name.
malware:malware:plugx · malware:"cobalt strike"An attributed actor is recorded using it. Names match the MITRE form, the plain form, or any recorded synonym - malware:plugx finds PlugX - S0013.
tool:tool:psexec · tool:mimikatzSame, for tooling.
One overloaded name. malware:true keeps its published meaning - is this record a malicious-package advisory - while malware:<name> searches the arsenal. A boolean is never an arsenal name, so the two cannot collide.

Existence shorthands

has:exploit · has:poc · has:kev · has:ransomware · has:weaponized · has:malicious · has:refs · has:repo · has:fix.

Aliases

Short formCanonical
pkg: package:purl:
sev:severity:
eco:ecosystem:
ver:version:
av:attack_vector:
epss_delta:epss_change:
scanned_in: scanned_from:observed_in: observed_from:
0day:zeroday:
vuln_type: cve_type:type:
Worked queries

Each of these runs as written. The ones marked Pro need the attribution tier.

Triage - what to do on Monday

QuestionQuery
Exploited right now, and I can actually fix itexploited:true has:fix
Exploited, no fix - compensating controls onlyexploited:true NOT fixable:true
Where CISA and our evidence disagree - they say active, we have nothingssvc:active NOT has:exploit
The reverse: we see weaponized tooling, CISA has not adjudicatedmaturity:weaponized ssvc:none
Fast-exploitation shapes, so the patch window is the real constrainttte:<7 severity:critical
Exploited before it was even publishedzeroday:true age:<365

Early warning - before it is on a list

QuestionQuery
New exploit code appeared this month for something old and unlovedrepo_since:>2026-07-01 age:>365 NOT kev:true
Probing is rising and code just landed - the two signals togetherscanning:up repo_since:>2026-07-01
EPSS moved hard this week and it is not already famousepss_change:>0.1 NOT kev:true
Being probed here, in the last few days only, not background noiseobserved_in:AE observed_days:<3
Real weaponized code, not a write-up mirrorrepo_role:weapon repo_stars:>100
Trending, and the reason is evidence rather than chattertrend:trending ref_type:exploited

Estate - scoped to what you run

QuestionQuery
Is this exact dependency version affected?product:openssl version:3.0
Everything below the fixed release, in one ecosystempkg:pkg:maven/org.apache.logging.log4j/log4j-core version:<2.17.1
npm supply-chain risk that is not just a vulnerabilityecosystem:npm type:malicious_package
My Microsoft estate, exploited, network-reachablevendor:microsoft exploited:true attack_vector:network
Which single Debian erratum closes the most exposureissuer:debian exploited:true
Everything one advisory coversadvisory:DSA-5020-1
Near-duplicates of a CVE I already triagedcluster:CVE-2021-44228

Threat-led Pro

QuestionQuery
Nation-state pressure on my Microsoft estate(origin:CN OR origin:RU) vendor:microsoft exploited:true
GCC-targeted and exploited in the wild(target:"united arab emirates" OR target:"saudi arabia" OR target:qatar OR target:kuwait OR target:bahrain OR target:oman) exploited:true
Espionage against government, still unpatchedmotivation:espionage sector:government NOT has:fix
Initial-access plays with real probability behind themtactic:"initial access" exploited:true epss:>0.5
Perimeter exploitation, exploited, with a fixttp:T1190 exploited:true fixable:true
What a specific toolset is being used againstmalware:"cobalt strike" exploited:true
Credential-access tooling, network-reachable, criticaltool:mimikatz attack_vector:network severity:critical

Composite - the queries worth saving

QuestionQuery
Genuinely urgent. Exploited, automatable, network-reachable, and a fix exists - the intersection where patching beats everything else you could do today.exploited:true automatable:true attack_vector:network has:fix
Rising, not risen. EPSS climbing and probing climbing, but not yet on KEV - the window where acting early is still worth something.epss_trend:up scanning:up NOT kev:true
Quiet but armed. Weaponized code exists and nobody has written it up - low noise, real capability.repo_role:weapon refs:<3 NOT kev:true
Ransomware-adjacent, patchable.ransomware:true has:fix severity:critical
Fresh critical exposure in your ecosystem.ecosystem:npm severity:critical age:<30 has:fix
Old, still exploited, still unfixed. The debt that keeps costing.age:>1095 exploited:true NOT fixable:true
When a query is refused

Silence is the worst answer a search engine can give, so the parser prefers an error over an empty page.

InputResponseWhy
banana:true400Not a qualifier. Returns the nearest registered name.
kev:maybe400Wrong value type - kev: wants a boolean.
version:<2.15400Unscoped. Add a product, vendor, purl or ecosystem.
actor:qilin below Pro403Names the qualifier that gated it.
xss400Pruned class word. Suggests cwe:xss.
a 40-deep nest, or a 500+ rune term400Bounded on purpose.

What you will not get is 200 with an empty list because something you typed was quietly discarded. Every accepted qualifier runs.

Input handling

Every query is normalised before it is parsed, so copy-paste behaves:

Values never reach SQL as text - every one is a bound parameter - so quotes, semicolons and comment markers in a search term are just characters to match on.

Same syntax, programmatically. Is it being exploited right now?