Integrations

Put live honeypot telemetry where your team already works.

HoneyLabs sees what is sweeping the internet right now, from real sensors. You don't have to come to us to use it. One MCP server, a JSON/CSV API on every lookup, and pullable token feeds cover the AI assistants, SIEMs, SOAR runbooks, and firewalls security teams run today. Every recipe below hits a real, documented endpoint.

Why wire it in

01

Cut alert noise before an analyst sees it

A large share of inbound traffic is indiscriminate internet scanning. If our sensors have already logged a source IP sweeping the internet, your SIEM or SOAR can drop or deprioritise it automatically instead of paging someone to triage it by hand.

02

Enrich an observable in one hop

Any IP in a case gets a verdict, first and last seen, the ASN and provider, and the ports and paths it probes, from a single HTTP call. No second console to open, no per-seat intel subscription to renew.

03

Block what is already attacking, at the edge

The scanner feed is a live list of IPs caught probing real sensors within the last few days. Point a firewall URL alias or an ipset cron at it and the blocklist maintains itself on a five-minute cache.

04

Hunt by fingerprint across rotating IPs

Search on TLS and HTTP fingerprints (JA4, JA4H) and on CVE campaigns to find the same client across rotating IPs in your own logs, which a plain IP blocklist can never catch.

AI assistants

Native · Model Context Protocol

This is the first-class path. Wire the MCP server in once and Claude, Cursor, VS Code, Cline, or any MCP client can ask about an IP, a fingerprint, or a CVE campaign and get live answers, no glue code. Sign in with OAuth on first connect, or paste a bearer key.

Claude Code
claude mcp add honeylabs \
  --transport http \
  https://mcp.honeylabs.net/mcp \
  --header "Authorization: Bearer <hlk_…>"

Key from your dashboard, or drop the --header line and sign in via OAuth on first connect.

One click for Cursor and VS Code. Sign in on first use (OAuth), nothing to paste.

Claude Desktop / claude.ai

Settings, Connectors, Add custom connector. Paste https://mcp.honeylabs.net/mcp and authenticate.

Any other MCP client
{
  "mcpServers": {
    "honeylabs": {
      "type": "http",
      "url": "https://mcp.honeylabs.net/mcp",
      "headers": {
        "Authorization": "Bearer <hlk_…>"
      }
    }
  }
}

Replace <hlk_…> with a key from your dashboard. Every tool call needs one, so a config without the Authorization header will connect and list the tools, then fail on the first query.

Remote streamable HTTP at https://mcp.honeylabs.net/mcp. If your client speaks OAuth 2.1 with PKCE, drop the headers block and sign in on first connect instead.

Full prompt gallery and the tool catalog live on the MCP page.

SIEM

Wire-it-yourself · public API

Pull a scanner feed into a lookup table, then flag any source IP your sensors already know is sweeping the internet. No vendor app required.

Sn

Microsoft Sentinel

API recipe

The built-in TAXII connector polls our STIX 2.1 collections. Four form fields, no code.

# Data connectors -> Threat Intelligence - TAXII -> Add
Friendly name : HoneyLabs exploiters
API root URL  : https://honeylabs.net/taxii2/api/
Collection ID : exploiters
Username      : taxii
Password      : <your API key>   # free, from /dashboard?src=sentinel
Polling       : Once an hour

# Repeat with Collection ID: malware-infrastructure
ES

Splunk ES

API recipe

A threat intelligence source in Enterprise Security. One URL, no add-on, no account to start.

# Configure -> Threat intelligence -> Threat intelligence sources
Name              : honeylabs_exploiters
Type              : ip
URL               : https://honeylabs.net/feed/exploiters.csv
Delimiting regex  : ,
Fields            : ip:$1,description:$7
Skip header lines : 1

# Matches land in threat_activity and carry a reference URL
# back to the full report for that indicator.
Spl

Splunk

API recipe

Feed CSV becomes a lookup; flag known scanners inline in SPL.

Splunk search using a HoneyLabs lookup table to flag source IPs as known scanners, with live event counts, country, and ASN.

Live capture · our lab instance

