REST API Documentation
Programmatically access and manage your feedback data
Introduction
The FeedbackFlow REST API allows you to programmatically access and manage your feedback data. Use it to build custom integrations, automate workflows, or sync feedback with other tools.
Secure
Bearer token authentication
Fast
100 requests/min rate limit
RESTful
JSON responses, standard HTTP
Authentication
API Keys
Generate API keys in Settings → API Keys. Keys start with ff_ and include permission scopes.
Making Authenticated Requests
Include your API key in the Authorization header with the Bearer prefix:
curl -H "Authorization: Bearer ff_your_api_key_here" \
https://feedbackflow.cc/api/v1/feedbackRate Limiting
The API is rate limited to 100 requests per minute per API key. Rate limit information is included in response headers:
| Header | Description |
|---|---|
X-RateLimit-Limit | Maximum requests per minute |
X-RateLimit-Remaining | Remaining requests in current window |
X-RateLimit-Reset | Unix timestamp when the limit resets |
Endpoints
/api/v1/feedbackread:feedbackList feedback for your team with optional filters
Query Parameters
| Parameter | Type | Description |
|---|---|---|
projectId | string | Filter by project ID |
status | string | Filter by status: new, triaging, drafted, exported, resolved |
type | string | Filter by type: bug, feature |
priority | string | Filter by priority: low, medium, high, critical |
limit | number | Number of results (default: 50, max: 100) |
offset | number | Pagination offset (default: 0) |
Response
{
"data": [
{
"id": "abc123",
"type": "bug",
"title": "Login button not working",
"description": "When I click the login button...",
"status": "new",
"priority": "high",
"tags": ["auth", "ui"],
"screenshotUrl": "https://...",
"submitterEmail": "user@example.com",
"projectId": "proj123",
"createdAt": 1704067200000,
"updatedAt": 1704067200000
}
],
"pagination": {
"total": 42,
"limit": 50,
"offset": 0,
"hasMore": false
}
}/api/v1/feedback/:idread:feedbackGet a single feedback item by ID
Response
{
"data": {
"id": "abc123",
"type": "bug",
"title": "Login button not working",
"description": "When I click the login button...",
"status": "new",
"priority": "high",
"tags": ["auth", "ui"],
"screenshotUrl": "https://...",
"recordingUrl": null,
"submitterEmail": "user@example.com",
"submitterName": "John Doe",
"assignee": {
"id": "user456",
"name": "Jane Smith",
"email": "jane@team.com"
},
"projectId": "proj123",
"widgetId": "widget789",
"metadata": {
"browser": "Chrome 120",
"os": "macOS",
"url": "https://app.example.com/login",
"timestamp": 1704067200000
},
"createdAt": 1704067200000,
"updatedAt": 1704067200000,
"resolvedAt": null
}
}/api/v1/feedback/:idwrite:feedbackUpdate a feedback item's status, priority, or tags
Request Body
{
"status": "triaging", // optional
"priority": "critical", // optional
"tags": ["urgent", "p0"] // optional
}Response
{
"data": { /* updated feedback object */ },
"message": "Feedback updated successfully"
}/api/v1/projectsread:projectsList all projects for your team
Response
{
"data": [
{
"id": "proj123",
"name": "Main Website",
"description": "Production website feedback",
"settings": {
"defaultPriority": "medium",
"autoTriage": true,
"notifyOnNew": true
},
"feedbackCount": 42,
"newFeedbackCount": 5,
"createdAt": 1704067200000
}
]
}Error Handling
The API uses standard HTTP status codes. Errors return a JSON object with an error message:
{
"error": "Invalid API key",
"status": 401
}| Status | Description |
|---|---|
| 200 | Success |
| 400 | Bad Request |
| 401 | Unauthorized (invalid or missing API key) |
| 404 | Not Found |
| 429 | Rate Limit Exceeded |
Example: Node.js Integration
const API_KEY = process.env.FEEDBACKFLOW_API_KEY;
const BASE_URL = 'https://feedbackflow.cc/api/v1';
async function listFeedback(options = {}) {
const params = new URLSearchParams(options);
const response = await fetch(`${BASE_URL}/feedback?${params}`, {
headers: {
'Authorization': `Bearer ${API_KEY}`,
'Content-Type': 'application/json',
},
});
if (!response.ok) {
const error = await response.json();
throw new Error(error.error);
}
return response.json();
}
// Example: Get all high-priority bugs
const bugs = await listFeedback({
type: 'bug',
priority: 'high',
status: 'new',
});
console.log(`Found ${bugs.data.length} high-priority bugs`);