Threat intelligence API / integrations
Splunk
Two ways to get ThreatCluster indicators into Splunk: a scripted input that polls the IOC feed and indexes the JSON as events, or a CSV lookup you refresh on a schedule and match against your logs with inputlookup.
Prerequisites
- A ThreatCluster API key. Every plan, including free, has one: sign in, open Settings → API and select Generate API Key. Requests go to
https://threatcluster.io/api/public/v1with the key in anX-API-Keyheader. - For the scripted input: filesystem access to a Splunk Enterprise instance or a deployable app. Scripted inputs are configured in
inputs.confand the script must live in$SPLUNK_HOME/etc/apps/<app>/bin/. Enabling one requires a Splunk restart. - For the lookup route: a role with the
upload_lookup_filescapability if you upload through Splunk Web.
Setup: scripted input
- Generate your key under Settings → API.
- Create
$SPLUNK_HOME/etc/apps/<app>/bin/threatcluster_feed.sh:#!/bin/sh curl -s -H "X-API-Key: YOUR_KEY" \ "https://threatcluster.io/api/public/v1/iocs/feed?format=json&hours=24"
Make it executable withchmod +x. - Add a stanza to
$SPLUNK_HOME/etc/apps/<app>/local/inputs.conf.intervalis in seconds, so 3600 polls once an hour:[script://$SPLUNK_HOME/etc/apps/<app>/bin/threatcluster_feed.sh] disabled = false interval = 3600 index = threat_intel sourcetype = threatcluster:iocs
- Restart Splunk. Scripted inputs can also be managed from Settings in Splunk Web; the exact page varies by version, so check the "Setting up a scripted input" docs for yours. The configuration file route above is stable.
- Search the indexed events. Each event is one JSON response;
spathextracts the IOC array:index=threat_intel sourcetype=threatcluster:iocs | spath path=iocs{} output=ioc | mvexpand ioc | spath input=ioc
Setup: CSV lookup blocklist
- Pull the feed as CSV (columns are
type,value,confidence,reason):curl -s -H "X-API-Key: YOUR_KEY" \ "https://threatcluster.io/api/public/v1/iocs/feed?format=csv" \ -o threatcluster_iocs.csv
- Load it into Splunk. One-off: Settings > Lookups > Lookup table files > Add new, choose the file and a destination filename ending in
.csv, then create a lookup definition from it. Recurring: run the curl from cron and write the file into your app'slookupsdirectory, which keeps the table fresh without the UI. - Match your logs against it with a subsearch. For example, proxy traffic to known bad domains:
index=proxy [ | inputlookup threatcluster_iocs.csv | search type=domain | rename value AS dest_host | fields dest_host ]
Worked example
A real captured response from the CSV endpoint, trimmed:
GET https://threatcluster.io/api/public/v1/iocs/feed?format=csv X-API-Key: YOUR_KEY type,value,confidence,reason domain,acrobatreaderonline.com,high,[article sweep] Used as a malicious site impersonating Adobe Acrobat Reader. domain,bookcheckarrival-gueststayhotel.com,high,Indicates attacker-controlled phishing domain targeting hotel reservations. domain,browser-app.com,high,[article sweep] Domain used in a malicious browser extension campaign domain,case-apple.com,high,[article sweep] Used in phishing scams impersonating Apple domain,ccleanerwind.top,high,Identified as attacker-controlled domain for malware distribution
Useful parameters on /iocs/feed: types (all, ip, domain, hash, email), format (txt, csv, json, stix), confidence (default confirmed, which excludes false positives and unreviewed IOCs) and hours. format=txt returns bare values, one per line, if you want a plain blocklist. /iocs/export takes the same filters and serves the result as a download.
Costs and limits
Each /iocs/feed or /iocs/export pull costs 3 credits. The free key has 100 credits per day, 30 requests per minute and a 7 day lookback (an hours value above 168 is clamped). An hourly scripted input is 24 pulls at 3 credits, 72 credits per day, so it fits the free budget. Pulls that return nothing are refunded.
Full endpoint reference: /api/public/v1/docs. Output formats: /formats. Paid tiers with longer lookback and higher limits: /pricing.