RSSMonster API
RSSMonster exposes a JSON API for its web client and for custom integrations. The routes are not versioned: they are served below /api on the same host as RSSMonster.
https://your-rssmonster.example/api
Most routes require a JSON Web Token (JWT). The Fever and Google Reader compatibility APIs use their own authentication schemes; their credentials are not interchangeable with a JWT.
Authentication
Request a JWT
Obtain a token by sending the user’s RSSMonster credentials to POST /api/auth/login:
curl --request POST \
--header 'Content-Type: application/json' \
--data '{"username":"<username>","password":"<password>"}' \
'https://your-rssmonster.example/api/auth/login'
A successful response has this shape:
{
"message": "Connected!",
"token": "<jwt>",
"user": {
"id": 1,
"username": "example"
},
"expiresInSeconds": 86400,
"agenticFeaturesEnabled": false
}
The user object can contain additional non-secret account fields. Store the value of token and send it in the bearer authorization header on subsequent requests:
curl --header 'Authorization: Bearer <jwt>' \
'https://your-rssmonster.example/api/feeds'
Use POST /api/auth/validate with the same header to check whether a token is still valid. Its successful response includes the authenticated user, the decoded token data, and whether agentic features are enabled.
JWT lifetime is controlled by JWT_EXPIRES_IN and defaults to 86,400 seconds (24 hours). RSSMonster does not expose refresh-token, logout, or token-revocation endpoints. When a token expires, log in again; to log out a client should discard its token. Changing JWT_SECRET invalidates all previously issued JWTs. See Configuration for the server settings.
Registration and development login
POST /api/auth/register creates an account from username, password, and password_repeat. Registration does not return a JWT, so the new user must log in afterwards.
POST /api/auth/development-login can issue a normal JWT without a password, but only when all of the development-login settings are enabled. This is meant for local debugging or a deliberately configured personal installation, never for a publicly reachable production server. See First Login for setup and security details.
Authentication errors
Protected native routes require an Authorization: Bearer <jwt> header. A missing, malformed, expired, or invalid token currently returns HTTP 400 with:
{
"message": "Your session is not valid!"
}
Clients should therefore treat this response as an authentication failure even though it is not returned as HTTP 401.
Public endpoints
These native routes do not require a JWT:
| Method | Endpoint | Purpose |
|---|---|---|
POST | /api/auth/register | Create a user account |
POST | /api/auth/login | Exchange username and password for a JWT |
POST | /api/auth/development-login | Log in as the configured development user when enabled |
GET | /api/health | Return process health, uptime, and a timestamp |
The Google Reader compatibility check and login routes are also public, but they belong to that protocol’s authentication flow.
Native endpoint reference
All endpoints in this section require a JWT unless marked otherwise above. Exact request and response fields are the current application’s contract; use the route names below as the discovery map when building an integration.
Articles and reading state
| Method | Endpoint | Purpose |
|---|---|---|
GET | /api/articles | List and search articles |
GET | /api/articles/briefing | Get articles for the briefing view |
GET | /api/articles/:articleId | Get one article |
GET | /api/articles/duplicates/:articleId | Get duplicate articles |
GET | /api/articles/:articleId/recommendations | Get related recommendations |
POST | /api/articles/details | Get details for a set of articles |
POST | /api/articles/markasread | Mark articles as read |
POST | /api/articles/markallasread | Mark the selected article set as read |
POST | /api/articles/marktounread/:articleId | Mark an article unread |
POST | /api/articles/markasseen/:articleId | Mark an article seen |
POST | /api/articles/markclicked | Record article clicks in bulk |
POST | /api/articles/markclicked/:articleId | Record an article click |
POST | /api/articles/markasfavorite | Change favorite state in bulk |
POST | /api/articles/markasfavorite/:articleId | Change an article’s favorite state |
POST | /api/articles/marknotinterested/:articleId | Record negative interest feedback |
POST | /api/articles/markmorelikethis/:articleId | Record positive interest feedback |
The article list accepts RSSMonster’s search language. See Search for all expressions, including expressions shared with Smart Folders.
Feeds and categories
| Method | Endpoint | Purpose |
|---|---|---|
GET, POST | /api/feeds | List or create feeds |
GET, PUT, DELETE | /api/feeds/:feedId | Read, update, or delete a feed |
POST | /api/feeds/validate | Validate a prospective feed |
POST | /api/feeds/refresh | Start a feed refresh job |
GET | /api/feeds/refresh/:jobId/events | Follow refresh progress using server-sent events |
POST | /api/feeds/recalculate-trust | Recalculate feed trust scores |
GET | /api/feeds/:feedId/observability | Get feed crawl and health diagnostics |
GET | /api/feeds/:feedId/crawls/:crawlResultId | Get one crawl result |
POST | /api/feeds/:feedId/retry | Retry a feed crawl |
POST | /api/feeds/:feedId/rediscover-rss | Rediscover a site’s feed URL |
POST | /api/feeds/mute/:feedId | Change a feed’s muted state |
GET, POST | /api/categories | List or create categories |
GET, PUT, DELETE | /api/categories/:categoryId | Read, update, or delete a category |
Organization, discovery, and insights
| Method | Endpoint | Purpose |
|---|---|---|
GET | /api/tags | List the user’s most-used tags, optionally filtered by status |
GET | /api/smartfolders | List Smart Folders |
POST | /api/smartfolders | Replace the user’s complete Smart Folder list |
GET | /api/smartfolders/counts | Get Smart Folder article counts |
GET | /api/smartfolders/insights | Get Smart Folder insights |
POST | /api/events/articles | Get articles associated with an event |
POST | /api/topics/articles | Get articles associated with a topic |
GET | /api/briefing/preferences | Get briefing preferences |
PUT | /api/briefing/preferences | Update briefing preferences |
Subscription management and maintenance
| Method | Endpoint | Purpose |
|---|---|---|
POST | /api/manager/overview | Get the subscription-management overview |
GET | /api/manager/overview-lite | Get a lightweight management overview |
POST | /api/manager/overview-counts | Get management counts |
POST | /api/manager/updateorder | Update feed or category ordering |
POST | /api/manager/changecategory | Move subscriptions between categories |
GET | /api/crawl | Trigger a crawl |
POST | /api/cleanup | Run authenticated cleanup processing |
GET | /api/opml/export | Export subscriptions as OPML |
POST | /api/opml/import | Import the multipart opmlFile upload |
Although /api/crawl changes server state, its current route uses GET. Maintenance routes can be expensive and should not be polled unnecessarily.
Settings, actions, and administration
| Method | Endpoint | Purpose |
|---|---|---|
GET, POST | /api/setting | Get or update user settings |
GET | /api/setting/crawl-statistics | Get crawl statistics |
GET | /api/setting/islands | Get Interest Island insights |
GET | /api/setting/topics | Get topic insights |
GET, POST | /api/setting/official-sources | Get or update official-source settings |
PATCH | /api/setting/developing-events | Update developing-event settings |
PATCH | /api/setting/theme | Update the theme |
PATCH | /api/setting/startup-view | Update the startup view |
PATCH | /api/setting/mark-as-read-on-scroll | Update scroll reading behavior |
PATCH | /api/setting/prioritize-high-trust | Update high-trust prioritization |
GET | /api/actions | List article-processing rules |
POST | /api/actions | Replace the user’s complete rules list |
GET | /api/users | List users; administrator only |
GET | /api/users/:userId | Get a user; administrator only |
POST | /api/users/:userId | Update a user; administrator only |
DELETE | /api/users/:userId | Delete another user; administrator only |
RSSMonster is multi-user. Controllers scope feeds, articles, settings, and related results to the authenticated user. A valid JWT does not grant access to another user’s data; the user-management routes additionally require an administrator account.
Other API surfaces
RSSMonster also exposes protocol-specific and machine-oriented interfaces:
| Endpoint | Authentication | Documentation |
|---|---|---|
/api/fever | Fever api_key or legacy Fever login cookie | Fever API |
/api/greader/* | GoogleLogin token; mutations also require an action token | Google Reader API |
/api/agent | JWT bearer token | Accepts agent messages or input and returns an assistant response when the provider is configured |
/mcp | JWT bearer token | Model Context Protocol transport for authenticated RSSMonster tools |
/rss | JWT bearer token | Personal RSS output with feed, category, unread, starred, and limit filters |
/api/agent and semantic enrichment depend on the server’s configured AI provider. The /rss and /mcp routes are mounted outside /api, but use the same JWT bearer authentication.
Request conventions and limits
- Send JSON bodies with
Content-Type: application/json, except for protocol endpoints and multipart OPML uploads. - Cross-origin API requests may use
GET,POST,PUT,PATCH, andDELETEwith theContent-TypeandAuthorizationheaders. - The default API limit is 600 requests per 15 minutes. Configure it with
API_RATE_LIMIT_WINDOW_MSandAPI_RATE_LIMIT_MAX; the health endpoint and preflight requests are excluded. MCP has an additional, lower configurable limit. - A rate-limited request returns HTTP
429. - JSON responses intentionally omit
contentOriginal. Integrations should use the normalized article content fields returned by the relevant endpoint. - Serve RSSMonster over HTTPS when credentials or tokens cross a network. A reverse proxy must preserve the
Authorizationheader.
The web client uses these same routes, so its network requests and the corresponding files in server/routes/ are useful references for exact payload shapes not covered on this overview page.