curl --request POST \
--url https://api.superx.so/v1/posts/triage \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"query": "coding agents",
"max_age_days": 3
}
'import requests
url = "https://api.superx.so/v1/posts/triage"
payload = {
"query": "coding agents",
"max_age_days": 3
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({query: 'coding agents', max_age_days: 3})
};
fetch('https://api.superx.so/v1/posts/triage', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.superx.so/v1/posts/triage",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'query' => 'coding agents',
'max_age_days' => 3
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.superx.so/v1/posts/triage"
payload := strings.NewReader("{\n \"query\": \"coding agents\",\n \"max_age_days\": 3\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://api.superx.so/v1/posts/triage")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"query\": \"coding agents\",\n \"max_age_days\": 3\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.superx.so/v1/posts/triage")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"query\": \"coding agents\",\n \"max_age_days\": 3\n}"
response = http.request(request)
puts response.read_body{
"data": {
"query": "coding agents",
"max_age_days": 3,
"posts_searched": 34,
"posts": [
{
"id": "2100458357006205177",
"url": "https://x.com/example/status/2100458357006205177",
"text": "We moved our test suite onto a coding agent for a week. It fixed 41 of 60 flaky tests and broke 3, and the 3 it broke were all in the same file.",
"created_at": "2026-09-17T05:34:31.000Z",
"author": {
"name": "Example Person",
"handle": "example",
"avatar": "https://pbs.twimg.com/profile_images/1466482275361562626/jP_Sgq2A_400x400.jpg",
"verified": true
},
"media": [],
"counts": {
"likes": 1652,
"replies": 114,
"reposts": 382,
"views": 350188
},
"lane": "read",
"pct": 79,
"kind": "data",
"answers": {
"r_specific": 0.88,
"r_new": 0.74,
"r_bait": 0.03,
"r_promo": 0.02,
"r_platitude": 0.02,
"r_reply_room": 0.66,
"farm": 0
}
}
],
"receipt": {
"posts": 34,
"questions_answered": 272,
"ms": 2637,
"usd": 0.0029
}
},
"meta": {
"credits_charged": 2,
"account_id": "1178367350552305665"
}
}Sort recent posts on a topic into Read, Pass or Not sure
Searches recent public posts for a topic and sorts them into three
lanes: read, pass and unsure. Up to 40 posts a run.
Every post comes back with its lane, a pct, a kind (insight,
story, data, progress, news, question, intro, launch,
joke or opinion) and the answers behind the call: is it
specific and informative, does it say something a regular reader of
the topic has not already heard, is it engagement bait, is it a plug,
is it a platitude, and is there room to add something in a reply.
Each answer is a probability between 0 and 1.
pct is how clear the call was, not how good the post is. On
read and pass it runs 50 to 99, so a post that is confidently not
worth reading is a pass at 99; on unsure it is the raw
worth-reading score. Always read it together with lane, and never
rank posts by it across lanes.
The searches ask for original posts, English only, with a floor of 30
likes. Replies and reposts are never returned. None of those three is
settable by the caller: the like floor is the one the lane thresholds
were tuned against, so a very new or very small topic can come back
empty. Treat the floor as the search’s request rather than a
guarantee about counts.likes, since upstream applies it against its
own snapshot and a few posts do come back under it.
What is judged is the TEXT of a post. No author, handle, avatar or follower count is in what the model reads, so a result is a call on the writing, never a rating of a person or an account.
query is searched as typed. A plain multi-word query with no quotes
or operators is ALSO searched as an exact phrase, so a topic catches
both the broad matches and the posts that name it outright; a query
that already carries quotes, a field lookup, OR / AND or an
exclusion is searched exactly once, as written.
max_age_days (1 to 7, default 3) is how far back to look.
posts_searched counts the distinct posts left after duplicates and
posts marked sensitive upstream are dropped, and before the 40-post
cap; receipt reports what the run cost in posts judged, questions
answered, milliseconds and US dollars of model spend.
A post the safety question flags is dropped before it is returned,
and so is one whose judgement failed, so posts can be shorter than
receipt.posts.
Two fields come back as an empty string rather than being omitted
when upstream gave nothing usable: kind (no readable label) and
created_at (no readable timestamp). Treat an empty string as
“unknown” rather than assuming the field is always populated.
Nothing is posted, saved or sent.
A flat 2 credits per run, and each plan has a daily cap on how many
runs it gets. The searches spend the key owner’s own live X
allowance, the one shared with Ask SuperX in the app: 1 lookup for a
single-word query, 2 for a multi-word one. So a 429 here can also
carry lookup_quota_exceeded, and on THIS endpoint that error
carries a code and a message only, with no retry_after field
and no Retry-After header: it resets at midnight UTC, except for
the short-lived “could not be verified” case, which is worth one
retry a minute later. A run that finds nothing to judge returns 200
with an empty posts array and charges no credits, but it still
counts against the daily cap. Needs a key with the write scope.
A 503 here is upstream_unavailable when live X data is throttling
SuperX, or accounts_unavailable when linked-account verification is
briefly unreadable. Both are safe to retry.
curl --request POST \
--url https://api.superx.so/v1/posts/triage \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"query": "coding agents",
"max_age_days": 3
}
'import requests
url = "https://api.superx.so/v1/posts/triage"
payload = {
"query": "coding agents",
"max_age_days": 3
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({query: 'coding agents', max_age_days: 3})
};
fetch('https://api.superx.so/v1/posts/triage', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.superx.so/v1/posts/triage",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'query' => 'coding agents',
'max_age_days' => 3
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.superx.so/v1/posts/triage"
payload := strings.NewReader("{\n \"query\": \"coding agents\",\n \"max_age_days\": 3\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://api.superx.so/v1/posts/triage")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"query\": \"coding agents\",\n \"max_age_days\": 3\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.superx.so/v1/posts/triage")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"query\": \"coding agents\",\n \"max_age_days\": 3\n}"
response = http.request(request)
puts response.read_body{
"data": {
"query": "coding agents",
"max_age_days": 3,
"posts_searched": 34,
"posts": [
{
"id": "2100458357006205177",
"url": "https://x.com/example/status/2100458357006205177",
"text": "We moved our test suite onto a coding agent for a week. It fixed 41 of 60 flaky tests and broke 3, and the 3 it broke were all in the same file.",
"created_at": "2026-09-17T05:34:31.000Z",
"author": {
"name": "Example Person",
"handle": "example",
"avatar": "https://pbs.twimg.com/profile_images/1466482275361562626/jP_Sgq2A_400x400.jpg",
"verified": true
},
"media": [],
"counts": {
"likes": 1652,
"replies": 114,
"reposts": 382,
"views": 350188
},
"lane": "read",
"pct": 79,
"kind": "data",
"answers": {
"r_specific": 0.88,
"r_new": 0.74,
"r_bait": 0.03,
"r_promo": 0.02,
"r_platitude": 0.02,
"r_reply_room": 0.66,
"farm": 0
}
}
],
"receipt": {
"posts": 34,
"questions_answered": 272,
"ms": 2637,
"usd": 0.0029
}
},
"meta": {
"credits_charged": 2,
"account_id": "1178367350552305665"
}
}Authorizations
A SuperX API key ("sxk_..."), created in the SuperX app under Account > API / MCP / CLI. Keys are server-side secrets.
Body
What to search for, on one line: a topic, a phrase, a hashtag, or a search expression with quotes or operators. A plain multi-word query is also searched as an exact phrase.
2 - 80How far back to search, in days.
1 <= x <= 7