Back to Nodes

ScanMalware

Last updated Nov 6, 2026

n8n node for ScanMalware.com: submit URLs for scanning, read scan verdicts, search scans with SMQL and look up domain scans and DNS. No API key needed.

171 Weekly Downloads
627 Monthly Downloads

Included Nodes

ScanMalware

Description

n8n-nodes-scanmalware

This is an n8n community node for ScanMalware.com, a URL scanner run by Triop AB in Sweden. It lets your n8n workflows submit URLs for scanning, read the verdict, AI assessment, detections and screenshot of a scan, search public scans with the ScanMalware Query Language (SMQL) or by AI scam type, look up domains and IP addresses, follow brand impersonation, and read ScanMalware’s threat feeds.

ScanMalware loads each submitted URL in isolated analysis environments and checks the page with YARA rules, antivirus engines, IDS signatures and threat feeds. AI models review suspicious scans and classify them by scam type, such as credential phishing. The node uses the public REST API at https://scanmalware.com/api/v1, which needs no API key.

The node can also be used as a tool by n8n AI agents.

n8n is a fair-code licensed workflow automation platform.

Installation
Operations
Credentials
Data flow and privacy
Example workflows
Using it in an AI agent
Errors and rate limits
Compatibility
Resources
Version history

Installation

Follow the installation guide in the n8n community nodes documentation and install the package n8n-nodes-scanmalware.

Operations

| Resource | Operation | API endpoint |
| ———– | ——————————- | ————————————————————————————————————————————— |
| Scan | Submit | POST /api/v1/scan |
| Scan | Get Progress | GET /api/v1/result/{scan_id}/progress |
| Scan | Get Summary | GET /api/v1/scan/{scan_id}/summary |
| Scan | Get AI Analysis | GET /api/v1/ai/{scan_id} |
| Scan | Get Detections | GET /api/v1/ioc/{scanid}, /malware/{scanid}, /ids/alerts/{scanid}, /safe-browsing/{scanid}, /hunting-rules/scan/{scan_id} |
| Scan | Get Pivot Values | GET /api/v1/scans/{scan_id}/pivot-values |
| Scan | Get RDAP | GET /api/v1/rdap/{scan_id} |
| Scan | Get Screenshot | GET /api/v1/screenshot/{scan_id} |
| Search | SMQL Query | GET /api/v1/search/smql |
| Search | Search by AI Scam Type | GET /api/v1/ai/search/scam-type |
| Domain | Get Scans | GET /api/v1/domains/{domain}/scans |
| Domain | Get DNS | GET /api/v1/ct/dns/{domain} |
| Domain | Get DNS History | GET /api/v1/dns/history/{domain} |
| Domain | Get Hosts | GET /api/v1/hosts/{domain} |
| Domain | Get Certificates | GET /api/v1/ct/{domain} |
| Domain | Get Certificate Timeline | GET /api/v1/ct/timeline/{domain} |
| Domain | Get Stats | GET /api/v1/domain/stats/{domain} |
| IP | Get Stats | GET /api/v1/search/ip/{ip}/stats |
| IP | Get Scans | GET /api/v1/search/ip/{ip} |
| IP | Get CT Domains | GET /api/v1/ct/ip/{ip}/domains |
| Brand | Get | GET /api/v1/brands/{brand} |
| Brand | Get Impersonating Hosts | GET /api/v1/brands/{brand} (paged) |
| Brand | Get Many | GET /api/v1/brands |
| Brand | Get Timeline | GET /api/v1/brands/{brand}/timeline |
| Threat Feed | Get Recent Hunt Sightings | GET /api/v1/hunts/sightings/recent |
| Threat Feed | Get Recent Hunting Rule Matches | GET /api/v1/hunting-rules/threats/recent |
| Threat Feed | Get Recent Malware | GET /api/v1/malware/threats/recent |

Operations that return a list output one n8n item per row. A lookup that finds nothing returns no items, which stops the branch unless the node’s Always Output Data setting is on.

Scan > Submit

Submits a URL for scanning and returns the new scan_id. The scan runs in the background, so read the result with Get Summary once Get Progress reports it finished, usually about a minute later.

