Median

POST /feedback

Updated Oct 1, 20262 minute read

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.

FieldTypeRequiredDescription
sessionstringYesWho 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.
bodystringYesWhat they actually wrote, in their words.
userobjectNoTheir name and email, if you know them.
user.namestringNo
user.emailstringNo
user.avatarUrlstringNo
pageobjectNoWhere they were. The query string is dropped before the URL is stored.
page.urlstringNo
page.titlestringNo
page.referrerstringNo
imagesstring | object[]NoPictures 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

StatusDescription
200Where the note ended up.
400The request is malformed, and the message names the field.
401The bearer token is missing, revoked, or expired.
429Too many requests. Wait the seconds in Retry-After. Limits depend on the plan. See rate limits.

200 body

FieldTypeRequiredDescription
outcome"bug" | "suggestion" | "spam" | "unread"No
signalIdanyNoThe 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"}]}'

Still need help?

    Esc