GetXAPI
Account

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.

EndpointWhat it does
POST /feedbackOpen a report
GET /feedbackSee 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

POST/feedback

Body

FieldRequiredNotes
typeyesbug when something we already offer misbehaves. missing_capability when you need data or an action we do not expose. idea for anything else
titleyesA single line, up to 120 characters. Say what is wrong, not "help"
detailsyesUp 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
areanoWhich endpoint or feature, e.g. user/followers or monitoring. Up to 80 characters
evidencenoA small JSON object of identifiers we can look up: tweet ids, user ids, status codes, timestamps, your client version. Up to 4 KB
clientnoThe 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

StatusWhen
400A required field is missing, a value is too long, or type is not one of the three
401No API key, or an invalid one
429Over 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

GET/feedback

Newest first. Use it to find an id you did not save, or to check whether something was already reported before opening a duplicate.

Query

ParameterNotes
statusOnly show reports in one state: new, triaged, shipped, or declined
limitHow 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

GET/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

statusMeaning
newWe have it, nobody has read it yet
triagedRead, understood, and on the list
shippedDone. The fix or the feature is live
declinedWe 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"])

On this page