DocsREST API

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/feedback

Rate Limiting

The API is rate limited to 100 requests per minute per API key. Rate limit information is included in response headers:

HeaderDescription
X-RateLimit-LimitMaximum requests per minute
X-RateLimit-RemainingRemaining requests in current window
X-RateLimit-ResetUnix timestamp when the limit resets

Endpoints

GET/api/v1/feedbackread:feedback

List feedback for your team with optional filters

Query Parameters

ParameterTypeDescription
projectIdstringFilter by project ID
statusstringFilter by status: new, triaging, drafted, exported, resolved
typestringFilter by type: bug, feature
prioritystringFilter by priority: low, medium, high, critical
limitnumberNumber of results (default: 50, max: 100)
offsetnumberPagination 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
  }
}
GET/api/v1/feedback/:idread:feedback

Get 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
  }
}
PATCH/api/v1/feedback/:idwrite:feedback

Update 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"
}
GET/api/v1/projectsread:projects

List 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
}
StatusDescription
200Success
400Bad Request
401Unauthorized (invalid or missing API key)
404Not Found
429Rate 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`);
2026 feedbackflow
made with<3byinfinitemoney