Visibility is required and has no default:

  • Public publishes the URL and its results in the public ScanMalware feed and search, visible to everyone.
  • Unlisted keeps the scan out of the public feed and search. Anyone who has the scan ID or the scan link can still open it.
  • Use Unlisted for anything private, such as links taken from internal email.

    Example: URL https://example.com/login, Visibility Unlisted returns:

    {
    	"scan_id": "3f2b1c4e-8a7d-4e21-9c55-0f1e2d3c4b5a",
    	"status": "queued",
    	"message": "Scan submitted successfully",
    	"scan_type": "unlisted",
    	"submitted_at": "2026-10-18T10:00:00"
    }
    

    Scan > Get Summary

    Returns the status, security verdict and risk score of one scan. With Simplify on (the default) the output has ten flat fields: scanid, url, finalurl, status, completedat, verdict, risklevel, confidence, riskscore and riskfactors. Turn Simplify off for the full response, including the detailed analysis.

    Example: Scan ID {{ $json.scan_id }} from a previous Submit node.

    The verdict describes the submitted URL as it rendered at final_url. It can stay empty for a few minutes after status becomes completed; if it is empty, wait and run Get Summary again. An unknown scan ID returns a “not found” message.

    Search > SMQL Query

    Searches public scans with the ScanMalware Query Language and returns one item per matching scan. Filters include domain:, url:, ip:, asn:, technology:, ct_domain: and submitted:, combined with AND, OR, NOT and parentheses. domain: and url: also match the final URL after redirects, so results can include other sites that redirect to the domain.

    Example: Query domain:example.com AND submitted:last7d, Limit 20. Under Options you can set the result Page and the Sort order.

    Domain > Get Scans

    Lists recent public scans of a domain and its subdomains, or of an IP address, one item per scan. Each row has matched_on, which says why it matched:

  • ["url"] or ["url", "final_url"]: the scan was submitted for this domain.
  • ["final_url"]: the scan started at another site that redirected here.
  • Read verdicts with care. A row whose matchedon does not contain "url", or whose url host differs from the queried domain, is a different site that only redirected there (often a phishing page imitating the domain) or a subdomain, so its verdict must not be read as the domain’s. The node adds verdictappliestodomain to every row: it is true only when matched_on contains "url" and the host of url is exactly the queried domain.

    Example: Domain example.com, Limit 20, Options > Status Completed. A trailing dot (example.com.) is removed.

    Domain > Get DNS

    Returns the subdomains and IP addresses seen for a domain in Certificate Transparency logs and DNS resolution. With Simplify on, the output has domain, degraded, stale, subdomains, subdomaincount, subdomainsunresolved, subdomainstruncated, ipaddresses and totalrecords. Turn Simplify off to get dnsrecords, which holds each subdomain’s own addresses.

    Example: Domain example.com, Options > Include Subdomains true, Subdomain Limit 100.

    If degraded is true, ScanMalware skipped the lookup under load, so empty lists do not mean the domain has no subdomains; run the node again later. ip_addresses covers the domain and www only.

    Scan > Get Progress

    Returns status, stepname, currentstep, total_steps and percentage for a scan. status turns completed or failed when the scan has finished, so a workflow can loop on Get Progress with a Wait node instead of waiting a fixed time.

    Scan > Get AI Analysis

    Returns the AI assessment of a scan. With Simplify on, the output has classification (for example CONFIRMEDSCAM, HIGHRISK or LEGITIMATE), scamtype, riskscore (0 to 10), confidencepercentage, impersonatedbrand, recommendedaction, the AI’s verdict text, and the lists keyevidence, riskfactors and safetyfactors.

    AI models review suspicious scans. A low-risk scan of a well-ranked domain is not reviewed: its verdict starts with “AI analysis skipped” and the node sets ai_skipped to true. The analysis appears after the scan has completed; until then the node reports that there is no AI analysis for the scan.

    Scan > Get Detections

    Reads what flagged a scan and returns one item. Pick the Sources to read (all five by default, one request each):

  • Threat Feeds: domains and IP addresses of the scan found in threat-intelligence feeds (threat_feeds).
  • Antivirus and YARA: results for the page and the files it served (antivirus_yara).
  • IDS Alerts: intrusion-detection alerts on the scan’s network traffic (ids_alerts).
  • Safe Browsing: Google Safe Browsing listings (safe_browsing).
  • Hunting Rules: ScanMalware hunting rules that matched the page, its frames or its scripts (hunting_rules).
  • The item has scanstatus, a detectioncounts object with one count per source, and the full result of each source under the same key. The sources report nothing while a scan is still running, so check that scan_status is completed. A count above zero is a finding to review, not a verdict on its own: some IDS alerts are informational.

    Scan > Get Pivot Values

    Returns the values of a scan that can be searched across other scans: page and script hashes, script URLs and hosts, tracking IDs, YARA rule names, linked hosts and more. Pivot types with no value are left out unless Options > Include Empty Values is on. Search a value with Search > SMQL Query to find other scans that share it.

    Scan > Get RDAP

    Returns the registration data of the scanned domain. With Simplify on: domain, registrar, registrationdate, expirationdate, domainagedays, domainagecategory, nameservers, status, data_source and error.

    The data describes the registered domain of the submitted URL. For a page on a shared platform such as pages.dev or vercel.app, the domain age is the platform’s, not the page’s.

    Scan > Get Screenshot

    Downloads the screenshot of a scanned page into a binary field (data by default), ready to attach to a Slack, Microsoft Teams or email alert. Under Options you can choose PNG or WebP and a Width in pixels (50 to 2000, aspect ratio kept). The node checks that ScanMalware returned an image; while a scan is still running it reports that the screenshot is not ready yet.

    Search > Search by AI Scam Type

    Finds scans that the AI classified as one scam type, such as Credential Phishing, Fake Shopping or Tech Support Scam, and returns one item per scan with the same simplified fields as Get AI Analysis plus url, title and submitted_at. The list holds the 16 most common types; to search a rarer one, switch the parameter to an expression and enter its exact label.

    Domain > Get DNS History, Get Hosts, Get Certificates, Get Certificate Timeline, Get Stats

    These take a domain name only; for an IP address use the IP resource.

  • Get DNS History returns one item per DNS record seen for the name, with type, value, firstseen, lastseen and source. source says how it was seen: scan (looked up when a public page using the name was scanned), certificate (resolved when a TLS certificate was published) or reverse_dns. It is not a continuous record: what DNS said between two sightings is unknown.
  • Get Hosts returns the other hosts that scanned pages of the domain contacted (observed) or loaded scripts from (scripts), and the domain’s subdomains seen in those scans.
  • Get Certificates returns one item per Certificate Transparency log entry for the domain and its subdomains, with loggedat and the ipaddresses the name resolved to when it was logged.
  • Get Certificate Timeline returns certificates issued per day and when each certificate was first and last seen. Options > Days limits it to recent days; leave it out for the full history.
  • Get Stats returns the number of scans of the domain, the first and latest scan, and counts for the last 24 hours, 7 days and 30 days.
  • IP > Get Stats, Get Scans, Get CT Domains

    These take an IPv4 or IPv6 address.

  • Get Stats returns the ASN, BGP prefixes, location, reverse DNS, domains seen on the address and scan counts, without the list of scans.
  • Get Scans returns one item per public scan that contains the address. Use Limit and Options > Page to page through them.
  • Get CT Domains returns one item per registered domain whose TLS certificates resolved to the address when they were issued, with its hostnames. Addresses are not re-checked, so a domain that moved to the address later is not listed, and shared hosting or CDN addresses carry many unrelated domains.
  • Brand > Get, Get Impersonating Hosts, Get Many, Get Timeline

    ScanMalware follows more than a thousand brands for impersonation. Pick the Brand from the searchable list, or enter its slug (such as paypal).

  • Get returns the brand with its totals, the campaigns (threat hunts) that target it and the hosting platforms and TLDs used (infrastructure).
  • Get Impersonating Hosts returns one item per host caught impersonating the brand, most recently seen first, with firstseen, lastseen, the number of sightings and the title and verdict of the host’s newest scan. Hide Lower-Risk Hosts (on by default, like the brand page on scanmalware.com) leaves out hosts that neither detection engine rates high and the AI assessed as at most moderate. Turn on Return All to page through every host.
  • Get Many lists the monitored brands, with filters for a search text, a sector and brands that have sightings.
  • Get Timeline returns one item per day with the brand’s sightings and new hosts.
  • Threat Feed > Get Recent Hunt Sightings, Get Recent Hunting Rule Matches, Get Recent Malware

    Recent findings across all public scans, one item per finding:

  • Get Recent Hunt Sightings: scans from the last three days that matched a threat hunt (a tracked phishing or malware campaign), newest first, with the hunt’s name, family and severity. A scan that matched several hunts appears once per hunt.
  • Get Recent Hunting Rule Matches: scans that matched a hunting rule, such as a card skimmer pattern, in the last Hours (1 to 168).
  • Get Recent Malware: scans in which antivirus detected malware in a served file, in the last Hours.
  • Credentials

    No credentials needed. The ScanMalware API is public and keyless, so the node has no credential type and nothing to configure.

    Data flow and privacy

    The node only talks to https://scanmalware.com. It sends what each operation needs and nothing else from your workflow:

  • Submit sends the URL and the visibility you chose.
  • The other Scan operations send the scan ID and the options you set.
  • SMQL Query sends the query text, limit, page and sort order; Search by AI Scam Type sends the scam type and limit.
  • Domain and IP operations send the domain or IP address and the options you set.
  • Brand operations send the brand slug and options; the brand list sends what you type into its search box.
  • Threat Feed operations send only the limit and time window.
  • Every request also carries the user agent scanmalware-n8n/ and comes from the IP address of your n8n instance. ScanMalware records requests, including what was looked up, in its logs, and hostnames that appear in lookups can be queued for its own scanner (scans started that way are unlisted). See Lookups, API requests and logs in the ScanMalware privacy policy for what is kept and for how long.

    Public scans are visible to everyone: the URL, a screenshot and the analysis results appear in the public feed and in search. Choose Unlisted when the URL or its content should not be published.

    Example workflows

    The workflows are in the examples folder and can be imported with Workflows > Import from File. They use example.com and PayPal so that they run as they are.

    Triage a suspicious URL from an email

    examples/triage-suspicious-url.json

    1. Email Trigger (IMAP) receives a reported message. (The example file starts with a Manual Trigger and a Set node holding the URL; replace both with your trigger and an expression that extracts the link.)
    2. ScanMalware, Scan > Submit with Visibility Unlisted, so the reported link is not published.
    3. Wait 60 seconds.
    4. ScanMalware, Scan > Get Summary with Scan ID {{ $('Submit Unlisted Scan').item.json.scan_id }}.
    5. If risk_level is high or malicious, alert your team (Slack, Microsoft Teams or email). Otherwise, if status is not completed yet or verdict is still empty, loop back to the Wait node.

    Watch scans of your domain

    examples/watch-domain-scans.json

    1. Schedule Trigger once a day (the example file uses a Manual Trigger).
    2. ScanMalware, Domain > Get Scans for your domain with Options > Status Completed.
    3. If verdictappliestodomain is true, run ScanMalware, Scan > Get Summary with Scan ID {{ $json.scanid }} and alert when risk_level is high or malicious.
    4. Rows where verdictappliesto_domain is false started at another site. Their verdict is not your domain’s, but they are worth a look as possible impersonation.

    Watch for new sites impersonating a brand

    examples/monitor-brand-impersonation.json

    1. Schedule Trigger once a day (the example file uses a Manual Trigger).
    2. ScanMalware, Brand > Get Impersonating Hosts for your brand, with Return All on.
    3. If first_seen is within the last 24 hours, the host is new.
    4. ScanMalware, Scan > Get Screenshot with Scan ID {{ $json.scan_id }}, then send the host, its verdict and the screenshot to your team. (The example ends at the screenshot; add your Slack, Microsoft Teams or email node.)

    Using it in an AI agent

    The node is marked usableAsTool, so it can be attached to an n8n AI Agent node as a tool. For each parameter you can either set a fixed value or let the model fill it in. Two suggestions:

  • Fix Visibility to Unlisted in a Submit tool, so the model cannot publish URLs by itself.
  • Keep Simplify on, so the agent receives short, flat results.
  • Get Screenshot returns a binary file, which agents cannot read; give an agent Get AI Analysis or Get Detections instead.
  • Errors and rate limits

    The node reports API failures with a short message and a hint, and does not retry on its own:

  • Not found (404): the scan ID does not exist, or nothing is recorded for the request.
  • Rate limited (429): ScanMalware asked the workflow to slow down. The message includes the Retry-After time when the API sends one. Run the node again later, add a Wait node, or process items in smaller batches.
  • Invalid input (400 or 422): the message names the parameter the API did not accept, for example an SMQL query that could not be parsed.
  • Not ready yet: Get AI Analysis and Get Screenshot are only available once a scan has completed. Check Get Progress, then run the node again.
  • Turn on Settings > On Error > Continue to keep a workflow running and receive the message in an error field instead.

    Compatibility

    Built with the @n8n/node-cli tooling (n8n nodes API version 1). Tested with n8n 2.43.7.

    Resources

  • ScanMalware API documentation
  • ScanMalware privacy policy, API requests
  • n8n community nodes documentation
  • Version history

    0.2.0

    22 new operations; the five 0.1.0 operations, their parameters and their output are unchanged.

  • Scan: Get Progress, Get AI Analysis, Get Detections, Get Pivot Values, Get RDAP, Get Screenshot (binary).
  • Search: Search by AI Scam Type.
  • Domain: Get DNS History, Get Hosts, Get Certificates, Get Certificate Timeline, Get Stats.
  • New IP resource: Get Stats, Get Scans, Get CT Domains.
  • New Brand resource: Get, Get Impersonating Hosts, Get Many, Get Timeline, with a searchable brand list.
  • New Threat Feed resource: Get Recent Hunt Sightings, Get Recent Hunting Rule Matches, Get Recent Malware.

0.1.0

First release: Scan > Submit, Scan > Get Summary, Search > SMQL Query, Domain > Get Scans and Domain > Get DNS.

License

MIT, copyright Triop AB.

From our network Other tools and sites we build