Skip to content

RSS Reader API Documentation

The RSS Reader API provides access to links, documents, and media shared across Signal groups. It aggregates content from multiple sources into a unified feed that can be filtered by category, group, or platform.

Base URL: https://rss.irregulars.io/api/rss (external) or http://localhost:8082/api/rss (internal)

Most endpoints are publicly accessible for reading content metadata. However, document download URLs require authentication.

Include the API key in the request header:

X-Api-Key: <your-api-key>
User TypeMetadataDownload URL
AnonymousVisiblenull (requires_auth: true)
AuthenticatedVisiblePresigned URL (7-day expiry)

Fetch links with filtering and pagination. Aggregates content from news articles, social media, repositories, documents, and videos.

ParameterTypeDefaultDescription
categorystringallFilter by category: news, social, videos, documents, repos
groupstring-Filter by Signal group ID
platformstring-Filter by platform (e.g., youtube, twitter, instagram)
qstring-Search query (searches title and summary)
limitnumber50Results per page (max: 100)
offsetnumber0Pagination offset
{
"success": true,
"links": [
{
"type": "news",
"id": "news-123456",
"url": "https://example.com/article",
"title": "Article Title",
"summary": "Article summary...",
"platform": "example.com",
"group_id": "abc123...",
"group_name": "IrregularChat: Tech",
"posted_by_name": "username",
"forum_url": null,
"post_count": 3,
"first_posted_at": "2026-01-25T10:00:00Z",
"last_posted_at": "2026-01-26T15:00:00Z",
"image_url": "https://example.com/image.jpg",
"stars": null,
"language": null
}
],
"total": 952,
"offset": 0,
"limit": 50,
"has_more": true
}
TypeSourceDescription
newsnews_linksNews articles with og:image metadata
socialsocial_media_linksInstagram, Twitter/X, LinkedIn, Facebook, Reddit, TikTok
videosocial_media_links + archived_videosYouTube, Vimeo, Twitch, PeerTube uploads
filearchived_filesPDFs, documents uploaded to Signal
reporepository_linksGitHub, GitLab repositories
{
"type": "file",
"id": "89",
"url": "https://s3.irregular.chat/...?X-Amz-Signature=...",
"title": "Document Title.pdf",
"summary": "AI-generated summary...",
"platform": "document",
"group_name": "IrregularChat: Research",
"requires_auth": null
}
{
"type": "file",
"id": "89",
"url": null,
"title": "Document Title.pdf",
"summary": "AI-generated summary...",
"platform": "document",
"group_name": "IrregularChat: Research",
"requires_auth": true
}

Get all content categories with link counts.

{
"success": true,
"categories": [
{
"name": "news",
"display_name": "News",
"description": "News articles and stories",
"link_count": 952,
"icon": "newspaper"
},
{
"name": "social",
"display_name": "Social Media",
"description": "Social media posts",
"link_count": 594,
"icon": "phone"
},
{
"name": "videos",
"display_name": "Videos",
"description": "YouTube, Vimeo and archived videos",
"link_count": 218,
"icon": "video"
},
{
"name": "documents",
"display_name": "Documents",
"description": "PDFs and files",
"link_count": 77,
"icon": "folder"
},
{
"name": "repos",
"display_name": "Repositories",
"description": "GitHub, GitLab and other code repositories",
"link_count": 66,
"icon": "code"
}
]
}

Get Signal groups that have shared links, with total link counts.

{
"success": true,
"groups": [
{
"id": "abc123...",
"name": "IrregularChat: Main",
"description": "Main discussion group",
"group_type": "community",
"link_count": 450
},
{
"id": "def456...",
"name": "IrregularChat: Tech",
"description": "Technology discussions",
"group_type": "topic",
"link_count": 230
}
]
}

Get overall statistics for the RSS feed.

{
"success": true,
"stats": {
"total_links": 1907,
"news_count": 952,
"social_count": 594,
"repo_count": 66,
"file_count": 77,
"video_count": 218,
"groups_with_links": 76,
"last_updated": "2026-01-26T21:40:20.094Z"
}
}

Search across all content types by keyword.

ParameterTypeDefaultDescription
qstringrequiredSearch query (min 2 characters)
semanticbooleanfalseUse semantic search (future feature)
limitnumber20Results limit (max: 50)
{
"success": true,
"query": "drone",
"method": "keyword",
"results": [
{
"type": "news",
"id": "news-789",
"url": "https://example.com/drone-article",
"title": "New Drone Regulations",
"summary": "Article about drones...",
"platform": "defensenews.com",
"group_name": "IrregularChat: sUAS"
}
],
"total": 15
}

Get the entity co-occurrence graph for visualization.

