|
|
2 недель назад | |
|---|---|---|
| .. | ||
| README.md | 2 недель назад | |
| handler.go | 2 недель назад | |
| middleware.go | 2 недель назад | |
| response.go | 2 лет назад | |
This document describes the Fever-compatible API implemented by the internal/fever package in this repository.
BASE_URL/fever/GET, write requests should be sent as POST3Fever authentication is enabled per user from the Miniflux integrations page.
Fever Username and Fever Password are configured in Minifluxusername:passwordapi_key parameterExample:
api_key = md5("fever_username:fever_password")
Example shell command:
printf '%s' 'fever_username:fever_password' | md5sum
Authentication failure does not return HTTP 401. The middleware returns HTTP 200 with:
{
"api_version": 3,
"auth": 0
}
On successful authentication, every response includes:
api_version: always 3auth: always 1last_refreshed_on_time: current server Unix timestamp at response timeThe handler selects the first matching operation in this order:
groupsfeedsfaviconsunread_item_idssaved_item_idsitemsmark=itemmark=feedmark=groupIf no selector is provided, the server returns the base authenticated response only.
For read operations, the selector must be present in the query string. For write operations, mark, as, id, and before are read from request form values, so they may come from the query string or a form body.
?groupsReturns:
groups: list of categoriesfeeds_groups: mapping of category IDs to feed IDsResponse shape:
{
"api_version": 3,
"auth": 1,
"last_refreshed_on_time": 1710000000,
"groups": [
{
"id": 1,
"title": "All"
}
],
"feeds_groups": [
{
"group_id": 1,
"feed_ids": "10,11"
}
]
}
Notes:
groups are Miniflux categoriesfeeds_groups.feed_ids is a comma-separated stringgroups but have no feeds_groups entry?feedsReturns:
feeds: list of feedsfeeds_groups: mapping of category IDs to feed IDsFeed fields:
idfavicon_idtitleurlsite_urlis_sparklast_updated_on_timeNotes:
favicon_id is 0 when the feed has no iconis_spark is always 0 in this implementationlast_updated_on_time is the feed check time as a Unix timestamp?faviconsReturns:
favicons: list of favicon objectsFavicon fields:
iddataNotes:
data is a data URL such as image/png;base64,...?unread_item_idsReturns:
unread_item_ids: comma-separated list of unread entry IDsResponse shape:
{
"api_version": 3,
"auth": 1,
"last_refreshed_on_time": 1710000000,
"unread_item_ids": "100,101,102"
}
?saved_item_idsReturns:
saved_item_ids: comma-separated list of starred entry IDs?itemsReturns:
items: list of entriestotal_items: total number of non-removed entries for the userItem fields:
idfeed_idtitleauthorhtmlurlis_savedis_readcreated_on_timeThe implementation always excludes entries whose status is removed.
The handler applies a fixed limit of 50 items.
Supported parameters:
since_id: when greater than 0, returns entries with id > since_id, ordered by id ASCmax_id: when equal to 0, returns the most recent entries ordered by id DESC; when greater than 0, returns entries with id < max_id, ordered by id DESCwith_ids: comma-separated list of entry IDs to fetchSelector precedence inside ?items is:
since_idmax_idwith_idsNotes:
with_ids does not enforce the 50-ID maximum mentioned in older Fever documentationwith_ids members are parsed as 0 and do not match normal entriesitems is requested without since_id, max_id, or with_ids, the code applies no explicit ORDER BY, so result ordering is not guaranteed by SQLhtml is returned after Miniflux content rewriting and may include media-proxy-rewritten URLsExample:
{
"api_version": 3,
"auth": 1,
"last_refreshed_on_time": 1710000000,
"total_items": 245,
"items": [
{
"id": 100,
"feed_id": 10,
"title": "Example entry",
"author": "Author",
"html": "<p>Content</p>",
"url": "https://example.org/post",
"is_saved": 0,
"is_read": 1,
"created_on_time": 1709990000
}
]
}
Normal successful write operations return the base authenticated response:
{
"api_version": 3,
"auth": 1,
"last_refreshed_on_time": 1710000000
}
mark=itemParameters:
mark=itemid=<entry_id>as=read|unread|saved|unsavedBehavior:
as=read: marks the entry as readas=unread: marks the entry as unreadas=saved: toggles the starred flagas=unsaved: toggles the starred flagImportant:
saved and unsaved both call the same toggle operationas=saved twice will save, then unsaveas=unsaved twice will unsave, then saveid <= 0, the handler returns without writing a response bodymark=feedParameters:
mark=feedas=readid=<feed_id>before=<unix_timestamp>Behavior:
published_at < beforeNotes:
id <= 0, the handler returns without writing a response bodybefore is missing or invalid, it is treated as Unix time 0, which usually means nothing is marked as readmark=groupParameters:
mark=groupas=readid=<group_id>before=<unix_timestamp>Behavior:
id=0: marks all unread entries as read, ignoring beforeid>0: marks unread entries in the matching category as read when published_at < beforeNotes:
id < 0, the handler returns without writing a response bodybefore is missing or invalid for id>0, it is treated as Unix time 0, which usually means nothing is marked as readAuthentication failures:
200{"api_version":3,"auth":0}Internal errors:
500body:
{
"error_message": "..."
}
This implementation is Fever-compatible, but it does not match every detail of historical Fever API docs.
api=xml is mentioned in code comments but is not implementedapi_version is 3last_refreshed_on_time is set to the current response time, not the timestamp of the most recently refreshed feedKindling and Sparks super groups are not returnedfeeds[].is_spark is always 0as=saved and as=unsaved toggle the saved flag instead of setting it absolutelyFetch groups:
curl -s 'https://miniflux.example.com/fever/?api_key=TOKEN&groups'
Fetch most recent items:
curl -s 'https://miniflux.example.com/fever/?api_key=TOKEN&items&max_id=0'
Fetch items after a known ID:
curl -s 'https://miniflux.example.com/fever/?api_key=TOKEN&items&since_id=123'
Mark an item as read:
curl -s -X POST 'https://miniflux.example.com/fever/' \
-d 'api_key=TOKEN' \
-d 'mark=item' \
-d 'as=read' \
-d 'id=123'
Mark a feed as read before a timestamp:
curl -s -X POST 'https://miniflux.example.com/fever/' \
-d 'api_key=TOKEN' \
-d 'mark=feed' \
-d 'as=read' \
-d 'id=10' \
-d 'before=1710000000'
Mark all items as read through the group endpoint:
curl -s -X POST 'https://miniflux.example.com/fever/' \
-d 'api_key=TOKEN' \
-d 'mark=group' \
-d 'as=read' \
-d 'id=0'