FeedNest Saved API

Saved/bookmarked articles

GitHub OpenAPI

Operations 2

GET /api/v1/saved List saved articles #
POST /api/v1/saved/url Save an article by URL #

Work with this as data

Every API here is available over the APIs.io API and to AI agents over MCP.

MCP server

One button, every client — Claude, Cursor, VS Code and the rest.

https://apis.io/mcp

Tools for apis

7 MCP tools reach this
  • find_apisBrowse and filter every API in the catalog.
  • get_api_artifactsOne API's artifacts, grouped by type.
  • get_openapiThe primary OpenAPI for this API.
  • find_similar_apisAPIs that look like this one.
  • apis_io_searchSTART HERE — APIs, providers and tags for one query, each with its total.
  • resolveTurn a domain, URL or GitHub org into the provider it belongs to.
  • find_cohortsEvery scored population of providers in the catalog.
All 92 tools →

Call it yourself

curl for this page
This API
curl "https://apis.io/api/v1/apis/feednest-com:feednest-com-saved-api"
All apis
curl "https://apis.io/api/v1/apis?limit=25"

Calls without X-API-Key need no key. Calls with it need a paid plan — get a key.

Get an API key

Free tier, no form to fill in. Signing in shares your email address with us — we store it to create your key and to recognise you if you sign in with another provider. See our Privacy Policy and Terms.

A second provider on the same verified email joins the account you already have.

OpenAPI Specification

feednest-com-saved-api-openapi.yml Raw ↑
openapi: 3.2.0
info:
  title: FeedNest Public Saved API
  version: 1.0.0
  description: 'The FeedNest Public API gives AI agents, automation platforms, and custom integrations programmatic access to your feeds, articles, highlights, notes, tags, and reading stats.


    ## Base URL


    ```

    https://feednest.com/api/v1

    ```


    ## Authentication


    All endpoints require a **Bearer token** (API key) in the `Authorization` header. Generate keys in **Settings → Developer API** (requires a Pro subscription).


    ```

    Authorization: Bearer fn_live_XXXX

    ```


    Keys use the format `fn_live_` followed by 32 hex characters. Each key is scoped to specific permissions:


    | Scope | Description |

    |-------|-------------|

    | `read` | Read feeds, articles, folders, tags, stats, highlights, notes, saved items |

    | `write` | Mark as read/unread, save/unsave, tag, highlight, add notes, extract content |

    | `ai` | Text-to-speech audio generation |


    ## Rate Limits


    | Endpoint group | Limit |

    |----------------|-------|

    | Default | 1,000 requests/hour per key |

    | AI endpoints | 50 requests/hour |

    | Save URL | 100 requests/hour |


    Rate-limited responses return `429` with `Retry-After` and `X-RateLimit-*` headers.


    ## Pagination


    All list endpoints use **keyset pagination**. Pass `limit` (max 100) and use the last item''s cursor fields (`before_published_at` + `before_id`) to fetch the next page. Check `meta.has_more` to know if more results exist.


    ## Error Format


    ```json

    {

    "error": {

    "code": "ERROR_CODE",

    "message": "Human-readable description."

    }

    }

    ```


    ## Versioning and deprecation


    The API is versioned in the URL path. `/api/v1` is the current stable version, and no breaking change will ever be made inside a version.


    Backwards-compatible additions (a new endpoint, a new optional field, a new optional parameter) ship inside `v1` without notice, so clients must ignore unknown response fields rather than failing on them.


    A breaking change means a new version path, for example `/api/v2`. When that happens:


    | Signal | Meaning |

    |--------|---------|

    | `Deprecation` response header | RFC 9745. Carries the date the version was declared deprecated. |

    | `Sunset` response header | RFC 8594. Carries the date the version stops responding. |

    | `Link` header, `rel="successor-version"` | Points at the replacement endpoint. |


    A deprecated version keeps working for **at least 12 months** after the `Deprecation` date. Deprecations are announced on the changelog, which every API response links via the `X-API-Changelog` header.


    ## Looking for AI assistant integration?


    FeedNest also exposes an **MCP server** at `mcp.feednest.com` for connecting to Claude, ChatGPT, Cursor, and other AI assistants. See the MCP documentation.'
  contact:
    url: https://feednest.com
  license:
    name: Proprietary
  x-mcp-server:
    url: https://mcp.feednest.com
    docs: https://docs.feednest.com
  x-protected-resource-metadata: https://www.feednest.com/.well-known/oauth-protected-resource
  x-versioning:
    strategy: uri-path
    current: v1
    status: stable
    breaking_changes: new-version-path
    deprecation_headers:
    - Deprecation
    - Sunset
    - Link
    minimum_sunset_period_days: 365
    changelog: https://feednest.com/changelog
servers:
- url: https://feednest.com
  description: Production
security:
- BearerAuth: []
tags:
- name: Saved
  description: Saved/bookmarked articles
