> ## Documentation Index
> Fetch the complete documentation index at: https://docs.xquik.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Remove follower

> Remove an X follower from one of your connected accounts

<blockquote className="agent-llms-directive">
  For the complete documentation index, see <a href="/llms.txt">llms.txt</a>.
</blockquote>

<Callout icon="coins" color="#5c3327">
  **10 credits per call** · [All plans](https://xquik.com/#pricing) from \$0.00012/credit
</Callout>

<CodeGroup>
  ```bash cURL theme={null}
  curl -X POST https://xquik.com/api/v1/x/users/44196397/remove-follower \
    -H "x-api-key: xq_YOUR_KEY_HERE" \
    -H "Idempotency-Key: remove-follower-44196397" \
    -H "Content-Type: application/json" \
    -d '{
      "account": "myxaccount"
    }' | jq
  ```

  ```javascript Node.js theme={null}
  const response = await fetch("https://xquik.com/api/v1/x/users/44196397/remove-follower", {
    method: "POST",
    headers: {
      "x-api-key": "xq_YOUR_KEY_HERE",
      "Idempotency-Key": "remove-follower-44196397",
      "Content-Type": "application/json",
    },
    body: JSON.stringify({
      account: "myxaccount",
    }),
  });
  const data = await response.json();
  ```

  ```python Python theme={null}
  import requests

  response = requests.post(
      "https://xquik.com/api/v1/x/users/44196397/remove-follower",
      headers={
          "x-api-key": "xq_YOUR_KEY_HERE",
          "Idempotency-Key": "remove-follower-44196397",
      },
      json={
          "account": "myxaccount",
      },
  )
  data = response.json()
  ```

  ```go Go theme={null}
  package main

  import (
      "bytes"
      "encoding/json"
      "fmt"
      "net/http"
  )

  func main() {
      body, _ := json.Marshal(map[string]interface{}{
          "account": "myxaccount",
      })

      req, err := http.NewRequest("POST", "https://xquik.com/api/v1/x/users/44196397/remove-follower", bytes.NewReader(body))
      if err != nil {
          panic(err)
      }
      req.Header.Set("x-api-key", "xq_YOUR_KEY_HERE")
      req.Header.Set("Idempotency-Key", "remove-follower-44196397")
      req.Header.Set("Content-Type", "application/json")

      resp, err := http.DefaultClient.Do(req)
      if err != nil {
          panic(err)
      }
      defer resp.Body.Close()

      var data map[string]interface{}
      if err := json.NewDecoder(resp.Body).Decode(&data); err != nil {
          panic(err)
      }
      fmt.Println(data)
  }
  ```
</CodeGroup>

## Headers

<ParamField header="x-api-key" type="string" required>
  Your API key. Session cookie authentication is also supported. Generate a key from the [dashboard](https://xquik.com/dashboard).
</ParamField>

<ParamField header="Idempotency-Key" type="string" required>
  Unique key for this intended write. Reuse it only for an exact network replay.
</ParamField>

<ParamField header="Content-Type" type="string" required>
  Must be `application/json`.
</ParamField>

## Path parameters

<ParamField path="id" type="string" required>
  The X user ID of the follower to remove.
</ParamField>

## Body

<ParamField body="account" type="string" required>
  X username or account ID of your connected account whose follower list should be updated.
</ParamField>

## Response

## Durable lifecycle responses

<Warning>
  Send one unique `Idempotency-Key` per intended write. Reuse it only for the
  exact same account, target, payload, and media.
</Warning>

<Note>
  Store the `X-Request-Id` response header with every action record.
</Note>

1. Store `id`, `request.hash`, `account`, `target`, and `billing`.
2. Stop only when `terminal` is `true`.
3. Poll `statusUrl` after `Retry-After` or `pollAfterMs`.
4. Retry only when `safeToRetry` is `true`.
5. Use a new key only for a newly approved write.

<Tabs>
  <Tab title="200 Terminal">
    The action reached `success`, `failed`, or `expired`. Trust `terminal`,
    `result`, `billing`, and `nextAction` over the HTTP class.

    ```json theme={null}
    {
      "object": "x_write_action",
      "id": "xwa_01JY6V7F8M9N0P1Q2R3S4T5U6V",
      "status": "success",
      "terminal": true,
      "safeToRetry": false,
      "billing": { "status": "charged", "chargedCredits": "10" },
      "result": { "confirmed": true },
      "nextAction": null
    }
    ```
  </Tab>

  <Tab title="202 Active">
    The action remains `accepted`, `dispatching`, or `pending_confirmation`.
    Store it and poll `statusUrl` after `Retry-After` or `pollAfterMs`. Never
    create another write while `terminal` is `false`.
  </Tab>

  <Tab title="400 Invalid Input">
    Fix the named field. Generate a new key for the corrected write.
  </Tab>

  <Tab title="401 Unauthenticated">
    Supply a valid API key or session. Do not retry unchanged.
  </Tab>

  <Tab title="402 Billing Required">
    Follow `nextAction`. Do not create another write before funding completes.
  </Tab>

  <Tab title="403 Account Blocked">
    Follow `nextAction` to reconnect or resolve the account restriction.
  </Tab>

  <Tab title="409 Idempotency conflict">
    The `Idempotency-Key` belongs to different input. Keep the original action
    unchanged. Use a new key only for a separately approved write.
  </Tab>

  <Tab title="422 Write Rejected">
    Inspect `error`, `details`, and `nextAction`. Fix the request before retrying.
  </Tab>

  <Tab title="429 Rate Limited">
    Wait for `Retry-After`. Preserve the same key for exact replay.
  </Tab>

  <Tab title="500 Write Failed">
    Inspect the durable action. Retry only when `safeToRetry` is `true`.
  </Tab>

  <Tab title="503 Write Unavailable">
    Inspect the durable action. Poll while `terminal` is `false`.
  </Tab>
</Tabs>

<ResponseField name="object" type="string">Always `x_write_action`.</ResponseField>
<ResponseField name="id" type="string">Durable action ID.</ResponseField>
<ResponseField name="writeActionId" type="string">Compatibility alias for `id`.</ResponseField>
<ResponseField name="action" type="string">Exact write operation.</ResponseField>
<ResponseField name="status" type="string">Current lifecycle status.</ResponseField>
<ResponseField name="terminal" type="boolean">Whether polling can stop.</ResponseField>
<ResponseField name="retryable" type="boolean">Whether a later attempt could succeed.</ResponseField>
<ResponseField name="safeToRetry" type="boolean">Whether a new attempt is safe.</ResponseField>
<ResponseField name="statusUrl" type="string">Relative polling URL.</ResponseField>
<ResponseField name="pollAfterMs" type="number | null">Recommended polling delay.</ResponseField>
<ResponseField name="charged" type="boolean">Whether billing settled as charged.</ResponseField>
<ResponseField name="chargedCredits" type="string">Settled credits charged.</ResponseField>
<ResponseField name="billing" type="object">Planned and settled billing state.</ResponseField>
<ResponseField name="request" type="object">Stable hash and exact sanitized payload.</ResponseField>
<ResponseField name="account" type="object">Exact connected account selected.</ResponseField>
<ResponseField name="target" type="object | null">Exact target type and ID.</ResponseField>
<ResponseField name="targetId" type="string | null">Compatibility target ID.</ResponseField>
<ResponseField name="result" type="object | null">Confirmed result or desired state.</ResponseField>
<ResponseField name="nextAction" type="object | null">Required poll, retry, or verification step.</ResponseField>
<ResponseField name="requestHash" type="string">Stable request fingerprint.</ResponseField>
<ResponseField name="requestId" type="string">Correlation ID.</ResponseField>
<ResponseField name="idempotent" type="boolean">Whether this response replayed an existing action.</ResponseField>
<ResponseField name="error" type="string">Machine-readable error code.</ResponseField>
<ResponseField name="message" type="string">Actionable status or error message.</ResponseField>
<ResponseField name="sendDispatched" type="boolean">Whether dispatch occurred.</ResponseField>
<ResponseField name="sendDispatchedAt" type="string">ISO 8601 dispatch time.</ResponseField>
<ResponseField name="createdAt" type="string">ISO 8601 creation time.</ResponseField>
<ResponseField name="updatedAt" type="string">ISO 8601 latest update time.</ResponseField>
<ResponseField name="completedAt" type="string">ISO 8601 terminal time.</ResponseField>
<ResponseField name="expiresAt" type="string">Nonterminal resolution deadline.</ResponseField>
<ResponseField name="confirmedAt" type="string">ISO 8601 confirmation time.</ResponseField>
<ResponseField name="confirmationCheckedAt" type="string">ISO 8601 latest confirmation check.</ResponseField>
<ResponseField name="confirmationAttempts" type="number">Confirmation attempt count.</ResponseField>
<ResponseField name="tweetId" type="string">Confirmed tweet ID when available.</ResponseField>
<ResponseField name="messageId" type="string">Confirmed direct message ID when available.</ResponseField>
<ResponseField name="mediaId" type="string">Confirmed media ID when available.</ResponseField>
<ResponseField name="mediaUrl" type="string">Public media URL when available.</ResponseField>
<ResponseField name="communityId" type="string">Confirmed community ID when available.</ResponseField>
<ResponseField name="communityName" type="string">Confirmed community name when available.</ResponseField>
<ResponseField name="resultId" type="string">Compatibility result ID.</ResponseField>
<ResponseField name="media" type="object">Media details when used.</ResponseField>
<ResponseField name="details" type="object">Structured recovery context.</ResponseField>
<ResponseField name="success" type="boolean">Whether status is `success`.</ResponseField>
