202 Accepted and processes the submission asynchronously, optionally turning it into one or more tasks on your board.
Endpoint
Headers
| Header | Required | Description |
|---|---|---|
Authorization | Yes (or apiKey in body) | Bearer <your-api-key> |
Content-Type | Yes | application/json |
Request body
| Field | Type | Required | Description |
|---|---|---|---|
content | string | Yes | The feedback text. 1–10,000 characters. |
author | string | No | A label for who submitted the feedback (email, handle, etc.). Stored on the resulting task. |
sourceUrl | string | No | URL where the feedback originated (e.g. the page the user was on). |
metadata | object | No | Arbitrary JSON stored alongside the request for your own debugging. |
classify | boolean | No | When true, an LLM classifier first decides whether the submission is real product feedback. Off-topic submissions are rejected without creating tasks. Defaults to false. |
apiKey | string | No | API key, if not sent via the Authorization header. |
Example
Response
202 Accepted is returned synchronously once the submission has been queued.
Embed snippet
A minimal feedback widget should post to your own server endpoint. The server attaches the Median API key and forwards the request, so the long-lived workspace key never ships to the browser.MEDIAN_KEY from the environment, set Authorization: Bearer ${MEDIAN_KEY}, and forward the body fields such as content, sourceUrl, and classify to https://api.median.sh/api/feedback.
Classification
Settingclassify: true runs a lightweight LLM pass before extraction. It rejects submissions that are not actionable product feedback (compliments, off-topic chat, generic praise). Use it whenever submissions arrive from an open form where users may write anything.
When classify is omitted or false, every submission is treated as feedback and goes straight to the task extractor. This is the right default for trusted internal sources where you know every submission is real feedback.
Errors
See Overview → Error shape.| Status | Reason |
|---|---|
400 | content missing, empty, longer than 10,000 chars, or another field has the wrong type. |
401 | API key missing or invalid. |
402 | Workspace has no active plan. |
405 | Wrong HTTP method (only POST and OPTIONS are accepted). |