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.
Call it yourself
curl for this page
This API
curl "https://apis.io/api/v1/apis/feednest-com:feednest-com-tags-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
openapi: 3.2.0
info:
title: FeedNest Public Tags 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: Tags
description: Tag management and article tagging
paths:
/api/v1/articles/{id}/tags:
post:
operationId: addTagToArticle
tags:
- Tags
summary: Add a tag to an article
description: Attaches an existing tag to an article. Call `GET /api/v1/tags` first and reuse a matching tag rather than creating a near-duplicate. Requires the `write` scope.
parameters:
- $ref: '#/components/parameters/articleId'
requestBody:
required: true
content:
application/json:
schema:
type: object
properties:
tag_id:
type: string
format: uuid
required:
- tag_id
responses:
'200':
description: Tag added to article
content:
application/json:
schema:
$ref: '#/components/schemas/ActionResponse'
'400':
$ref: '#/components/responses/ValidationError'
'401':
$ref: '#/components/responses/Unauthorized'
'403':
$ref: '#/components/responses/Forbidden'
'404':
$ref: '#/components/responses/NotFound'
'429':
$ref: '#/components/responses/RateLimited'
/api/v1/articles/{id}/tags/{tagId}:
delete:
operationId: removeTagFromArticle
tags:
- Tags
summary: Remove a tag from an article
description: Detaches a tag from an article. The tag itself is not deleted and stays available for other articles. Requires the `write` scope.
parameters:
- $ref: '#/components/parameters/articleId'
- name: tagId
in: path
required: true
schema:
type: string
format: uuid
responses:
'200':
description: Tag removed from article
content:
application/json:
schema:
$ref: '#/components/schemas/ActionResponse'
'401':
$ref: '#/components/responses/Unauthorized'
'403':
$ref: '#/components/responses/Forbidden'
'429':
$ref: '#/components/responses/RateLimited'
/api/v1/tags:
get:
operationId: listTags
tags:
- Tags
summary: List all tags
description: Returns every tag the user has created, with usage counts. Call this before creating a tag so an equivalent one is reused instead of duplicated. Requires the `read` scope.
responses:
'200':
description: Tag list
content:
application/json:
schema:
type: object
properties:
data:
type: array
items:
$ref: '#/components/schemas/TagV1'
required:
- data
'401':
$ref: '#/components/responses/Unauthorized'
'403':
$ref: '#/components/responses/Forbidden'
'429':
$ref: '#/components/responses/RateLimited'
post:
operationId: createTag
tags:
- Tags
summary: Create a new tag
description: Creates a new tag. Tag names are unique per user, so creating a tag whose name already exists returns a validation error rather than a duplicate. Requires the `write` scope.
requestBody:
required: true
content:
application/json:
schema:
type: object
properties:
name:
type: string
maxLength: 50
color:
type: string
pattern: ^#[0-9a-fA-F]{6}$
default: '#6B7280'
required:
- name
responses:
'201':
description: Tag created
content:
application/json:
schema:
type: object
properties:
data:
$ref: '#/components/schemas/TagV1'
required:
- data
'400':
$ref: '#/components/responses/ValidationError'
'401':
$ref: '#/components/responses/Unauthorized'
'403':
$ref: '#/components/responses/Forbidden'
'429':
$ref: '#/components/responses/RateLimited'
/api/v1/tags/{id}:
delete:
operationId: deleteTag
tags:
- Tags
summary: Delete a tag
description: Deletes a tag and detaches it from every article that carried it. The articles themselves are not affected. Requires the `write` scope.
parameters:
- name: id
in: path
required: true
schema:
type: string
format: uuid
description: Tag ID
responses:
'200':
description: Tag deleted
content:
application/json:
schema:
type: object
properties:
data:
type: object
properties:
message:
type: string
'401':
$ref: '#/components/responses/Unauthorized'
'403':
$ref: '#/components/responses/Forbidden'
'404':
$ref: '#/components/responses/NotFound'
'429':
$ref: '#/components/responses/RateLimited'
components:
responses:
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'
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'
NotFound:
description: Resource not found
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
ValidationError:
description: Input validation failed
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
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
schemas:
TagV1:
type: object
properties:
id:
type: string
format: uuid
name:
type: string
color:
type: string
article_count:
type: integer
required:
- id
- name
- color
- article_count
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
ActionResponse:
type: object
properties:
success:
type: boolean
const: true
required:
- success
parameters:
articleId:
name: id
in: path
required: true
schema:
type: string
format: uuid
description: Article ID
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