POST /feedback
Submit feedback
One note in, a verdict out. A fast model reads what was written, calls it a bug or a suggestion, writes the title and the write-up, picks a priority, and drops it if it is spam. A note about something already on the list joins that signal instead of adding a row, so the same complaint from ten people is one signal with ten reporters.
This is the endpoint behind the feedback panel, and the one for notes collected anywhere else: an app store review, a survey, a message in a community. Use POST /v1/signals when you already know what the thing is and how it should read.
It waits for the reading, so expect a second or two. outcome is unread when the reader was unavailable or the organization has filing switched off; nothing is filed either way.
Part of Feedback.
Request body
application/json, required.
| Field | Type | Required | Description |
|---|---|---|---|
session | string | Yes | Who the note is from: any stable id for that person, the same one every time. It is what makes two notes from one person one reporter, and it is the browser's session token when the note comes from the widget. 8 to 128 characters. |
body | string | Yes | What they actually wrote, in their words. |
user | object | No | Their name and email, if you know them. |
user.name | string | No | |
user.email | string | No | |
user.avatarUrl | string | No | |
page | object | No | Where they were. The query string is dropped before the URL is stored. |
page.url | string | No | |
page.title | string | No | |
page.referrer | string | No | |
images | string | object[] | No | Pictures of the thing, as http or https addresses. They show on the report and on any issue it is pushed to. A bare string works where you have nothing to call it. |
Responses
| Status | Description |
|---|---|
200 | Where the note ended up. |
400 | The request is malformed, and the message names the field. |
401 | The bearer token is missing, revoked, or expired. |
429 | Too many requests. Wait the seconds in Retry-After. Limits depend on the plan. See rate limits. |
200 body
| Field | Type | Required | Description |
|---|---|---|---|
outcome | "bug" | "suggestion" | "spam" | "unread" | No | |
signalId | any | No | The signal it landed on, or null when nothing was filed. |
Example request
curl -X POST https://api.median.sh/v1/feedback \
-H "Authorization: Bearer $BEARER_AUTH" \
-H "content-type: application/json" \
-d '{"session":"user_8812","body":"The export button on the billing page does nothing on my phone.","page":{"url":"https://acme.com/settings/billing"},"images":[{"url":"https://files.acme.com/reports/8812-billing.png","name":"Billing page on iOS"}]}'