Composio for SecOps

Give your AI secure access to 71 security tools in minutes

Connect Claude Code, Codex, OpenCode, or your own agent to VirusTotal, Shodan, Okta, Jira and more, with one key. Then watch it go from advice to action.

71
providers
1
API key
0
SDKs
Works withClaude Code logoCodex logoOpenCode logo
claude — ~/secops
 ▐▛███▜▌
▝▜█████▛▘
  ▘▘ ▝▝
Claude Code v2.1
Opus 5.5 · Claude Max
~/secops
> is 45.83.12.7 malicious? check greynoise and abuseipdb
Pondering… (esc to interrupt)
∴ Thought for 2s
⏺ Bash(curl -s $SATU/api/greynoise/lookup_ip \
-H "X-API-Key: $SATU_KEY" -d '{"ip":"45.83.12.7"}')
⎿ Running…
⎿ {"noise":true,"classification":"malicious","last_seen":"2026-09-27"}
⏺ Bash(curl -s $SATU/api/abuseipdb/lookup_ip_address \
-H "X-API-Key: $SATU_KEY" -d '{"ip_address":"45.83.12.7"}')
⎿ Running…
⎿ {"data":{"abuseConfidenceScore":100,"totalReports":412,"countryCode":"NL"}}
⏺ Yes — treat 45.83.12.7 as hostile.
• GreyNoise: malicious scanner, seen yesterday
• AbuseIPDB: 100/100 confidence, 412 reports
Block it at the edge and grep access logs for prior hits.
> Try "hash lookup on virustotal for this sample"
? for shortcuts● only $SATU_KEY in this session
The problem

Every tool has its own auth.
Every script ends up holding every key.

Without Satu
virustotal logox-apikey: 7f3c…
abuseipdb logoKey: 9ae1…
shodan logo?key=Qm9z…
urlscan logoAPI-key: 0b2d…
okta logoAuthorization: SSWS 00x…
jira logoAuthorization: Basic cmF…
6 secrets, copied into
.env filesagent contextCI secretscron scripts
With Satu
X-API-Key: $SATU_KEY
virustotal logoPOST /api/virustotal/lookup_file_hash
abuseipdb logoPOST /api/abuseipdb/lookup_ip_address
shodan logoPOST /api/shodan/host_lookup
urlscan logoPOST /api/urlscan/lookup_url
okta logoPOST /api/okta/suspend_user
jira logoPOST /api/jira/add_issue_comment
1 key everywhere, provider secrets stay put
stored server-siderevoke one key, not six
How it works

Your key goes in.
The right provider key comes out.

Callers
Claude Code logo
Codex logo
OpenCode logo
X-API-Key
Satu GatewaySatu Gateway
Check your Satu key
Route to provider
Inject provider credential
provider key
Providers
virustotal logo
greynoise logo
abuseipdb logo
shodan logo
67 more providers, same call shape
Coverage

71 providers behind one route

POST /api/{provider}/{function}
GET /api/{provider}/apiinfo · self-describing docs
Threat intel21
virustotal logoabuseipdb logogreynoise logoalienvault_otx logocrowdsec_cti logopulsedive logothreatfox logourlhaus logomalwarebazaar logothreatstream logohybrid_analysis logoanyrun logourlscan logophishtank logoemailrep logointelx logoransomlook logoransomware_live logohudsonrock logo
Recon & OSINT17
shodan logocensys logoipinfo logogeoip logowhois logocrtsh logohackertarget logowayback logotor logocircl_onion_lookup logoexa logohibp logoleakcheck logoblockchain_btc logogoogle_maps logo
Vulnerabilities11
circl_cve logocwe logoepss logoghsa logoosv logovulncheck logovulners logoattackerkb logoshodan_cvedb logotenable_sc logo
SIEM, EDR & identity10
splunk logoelasticsearch logomicrosoft_sentinel logodatadog logomicrosoft_defender_endpoint logosentinel_one logookta logookta_oar logomicrosoft_entra logom365 logo
Ticketing & response12
jira logoconfluence logopagerduty logorootly logoalertmedia logomicrosoft_teams logohackerone logogithub logogoogle_sheets logoterraform_cloud logogophish logocaldera logo
FAQ

Before you connect anything

Do I need my own provider keys?

Yes, for now. Satu doesn't supply shared provider keys yet, so calls run on your own VirusTotal, Okta or Jira accounts, with your plans and quotas. You add each key once. Public sources such as crt.sh, OSV, EPSS and the Wayback Machine need no key at all.

Where do my provider keys go?

They stay on the gateway. The API never returns them, and your agents, scripts and CI only ever hold your Satu key. If that key leaks, you revoke one key instead of rotating every provider.

Does it work with my agent or stack?

If it can send an HTTP request, yes: Claude Code, Codex, OpenCode, Python, n8n or plain curl. There's no SDK to install, and every provider documents itself at /api/{provider}/apiinfo so agents can discover what to call.