Feature Requests API
Quick Start
Advanced Features
SDKs & Libraries
Feedback & Support
Feature Requests API
API endpoints for creating, listing, voting on, and commenting on feature requests. All endpoints require a valid JWT token from device attestation.
FeatureStatus Enum
Feature requests progress through the following statuses:
| Value | Description |
|---|---|
pending | Newly submitted, awaiting review |
open | Reviewed and accepted for consideration |
planned | Scheduled for implementation |
in_progress | Currently being developed |
shipped | Released and available |
declined | Will not be implemented |
duplicate | Duplicate of another request |
1. List Feature Requests
GET /api/v1/feedback/features
Returns a paginated list of feature requests for the current tenant.
Query Parameters
| Parameter | Type | Default | Description |
|---|---|---|---|
page | Int | 1 | Page number |
per | Int | 20 | Items per page |
sort | String | votes | votes, newest, or oldest |
status | String | — | Filter by FeatureStatus value |
voterId | String | — | Include hasVoted flag for this voter |
Response
{
"items": [
{
"id": "550e8400-e29b-41d4-a716-446655440000",
"title": "Dark mode support",
"description": "Add a dark theme option for the app",
"status": "open",
"submitterId": "user_123",
"voteCount": 42,
"commentCount": 7,
"hasVoted": true,
"createdAt": "2025-01-15T10:30:00Z",
"updatedAt": "2025-01-20T14:00:00Z"
}
],
"metadata": {
"page": 1,
"per": 20,
"total": 35
}
}
2. Get Feature Request
GET /api/v1/feedback/features/:featureId
Returns a single feature request by ID.
Response
{
"id": "550e8400-e29b-41d4-a716-446655440000",
"title": "Dark mode support",
"description": "Add a dark theme option for the app",
"status": "open",
"submitterId": "user_123",
"voteCount": 42,
"commentCount": 7,
"createdAt": "2025-01-15T10:30:00Z",
"updatedAt": "2025-01-20T14:00:00Z"
}
3. Create Feature Request
POST /api/v1/feedback/features
Creates a new feature request. The request starts in pending status.
Request Body
{
"title": "Dark mode support",
"description": "Add a dark theme option for the app",
"submitterId": "user_123",
"deviceHash": "abc123def456"
}
| Field | Type | Required | Description |
|---|---|---|---|
title | String | Yes | Short title for the request |
description | String | Yes | Detailed description |
submitterId | String | Yes | Your app's user identifier |
deviceHash | String | No | Device identifier from attestation |
Response (201 Created)
{
"id": "550e8400-e29b-41d4-a716-446655440000",
"title": "Dark mode support",
"description": "Add a dark theme option for the app",
"status": "pending",
"submitterId": "user_123",
"voteCount": 0,
"commentCount": 0,
"createdAt": "2025-01-15T10:30:00Z"
}
4. Vote on Feature Request
POST /api/v1/feedback/features/:featureId/vote
Adds a vote to a feature request. Each voter can only vote once per feature.
Request Body
{
"voterId": "user_123",
"deviceHash": "abc123def456"
}
Response (200 OK)
{
"success": true,
"voteCount": 43
}
5. Remove Vote
DELETE /api/v1/feedback/features/:featureId/vote
Removes a previously cast vote from a feature request.
Query Parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
voterId | String | Yes | The voter's identifier |
Response (200 OK)
{
"success": true,
"voteCount": 42
}
6. List Comments
GET /api/v1/feedback/features/:featureId/comments
Returns all comments on a feature request, sorted chronologically.
Response
{
"items": [
{
"id": "660e8400-e29b-41d4-a716-446655440000",
"authorId": "user_456",
"authorType": "user",
"body": "This would be great for late-night coding sessions!",
"createdAt": "2025-01-16T09:15:00Z"
},
{
"id": "770e8400-e29b-41d4-a716-446655440000",
"authorId": "admin_1",
"authorType": "admin",
"body": "Thanks for the feedback! We're looking into this.",
"createdAt": "2025-01-16T11:30:00Z"
}
]
}
7. Add Comment
POST /api/v1/feedback/features/:featureId/comments
Adds a comment to a feature request.
Request Body
{
"authorId": "user_456",
"body": "This would be great for late-night coding sessions!"
}
| Field | Type | Required | Description |
|---|---|---|---|
authorId | String | Yes | Your app's user identifier |
body | String | Yes | Comment text content |
Response (201 Created)
{
"id": "880e8400-e29b-41d4-a716-446655440000",
"authorId": "user_456",
"authorType": "user",
"body": "This would be great for late-night coding sessions!",
"createdAt": "2025-01-16T09:15:00Z"
}
Error Responses
// 404 Not Found
{
"error": "not_found",
"message": "Feature request not found"
}
// 409 Conflict (duplicate vote)
{
"error": "conflict",
"message": "User has already voted on this feature"
}
// 403 Forbidden (tenant mismatch)
{
"error": "forbidden",
"message": "Access denied"
}