Browse the docs

API reference

Every endpoint in the FeedbackDots REST API, generated from the OpenAPI spec at /api/v1/openapi.json.

Base URL https://feedbackdots.com/api/v1. Download the spec at /api/v1/openapi.json to generate a client or import it into Postman.

Workspace

The workspace an API key belongs to.

Get the current workspace

GET /me

Returns the workspace and API key used for the request. Handy for checking a key.

curl https://feedbackdots.com/api/v1/me \
  -H "Authorization: Bearer $FEEDBACKDOTS_API_KEY"

Returns 200 with a Workspace. Errors: 401.

Projects

Sites and apps that have the widget installed.

List projects

GET /projects

Parameters

limitinteger · queryHow many items to return, from 1 to 100. Default 25. 1 to 100.
cursorstring · queryThe `next_cursor` from the previous page.
curl https://feedbackdots.com/api/v1/projects \
  -H "Authorization: Bearer $FEEDBACKDOTS_API_KEY"

Returns 200 with a list of Project objects. Errors: 400, 401.

Get a project

GET /projects/{id}

Parameters

idrequiredstring (uuid) · pathThe project ID.
curl https://feedbackdots.com/api/v1/projects/ID \
  -H "Authorization: Bearer $FEEDBACKDOTS_API_KEY"

Returns 200 with a Project. Errors: 401, 404.

Reports

Bug reports and feedback, with the context the widget captured.

List reports

GET /reports

Newest first. Archived reports are left out unless `archived=true`.

Parameters

project_idstring (uuid) · queryOnly items from this project.
status"Triage" | "In Progress" | "In Review" | "Done" · queryOnly reports with this status. snake_case forms like `in_progress` also work.
severity"Blocker" | "High" | "Medium" | "Low" · queryOnly reports with this severity.
archivedboolean · querySet to true to list archived reports instead. Default false.
qstring · querySearch titles and descriptions. Up to 200 characters.
limitinteger · queryHow many items to return, from 1 to 100. Default 25. 1 to 100.
cursorstring · queryThe `next_cursor` from the previous page.
curl https://feedbackdots.com/api/v1/reports \
  -H "Authorization: Bearer $FEEDBACKDOTS_API_KEY"

Returns 200 with a list of Report objects. Errors: 400, 401.

Create a report

POST /reports

Adds a report as if it came from the widget: it is sent to the project’s Linear, Jira, GitHub and Slack, and fires the `report.created` webhook. Counts toward the plan’s monthly reports.

Body

project_idrequiredstring (uuid)
titlerequiredstringUp to 240 characters.
descriptionstringUp to 10000 characters.
severity"Blocker" | "High" | "Medium" | "Low"Default "Medium".
areastringDefault "General". Up to 80 characters.
page_urlstring (uri)
environmentstringDefault "production". Up to 40 characters.
buildstringUp to 120 characters.
reporter_namestringDefaults to the API key’s name. Up to 120 characters.
reporter_emailstring (email)
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":"Checkout button does nothing"}'

Returns 201 with a Report with its context. Errors: 400, 401, 402, 404, 409.

Get a report

GET /reports/{id}

Includes the captured context: a signed screenshot URL (valid for an hour), device details, console logs, pins and network requests.

Parameters

idrequiredstring (uuid) · pathThe report ID.
curl https://feedbackdots.com/api/v1/reports/ID \
  -H "Authorization: Bearer $FEEDBACKDOTS_API_KEY"

Returns 200 with a Report with its context. Errors: 401, 404.

Update a report

PATCH /reports/{id}

Changes only the fields you send. A status change syncs to connected trackers, emails the reporter when it moves to Done (if the project has that on) and fires `report.status_changed`.

Parameters

idrequiredstring (uuid) · pathThe report ID.

Body

titlestringUp to 240 characters.
descriptionstringUp to 10000 characters.
status"Triage" | "In Progress" | "In Review" | "Done"
severity"Blocker" | "High" | "Medium" | "Low"
areastringUp to 80 characters.
archivedboolean
curl -X PATCH https://feedbackdots.com/api/v1/reports/ID \
  -H "Authorization: Bearer $FEEDBACKDOTS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"status":"Triage"}'

Returns 200 with a Report with its context. Errors: 400, 401, 404.

Comments

Team discussion on a report.

List comments on a report

GET /reports/{id}/comments

Oldest first.

Parameters

idrequiredstring (uuid) · pathThe report ID.
limitinteger · queryHow many items to return, from 1 to 100. Default 25. 1 to 100.
cursorstring · queryThe `next_cursor` from the previous page.
curl https://feedbackdots.com/api/v1/reports/ID/comments \
  -H "Authorization: Bearer $FEEDBACKDOTS_API_KEY"

Returns 200 with a list of Comment objects. Errors: 400, 401, 404.

Comment on a report

POST /reports/{id}/comments

Fires the `comment.created` webhook.

Parameters

idrequiredstring (uuid) · pathThe report ID.

