id = "theharvester"
name = "theHarvester"
homepage = "https://github.com/laramies/theHarvester"
description = "theHarvester gathers open-source intelligence about a domain or organization from public sources."
executables = ["theHarvester"]
[dotfiles]
paths = ["~/.theHarvester/proxies.yaml"]
secret = ["~/.theHarvester/api-keys.yaml"]
exclude = []
side_effect = false
[commands]
format = 1
label = "Gather OSINT for a domain"
description = "Query public sources for hosts, emails and IPs of a domain. Active options (brute force, takeover, screenshots, vhost, API scan) are left out."
quality = "ai-draft"
parser = { end_of_options = "--", interleave = "permute", long_equals = true, short_attached = true, short_bundles = false }
[[commands.source]]
id = "src"
kind = "help"
url = "https://github.com/laramies/theHarvester/blob/master/theHarvester/__main__.py"
revision = "master 2026-10"
evidence = """
'-d', '--domain', help='Company name or domain to search, or an explicit ASN/IP/CIDR target for --routeviews.',
'-l', '--limit', help='Maximum results requested from each source that supports result limits
'-S', '--start', help='Result offset for sources that support pagination (default: 0).',
'-f', '--filename', help='Write NAME.json, NAME.xml, and NAME.jsonl.',
'-v', '--verbose', help='Show informational diagnostic messages.'
'-b', '--source', help='Comma-separated source names or source capabilities. Capabilities: subdomains, emails, ips, asns, urls, people, breaches, all.
"""
[[commands.field]]
id = "domain"
label = "Domain or company"
type = "string"
option = ["--domain", "-d"]
sources = ["src"]
[[commands.field]]
id = "source"
label = "Sources or capabilities"
description = "Comma-separated source names or capabilities."
type = "string"
option = ["--source", "-b"]
suggestions = [{ value = "all", label = "All sources" }, { value = "subdomains", label = "Subdomains" }, { value = "emails", label = "Emails" }, { value = "ips", label = "IPs" }]
sources = ["src"]
[[commands.field]]
id = "limit"
label = "Result limit per source"
type = "integer"
option = ["--limit", "-l"]
sources = ["src"]
[[commands.field]]
id = "start"
label = "Result offset"
type = "integer"
option = ["--start", "-S"]
sources = ["src"]
[[commands.field]]
id = "filename"
label = "Output base name"
description = "Writes NAME.json, NAME.xml and NAME.jsonl."
type = "string"
option = ["--filename", "-f"]
effect = "overwrite"
sources = ["src"]
[[commands.field]]
id = "verbose"
label = "Verbose"
type = "boolean"
option = ["--verbose", "-v"]
sources = ["src"]
[[commands.task]]
id = "search"
label = "Search a domain"
fields = ["domain", "source", "limit", "filename"]
required = ["domain", "source"]
[[commands.group]]
id = "basic"
label = "Basic"
fields = ["domain", "source", "limit", "filename"]
[[commands.group]]
id = "advanced"
label = "Advanced"
fields = ["start", "verbose"]