// scan public json api

API

Everything the reader UI fetches is also reachable as a public JSON endpoint. No API key, no token, no signup. Use it for dashboards, scripts, alerts, your own dedup, your own reader. JSON in, JSON out.
01

// basics

Base URL: https://omnomfeeds.com

All responses are application/json; charset=utf-8 except /feed.xml which is RSS 2.0. Methods documented are the supported method; anything else returns 405.

Try one now:

$ curl https://omnomfeeds.com/api/cves/hottest?hours=24&limit=5
Caching: heavy-read endpoints (/api/cves/hottest, /api/landing/stats, /feed.xml) cache 5-10 minutes server-side. Polling more often is fine - you get the cached payload.
02

// feed data

GET/api/articlespublic
Paginated list of scored articles from every source. Filtering and pagination via query params. Anonymous + free callers get a 30-day window; Pro users get full history.
ParamTypeDefaultNotes
min_scoreint0Floor on the article score (0-100).
limitint100Page size.
offsetint0Page offset.
sourcestring-Exact source name match.
source_typestring-rss, bluesky, mastodon, reddit, github, ioc_feed.
searchstring-Substring match across title + summary.
has_iocsboolfalseOnly items tagged with IOCs.
unreadboolfalseOnly items the caller hasn't marked read (per-user state needs auth).
show_dupesboolfalseInclude de-duped articles.
sinceISO 8601-Articles fetched at or after this timestamp.
GET/api/sourcespublic
All configured news sources and their current health (last fetch, last error, item count).
GET/api/statspublic
Per-source article counts, total / unread / duplicates, top tags. Heavier - use /api/landing/stats for cheap polling.
GET/api/landing/statspublic
Cheap headline numbers for trust strips: articles in 30d, distinct CVEs in 7d, KEV pops in 7d, time since last fetch. 5-min server cache.
GET/feed.xmlpublic
RSS 2.0 of the top 50 articles (score >= 60) in the last 7 days. Item descriptions carry score + KEV / CVE enrichment in brackets. Categories carry the article tag array.
GET/healthzpublic
Liveness probe. {"status":"ok","version":"<commit-sha>","uptime_s":<n>,"hosted_mode":bool}. UptimeRobot-friendly.
03

// cve enrichment

GET/api/cve/{id}public
Combined NVD + EPSS + KEV + OTX data for a single CVE. Path is the canonical CVE ID, e.g. /api/cve/CVE-2026-12345. Response includes cvss_v3_score, cvss_v3_severity, cwe, published, epss_score, epss_percentile, otx_pulse_count, description.
curl https://omnomfeeds.com/api/cve/CVE-2025-50165
GET/api/cves/hottestpublic
Trending CVEs by mention count across all sources. EPSS overlay attached per row when available. 5-min server cache.
ParamTypeDefaultNotes
hoursint 1-33672Window size in hours.
limitint 1-5010Max rows.
GET/api/cves/pre-kevpublic
CVEs trending across >= N sources in the last N hours but NOT yet on the CISA KEV catalog. Early-warning view ahead of formal listing.
ParamTypeDefaultNotes
hoursint 1-33672Lookback window.
minint3Min distinct sources mentioning the CVE.
04

// actors & malware

GET/api/actors/{slug}public
Curated threat-actor metadata. Slug is the lowercase canonical name (e.g. apt41, lazarus, scattered-spider, lockbit). Response includes display name, aliases, origin attribution where known, recent mention count, and a link to MITRE Groups.
curl https://omnomfeeds.com/api/actors/lockbit
GET/api/malware/{slug}public
Curated malware-family metadata. Slug is the lowercase canonical name (e.g. cobaltstrike, mimikatz, sliver, redline). Same response shape as actors plus a kind field (loader / RAT / stealer / etc.).
05

// mitre att&ck

GET/api/mitrepublic
Compact technique-ID-to-name map. Used by the reader for chip rendering.
GET/api/mitre/{id}public
Full ATT&CK technique record. ID is the standard T-number e.g. T1059, T1059.001.
GET/api/attack/exportpublic
MITRE ATT&CK Navigator v4.5 layer JSON. Default scope=global is public and returns TTP frequency across all sources for the window. scope=mine is Pro-gated and returns the caller's bookmarked articles' TTPs. Drops straight into attack-navigator.
ParamTypeDefaultNotes
scopestringglobalglobal (public) or mine (Pro).
daysint 1-18030Lookback window for scope=global.
curl 'https://omnomfeeds.com/api/attack/export?scope=global&days=14' -o layer.json
06

// other

GET/api/briefs/patchpublic
Patch Tuesday briefs (Microsoft, Adobe, Oracle, SAP, etc) auto-generated on patch days.
ParamTypeDefaultNotes
daysint 1-9030How far back to fetch briefs.
GET/api/momentumpublic
Week-over-week growth of tags, MITRE techniques, threat actors. Surfaces things heating up before they hit the trending leaderboard.
GET/api/scoringpublic
The keyword categories + weights that drive article scoring. Useful for understanding why an article scored what it did.
GET/api/worm/moodpublic
Worm sprite mood (hibernating / eating / frenzy) derived from KEV velocity in the last 24h. Frenzy is >= 5 KEV mentions in 24h.
07

// pro-gated

These exist for completeness. Hit them anonymously and you get a 401; hit them as a free user in hosted mode and you get a 402.

GET/api/cve/{id}/explainpro
3-bullet Claude-Haiku summary of the CVE in plain English. Cached per CVE forever - the first Pro user pays the LLM call, every subsequent reader gets it instantly.
GET/api/attack/export?scope=minepro
ATT&CK Navigator layer for the caller's bookmarked articles instead of global frequency.
GET/api/digestpro
Daily AI intel brief (last 24h). Server-side cached 1h across all Pro users.
GET/api/articles/explain/{id}pro
Per-article "what it is / who needs to care / what to do today" summary. Cached per article id.
GET/api/me/whats-newpro
Personalised "while you were gone" brief - what happened in the gap between the caller's last visit and now. Append ?force=1 to bypass the 24h auto-hide gate.
08

// errors & limits

Standard HTTP status codes. No envelope around errors - plain JSON like {"error":"reason"}.

CodeMeaning
200OK
400Bad request - usually malformed query param.
401Unauthenticated. Reached a Pro-gated endpoint without a session.
402Free tier user hit a Pro endpoint.
404Path or resource doesn't exist.
405Method not allowed (most endpoints are GET-only).
429Per-IP rate limit on AI endpoints (20 per minute). Retry-After header carries seconds.
503Backing service (NVD, EPSS, OTX) unreachable for the requested data.
09

// self-host

Same API, on your own box. Build the binary from github.com/RMS2D/omnomfeeds, or use the one-liner installers in the README. Pro-gated endpoints are open in self-host mode (you ARE the operator); the AI ones need ANTHROPIC_API_KEY or OPENAI_API_KEY in your env.

oM noM Security FeedsยทMIT licensed trending cvesrssgithubprivacy