Body

bodyrequiredstringUp to 4000 characters.
author_namestringDefaults to the API key’s name. Up to 200 characters.
curl -X POST https://feedbackdots.com/api/v1/reports/ID/comments \
  -H "Authorization: Bearer $FEEDBACKDOTS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"body":"Fixed in v2.3.1"}'

Returns 201 with a Comment. Errors: 400, 401, 404.

Feature requests

Ideas people suggest and vote on.

List feature requests

GET /feature-requests

Parameters

project_idstring (uuid) · queryOnly items from this project.
status"new" | "open" | "planned" | "in_progress" | "shipped" | "declined" · queryOnly ideas with this status.
sort"votes" | "newest" · queryMost votes first, or newest first. Default "votes".
limitinteger · queryHow many items to return, from 1 to 100. Default 25. 1 to 100.
cursorstring · queryThe `next_cursor` from the previous page.
curl https://feedbackdots.com/api/v1/feature-requests \
  -H "Authorization: Bearer $FEEDBACKDOTS_API_KEY"

Returns 200 with a list of FeatureRequest objects. Errors: 400, 401.

Create a feature request

POST /feature-requests

Fires the `feature_request.created` webhook.

Body

project_idrequiredstring (uuid)
titlerequiredstringUp to 160 characters.
descriptionstringUp to 2000 characters.
status"new" | "open" | "planned" | "in_progress" | "shipped" | "declined"Default "open".
author_namestringUp to 120 characters.
author_emailstring (email)
curl -X POST https://feedbackdots.com/api/v1/feature-requests \
  -H "Authorization: Bearer $FEEDBACKDOTS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"project_id":"PROJECT_ID","title":"Checkout button does nothing"}'

Returns 201 with a FeatureRequest. Errors: 400, 401, 404, 409.

Get a feature request

GET /feature-requests/{id}

Parameters

idrequiredstring (uuid) · pathThe feature request ID.
curl https://feedbackdots.com/api/v1/feature-requests/ID \
  -H "Authorization: Bearer $FEEDBACKDOTS_API_KEY"

Returns 200 with a FeatureRequest. Errors: 401, 404.

Update a feature request

PATCH /feature-requests/{id}

A status change fires the `feature_request.status_changed` webhook.

Parameters

idrequiredstring (uuid) · pathThe feature request ID.

Body

titlestringUp to 160 characters.
descriptionstringUp to 2000 characters.
status"new" | "open" | "planned" | "in_progress" | "shipped" | "declined"
curl -X PATCH https://feedbackdots.com/api/v1/feature-requests/ID \
  -H "Authorization: Bearer $FEEDBACKDOTS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"status":"new"}'

Returns 200 with a FeatureRequest. Errors: 400, 401, 404.

Objects

Workspace

objectrequired"workspace"
idrequiredstring (uuid)
namerequiredstring
api_keyrequiredobject

Project

objectrequired"project"
idrequiredstring (uuid)
namerequiredstring
customerstringThe client the project is for, if any.
status"Launching" | "On track" | "Stalled" | "On hold"
widget_public_keyrequiredstringThe key the widget script uses.
allowed_originsstring[]
widget_modes"pin" | "feedback" | "markup" | "idea"[]
archivedrequiredboolean
created_atrequiredstring (date-time)
updated_atstring (date-time)

Report

objectrequired"report"
idrequiredstring (uuid)
project_idrequiredstring (uuid)
titlerequiredstringUp to 240 characters.
descriptionstring
statusrequired"Triage" | "In Progress" | "In Review" | "Done"
severityrequired"Blocker" | "High" | "Medium" | "Low"
areastring
page_urlstring | nullThe page the report was sent from.
routestring
environmentstring
buildstring | null
reporterobject
archivedboolean
has_screenshotboolean
has_replayboolean
issuesobjectIssues created in connected trackers.
dashboard_urlstring (uri)
created_atrequiredstring (date-time)
updated_atstring (date-time)

ReportContext

screenshot_urlstring | nullA signed link, valid for one hour.
deviceobjectBrowser, OS, viewport, language and timezone.
console_logsobject[]
pinsobject[]Dots the reporter dropped on the page.
network_requestsobject[]Request metadata, when the project captures it. URLs are redacted.

Comment

objectrequired"comment"
idrequiredstring (uuid)
report_idrequiredstring (uuid)
author_namerequiredstring
bodyrequiredstring
created_atrequiredstring (date-time)

FeatureRequest

objectrequired"feature_request"
idrequiredstring (uuid)
project_idrequiredstring (uuid)
titlerequiredstringUp to 160 characters.
descriptionstring
statusrequired"new" | "open" | "planned" | "in_progress" | "shipped" | "declined"`new` ideas wait for review and are hidden from the public board, as are `declined` ones.
votesrequiredinteger
source"widget" | "team" | "api"
authorobject
page_urlstring | null
created_atrequiredstring (date-time)
updated_atstring (date-time)

Error

errorrequiredobject