paths:
  /api/v1/saved:
    get:
      operationId: listSaved
      tags:
      - Saved
      summary: List saved articles
      description: Returns the user's saved articles, most recently saved first, including items saved from the web rather than from a subscribed feed. Requires the `read` scope.
      parameters:
      - $ref: '#/components/parameters/limit'
      - $ref: '#/components/parameters/before_published_at'
      - $ref: '#/components/parameters/before_id'
      - $ref: '#/components/parameters/q'
      - $ref: '#/components/parameters/date_from'
      - $ref: '#/components/parameters/date_to'
      - $ref: '#/components/parameters/sort'
      responses:
        '200':
          description: Paginated saved articles
          content:
            application/json:
              schema:
                type: object
                properties:
                  data:
                    type: array
                    items:
                      $ref: '#/components/schemas/SavedArticleV1'
                  meta:
                    type: object
                    properties:
                      has_more:
                        type: boolean
                    required:
                    - has_more
                required:
                - data
                - meta
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
        '429':
          $ref: '#/components/responses/RateLimited'
  /api/v1/saved/url:
    post:
      operationId: saveUrl
      tags:
      - Saved
      summary: Save an article by URL
      description: Saves any web URL to the user's saved list, fetching and parsing the page so it reads like a feed article. Creates the article when FeedNest has not seen the URL before, otherwise reuses it. Rate limited to 100 requests per hour. Requires the `write` scope.
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                url:
                  type: string
                  format: uri
                  maxLength: 2048
              required:
              - url
      responses:
        '201':
          description: URL saved
          content:
            application/json:
              schema:
                type: object
                properties:
                  data:
                    type: object
                    properties:
                      id:
                        type: string
                        format: uuid
                      article_id:
                        type: string
                        format: uuid
                      url:
                        type: string
                        format: uri
                      title:
                        type:
                        - string
                        - 'null'
                    required:
                    - id
                    - article_id
                    - url
                    - title
                required:
                - data
        '400':
          $ref: '#/components/responses/ValidationError'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
        '429':
          $ref: '#/components/responses/RateLimited'
components:
  headers:
    Retry-After:
      schema:
        type: integer
      description: Seconds to wait before retrying (on 429 responses)
    X-RateLimit-Remaining:
      schema:
        type: integer
      description: Remaining requests in current window
    X-RateLimit-Limit:
      schema:
        type: integer
      description: Request limit per window
    X-RateLimit-Reset:
      schema:
        type: integer
      description: UTC epoch seconds when the window resets
  parameters:
    date_to:
      name: date_to
      in: query
      schema:
        type: string
        format: date
      description: 'Filter: articles published on or before this date'
    sort:
      name: sort
      in: query
      schema:
        type: string
        enum:
        - newest
        - oldest
        default: newest
      description: Sort order by published date
    q:
      name: q
      in: query
      schema:
        type: string
      description: Full-text search query
    limit:
      name: limit
      in: query
      schema:
        type: integer
        minimum: 1
        maximum: 100
        default: 20
      description: Maximum items to return (1–100)
    before_published_at:
      name: before_published_at
      in: query
      schema:
        type: string
        format: date-time
      description: 'Cursor: return items published before this timestamp'
    before_id:
      name: before_id
      in: query
      schema:
        type: string
        format: uuid
      description: 'Cursor: return items with IDs before this value'
    date_from:
      name: date_from
      in: query
      schema:
        type: string
        format: date
      description: 'Filter: articles published on or after this date'
  schemas:
    ErrorResponse:
      type: object
      properties:
        error:
          type: object
          properties:
            code:
              type: string
              enum:
              - UNAUTHORIZED
              - FORBIDDEN
              - SUBSCRIPTION_REQUIRED
              - NOT_FOUND
              - RATE_LIMITED
              - INSUFFICIENT_TOKENS
              - VALIDATION_ERROR
              - INTERNAL_ERROR
              - SERVICE_UNAVAILABLE
            message:
              type: string
            details:
              type: object
          required:
          - code
          - message
      required:
      - error
    SavedArticleV1:
      type: object
      properties:
        id:
          type: string
          format: uuid
        title:
          type:
          - string
          - 'null'
        url:
          type: string
          format: uri
        source:
          type:
          - string
          - 'null'
        published_at:
          type:
          - string
          - 'null'
          format: date-time
        saved_at:
          type: string
          format: date-time
        is_read:
          type: boolean
        tags:
          type: array
          items:
            type: string
        has_highlights:
          type: boolean
        has_notes:
          type: boolean
      required:
      - id
      - title
      - url
      - source
      - published_at
      - saved_at
      - is_read
      - tags
      - has_highlights
      - has_notes
  responses:
    Forbidden:
      description: Insufficient permissions or subscription required
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/ErrorResponse'
    Unauthorized:
      description: Missing or invalid API key
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/ErrorResponse'
    RateLimited:
      description: Rate limit exceeded
      headers:
        Retry-After:
          $ref: '#/components/headers/Retry-After'
        X-RateLimit-Limit:
          $ref: '#/components/headers/X-RateLimit-Limit'
        X-RateLimit-Remaining:
          $ref: '#/components/headers/X-RateLimit-Remaining'
        X-RateLimit-Reset:
          $ref: '#/components/headers/X-RateLimit-Reset'
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/ErrorResponse'
    ValidationError:
      description: Input validation failed
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/ErrorResponse'
  securitySchemes:
    BearerAuth:
      type: http
      scheme: bearer
      description: 'API key in the format `fn_live_XXXX`. Pass via `Authorization: Bearer fn_live_XXXX`.'
      x-scopes:
        read: Read feeds, articles, folders, tags, stats, highlights, notes, saved items
        write: Mark as read/unread, save/unsave, tag, highlight, add notes, extract content
        ai: Text-to-speech audio generation
      x-token-issuance:
        type: self-service-api-key
        url: https://www.feednest.com/dashboard/settings/developer-api
        documentation: https://docs.feednest.com/api-keys