Several modules depend on third-party API keys (Shodan, VirusTotal, AbuseIPDB, Censys…). When a key is absent or rate-limited, the module should return a clear "skipped: no API key" / "rate limited" status instead of a hard error, and the dashboard should render that state.
Acceptance criteria
- Standard status enum for module results:
ok | skipped | rate_limited | error.
- Each key-dependent module reports the right status.
- Frontend badge per module reflecting the status.
Several modules depend on third-party API keys (Shodan, VirusTotal, AbuseIPDB, Censys…). When a key is absent or rate-limited, the module should return a clear "skipped: no API key" / "rate limited" status instead of a hard error, and the dashboard should render that state.
Acceptance criteria
ok | skipped | rate_limited | error.