FeaturesVote API
The FeaturesVote API is a management API for administering your feature voting board. Use it to integrate with CI/CD pipelines, build internal tools, or connect AI assistants via MCP.
Base URL: https://features.vote/api
Authentication
All API requests require a valid API key sent in the Authorization header as a Bearer token.
curl https://features.vote/api/features \
-H "Authorization: Bearer fv_live_xxxxxxxxxxxxx"Getting an API key
- Go to your project Settings → API Keys
- Click "Create API Key"
- Copy the key — it is only shown once
- Requires a Growth or VIP subscription plan
fv_live_ followed by 40 random characters. Each key is bound to a single project.Rate Limits
| Plan | Per-Key Limit | IP Rate Limit |
|---|---|---|
| Growth | 100 requests / minute | 10 writes / 2 min (edge) |
| VIP | 300 requests / minute | 10 writes / 2 min (edge) |
Rate limit info is included in response headers: X-RateLimit-Limit, X-RateLimit-Remaining, X-RateLimit-Reset.
Response Format
Successful responses wrap data in a data field. Paginated endpoints include a meta field.
{
"data": { ... },
"meta": { "page": 1, "limit": 50, "total": 123 }
}{
"error": "error_code",
"message": "Human-readable description"
}Features
Create, read, update, and delete feature requests. Manage voters, merge duplicates, and link features to releases.
/api/featuresList all features for the project. Supports filtering and pagination.
Parameters
statustagsearchpagelimitExample Request
curl "https://features.vote/api/features?status=Pending&limit=10" \
-H "Authorization: Bearer fv_live_xxx"Response
{
"data": [
{
"id": "uuid",
"title": "Add dark mode",
"description": "...",
"status": "Pending",
"total_votes": 42,
"tags": ["UI"],
"created_at": "2024-01-01T00:00:00Z"
}
],
"meta": { "page": 1, "limit": 10, "total": 42 }
}/api/features/createCreate a new feature.
Request Body
{
"title": "Add dark mode",
"description": "Support dark theme across the app",
"status": "Pending",
"tags": ["UI", "UX"]
}Example Request
curl -X POST https://features.vote/api/features/create \
-H "Authorization: Bearer fv_live_xxx" \
-H "Content-Type: application/json" \
-d '{"title": "Add dark mode", "description": "...", "tags": ["UI"]}'Response
{
"data": {
"id": "uuid",
"title": "Add dark mode",
"status": "Pending",
"total_votes": 0
}
}/api/features?featureId={id}Get a single feature by ID.
Example Request
curl "https://features.vote/api/features?featureId=FEATURE_ID" \
-H "Authorization: Bearer fv_live_xxx"Response
{
"id": "...",
"title": "...",
"description": "...",
"status": "Pending",
"total_votes": 42,
"tags": ["UI"]
}/api/featuresUpdate a feature. Only provided fields are updated.
Request Body
{
"id": "feature-uuid",
"title": "Updated title",
"description": "Updated description",
"status": "Approved",
"tags": ["UI", "Priority"]
}Example Request
curl -X PUT https://features.vote/api/features \
-H "Authorization: Bearer fv_live_xxx" \
-H "Content-Type: application/json" \
-d '{"id": "FEATURE_ID", "status": "Approved"}'Response
{
"id": "...",
"title": "...",
"status": "Approved"
}/api/features?is_status_update=trueUpdate only the status of a feature. Triggers subscriber notifications.
Request Body
{
"id": "feature-uuid",
"status": "In Progress"
}Example Request
curl -X PUT "https://features.vote/api/features?is_status_update=true" \
-H "Authorization: Bearer fv_live_xxx" \
-H "Content-Type: application/json" \
-d '{"id": "FEATURE_ID", "status": "In Progress"}'Response
{
"id": "...",
"status": "In Progress"
}/api/featuresDelete a feature. Remove comments first if the feature has any.
Request Body
{ "id": "feature-uuid" }Example Request
curl -X DELETE https://features.vote/api/features \
-H "Authorization: Bearer fv_live_xxx" \
-H "Content-Type: application/json" \
-d '{"id": "FEATURE_ID"}'Response
null/api/features/voters?featureId={id}List all voters for a feature.
Example Request
curl "https://features.vote/api/features/voters?featureId=FEATURE_ID" \
-H "Authorization: Bearer fv_live_xxx"Response
{
"data": {
"voters": [
{ "id": "...", "name": "John", "email": "john@example.com" }
],
"total_votes": 42
}
}/api/features/add-voterAdd a voter to a feature. Provide an existing user_id or new_user details.
Request Body
// With existing user
{
"feature_id": "feature-uuid",
"user_id": "existing-user-uuid"
}
// With new user
{
"feature_id": "feature-uuid",
"new_user": {
"name": "Jane Doe",
"email": "jane@example.com",
"app_user_id": "usr_123"
}
}Example Request
curl -X POST https://features.vote/api/features/add-voter \
-H "Authorization: Bearer fv_live_xxx" \
-H "Content-Type: application/json" \
-d '{"feature_id": "FEATURE_ID", "new_user": {"name": "Jane", "email": "jane@example.com"}}'Response
{
"message": "Successfully added voter to feature",
"feature": { "id": "...", "total_votes": 43 }
}/api/features/link-to-releaseLink a feature to a release.
Request Body
{
"feature_id": "feature-uuid",
"release_id": "release-uuid"
}Example Request
curl -X POST https://features.vote/api/features/link-to-release \
-H "Authorization: Bearer fv_live_xxx" \
-H "Content-Type: application/json" \
-d '{"feature_id": "FEATURE_ID", "release_id": "RELEASE_ID"}'Response
{
"message": "Successfully linked feature to release",
"feature": { "id": "...", "release_id": "..." }
}/api/features/mergeMerge two features. Voters, subscribers, and tags from the source are added to the target. The source is deleted.
Request Body
{
"source_feature_id": "uuid-to-merge-from",
"target_feature_id": "uuid-to-merge-into"
}Example Request
curl -X POST https://features.vote/api/features/merge \
-H "Authorization: Bearer fv_live_xxx" \
-H "Content-Type: application/json" \
-d '{"source_feature_id": "...", "target_feature_id": "..."}'Response
{
"message": "Posts merged successfully",
"targetFeature": { ... },
"mergeStats": {
"addedVoters": 5,
"addedSubscribers": 2
}
}Releases / Changelogs
Create and manage releases. Generate AI-powered changelogs and send email notifications to subscribers.
/api/releasesList all releases for the project.
Example Request
curl https://features.vote/api/releases \
-H "Authorization: Bearer fv_live_xxx"Response
{
"data": [
{
"id": "...",
"version": "1.2.0",
"title": "January Release",
"short_description": "...",
"released_at": "2024-01-15T00:00:00Z"
}
]
}/api/releasesCreate a new release. Optionally link features.
Request Body
{
"version": "1.2.0",
"title": "January Release",
"short_description": "Bug fixes and improvements",
"long_description": "# What's New\n...",
"feature_ids": ["feat-1", "feat-2"]
}Example Request
curl -X POST https://features.vote/api/releases \
-H "Authorization: Bearer fv_live_xxx" \
-H "Content-Type: application/json" \
-d '{"version": "1.2.0", "title": "January Release"}'Response
{
"data": { "id": "...", "version": "1.2.0" }
}/api/releases?releaseId={id}Get a single release.
Example Request
curl "https://features.vote/api/releases?releaseId=RELEASE_ID" \
-H "Authorization: Bearer fv_live_xxx"Response
{
"id": "...",
"version": "1.2.0",
"title": "January Release"
}/api/releasesUpdate a release. Optionally update linked features.
Request Body
{
"release": {
"id": "release-uuid",
"title": "Updated Title"
},
"featureIds": ["feat-1", "feat-3"]
}Example Request
curl -X PUT https://features.vote/api/releases \
-H "Authorization: Bearer fv_live_xxx" \
-H "Content-Type: application/json" \
-d '{"release": {"id": "RELEASE_ID", "title": "Updated Title"}, "featureIds": []}'Response
null/api/releases?releaseId={id}Delete a release. Linked features will be unlinked.
Example Request
curl -X DELETE "https://features.vote/api/releases?releaseId=RELEASE_ID" \
-H "Authorization: Bearer fv_live_xxx"Response
null/api/releases/send-changelog-emailSend the changelog email to subscribers. Max 50 recipients per request.
Request Body
{
"releaseId": "release-uuid",
"subject": "What's new in v1.2.0",
"bodyMarkdown": "# What's New\n\n- Feature A\n- Bug fix B"
}Example Request
curl -X POST https://features.vote/api/releases/send-changelog-email \
-H "Authorization: Bearer fv_live_xxx" \
-H "Content-Type: application/json" \
-d '{"releaseId": "RELEASE_ID", "subject": "What\'s new", "bodyMarkdown": "# Changes\n..."}'Response
{
"success": true,
"emailsSent": 12,
"recipients": ["a@b.com", ...]
}/api/releases/generate-changelogAI-generate a changelog from linked features. Limited to 5 per day per project.
Request Body
{
"releaseId": "release-uuid",
"customPrompt": "Write in a friendly tone",
"existingChangelog": "Optional existing text to improve"
}Example Request
curl -X POST https://features.vote/api/releases/generate-changelog \
-H "Authorization: Bearer fv_live_xxx" \
-H "Content-Type: application/json" \
-d '{"releaseId": "RELEASE_ID"}'Response
{
"changelog": "# v1.2.0 - January Release\n\n## New Features\n...",
"remaining": 4,
"limit": 5
}Project
Retrieve project details and usage analytics.
/api/projectsGet details of the project associated with the API key.
Example Request
curl https://features.vote/api/projects \
-H "Authorization: Bearer fv_live_xxx"Response
{
"data": {
"id": "...",
"name": "My App",
"slug": "my-app",
"website_url": "https://myapp.com",
"logo_url": "...",
"created_at": "2024-01-01T00:00:00Z"
}
}/api/usageGet usage analytics for the project.
Example Request
curl https://features.vote/api/usage \
-H "Authorization: Bearer fv_live_xxx"Response
{
"data": {
"total_upvotes": 1234,
"total_feature_requests": 89,
"total_views": 5678,
"total_features": 42,
"total_releases": 7
}
}Error Codes
| Status | Code | Description |
|---|---|---|
| 400 | validation_error | Missing or invalid request parameters |
| 401 | unauthorized | Missing or invalid API key |
| 401 | api_key_expired | API key has passed its expiration date |
| 403 | plan_required | Growth or VIP subscription required |
| 404 | not_found | Resource not found |
| 405 | method_not_allowed | HTTP method not supported for this endpoint |
| 429 | rate_limit_exceeded | Too many requests — check X-RateLimit-Reset header |
| 500 | internal_error | Unexpected server error |
MCP Integration
FeaturesVote provides an MCP (Model Context Protocol) server that wraps this REST API, allowing AI assistants like Claude to manage your feature board directly.
Setup (Claude Desktop)
Add the following to your claude_desktop_config.json:
{
"mcpServers": {
"featuresvote": {
"command": "npx",
"args": ["@featuresvote/mcp-server"],
"env": {
"FEATURESVOTE_API_KEY": "fv_live_your_key_here"
}
}
}
}FeaturesVote API Documentation
Comments
Manage comments on feature requests. All API-created comments are marked as admin comments.
/api/comments?featureId={featureId}List all comments for a feature.
Example Request
Response
/api/comments/create?featureId={featureId}Create a comment on a feature. All API comments are marked as admin comments.
Request Body
Example Request
Response
/api/commentsUpdate a comment.
Request Body
Example Request
Response
/api/commentsDelete a comment.
Request Body
Example Request
Response