ParameterTypeDefaultDescription
min_articlesnumber10Minimum article count for a node
min_edgesnumber5Minimum co-occurrence count for an edge
limitnumber60Maximum number of nodes
edge_limitnumber100Maximum number of edges
include_outletsbooleanfalseInclude news outlet nodes
{
"success": true,
"nodes": [
{
"name": "United States",
"type": "locations",
"article_count": 142,
"recent_count": 18,
"prev_count": 25
}
],
"edges": [
{
"source": "United States",
"target": "Donald Trump",
"weight": 87,
"pmi": 0.234
}
],
"meta": {
"total_nodes": 60,
"total_edges": 95,
"total_available_nodes": 245,
"min_articles": 10,
"min_cooccurrence": 5,
"total_articles": 1907
}
}

Get detailed information about a specific entity.

ParameterTypeDescription
namestringEntity name (URL-encoded)
{
"success": true,
"entity": {
"name": "United States",
"type": "locations",
"article_count": 142,
"recent_count": 18,
"articles": [
{
"id": "news-123",
"title": "Article about US policy",
"url": "https://example.com/article",
"posted_at": "2026-02-28T10:00:00Z"
}
],
"cooccurring": [
{ "name": "Donald Trump", "type": "people", "count": 87 },
{ "name": "Congress", "type": "organizations", "count": 45 }
]
}
}

Search entities by name.

ParameterTypeDefaultDescription
qstringrequiredSearch query (min 2 characters)
limitnumber20Results limit

Get all entity aliases.

{
"success": true,
"aliases": [
{ "canonical": "United States", "alias": "USA", "entity_type": "locations" },
{ "canonical": "United States", "alias": "US", "entity_type": "locations" }
]
}

POST /api/rss/admin/entity-aliases (Admin)

Section titled “POST /api/rss/admin/entity-aliases (Admin)”

Add a new entity alias.

{
"canonical": "United States",
"alias": "America",
"entity_type": "locations"
}

DELETE /api/rss/admin/entity-aliases (Admin)

Section titled “DELETE /api/rss/admin/entity-aliases (Admin)”

Remove an entity alias.

{
"alias": "America",
"entity_type": "locations"
}

PlatformMetadataThumbnailsNotes
YouTubeTitle, description, channelYes (via yt-dlp)Full metadata extraction
Instagram-Yes (via og:image)API restrictions limit metadata
Twitter/X-Yes (via og:image)Limited metadata
LinkedIn-Yes (via og:image)Limited metadata
Facebook-Yes (via og:image)Limited metadata
Reddit-NoBlocks scrapers
TikTok-NoBlocks scrapers
Twitch-YesStream thumbnails
Vimeo-YesVideo thumbnails

News links automatically extract:

  • Title from <title> or og:title
  • Summary from og:description or meta description
  • Image from og:image or twitter:image

Success rate: ~73% have images (depends on site support for Open Graph tags)

Documents stored in MinIO S3:

  • PDF title extraction (when available)
  • AI-generated summaries (optional)
  • Category based on source Signal group
  • Virus scanned before storage

All endpoints return consistent error format:

{
"success": false,
"error": "Error message description"
}
CodeMeaning
200Success
400Bad request (missing/invalid parameters)
401Unauthorized (invalid API key)
500Server error
503Database not initialized

Currently no rate limiting is enforced. Please be respectful with request frequency.


Terminal window
curl "https://rss.irregulars.io/api/rss/links?category=news&limit=10"
Terminal window
curl "https://rss.irregulars.io/api/rss/links?category=videos&platform=youtube"
Terminal window
curl "https://rss.irregulars.io/api/rss/search?q=drone&limit=20"
Terminal window
curl -H "X-Api-Key: YOUR_API_KEY" \
"https://rss.irregulars.io/api/rss/links?category=documents"
Terminal window
curl "https://rss.irregulars.io/api/rss/links?group=sUz0ycsujy8FjbEAISdmOaOopRuOgK2HalesYqD%2Ba34%3D"

  • Entity graph API: GET /entities/graph returns co-occurrence graph with nodes, edges, PMI, and community data
  • Entity detail API: GET /entities/detail/:name returns article history and co-occurring entities for a specific entity
  • Entity search API: GET /entities/search for searching entities by name
  • Entity aliases API: CRUD endpoints for managing entity name normalization (e.g., “USA” → “United States”)
  • Admin backfill: POST /admin/backfill-entities triggers entity extraction from existing articles
  • Documents require authentication: Document download URLs now require API key authentication. Metadata (title, summary, group) remains publicly visible.
  • Presigned URLs: Documents use 7-day presigned URLs for secure access
  • YouTube metadata: Full title, description, and thumbnail extraction via yt-dlp
  • Video category: YouTube, Vimeo, Twitch links now categorized as “videos” instead of “social”