curl --request POST \
--url https://api.superx.so/v1/signals/leads/{id}/feedback \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"feedback": "fit"
}
'import requests
url = "https://api.superx.so/v1/signals/leads/{id}/feedback"
payload = { "feedback": "fit" }
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({feedback: 'fit'})
};
fetch('https://api.superx.so/v1/signals/leads/{id}/feedback', 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/signals/leads/{id}/feedback",
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([
'feedback' => 'fit'
]),
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/signals/leads/{id}/feedback"
payload := strings.NewReader("{\n \"feedback\": \"fit\"\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/signals/leads/{id}/feedback")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"feedback\": \"fit\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.superx.so/v1/signals/leads/{id}/feedback")
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 \"feedback\": \"fit\"\n}"
response = http.request(request)
puts response.read_body{
"data": {
"id": 4821,
"feedback": "fit",
"feedback_at": "2026-09-07T10:00:00.000Z"
}
}{
"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": {
"code": "insufficient_scope",
"message": "This API key is read-only. Create a key with the write scope to use this endpoint."
}
}{
"error": {
"code": "lead_not_found",
"message": "No lead with that id belongs to this account. List leads at /v1/signals/leads."
}
}{
"error": {
"code": "rate_limited",
"message": "Rate limit exceeded for the Pro plan (30 requests/min). Upgrade for higher limits.",
"retry_after": 42
}
}{
"error": {
"code": "upstream_error",
"message": "Failed to fetch scheduled posts. Try again shortly."
}
}{
"error": {
"code": "upstream_unavailable",
"message": "The scheduling service is temporarily unavailable. Retry with the same Idempotency-Key."
}
}Set feedback on a lead
Record the account’s verdict on one lead - fit, not_fit, or
null to clear it.
The id is the numeric LEAD id from GET /v1/signals/leads, not the
person’s X user id: the same person can be a lead of two agents with
a different verdict on each. The verdict is what the scorer’s
examples and the lead sweep learn from, so it is worth recording on
leads you act on, and it is mirrored onto the person’s row in the
agent’s destination contact list. It reads back as feedback /
feedback_at on GET /v1/signals/leads.
Naturally idempotent (the verdict is a value, not a counter), so
there is no Idempotency-Key support. Works for your main account or
any account linked to it (account_id); accounts shared with you are
read-only.
curl --request POST \
--url https://api.superx.so/v1/signals/leads/{id}/feedback \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"feedback": "fit"
}
'import requests
url = "https://api.superx.so/v1/signals/leads/{id}/feedback"
payload = { "feedback": "fit" }
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({feedback: 'fit'})
};
fetch('https://api.superx.so/v1/signals/leads/{id}/feedback', 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/signals/leads/{id}/feedback",
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([
'feedback' => 'fit'
]),
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/signals/leads/{id}/feedback"
payload := strings.NewReader("{\n \"feedback\": \"fit\"\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/signals/leads/{id}/feedback")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"feedback\": \"fit\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.superx.so/v1/signals/leads/{id}/feedback")
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 \"feedback\": \"fit\"\n}"
response = http.request(request)
puts response.read_body{
"data": {
"id": 4821,
"feedback": "fit",
"feedback_at": "2026-09-07T10:00:00.000Z"
}
}{
"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": {
"code": "insufficient_scope",
"message": "This API key is read-only. Create a key with the write scope to use this endpoint."
}
}{
"error": {
"code": "lead_not_found",
"message": "No lead with that id belongs to this account. List leads at /v1/signals/leads."
}
}{
"error": {
"code": "rate_limited",
"message": "Rate limit exceeded for the Pro plan (30 requests/min). Upgrade for higher limits.",
"retry_after": 42
}
}{
"error": {
"code": "upstream_error",
"message": "Failed to fetch scheduled posts. Try again shortly."
}
}{
"error": {
"code": "upstream_unavailable",
"message": "The scheduling service is temporarily unavailable. Retry with the same Idempotency-Key."
}
}Authorizations
A SuperX API key ("sxk_..."), created in the SuperX app under Account > API / MCP / CLI. Keys are server-side secrets.
Path Parameters
The lead's numeric id (from GET /v1/signals/leads).
Body
fit = a good lead, not_fit = a bad one, null clears the verdict.
fit, not_fit, null Any account you own, meaning your main account (the default when omitted) or one linked to it. An account shared with you returns 403 writes_main_account_only.
Response
The stored verdict.
Show child attributes
Show child attributes