Send your key in the Authorization header on every request, whichever key it is. The key also picks the organization, so no endpoint takes an organization ID.
Authorization: Bearer fb_pub_your_public_key
Key
Use it for
fb_pub_…
Browsers and apps. Reads public organizations, posts feedback and screenshots into any organization, answers surveys.
fb_sec_…
Your server only. Everything a public key does, plus private organizations, internal feedback and private fields.
Create keys in Dashboard → Project → API keys. Never ship the secret key to a browser.
To act as one of your users, add their token in X-User-Token. Voting, commenting and subscribing need a token signed on your server; see server-side user signing. An unsigned token, like the one the SDK builds from its user option, only credits new feedback and survey responses to that user. It never changes a user’s saved name or email. Once a signed token is used for a user ID, unsigned tokens for that ID are ignored. For users last identified by a signed token before this protection shipped, it applies from their next signed request.
Authorization: Bearer fb_pub_your_public_key
X-User-Token: <token signed on your server>
Every path below is relative to this URL. It’s the same one the SDK and CLI call by default. Self-hosting? Use your own Convex deployment’s .convex.site URL instead.
List approved feedback. Pinned items come first, then the chosen sort.
Auth: Public or secret key. A public key only reads a public organization; a private one answers 403 unless you use the secret key. With the secret key the response also includes internal feedback, feedback still awaiting publication, and the private fields context, assigneeId, claimedBy, githubIssueNumber, githubHtmlUrl, isInternal, publication (internal, pending, approved or rejected) and syncedFromGithub. Add a signed user token to fill hasVoted.
Parameter
Type
Description
status
string
open, under_review, planned, in_progress, completed or closed.
statusId
string
Only items in this custom status.
tagId
string
Only items with this tag.
search
string
Matches the title or description.
pagePath
string
Only items reported from this page, e.g. /settings/billing.
Auth: Public or secret key. A public key only reads a public organization; a private one answers 403 unless you use the secret key. With the secret key the response also includes internal feedback, feedback still awaiting publication, and the private fields context, assigneeId, claimedBy, githubIssueNumber, githubHtmlUrl, isInternal, publication (internal, pending, approved or rejected) and syncedFromGithub. Add a signed user token to fill hasVoted. A signed user token also fills isSubscribed.
List the comments on a feedback item, with replies nested under their parent.
Auth: Public or secret key. A public key only reads a public organization; a private one answers 403 unless you use the secret key. With the secret key, authors include their email.
Auth: Public or secret key; a public key can post to a private organization too. A user token, signed or not, credits the post to that user and adds their upvote. internal: true needs the secret key. Counts against the write rate limit.
Parameter
Type
Description
title
string
Required.
description
string
Required.
tagId
string
Tag to file it under.
internal
boolean
Team-only feedback. Secret key only; never shown on the public board.
context
object
Where it was reported: url, pageTitle, browser, os, device, viewport, metadata and more.
Request body
{
"title": "Add dark mode",
"description": "Please add a dark mode option.",
"tagId": "kt31…",
"context": { "url": "https://app.acme.com/settings", "browser": "Chrome 128" }
}
Example request
curl -X POST "https://harmless-clam-802.convex.site/api/v1/feedback/create" \
-H "Authorization: Bearer fb_pub_xxx" \
-H "Content-Type: application/json" \
-d '{"title": "Add dark mode", "description": "Please add a dark mode option."}'
Responds with 201 and isApproved: false: every new item waits for automatic triage, which publishes it shortly unless the board requires approval or the item looks like spam. Until then only the secret key reads it. Publish or reject it yourself with the secret key: POST /api/v1/admin/feedback/publication with { "feedbackId", "state": "approved" | "rejected" }. Rejecting archives the item, so it leaves every read until someone restores it.
Toggle the user’s vote. Sending the same vote again removes it; sending the other type switches it.
Auth: Public or secret key, plus a signed user token in X-User-Token. Without one the request fails with 401. A public key only votes on a public organization.
Attach an uploaded screenshot to a feedback item. The upload must be a PNG, JPEG, WebP, GIF or AVIF image of 10 MB or less, uploaded in the last 30 minutes and not attached anywhere else; type and size are read from the upload. With a public key, only the reporter (same X-User-Token user, or anonymous for anonymous reports) can attach, within 30 minutes of creating the feedback, and at most 10 screenshots per feedback item.
Auth: Public or secret key.
Parameter
Type
Description
feedbackId
string
Required. The feedback ID.
storageId
string
Required. From the upload response.
filename
string
Defaults to screenshot.png.
width
number
Image width in pixels.
height
number
Image height in pixels.
pageUrl
string
Page the screenshot was taken on.
captureSource
string
widget (default) or element.
annotatedStorageId
string
A second upload with the annotations drawn in.
annotations
array
Up to 50 shapes: rectangle, arrow, text, blur, pen, highlight or spotlight.
List every survey this respondent may see right now: active, inside its schedule, under its response cap, allowed by its display frequency and sampled in. Surveys with the manual trigger are included too; show them only when your app asks for them. Your client arms the triggers. The SDK and the feedback widget do it for you.
Auth: Public or secret key, for public and private organizations alike. A user token links the response to that user and keeps display frequency and sampling stable across their devices.
Parameter
Type
Description
respondentId
string
Your anonymous ID for this visitor, up to 200 characters. Display frequency and sampling are checked against it and the user token. Without either, frequency never blocks and sampling lets everyone in.
Questions come sorted by order, and endings and display always have values. triggerConfig.pageUrl holds comma- or newline-separated patterns with * wildcards: a pattern starting with / matches the path, anything else the full URL, and an empty value matches every page. sampleRate is a percentage from 0 to 100, delayMs applies to time_delay and eventName to event. To find the next step, the first rule in logic that matches the question’s own answer wins, then next, then the following question, then the first ending. Jumps only go forward. A statement shows a message and never takes an answer.
Get the first survey from eligible surveys that matches the filters, in the same shape, or null when none does. Prefer the eligible list when your client arms several triggers.
Auth: Public or secret key, for public and private organizations alike. A user token links the response to that user and keeps display frequency and sampling stable across their devices.
Parameter
Type
Description
triggerType
string
Only surveys with this trigger: manual, page_visit, time_delay, exit_intent, feedback_submitted or event.
surveyId
string
Only this survey.
respondentId
string
Your anonymous ID for this visitor, up to 200 characters. Display frequency and sampling are checked against it and the user token. Without either, frequency never blocks and sampling lets everyone in.
Start a response when the survey appears. Starting counts as showing the survey for its display frequency. Returns 400 when the survey isn’t active, is outside its schedule, has reached its response cap, was already shown to this respondent or leaves them out of its sample. Shares a rate limit with dismissing.
Auth: Public or secret key, for public and private organizations alike. A user token links the response to that user and keeps display frequency and sampling stable across their devices.
Parameter
Type
Description
surveyId
string
Required. The survey ID.
respondentId
string
Your anonymous ID for this visitor, up to 200 characters. Display frequency and sampling are checked against it and the user token. Without either, frequency never blocks and sampling lets everyone in.
Save one answer while the response is in progress. Answering the same question again replaces the earlier answer, and null deletes it. Values are checked against the question: a whole number in range for NPS (0–10) and ratings, a boolean for yes/no, a listed choice for single choice, distinct listed choices for multiple choice, and text within the length limit. When the question allows “Other”, one unlisted choice is accepted as the respondent’s own text.
Auth: Public or secret key, for public and private organizations alike. A user token links the response to that user and keeps display frequency and sampling stable across their devices.
Parameter
Type
Description
responseId
string
Required. From the start call.
questionId
string
Required. The question ID.
value
string | number | boolean | string[] | null
Required. A number for rating and NPS, a boolean for yes/no, a string for text and single choice, a string array for multiple choice, or null to clear.
Returns { "answerId": null } after a null value. Invalid answers return 400, e.g. { "error": "Pick a score from 0 to 10." }, as do statements and responses that are already completed or abandoned.
Finish the response. Reflet walks the flow with the saved answers, deletes answers left on a branch the respondent backed out of, stores the ending reached and sends the survey.response.completedwebhook. Returns 400 when a required question on that path has no answer. Completing again returns the same ending. Once completed responses reach the survey’s cap, the survey closes.
Auth: Public or secret key, for public and private organizations alike. A user token links the response to that user and keeps display frequency and sampling stable across their devices.
Mark an unfinished response as abandoned right away, e.g. when the respondent closes the survey. Does nothing to a completed response. Shares a rate limit with starting.
Auth: Public or secret key, for public and private organizations alike. A user token links the response to that user and keeps display frequency and sampling stable across their devices.
Reflet POSTs a JSON payload to your endpoint when feedback changes. Add endpoints in the Webhooks section of Dashboard → Project → API keys. Each webhook has its own signing secret, shown once at creation.
The status or custom status changed: by a member, the API, an agent, GitHub, a release or the automatic close of stale feedback.
feedback.github_issue_created
A GitHub issue was created for or linked to the feedback.
survey.response.completed
A respondent finished a survey. The payload data holds the survey (id, title) and the response (channel, ending, respondent and answers) instead of feedback.
Headers: Content-Type: application/json, User-Agent: Reflet-Webhooks/1.0, X-Reflet-Event, X-Reflet-Delivery (the same on every retry, use it to dedupe) and X-Reflet-Signature (sha256= followed by the hex HMAC-SHA256 of the raw body, keyed with the webhook secret).
data.feedback has the same shape as GET /feedback/item with a secret key, including the author’s email and the private fields.
Respond with any 2xx within 10 seconds. A failed delivery is retried after 1 minute and again after 10 minutes. A webhook is disabled after 20 failed attempts in a row, retries included; re-enabling it resets the count. Only approved, non-internal feedback is delivered.
A public key can create 30 feedback items or comments per minute, start or dismiss 600 survey responses per minute, save 3,000 survey answers or completions per minute and request 300 screenshot upload URLs per minute; each limit is separate. A secret key shares 300 writes per minute across all of these. While a key is over a limit, those requests return 429. Saving a screenshot isn’t rate limited, but a public key can attach at most 10 screenshots per feedback item. Reads, votes and subscriptions aren’t rate limited, and responses carry no rate-limit headers.