Get a signal
The signal, everyone who reported it with their own words, and commits that look like they finish it.
GET
/signals/{id}Authorization
AuthorizationBearer token · headerrequired`MEDIAN_KEY` from Settings under API, or an MCP OAuth access token. A key acts as the organization; a token acts as the person who approved it.
Path parameters
idstringrequiredA signal id.
Responses
200The signal and its history.
signalSignalShow propertiesHide properties
idstringkindstringAllowed:
bugsuggestiontitlestringbodystringprioritystringAllowed:
urgenthighmediumlowstatusstringAllowed:
openplannedin progressin reviewdonedeclinedreporterCountintegeraliasesstring[]The other titles this was reported under, kept when duplicates merge.
filedAtintegerupdatedAtintegerupdatedByNamestring | nulllinearobject | nullShow propertiesHide properties
identifierstringurlstringgithubobject | nullShow propertiesHide properties
numberintegerurlstringreportersReporter[]Show propertiesHide properties
Array of
Reporterconversationsobject[]Show propertiesHide properties
Array of
objectconversationIdstringsubjectstringwhostringquotestringWhat the customer actually said, in their own words.
reportedAtintegernotifiedAtinteger | nullWhen the "this is fixed" message reached them.
imagesobject[]The screenshots behind the report, each with somewhere to fetch it. Screenshots sent in the conversation are here alongside anything attached by link.
Show propertiesHide properties
Array of
objecturlstringnamestringexternalbooleanTrue for an address Median does not serve.
commitsSignalCommit[]Show propertiesHide properties
Array of
SignalCommitidstringshastringmessagestringurlstringauthorstringwhystringOne line on why the reader thinks this is the one.
appliedboolean401The bearer token is missing, revoked, or expired.
errorobjectShow propertiesHide properties
codestringmessagestring404Not one of yours, or not there at all.
errorobjectShow propertiesHide properties
codestringmessagestring429Too many requests. Wait the seconds in `Retry-After`. Limits depend on the plan. See [rate limits](/api/errors-and-limits#rate-limits).
errorobjectShow propertiesHide properties
codestringmessagestringRequest
curl -X GET "https://api.median.sh/v1/signals/string" \
-H "Authorization: Bearer YOUR_TOKEN"const response = await fetch("https://api.median.sh/v1/signals/string", {
method: "GET",
headers: {
"Authorization": "Bearer YOUR_TOKEN"
}
});Response
{
"signal": {
"id": "string",
"kind": "bug",
"title": "string",
"body": "string",
"priority": "urgent",
"status": "open",
"reporterCount": 0,
"aliases": [
"string"
],
"filedAt": 0,
"updatedAt": 0,
"updatedByName": "string",
"linear": {
"identifier": "string",
"url": "string"
},
"github": {
"number": 0,
"url": "string"
}
},
"reporters": [
{
"conversations": [
{
"conversationId": "string",
"subject": "string"
}
],
"who": "string",
"quote": "string",
"reportedAt": 0,
"notifiedAt": 0,
"images": [
{
"url": "string",
"name": "string",
"external": true
}
]
}
],
"commits": [
{
"id": "string",
"sha": "string",
"message": "string",
"url": "string",
"author": "string",
"why": "string",
"applied": true
}
]
}{
"error": {
"code": "string",
"message": "string"
}
}{
"error": {
"code": "string",
"message": "string"
}
}{
"error": {
"code": "string",
"message": "string"
}
}