# Scripted input, every 5 min: refresh the lookup table file
curl -fsS 'https://honeylabs.net/feed/<token>.csv' \
  > $SPLUNK_HOME/etc/apps/search/lookups/honeylabs_scanners.csv
# Define it once: Settings > Lookups > add a definition over that CSV.

# Search-time: flag any source IP HoneyLabs has caught scanning
index=firewall
| lookup honeylabs_scanners ip AS src_ip OUTPUT events asn country last_seen
| eval HoneyLabs=if(isnotnull(events),"known scanner","clean")
| table src_ip HoneyLabs events country asn last_seen
ES

Elastic

API recipe

Logstash http_poller ingests the feed; enrich events at index time.

Kibana Discover showing the HoneyLabs scanner feed indexed in Elasticsearch: 3,323 source IPs with country, ASN, and event counts.

Live capture · our lab instance

# logstash.conf  -  poll the JSON feed into an index
input {
  http_poller {
    urls => { honeylabs => "https://honeylabs.net/feed/<token>.json" }
    request_timeout => 30
    schedule => { every => "5m" }
    codec => "json"
  }
}
filter { split { field => "message" } }
output { elasticsearch { index => "honeylabs-scanners" } }
# Then build an enrich policy on honeylabs-scanners keyed by ip.

SOAR & threat-intel platforms

Wire-it-yourself · public API

Enrich an observable on demand from a playbook, or import the feed as a first-class intel source. The JSON verdict is built to drop straight into a case.

Cx

Cortex / TheHive

API recipe

A ~15-line analyzer turns an IP observable into a HoneyLabs verdict.

# Cortex analyzer  -  HoneyLabs_Lookup
from cortexutils.analyzer import Analyzer
import requests

class HoneyLabs(Analyzer):
    def run(self):
        ip = self.get_data()
        d = requests.get(
            f"https://honeylabs.net/lookup/{ip}?format=json", timeout=20
        ).json()
        self.report({
            "verdict": d["verdict"]["label"],
            "events":  d["total_events"],
            "scanner": d.get("scanner_tag"),
            "last_seen": d["last_seen"],
        })

if __name__ == "__main__":
    HoneyLabs().run()
MI

MISP

Native

Ships in MISP's default feed set (PR #10864). Filter for HoneyLabs, enable, done.

MISP event attributes correlating against the HoneyLabs active exploiters feed: five attacker IPs show feed hits, a Shadowserver research scanner shows none.

Live capture · our lab instance

# Nothing to add: both feeds are in MISP's shipped defaults.json.
# Sync Actions -> List Feeds -> filter "HoneyLabs"
#   HoneyLabs active exploiters       (csv, ip-src)
#   HoneyLabs malware infrastructure  (freetext, url)
# "Cache all feeds" for correlation, or "Fetch and store all feed data"
# to pull them into events.

# Your own saved queries work as extra MISP feeds too:
URL           : https://honeylabs.net/feed/<token>.csv
Source Format : Simple CSV, value field 1
OC

OpenCTI

API recipe

Native TAXII 2.1 ingestion: typed STIX indicators, incremental polling, no connector.

One indicator as OpenCTI stored it after polling our TAXII collection: the STIX pattern, our confidence carried through as the score, the exploitation kill chain phase, and a description naming the ASN, country and observation window.

Live capture · our lab instance

# Data -> Ingestion -> TAXII Feeds -> Create
TAXII server URL : https://honeylabs.net/taxii2/api/
TAXII collection : 253ff00b-4863-571f-8949-9d05616de5b7
Authentication   : Basic (user: taxii, password: <your API key>)

# Second ingester for loader/C2 URLs:
TAXII collection : e144c129-a19a-55c8-b926-dd2dfbbd8138
n8n

n8n / Tines

API recipe

One HTTP node enriches any IP mid-workflow. No SDK, no auth to set up.

n8n HTTP Request node calling the HoneyLabs lookup API, with the live JSON verdict for 80.82.77.202 in the output panel.

Live capture · our lab instance

# n8n "HTTP Request" node (or a Tines HTTP action)
Method : GET
URL    : https://honeylabs.net/lookup/{{ $json.ip }}?format=json
# Optional, lifts the anonymous rate limit:
Header : Authorization: Bearer hlk_xxxxxxxxxxxxxxxx

