Feedback
Tell us when something breaks or when you need an endpoint we do not have, straight from your code or your AI agent. Free, no credits used.
Hit a broken endpoint, a wrong field, or a gap we should fill? Send it to us from wherever you are: a curl, your own code, or the AI agent you are building with. Every report is tied to your account, so we can follow up, and you can check what happened to it at any time.
| Endpoint | What it does |
|---|---|
POST /feedback | Open a report |
GET /feedback | See your reports and what state each one is in |
GET /feedback/{id} | Look up one report |
All three are free and never touch your credits. They take the same Authorization: Bearer <API_KEY> header as everything else (x-api-key works too). To keep the inbox usable there is a soft ceiling of 10 calls a minute across the three, and 50 new reports a day per account.
If you use the GetXAPI MCP server, your agent already has these as send_feedback, list_feedback, and get_feedback_status. Claude Code, Cursor, and similar tools will offer to file a report when a GetXAPI call fails on them, and ask you first.
Open a report
/feedbackBody
| Field | Required | Notes |
|---|---|---|
type | yes | bug when something we already offer misbehaves. missing_capability when you need data or an action we do not expose. idea for anything else |
title | yes | A single line, up to 120 characters. Say what is wrong, not "help" |
details | yes | Up to 8000 characters. The more of this you include, the faster we can act: the exact request, the response you got, the response you expected, and how often it happens |
area | no | Which endpoint or feature, e.g. user/followers or monitoring. Up to 80 characters |
evidence | no | A small JSON object of identifiers we can look up: tweet ids, user ids, status codes, timestamps, your client version. Up to 4 KB |
client | no | The tool sending the report, e.g. getxapi-mcp/0.1.1 or acme-crawler/3.2. Up to 120 characters |
Keep secrets out of it. Auth tokens, cookies, proxy strings, and passwords do not belong in details or evidence; we do not need them to reproduce a problem.
Response
201 Created
{
"id": "7c9e6679-7425-40de-944b-e07fc1f90ae7",
"status": "new",
"created_at": "2026-09-05T10:15:00.000Z"
}Hang on to id if you want to look the report up later, though GET /feedback will always find it for you.
Errors
| Status | When |
|---|---|
400 | A required field is missing, a value is too long, or type is not one of the three |
401 | No API key, or an invalid one |
429 | Over 10 calls in the last minute, or 50 reports today. The Retry-After header says how long to wait |
Try it
curl -X POST "https://api.getxapi.com/feedback" \
-H "Authorization: Bearer API_KEY" \
-H "Content-Type: application/json" \
-d '{
"type": "bug",
"title": "user/followers stops after ~800 results for large accounts",
"details": "GET /twitter/user/followers?userName=nasa pages fine until roughly the 40th cursor, then returns has_more: false with an empty list. The account has 90M followers. Reproduced 3 times between 09:00 and 09:30 UTC.",
"area": "user/followers",
"evidence": { "userName": "nasa", "last_cursor": "DAABCgABG...", "pages_received": 40 },
"client": "acme-crawler/3.2"
}'const res = await fetch("https://api.getxapi.com/feedback", {
method: "POST",
headers: {
Authorization: "Bearer API_KEY",
"Content-Type": "application/json",
},
body: JSON.stringify({
type: "missing_capability",
title: "Need the pinned tweet id on user/info",
details: "I show a profile card with the pinned tweet. Today that costs two calls: user/info, then user/tweets and a scan for isPinned. A pinned_tweet_id field on user/info would make it one.",
area: "user/info",
client: "profile-cards/1.4",
}),
});
const { id } = await res.json();import requests
r = requests.post(
"https://api.getxapi.com/feedback",
headers={"Authorization": "Bearer API_KEY"},
json={
"type": "idea",
"title": "Let trends accept a city name, not only a country",
"details": "trends?country=India works. trends?location=Mumbai returns 400 even though Mumbai is in trends/locations. Matching city names would save a lookup.",
"area": "trends",
},
)
print(r.status_code, r.json())See your reports
/feedbackNewest first. Use it to find an id you did not save, or to check whether something was already reported before opening a duplicate.
Query
| Parameter | Notes |
|---|---|
status | Only show reports in one state: new, triaged, shipped, or declined |
limit | How many to return, 1 to 50. Default 20 |
Response
{
"count": 2,
"feedback": [
{
"id": "7c9e6679-7425-40de-944b-e07fc1f90ae7",
"type": "bug",
"title": "user/followers stops after ~800 results for large accounts",
"area": "user/followers",
"status": "shipped",
"response": "Pagination past page 40 is fixed as of today. Thanks for the cursor.",
"created_at": "2026-09-05T10:15:00.000Z",
"updated_at": "2026-09-06T08:02:11.000Z"
},
{
"id": "1b4e28ba-2fa1-4d3b-9c6e-1f0a2b3c4d5e",
"type": "missing_capability",
"title": "Need the pinned tweet id on user/info",
"area": "user/info",
"status": "new",
"response": null,
"created_at": "2026-09-04T18:40:12.000Z",
"updated_at": "2026-09-04T18:40:12.000Z"
}
]
}You only ever see your own account's reports.
curl "https://api.getxapi.com/feedback?status=shipped" \
-H "Authorization: Bearer API_KEY"const res = await fetch("https://api.getxapi.com/feedback?limit=5", {
headers: { Authorization: "Bearer API_KEY" },
});
const { feedback } = await res.json();import requests
r = requests.get(
"https://api.getxapi.com/feedback",
params={"status": "new"},
headers={"Authorization": "Bearer API_KEY"},
)
print(r.json()["count"])Look up one report
/feedback/{id}Same fields as the list, for a single id. An id that belongs to another account, or does not exist, comes back as 404.
What the states mean
status | Meaning |
|---|---|
new | We have it, nobody has read it yet |
triaged | Read, understood, and on the list |
shipped | Done. The fix or the feature is live |
declined | We are not going to do this one. response explains |
response is a short note from us, when there is something worth saying. updated_at moves whenever the state or the note changes.
curl "https://api.getxapi.com/feedback/7c9e6679-7425-40de-944b-e07fc1f90ae7" \
-H "Authorization: Bearer API_KEY"const res = await fetch(
"https://api.getxapi.com/feedback/7c9e6679-7425-40de-944b-e07fc1f90ae7",
{ headers: { Authorization: "Bearer API_KEY" } },
);
const { status, response } = await res.json();import requests
r = requests.get(
"https://api.getxapi.com/feedback/7c9e6679-7425-40de-944b-e07fc1f90ae7",
headers={"Authorization": "Bearer API_KEY"},
)
print(r.json()["status"])