curl --request GET \
--url https://api.superx.so/v1/audience/{kind} \
--header 'Authorization: Bearer <token>'import requests
url = "https://api.superx.so/v1/audience/{kind}"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://api.superx.so/v1/audience/{kind}', 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/audience/{kind}",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://api.superx.so/v1/audience/{kind}"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("Authorization", "Bearer <token>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://api.superx.so/v1/audience/{kind}")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.superx.so/v1/audience/{kind}")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["Authorization"] = 'Bearer <token>'
response = http.request(request)
puts response.read_body{
"data": [
{
"id": "44196397001234567",
"x_user_id": "44196397001234567",
"username": "activefan",
"name": "Sam Porter",
"avatar_url": "https://pbs.twimg.com/profile_images/example3.jpg",
"location": "Lisbon",
"followers_count": 3120,
"following_count": 480,
"engaged_count": 12,
"source": "followers",
"added_at": "2026-08-30T09:14:00.000Z",
"icp_score": null,
"icp_rationale": null,
"can_dm": true
}
],
"meta": {
"kind": "followers",
"account_id": "9HVHDe4WsJfJcR5SFauMD",
"x_account_id": "1178367350552305665",
"synced_count": 13270,
"status": "complete",
"backfill_cap": 25000,
"is_capped": false,
"window_days": null
},
"pagination": {
"limit": 50,
"has_more": true,
"next_cursor": "MTc1NjU0NDA0MDAwMDo0NDE5NjM5NzAwMTIzNDU2Nw"
}
}{
"error": {
"code": "invalid_parameter",
"message": "since must be a UTC ISO-8601 timestamp"
}
}{
"error": {
"code": "invalid_api_key",
"message": "Unknown or revoked API key"
}
}{
"error": "subscription_required: The SuperX API requires an active subscription"
}{
"error": {
"code": "account_not_found",
"message": "No account with that id belongs to this key"
}
}{
"error": {
"code": "rate_limited",
"message": "Rate limit exceeded for the Pro plan (30 requests/min). Upgrade for higher limits.",
"retry_after": 42
}
}{
"error": {
"code": "internal_error",
"message": "Failed to fetch posts"
}
}{
"error": {
"code": "accounts_unavailable",
"message": "Account information is temporarily unavailable. Try again shortly."
}
}Read an audience list
A page of the account’s followers, following, repliers or reposters from SuperX’s synced snapshot.
These four are the system lists in the app’s Contacts tab. They live
in SuperX’s own audience store rather than in the contact lists you
create, which is why /v1/contact-lists/{id}/members will not read
them and this endpoint exists.
Paging is by CURSOR, not page number: pass pagination.next_cursor
back as cursor to continue. A cursor points at the last row of the
page you were given, so new rows arriving mid-walk never shift the
pages you already read. There is no total; meta.synced_count is
the size of the whole list.
followers and following come from the follow graph SuperX syncs
for the account, so meta reports the sync status, the plan’s
backfill_cap and whether the account is deeper than that cap.
repliers and reposters are a rolling 90-day window
(meta.window_days), so someone whose last reply ages past 90 days
drops out and reappears on their next reply.
engaged_count is replies plus reposts in the last 90 days for the
follow lists, and this list’s own action count for repliers and
reposters. icp_score and icp_rationale are always null here:
scoring belongs to signal-agent deposits, not to the snapshot.
curl --request GET \
--url https://api.superx.so/v1/audience/{kind} \
--header 'Authorization: Bearer <token>'import requests
url = "https://api.superx.so/v1/audience/{kind}"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://api.superx.so/v1/audience/{kind}', 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/audience/{kind}",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://api.superx.so/v1/audience/{kind}"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("Authorization", "Bearer <token>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://api.superx.so/v1/audience/{kind}")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.superx.so/v1/audience/{kind}")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["Authorization"] = 'Bearer <token>'
response = http.request(request)
puts response.read_body{
"data": [
{
"id": "44196397001234567",
"x_user_id": "44196397001234567",
"username": "activefan",
"name": "Sam Porter",
"avatar_url": "https://pbs.twimg.com/profile_images/example3.jpg",
"location": "Lisbon",
"followers_count": 3120,
"following_count": 480,
"engaged_count": 12,
"source": "followers",
"added_at": "2026-08-30T09:14:00.000Z",
"icp_score": null,
"icp_rationale": null,
"can_dm": true
}
],
"meta": {
"kind": "followers",
"account_id": "9HVHDe4WsJfJcR5SFauMD",
"x_account_id": "1178367350552305665",
"synced_count": 13270,
"status": "complete",
"backfill_cap": 25000,
"is_capped": false,
"window_days": null
},
"pagination": {
"limit": 50,
"has_more": true,
"next_cursor": "MTc1NjU0NDA0MDAwMDo0NDE5NjM5NzAwMTIzNDU2Nw"
}
}{
"error": {
"code": "invalid_parameter",
"message": "since must be a UTC ISO-8601 timestamp"
}
}{
"error": {
"code": "invalid_api_key",
"message": "Unknown or revoked API key"
}
}{
"error": "subscription_required: The SuperX API requires an active subscription"
}{
"error": {
"code": "account_not_found",
"message": "No account with that id belongs to this key"
}
}{
"error": {
"code": "rate_limited",
"message": "Rate limit exceeded for the Pro plan (30 requests/min). Upgrade for higher limits.",
"retry_after": 42
}
}{
"error": {
"code": "internal_error",
"message": "Failed to fetch posts"
}
}{
"error": {
"code": "accounts_unavailable",
"message": "Account information is temporarily unavailable. Try again shortly."
}
}Authorizations
A SuperX API key ("sxk_..."), created in the SuperX app under Account > API / MCP / CLI. Keys are server-side secrets.
Path Parameters
followers, following, repliers, reposters Query Parameters
Account to act on, from GET /v1/accounts. Defaults to your main account. An id outside your accounts returns 404 account_not_found.
next_cursor from the previous page. Omit for the first page.
1 <= x <= 100Response
A page of the audience.
Show child attributes
Show child attributes
The state of the whole audience list, not of this page.
Show child attributes
Show child attributes
Keyset pagination. next_cursor is present only when has_more is
true; pass it back as cursor to read the next page. Cursors are
opaque and are not valid across different queries.
Show child attributes
Show child attributes