# Branch on  {{ $json.verdict.verdict == "scanner" }}

Firewalls & blocklists

Wire-it-yourself · public API

The plain-text feed is one IP per line, edge-cached for 5 minutes - exactly what a URL-table alias or an ipset cron job wants. Drop traffic from IPs your own sensors caught scanning.

pf

pfSense / OPNsense

API recipe

A URL-table alias auto-refreshes; reference it in a block rule.

# Firewall -> Aliases -> add a "URL Table (IPs)" alias
Name             : HoneyLabs_Scanners
Type             : URL Table (IPs)
URL              : https://honeylabs.net/feed/<token>
Update frequency : 1 day

# Then: Firewall -> Rules -> WAN -> block, Source = HoneyLabs_Scanners
ip

iptables / ipset

API recipe

Cron pulls the list into an ipset; one rule drops the whole set.

# /etc/cron.d/honeylabs  -  refresh every 30 min
*/30 * * * * root ipset create honeylabs hash:ip -exist; \
  curl -fsS 'https://honeylabs.net/feed/<token>' | \
  while read ip; do ipset add honeylabs "$ip" -exist; done

# One-time: drop anything in the set
iptables -I INPUT -m set --match-set honeylabs src -j DROP
f2b

fail2ban

API recipe

A list-fed jail bans scanners before their first attempt on your box.

A fail2ban jail built from this recipe after one feed pull: 235 addresses banned, each one a live REJECT rule in the f2b-honeylabs iptables chain.

Live capture · our lab instance

# Jail with no log filter, fed from the feed by cron
# /etc/fail2ban/jail.d/honeylabs.conf
[honeylabs]
enabled = true
filter = honeylabs      # empty failregex
logpath = /dev/null
bantime = 6h

# /etc/cron.d/honeylabs-fail2ban
*/30 * * * * root curl -fsS 'https://honeylabs.net/feed/<token>' \
  | while read -r ip; do fail2ban-client set honeylabs banip "$ip" >/dev/null; done
CS

CrowdSec

API recipe

cscli imports the list as decisions; your bouncers enforce them.

cscli importing the HoneyLabs feed into CrowdSec: 234 decisions created, then listed as 24-hour bans that any installed bouncer enforces.

Live capture · our lab instance

# Daily: import the feed as 24h ban decisions
curl -fsS 'https://honeylabs.net/feed/<token>' -o /tmp/honeylabs.txt
cscli decisions import -i /tmp/honeylabs.txt --format values --duration 24h

# Existing bouncers (firewall, nginx, Traefik) pick them up automatically
cscli decisions list | head

Code & CLI

Wire-it-yourself · public API

No client at all. The same JSON your tools consume is one request away from a shell or a script. Anonymous calls work; a key lifts the rate limit.

$_

curl + jq

API recipe

Verdict for any IP in one line. curl's UA gets JSON without the flag.

curl -s 'https://honeylabs.net/lookup/80.82.77.202?format=json' \
  | jq '{verdict: .verdict.label, events: .total_events, asn: .geo.org}'

# { "verdict": "Recognized scanner", "events": 292541, "asn": "IP Volume inc" }
Py

Python

API recipe

requests in, dict out. Key is optional and only raises your quota.

import requests

r = requests.get(
    "https://honeylabs.net/lookup/80.82.77.202",
    params={"format": "json"},
    headers={"Authorization": "Bearer hlk_xxxxxxxxxxxxxxxx"},  # optional
    timeout=20,
)
v = r.json()["verdict"]
print(v["label"], v["confidence"])  # Recognized scanner high

About the token feeds

The firewall and SIEM recipes pull a /feed/<token> URL. You create one from any HoneyLabs query you save: the feed then tracks that query live. Each is available as plain text (one IP per line), .csv, or .json, is anonymous and token-gated, and is edge-cached for five minutes so a tight cron never hammers the origin.

Running HoneyLabs inside a tool that isn't here? The JSON, CSV, and feed surfaces cover almost anything that speaks HTTP. Tell us what you wired up and we'll document it.