Reports
List, read, create and update bug reports, and comment on them.
A report is one piece of feedback sent with the widget: a bug, a question or a design note. The dashboard sometimes calls them issues.
Finding reports
curl "https://feedbackdots.com/api/v1/reports?project_id=PROJECT_ID&status=Triage&severity=High" \
-H "Authorization: Bearer $FEEDBACKDOTS_API_KEY"
Filters: project_id, status, severity, q (searches titles and descriptions) and archived=true to list archived reports instead of open ones. Results are newest first.
Reading one report
GET /reports/{id} returns the report plus a context object with everything the widget captured:
{
"object": "report",
"id": "c3d1…",
"title": "Checkout button does nothing",
"description": "Clicked Pay, nothing happened",
"status": "Triage",
"severity": "High",
"page_url": "https://shop.example.com/checkout",
"reporter": { "name": "Ana", "email": "ana@example.com" },
"issues": { "linear": { "key": "WEB-41", "url": "https://linear.app/…" }, "jira": null, "github": null },
"dashboard_url": "https://feedbackdots.com/reports/c3d1…",
"context": {
"screenshot_url": "https://…signed…",
"device": { "browser": "Chrome 129", "os": "macOS", "viewport": "1440x900" },
"console_logs": [{ "level": "error", "message": "TypeError: pay is not a function", "at": "…" }],
"pins": [
{
"number": 1,
"comment": "This button",
"x": 0.62,
"y": 0.41,
"element": { "tag": "button", "text": "Pay", "selector": "#checkout > button.pay" }
}
],
"network_requests": []
}
}
The screenshot link is signed and works for an hour; fetch the report again for a fresh one. Pin positions are fractions of the viewport. network_requests is only filled when the project captures network activity, and its URLs are redacted.
Creating a report
Use this to file reports from your own tools, such as a support inbox or an error tracker.
curl -X POST https://feedbackdots.com/api/v1/reports \
-H "Authorization: Bearer $FEEDBACKDOTS_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"project_id": "PROJECT_ID",
"title": "Customer cannot reset password",
"description": "Reported by email. Reset link 404s.",
"severity": "High",
"page_url": "https://app.example.com/reset",
"reporter_name": "Support inbox",
"reporter_email": "customer@example.com"
}'
New reports are handled exactly like widget reports: they go to the project's Linear, Jira, GitHub and Slack and fire the report.created webhook (both on Pro), and count toward the plan's monthly reports. Screenshots can't be attached through the API yet.
Updating a report
Send only the fields you want to change: title, description, status, severity, area or archived.
curl -X PATCH https://feedbackdots.com/api/v1/reports/REPORT_ID \
-H "Authorization: Bearer $FEEDBACKDOTS_API_KEY" \
-H "Content-Type: application/json" \
-d '{"status": "In Review", "severity": "Medium"}'
A status change has the same effects as in the dashboard: connected trackers are updated, the reporter is emailed when it moves to Done (if the project has reporter updates on), and the report.status_changed webhook fires.
Comments
curl https://feedbackdots.com/api/v1/reports/REPORT_ID/comments \
-H "Authorization: Bearer $FEEDBACKDOTS_API_KEY"
curl -X POST https://feedbackdots.com/api/v1/reports/REPORT_ID/comments \
-H "Authorization: Bearer $FEEDBACKDOTS_API_KEY" \
-H "Content-Type: application/json" \
-d '{"body": "Fixed in v2.3.1, deploying now."}'
Comments added with a key are signed with the key's name unless you pass author_name. They fire the comment.created webhook.