### Response Example: User Changes Data Source: https://github.com/rss-sync/open-reader-api/blob/master/content/resources/feedsink-api.md This is an example JSON response structure for the 'Retrieve User Changes' endpoint. It outlines the format for 'added', 'deleted', and 'updated' feeds, as well as the status of 'read', 'unread', 'starred', and 'unstarred' entries within specific feeds. ```json { "feeds": { "added": [ { uri: "http://aviflax.com/feed", name: "Avi’s Rad Blog", "tags": ["racing" "friends"] }, { uri: "http://aviflax.com/feed", name: "Avi’s Rad Blog", "tags": ["racing" "friends"] } ], "deleted": [ "http//feed.zombo.com/" ], "updated": [ { uri: "http://aviflax.com/feed", name: "Avi’s Rad Blog", "tags": ["racing" "friends"] }, { uri: "http://aviflax.com/feed", name: "Avi’s Rad Blog", "tags": ["racing" "friends"] } ] }, "feed-entries": { "http://aviflax.com/feed": { "read": [ 'urn:uuid:1225c695-cfb8-4ebb-aaaa-80da344efa6a', 'urn:uuid:1225c695-cfb8-4ebb-aaaa-80da344efa6a' ], "unread": [ 'urn:uuid:1225c695-cfb8-4ebb-aaaa-80da344efa6a', 'urn:uuid:1225c695-cfb8-4ebb-aaaa-80da344efa6a' ], "starred": [ 'urn:uuid:1225c695-cfb8-4ebb-aaaa-80da344efa6a', 'urn:uuid:1225c695-cfb8-4ebb-aaaa-80da344efa6a' ], "unstarred": [ 'urn:uuid:1225c695-cfb8-4ebb-aaaa-80da344efa6a', 'urn:uuid:1225c695-cfb8-4ebb-aaaa-80da344efa6a' ] }, "http://arc90.com/blog/entries?format=atom": { "read": [ 'urn:uuid:1225c695-cfb8-4ebb-aaaa-80da344efa6a', 'urn:uuid:1225c695-cfb8-4ebb-aaaa-80da344efa6a' ], "unread": [ 'urn:uuid:1225c695-cfb8-4ebb-aaaa-80da344efa6a', 'urn:uuid:1225c695-cfb8-4ebb-aaaa-80da344efa6a' ], "starred": [ 'urn:uuid:1225c695-cfb8-4ebb-aaaa-80da344efa6a', 'urn:uuid:1225c695-cfb8-4ebb-aaaa-80da344efa6a' ], "unstarred": [ 'urn:uuid:1225c695-cfb8-4ebb-aaaa-80da344efa6a', 'urn:uuid:1225c695-cfb8-4ebb-aaaa-80da344efa6a' ] } } } ``` -------------------------------- ### Sync User Changes (Python) Source: https://context7.com/rss-sync/open-reader-api/llms.txt Synchronizes client state by fetching all subscription and feed entry changes since a specified timestamp using Python. This function makes a GET request to the API with appropriate headers and processes the returned changes for local updates. ```python import requests from datetime import datetime def sync_changes(user_id, last_sync_time): timestamp = last_sync_time.isoformat() url = f"https://api.example.com/users/{user_id}/changes-since-{timestamp}" headers = { "Accept": "application/json; schema=feedsink.user-changes.v.1.0", "Authorization": f"Bearer {token}" } response = requests.get(url, headers=headers) changes = response.json() # Process added feeds for feed in changes['feeds']['added']: add_feed_locally(feed['uri'], feed['name'], feed['tags']) # Process deleted feeds for feed_uri in changes['feeds']['deleted']: remove_feed_locally(feed_uri) return changes ``` -------------------------------- ### Add Single Feed (Curl) Source: https://context7.com/rss-sync/open-reader-api/llms.txt Example using curl to add a single feed subscription. This demonstrates how to construct the PUT request with appropriate headers and JSON payload. ```curl curl -X PUT "https://api.example.com/users/12345/feeds/http%3A%2F%2Faviflax.com%2Ffeed" -H "Content-Type: application/json; schema=feedsink.feed.v1.0" -H "Authorization: Bearer your_token" -d '{ "uri": "http://aviflax.com/feed", "name": "Avi\'s Silly Blog", "tags": ["favorites", "tech/blogs"] }' ``` -------------------------------- ### Reorganize Feed Tags using REST API (curl) Source: https://context7.com/rss-sync/open-reader-api/llms.txt This example demonstrates how to reorganize feed tags for a specific user's feed using a PUT request to the Open Reader API. It requires the feed's URI, name, and desired tags. Authentication and content type headers are essential for proper request handling. The `If-Unmodified-Since` header is used for conditional requests to prevent conflicts. ```shell curl -X PUT "https://api.example.com/users/12345/feeds/http%3A%2F%2Faviflax.com%2Ffeed" \ -H "Content-Type: application/json; schema=feedsink.feed.v1.0" \ -H "If-Unmodified-Since: Wed, 18 Mar 2013 21:34:22 GMT" \ -H "Authorization: Bearer your_token" \ -d '{ "uri": "http://aviflax.com/feed", "name": "Avi\'s Amazing Blog", "tags": ["favorites", "tech/programming", "daily/must-read"] }' ``` -------------------------------- ### Response Example: Read Entries Data Source: https://github.com/rss-sync/open-reader-api/blob/master/content/resources/feedsink-api.md This JSON structure represents the success response for checking a user's read entries for a specific feed. It contains a single key, 'read_entries', which is an array of unique identifiers for the entries that the user has marked as read. ```json { "read_entries": [ 'urn:uuid:1225c695-cfb8-4ebb-aaaa-80da344efa6a', 'urn:uuid:1225c695-cfb8-4ebb-aaaa-80da344efa6a', 'urn:uuid:1225c695-cfb8-4ebb-aaaa-80da344efa6a' ] } ``` -------------------------------- ### GET /users/{user-id}/changes-since-timestamp Source: https://context7.com/rss-sync/open-reader-api/llms.txt Synchronizes client state by fetching all subscription and feed entry changes since a specified timestamp. This endpoint is crucial for maintaining consistent data across user devices. ```APIDOC ## GET /users/{user-id}/changes-since-timestamp ### Description Synchronizes client state by fetching all subscription and feed entry changes since a specified timestamp. ### Method GET ### Endpoint `/users/{user-id}/changes-since-2013-03-18T21:34:22-04:00` ### Parameters #### Path Parameters - **user-id** (string) - Required - The unique identifier for the user. - **timestamp** (string) - Required - The timestamp in ISO 8601 format (e.g., `2013-03-18T21:34:22-04:00`) to retrieve changes since. #### Query Parameters None #### Request Body None ### Request Example ```http GET /users/12345/changes-since-2013-03-18T21:34:22-04:00 Accept: application/json; schema=feedsink.user-changes.v.1.0 Authorization: Bearer ``` ### Response #### Success Response (200 OK) - **feeds** (object) - Contains changes to feed subscriptions. - **added** (array) - List of newly added feeds. - **deleted** (array) - List of deleted feed URIs. - **updated** (array) - List of updated feeds. - **feed-entries** (object) - Contains changes to feed entry statuses. - **{feed-uri}** (object) - Status changes for entries of a specific feed. - **read** (array) - List of entry IDs marked as read. - **starred** (array) - List of entry IDs marked as starred. #### Response Example ```json { "feeds": { "added": [ { "uri": "http://aviflax.com/feed", "name": "Avi's Rad Blog", "tags": ["racing", "friends"] } ], "deleted": [ "http://feed.zombo.com/" ], "updated": [ { "uri": "http://techblog.com/feed", "name": "Tech Blog Renamed", "tags": ["technology", "news"] } ] }, "feed-entries": { "http://aviflax.com/feed": { "read": [ "urn:uuid:1225c695-cfb8-4ebb-aaaa-80da344efa6a" ], "starred": [ "urn:uuid:9876c695-cfb8-4ebb-bbbb-80da344efa6b" ] } } } ``` ``` -------------------------------- ### Retrieve User Changes Since a Specific Date (GET) Source: https://github.com/rss-sync/open-reader-api/blob/master/content/resources/feedsink-api.md Clients can retrieve all changes a user has made to their feeds since a specified date and time. This involves sending a GET request to a user-specific endpoint with the timestamp in the URL and an appropriate Accept header. The response will be a JSON object detailing added, deleted, and updated feeds, along with changes to feed entries. ```HTTP GET /users/{user-id}/changes-since-2013-03-18T21:34:22-04:00 HTTP/1.1 Accept: application/json; schema=feedsink.user-changes.v.1.0 ``` -------------------------------- ### GET /users/{user-id}/feeds Source: https://context7.com/rss-sync/open-reader-api/llms.txt Retrieves a complete list of user feeds with metadata and recent read entries, useful for initial synchronization. ```APIDOC ## GET /users/{user-id}/feeds ### Description Retrieves complete feed list with metadata and recent read entries for efficient initial sync. ### Method GET ### Endpoint /users/{user-id}/feeds #### Path Parameters - **user-id** (string) - Required - The unique identifier for the user. #### Request Headers - **Accept**: application/json; schema=feedsink.feed-list.v1.0 - **Authorization**: Bearer ### Response #### Success Response (200 OK) - **feeds** (array) - A list of feed objects. - **uri** (string) - The URL of the feed. - **name** (string) - The name of the feed. - **tags** (array of strings) - Hierarchical tags associated with the feed. - **read_entries** (array of strings) - A list of URNs for recently read entries. #### Response Example ```json { "feeds": [ { "uri": "http://aviflax.com/feed", "name": "Avi's Silly Blog", "tags": ["favorites"], "read_entries": [ "urn:uuid:1225c695-cfb8-4ebb-aaaa-80da344efa6a", "urn:uuid:2335c695-cfb8-4ebb-aaaa-80da344efa6b" ] } ] } ``` ``` -------------------------------- ### Check Read Entries for a Feed (GET) Source: https://github.com/rss-sync/open-reader-api/blob/master/content/resources/feedsink-api.md This endpoint allows clients to check which entries within a specific feed a user has already read. A GET request is made to the user's feeds with the feed URI, expecting a JSON response containing a list of read entry identifiers. This prevents showing users entries they have already consumed. ```HTTP GET /users/{user-id}/feeds/{uri}/entries/read HTTP/1.1 Accept: application/json; schema=feedsink.read-entries.v1.0 ``` -------------------------------- ### GET /users/{user-id}/changes-since-{date-time} Source: https://github.com/rss-sync/open-reader-api/blob/master/content/resources/feedsink-api.md Retrieves all changes a user has made to their feeds and entries since a specified date-time. This is useful for clients to sync their state with the server. ```APIDOC ## GET /users/{user-id}/changes-since-{date-time} ### Description Retrieves all changes a user has made to their feeds and entries since a specified date-time. This is useful for clients to sync their state with the server. ### Method GET ### Endpoint `/users/{user-id}/changes-since-{date-time}` ### Parameters #### Path Parameters - **user-id** (string) - Required - The unique identifier for the user. - **date-time** (string) - Required - The timestamp to retrieve changes since. Format: YYYY-MM-DDTHH:mm:ss-HH:mm #### Request Body None ### Request Example None ### Response #### Success Response (200) - **feeds** (object) - Contains changes related to user's feeds. - **added** (array) - List of feeds added. - **deleted** (array) - List of feed URIs deleted. - **updated** (array) - List of feeds updated. - **feed-entries** (object) - Contains changes related to feed entries. - Key is feed URI (string). - Value is an object with entry status changes: `read`, `unread`, `starred`, `unstarred` (arrays of entry URNs). #### Response Example ```json { "feeds": { "added": [ { "uri": "http://aviflax.com/feed", "name": "Avi’s Rad Blog", "tags": ["racing" "friends"] } ], "deleted": [ "http//feed.zombo.com/" ], "updated": [ { "uri": "http://aviflax.com/feed", "name": "Avi’s Rad Blog", "tags": ["racing" "friends"] } ] }, "feed-entries": { "http://aviflax.com/feed": { "read": [ 'urn:uuid:1225c695-cfb8-4ebb-aaaa-80da344efa6a' ], "unread": [ 'urn:uuid:1225c695-cfb8-4ebb-aaaa-80da344efa6a' ], "starred": [ 'urn:uuid:1225c695-cfb8-4ebb-aaaa-80da344efa6a' ], "unstarred": [ 'urn:uuid:1225c695-cfb8-4ebb-aaaa-80da344efa6a' ] } } } ``` ``` -------------------------------- ### GET /users/{user-id}/feeds/{feed-url}/entries/read Source: https://context7.com/rss-sync/open-reader-api/llms.txt Retrieves the list of entry IDs that have been marked as read for a specific feed. This is useful for filtering out already-read content. ```APIDOC ## GET /users/{user-id}/feeds/{feed-url}/entries/read ### Description Retrieves the list of entry IDs that have been marked as read for a specific feed. ### Method GET ### Endpoint `/users/{user-id}/feeds/{feed-url}/entries/read` ### Parameters #### Path Parameters - **user-id** (string) - Required - The unique identifier for the user. - **feed-url** (string) - Required - The URL of the feed, properly URL-encoded. #### Query Parameters None #### Request Body None ### Request Example ```http GET /users/12345/feeds/http%3A%2F%2Fexample.com%2Ffeed.xml/entries/read Accept: application/json; schema=feedsink.read-entries.v1.0 Authorization: Bearer ``` ### Response #### Success Response (200 OK) - **read_entries** (array) - A list of entry IDs (strings) that have been marked as read for the specified feed. #### Response Example ```json { "read_entries": [ "urn:uuid:1225c695-cfb8-4ebb-aaaa-80da344efa6a", "urn:uuid:2335c695-cfb8-4ebb-aaaa-80da344efa6b", "urn:uuid:3445c695-cfb8-4ebb-aaaa-80da344efa6c" ] } ``` ``` -------------------------------- ### Check Subscription Status Source: https://context7.com/rss-sync/open-reader-api/llms.txt Checks if a user is subscribed to a given feed URL. This function makes a GET request to the API and returns a boolean indicating subscription status. It requires the feed URL as input and uses a user token for authentication. ```javascript async function checkSubscription(feedUrl) { const response = await fetch( `https://api.example.com/subscribed?s=${encodeURIComponent(feedUrl)}`, { headers: { 'Authorization': 'Bearer ' + userToken } } ); const isSubscribed = await response.json(); return isSubscribed; } const subscribed = await checkSubscription('feed/http://example.com/feed.xml'); console.log('Already subscribed:', subscribed); ``` -------------------------------- ### Get Read Entries for Feed Source: https://context7.com/rss-sync/open-reader-api/llms.txt Retrieves the list of entry IDs that have been marked as read for a specific feed. This API endpoint requires a user ID and a feed URL. It returns a JSON object containing an array of read entry IDs. ```http GET /users/{user-id}/feeds/http%3A%2F%2Fexample.com%2Ffeed.xml/entries/read Accept: application/json; schema=feedsink.read-entries.v1.0 Authorization: Bearer Response (200 OK): Content-Type: application/json; schema=feedsink.read-entries.v1.0 { "read_entries": [ "urn:uuid:1225c695-cfb8-4ebb-aaaa-80da344efa6a", "urn:uuid:2335c695-cfb8-4ebb-aaaa-80da344efa6b", "urn:uuid:3445c695-cfb8-4ebb-aaaa-80da344efa6c" ] } ``` -------------------------------- ### GET /users/{user-id}/feeds - Retrieve User's Feeds Source: https://github.com/rss-sync/open-reader-api/blob/master/content/resources/feedsink-api.md Retrieves a list of all feeds subscribed to by a user. Each feed object includes a list of the N most recent read entries, which can be used for client-side filtering without requiring additional requests. ```APIDOC ## GET /users/{user-id}/feeds ### Description Retrieves a list of all feeds subscribed to by a user. Each feed includes a list of the N most recent read entries to facilitate client-side filtering. ### Method GET ### Endpoint `/users/{user-id}/feeds` ### Parameters #### Path Parameters - **user-id** (string) - Required - The unique identifier for the user. #### Headers - **Accept** (string) - Required - Must be `application/json; schema=feedsink.feed-list.v1.0` ### Request Example (No request body for GET requests) ### Response #### Success Response (200) - **Content-Type**: `application/json; schema=feedsink.feed-list.v1.0` - **feeds** (array) - A list of feed objects. - **uri** (string) - The URI of the feed. - **name** (string) - The name of the feed. - **tags** (array of strings) - A list of tags associated with the feed. - **read_entries** (array of strings) - A list of URIs for the N most recent read entries. #### Response Example ```json { "feeds": [ { "uri": "http://aviflax.com/feed", "name": "Avi’s Silly Blog", "tags": ["favorites"], "read_entries": [ 'urn:uuid:1225c695-cfb8-4ebb-aaaa-80da344efa6a', 'urn:uuid:1225c695-cfb8-4ebb-aaaa-80da344efa6a', 'urn:uuid:1225c695-cfb8-4ebb-aaaa-80da344efa6a' ] } ] } ``` #### Error Responses TBD ``` -------------------------------- ### Quick Add Subscription Source: https://github.com/rss-sync/open-reader-api/blob/master/content/subscription.md Provides a simplified way to subscribe to a feed without specifying a title or tags. Requires authentication and a feed ID. ```APIDOC ## POST /subscription/quickadd ### Description Allows for the quick subscription of a feed where no title or tags are specified. This endpoint requires authentication and a feed ID. ### Method POST ### Endpoint /subscription/quickadd ### Parameters #### Query Parameters - **ck** (timestamp) - Required - Current timestamp to prevent caching issues. - **client** (string) - Required - Application name that identifies the client used. #### Request Body - **quickadd** (string) - Required - The feed stream ID to be subscribed to. - **T** (string) - Required - Authentication token. ### Response #### Success Response (200) - **OK** (string) - Indicates the subscription was successfully added. ``` -------------------------------- ### Quick Add Subscription API Endpoint Source: https://github.com/rss-sync/open-reader-api/blob/master/content/subscription.md Enables rapid subscription to a feed without specifying a title or tags. Requires a timestamp, client identifier, the stream ID of the feed, and an authentication token. ```http POST /subscription/quickadd # Request Parameters: # ck: timestamp # client: application name # Post Parameters: # quickadd: stream id # T: token # Response: OK ``` -------------------------------- ### Bulk Import Feeds from OPML (Node.js) Source: https://context7.com/rss-sync/open-reader-api/llms.txt Demonstrates how to import feeds from an OPML file using Node.js. It parses the OPML XML, extracts feed URLs and names, and then sends them to the API's bulk import endpoint. Requires 'fs' and 'xml2js' modules. ```javascript const fs = require('fs'); const xml2js = require('xml2js'); async function importFromOPML(userId, opmlFile) { const opmlContent = fs.readFileSync(opmlFile, 'utf8'); const parser = new xml2js.Parser(); const result = await parser.parseStringPromise(opmlContent); const feeds = []; const outlines = result.opml.body[0].outline; function extractFeeds(outline, tags = []) { if (outline.$.xmlUrl) { feeds.push({ uri: outline.$.xmlUrl, name: outline.$.title || outline.$.text, tags: tags }); } if (outline.outline) { const newTags = outline.$.title ? [...tags, outline.$.title] : tags; outline.outline.forEach(child => extractFeeds(child, newTags)); } } outlines.forEach(outline => extractFeeds(outline)); const response = await fetch( `https://api.example.com/users/${userId}/feeds`, { method: 'POST', headers: { 'Content-Type': 'application/json; schema=feedsink.feed-list.v1.0', 'Authorization': `Bearer ${token}` }, body: JSON.stringify({ feeds }) } ); return response.ok; } ``` -------------------------------- ### Export Subscriptions Source: https://github.com/rss-sync/open-reader-api/blob/master/content/subscription.md Exports all subscriptions for the authenticated user in OPML format. ```APIDOC ## GET /subscriptions/export ### Description Exports all subscriptions for the authenticated user in OPML file format. ### Method GET ### Endpoint /subscriptions/export ### Response #### Success Response (200) - **OPML file** - Contains all subscriptions belonging to the authenticated user. ``` -------------------------------- ### GET /users/{user-id}/feeds/{uri}/entries/read Source: https://github.com/rss-sync/open-reader-api/blob/master/content/resources/feedsink-api.md Checks which entries within a specific feed have been marked as read by the user. This helps in preventing the display of already-read entries. ```APIDOC ## GET /users/{user-id}/feeds/{uri}/entries/read ### Description Checks which entries within a specific feed have been marked as read by the user. This helps in preventing the display of already-read entries. ### Method GET ### Endpoint `/users/{user-id}/feeds/{uri}/entries/read` ### Parameters #### Path Parameters - **user-id** (string) - Required - The unique identifier for the user. - **uri** (string) - Required - The URI of the feed to check entries for. #### Request Body None ### Request Example None ### Response #### Success Response (200) - **read_entries** (array) - A list of URNs for entries that have been read. #### Response Example ```json { "read_entries": [ 'urn:uuid:1225c695-cfb8-4ebb-aaaa-80da344efa6a', 'urn:uuid:1225c695-cfb8-4ebb-aaaa-80da344efa6a' ] } ``` ``` -------------------------------- ### Export Subscriptions API Endpoint Source: https://github.com/rss-sync/open-reader-api/blob/master/content/subscription.md Exports all user subscriptions in OPML format. This endpoint requires authentication and returns an OPML file containing the subscription data. ```http GET /subscriptions/export # Response: OPML file of all subscriptions. ``` -------------------------------- ### Google Analytics Tracking Initialization Source: https://github.com/rss-sync/open-reader-api/blob/master/layouts/default.html This JavaScript code snippet initializes Google Analytics tracking for the website. It ensures that page views are recorded and sent to Google Analytics. It requires the Google Analytics JavaScript library to be loaded. ```javascript (function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){ (i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o), m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m) })(window,document,'script','//www.google-analytics.com/analytics.js','ga'); ga('create', 'UA-2824474-8', 'rss-sync.github.io'); ga('send', 'pageview'); ``` -------------------------------- ### List Subscriptions Source: https://github.com/rss-sync/open-reader-api/blob/master/content/subscription.md Retrieves a list of all subscriptions for the authenticated user. Includes parameters for preventing caching and identifying the client. ```APIDOC ## GET /subscription/list ### Description Retrieves a list of all subscriptions for the authenticated user. This endpoint requires authentication and accepts query parameters for timestamp and client identification. ### Method GET ### Endpoint /subscription/list ### Parameters #### Query Parameters - **ck** (timestamp) - Required - Current timestamp to prevent caching issues. - **client** (string) - Required - Application name that identifies the client used. ### Response #### Success Response (200) - **subscriptions** (array) - An array of subscription objects, each containing: - **id** (string) - The unique identifier for the subscription. - **title** (string) - The title of the subscription. - **categories** (array) - An array of categories associated with the subscription. - **sortid** (string) - A sorting identifier for the subscription. - **firstitemmsec** (string) - The timestamp of the first item in milliseconds. ### Response Example ```json { "subscriptions": [ { "id": "feed/http://feeds.feedburner.com/MyMicro-isv", "title": "47 Hats", "categories": [], "sortid": "FB039968", "firstitemmsec": "1252975023032" } ] } ``` ``` -------------------------------- ### Quick Add Subscription - HTTP API Source: https://context7.com/rss-sync/open-reader-api/llms.txt Rapidly subscribes to a feed without specifying additional metadata, suitable for one-click subscription actions. Requires the feed URL and an authentication token. ```http POST /subscription/quickadd?ck=1234567890&client=MyRSSReader Content-Type: application/x-www-form-urlencoded Authorization: Bearer Body: quickadd=feed/http://newblog.example.com/rss& T=authentication_token Response (200 OK): OK # Usage in curl curl -X POST "https://api.example.com/subscription/quickadd?ck=1234567890&client=curl" \ -H "Authorization: Bearer your_token_here" \ -d "quickadd=feed/http://techblog.example.com/feed.xml" \ -d "T=your_auth_token" ``` -------------------------------- ### List Subscriptions API Endpoint Source: https://github.com/rss-sync/open-reader-api/blob/master/content/subscription.md Retrieves a list of all subscriptions for the authenticated user. Requires a timestamp for caching prevention and a client identifier. Returns a JSON object containing an array of subscription details. ```http GET /subscription/list # Request Parameters: # ck: timestamp # client: application name # Response Example: { "subscriptions": [ { "id": "feed/http://feeds.feedburner.com/MyMicro-isv", "title": "47 Hats", "categories": [], "sortid": "FB039968", "firstitemmsec": "1252975023032" } ] } ``` -------------------------------- ### Quick Add Subscription Source: https://context7.com/rss-sync/open-reader-api/llms.txt Rapidly subscribes to a feed without specifying title or tags, ideal for one-click subscription workflows. ```APIDOC ## POST /subscription/quickadd ### Description Quickly subscribes to a feed without additional metadata. ### Method POST ### Endpoint /subscription/quickadd ### Parameters #### Query Parameters - **ck** (string) - Required - A client-specific identifier. - **client** (string) - Required - The name of the client application. #### Headers - **Content-Type** (string) - Required - `application/x-www-form-urlencoded` - **Authorization** (string) - Required - Bearer token for authentication. #### Request Body (Form Data) - **quickadd** (string) - Required - The feed URL to subscribe to. - **T** (string) - Required - Authentication token. ### Request Example ``` quickadd=feed/http://newblog.example.com/rss& T=authentication_token ``` ### Response #### Success Response (200) - **Body**: `OK` ### Response Example ``` OK ``` ``` -------------------------------- ### Bulk Import Feeds (HTTP) Source: https://context7.com/rss-sync/open-reader-api/llms.txt Imports multiple feed subscriptions simultaneously for a user. This endpoint is ideal for migrating subscriptions from sources like OPML files. The request body contains a JSON array of feed objects, each with a URI, name, and tags. ```http POST /users/{user-id}/feeds Content-Type: application/json; schema=feedsink.feed-list.v1.0 Authorization: Bearer { "feeds": [ { "uri": "http://aviflax.com/feed", "name": "Avi's Silly Blog", "tags": ["favorites"] }, { "uri": "http://arc90.com/feed", "name": "Arc90 Blog", "tags": ["river", "arc"] }, { "uri": "http://techcrunch.com/feed", "name": "TechCrunch", "tags": ["news", "tech/news"] } ] } Response (202 Accepted) ``` -------------------------------- ### POST /users/{user-id}/feeds Source: https://context7.com/rss-sync/open-reader-api/llms.txt Imports multiple feeds at once, commonly used for OPML imports or service migrations. ```APIDOC ## POST /users/{user-id}/feeds ### Description Imports multiple feeds at once, typically used for OPML import or service migration. ### Method POST ### Endpoint /users/{user-id}/feeds #### Path Parameters - **user-id** (string) - Required - The unique identifier for the user. #### Request Headers - **Content-Type**: application/json; schema=feedsink.feed-list.v1.0 - **Authorization**: Bearer #### Request Body - **feeds** (array) - Required - A list of feed objects to import. - **uri** (string) - Required - The URL of the feed. - **name** (string) - Optional - The name to assign to the feed. - **tags** (array of strings) - Optional - Hierarchical tags for the feed. ### Request Example ```json { "feeds": [ { "uri": "http://aviflax.com/feed", "name": "Avi's Silly Blog", "tags": ["favorites"] }, { "uri": "http://arc90.com/feed", "name": "Arc90 Blog", "tags": ["river", "arc"] } ] } ``` ### Response #### Success Response (202 Accepted) Indicates the import request has been accepted for processing. The actual import may happen asynchronously. #### Response Example (No specific response body provided for success, typically an empty body or a confirmation status.) #### Example using Node.js for OPML import: ```javascript const fs = require('fs'); const xml2js = require('xml2js'); async function importFromOPML(userId, opmlFile, token) { const opmlContent = fs.readFileSync(opmlFile, 'utf8'); const parser = new xml2js.Parser(); const result = await parser.parseStringPromise(opmlContent); const feeds = []; const outlines = result.opml.body[0].outline; function extractFeeds(outline, tags = []) { if (outline.$.xmlUrl) { feeds.push({ uri: outline.$.xmlUrl, name: outline.$.title || outline.$.text, tags: tags }); } if (outline.outline) { const newTags = outline.$.title ? [...tags, outline.$.title] : tags; outline.outline.forEach(child => extractFeeds(child, newTags)); } } outlines.forEach(outline => extractFeeds(outline)); const response = await fetch( `https://api.example.com/users/${userId}/feeds`, { method: 'POST', headers: { 'Content-Type': 'application/json; schema=feedsink.feed-list.v1.0', 'Authorization': `Bearer ${token}` }, body: JSON.stringify({ feeds }) } ); return response.ok; } ``` ``` -------------------------------- ### Export Subscriptions Source: https://context7.com/rss-sync/open-reader-api/llms.txt Exports all user subscriptions as an OPML file for backup or migration to another service. ```APIDOC ## GET /subscriptions/export ### Description Exports all user subscriptions in OPML format. ### Method GET ### Endpoint /subscriptions/export ### Parameters #### Headers - **Authorization** (string) - Required - Bearer token for authentication. - **Accept** (string) - Required - `application/xml` ### Response #### Success Response (200) - **Body**: OPML XML content representing the subscriptions. ### Response Example ```xml Subscriptions Export ``` ``` -------------------------------- ### POST /users/{user-id}/feeds Source: https://github.com/rss-sync/open-reader-api/blob/master/content/resources/feedsink-api.md Adds multiple feeds to a user's list. This endpoint is recommended for bulk import use cases where a user is adding a significant number of feeds at once. ```APIDOC ## POST /users/{user-id}/feeds ### Description Adds multiple feeds to a user's list. This endpoint is intended for the "import" use-case wherein a user is adopting the API for the first time, and wishes to import their feed list from another application or service. Clients are recommended to use this method only when they have a significant number of feeds to add at once. ### Method POST ### Endpoint `/users/{user-id}/feeds` ### Parameters #### Path Parameters - **user-id** (string) - Required - The unique identifier for the user. #### Query Parameters None #### Request Body - **feeds** (array of objects) - Required - A list of feeds to add. - **uri** (string) - Required - The URI of the feed. - **name** (string) - Optional - The name of the feed. - **tags** (array of strings) - Optional - A list of tags associated with the feed. ### Request Example ```json { "feeds": [ { "uri": "http://aviflax.com/feed", "name": "Avi’s Silly Blog", "tags": ["favorites"] }, { "uri": "http://arc90.com/feed", "name": "Arc90 Blog", "tags": ["river", "arc"] } ] } ``` ### Response #### Success Response (200, 202, or 204) - No entity will be returned. #### Response Example None ``` -------------------------------- ### List All User Feeds (HTTP) Source: https://context7.com/rss-sync/open-reader-api/llms.txt Retrieves a complete list of user-subscribed feeds, including their metadata and recent read entries. This is useful for initial synchronization and displaying feed status. The response includes feed URI, name, tags, and a list of URNs for read entries. ```http GET /users/{user-id}/feeds Accept: application/json; schema=feedsink.feed-list.v1.0 Authorization: Bearer Response (200 OK): Content-Type: application/json; schema=feedsink.feed-list.v1.0 { "feeds": [ { "uri": "http://aviflax.com/feed", "name": "Avi's Silly Blog", "tags": ["favorites"], "read_entries": [ "urn:uuid:1225c695-cfb8-4ebb-aaaa-80da344efa6a", "urn:uuid:2335c695-cfb8-4ebb-aaaa-80da344efa6b" ] }, { "uri": "http://arc90.com/feed", "name": "Arc90 Blog", "tags": ["river", "arc"], "read_entries": [ "urn:uuid:3445c695-cfb8-4ebb-aaaa-80da344efa6c" ] } ] } ``` -------------------------------- ### Retrieve User Changes Since Timestamp Source: https://context7.com/rss-sync/open-reader-api/llms.txt Synchronizes client state by fetching all subscription and feed entry changes since a specified timestamp. This API endpoint requires a user ID and a timestamp, and returns changes related to added, deleted, and updated feeds, as well as changes to feed entries. ```http GET /users/{user-id}/changes-since-2013-03-18T21:34:22-04:00 Accept: application/json; schema=feedsink.user-changes.v.1.0 Authorization: Bearer Response (200 OK): Content-Type: application/json; schema=feedsink.user-changes.v1.0 { "feeds": { "added": [ { "uri": "http://aviflax.com/feed", "name": "Avi's Rad Blog", "tags": ["racing", "friends"] } ], "deleted": [ "http://feed.zombo.com/" ], "updated": [ { "uri": "http://techblog.com/feed", "name": "Tech Blog Renamed", "tags": ["technology", "news"] } ] }, "feed-entries": { "http://aviflax.com/feed": { "read": [ "urn:uuid:1225c695-cfb8-4ebb-aaaa-80da344efa6a" ], "starred": [ "urn:uuid:9876c695-cfb8-4ebb-bbbb-80da344efa6b" ] } } } ``` -------------------------------- ### Export Subscriptions - HTTP API Source: https://context7.com/rss-sync/open-reader-api/llms.txt Exports all user subscriptions in OPML format, useful for backups or migrations. Requires an authentication token and specifies XML as the accepted content type. ```http GET /subscriptions/export Authorization: Bearer Accept: application/xml Response (200 OK): Subscriptions Export # Download with curl curl -H "Authorization: Bearer your_token" \ https://api.example.com/subscriptions/export \ -o my_subscriptions.opml ``` -------------------------------- ### PUT /users/{user-id}/feeds/{feed-uri} Source: https://context7.com/rss-sync/open-reader-api/llms.txt Adds a new feed subscription for a user. If the feed already exists, its metadata (name, tags) is updated. ```APIDOC ## PUT /users/{user-id}/feeds/{feed-uri} ### Description Adds a new feed subscription with optional name and hierarchical tags. If the feed exists, its metadata is updated. ### Method PUT ### Endpoint /users/{user-id}/feeds/{feed-uri} #### Path Parameters - **user-id** (string) - Required - The unique identifier for the user. - **feed-uri** (string) - Required - The URI of the feed, URL-encoded. #### Request Headers - **Content-Type**: application/json; schema=feedsink.feed.v1.0 - **Authorization**: Bearer #### Request Body - **uri** (string) - Required - The URL of the feed. - **name** (string) - Optional - The name to assign to the feed. - **tags** (array of strings) - Optional - Hierarchical tags for the feed. ### Request Example ```json { "uri": "http://aviflax.com/feed", "name": "Avi's Silly Blog", "tags": ["favorites", "tech/blogs", "daily"] } ``` ### Response #### Success Response (201 Created) Indicates the feed was successfully added or updated. #### Response Example (No specific response body provided for success, typically an empty body or a confirmation status.) #### Example using curl: ```bash curl -X PUT "https://api.example.com/users/12345/feeds/http%3A%2F%2Faviflax.com%2Ffeed" \ -H "Content-Type: application/json; schema=feedsink.feed.v1.0" \ -H "Authorization: Bearer your_token" \ -d '{ "uri": "http://aviflax.com/feed", "name": "Avi\'s Silly Blog", "tags": ["favorites", "tech/blogs"] }' ``` ``` -------------------------------- ### List User Subscriptions Source: https://context7.com/rss-sync/open-reader-api/llms.txt Retrieves all RSS feed subscriptions for the authenticated user, including feed metadata, categories, and sorting information. ```APIDOC ## GET /subscription/list ### Description Retrieves all RSS feed subscriptions for the authenticated user. ### Method GET ### Endpoint /subscription/list ### Parameters #### Query Parameters - **ck** (string) - Required - A client-specific identifier. - **client** (string) - Required - The name of the client application. #### Headers - **Authorization** (string) - Required - Bearer token for authentication. - **Accept** (string) - Required - `application/json` ### Response #### Success Response (200) - **subscriptions** (array) - A list of subscription objects. - **id** (string) - The unique identifier for the subscription. - **title** (string) - The title of the feed. - **categories** (array) - A list of categories the subscription belongs to. - **sortid** (string) - Sorting identifier. - **firstitemmsec** (string) - Timestamp of the first item in milliseconds. ### Response Example ```json { "subscriptions": [ { "id": "feed/http://feeds.feedburner.com/MyMicro-isv", "title": "47 Hats", "categories": [], "sortid": "FB039968", "firstitemmsec": "1252975023032" }, { "id": "feed/http://blog.example.com/feeds/posts/default", "title": "Example Blog", "categories": [ {"id": "user/-/label/Technology", "label": "Technology"} ], "sortid": "0B6626E4", "firstitemmsec": "1280455399985" } ] } ``` ``` -------------------------------- ### Edit Subscription API Endpoint Source: https://github.com/rss-sync/open-reader-api/blob/master/content/subscription.md Modifies an existing subscription. Allows subscribing, unsubscribing, editing feed titles, and managing tags. Requires a timestamp, client identifier, stream ID, authentication token, and an action parameter. ```http POST /subscription/edit # Request Parameters: # ck: timestamp # client: application name # Post Parameters: # s: stream id # T: token # ac: Action (subscribe, unsubscribe, edit) # a: tag (add tag) # r: tag (remove tag) # t: feed title # Response: OK ```