> ## 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.

# Get a tweet draft by ID with the Xquik API

> Retrieve one Xquik tweet draft by ID with saved text, optional topic, optional goal, creation time & update time. Handle 400, 401, 404 & 429 API errors.

<Panel>
  <Tabs defaultTabIndex={0} sync={false}>
    <Tab title="200" id="response-drafts-get-200">
      ```json theme={null}
      {
        "id": "42",
        "text": "AI is the future of productivity",
        "topic": "AI trends",
        "goal": "engagement",
        "createdAt": "2025-01-15T12:00:00Z",
        "updatedAt": "2025-01-16T09:30:00Z"
      }
      ```
    </Tab>

    <Tab title="400" id="response-drafts-get-400">
      ```json theme={null}
      {
        "error": "invalid_input",
        "message": "Invalid input. Check the request body."
      }
      ```
    </Tab>

    <Tab title="401" id="response-drafts-get-401">
      ```json theme={null}
      {
        "error": "unauthenticated",
        "message": "Authentication required. Provide a valid API key or bearer token."
      }
      ```
    </Tab>

    <Tab title="404" id="response-drafts-get-404">
      ```json theme={null}
      {
        "error": "not_found",
        "message": "Resource not found."
      }
      ```
    </Tab>

    <Tab title="429" id="response-drafts-get-429">
      ```json theme={null}
      {
        "error": "rate_limit_exceeded",
        "message": "Too many requests. Try again later.",
        "retryAfter": 60
      }
      ```
    </Tab>
  </Tabs>
</Panel>

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

## Retrieve one tweet draft by ID

Retrieve one saved tweet draft from your Xquik account. The response contains
its ID, text, optional topic, optional goal, and timestamps. It does not return
thread order, media attachments, reply targets, or publishing results.

Use the ID returned by [Create Draft](/api-reference/drafts/create) or
[List Drafts](/api-reference/drafts/list). This route reads that record without
creating, changing, publishing, or deleting it.

Xquik drafts are separate from [X's native Unsent posts](https://help.x.com/en/using-x/how-to-post).
This endpoint cannot retrieve drafts stored inside the X compose interface.

<Callout icon="circle-check" color="#16a34a">
  **Free.** This endpoint does not consume credits.
</Callout>

<CodeGroup>
  ```bash cURL theme={null}
  curl --fail-with-body \
    https://xquik.com/api/v1/drafts/42 \
    --header "x-api-key: xq_YOUR_KEY_HERE" | jq
  ```

  ```javascript Node.js theme={null}
  const draftId = "42";
  const response = await fetch(`https://xquik.com/api/v1/drafts/${draftId}`, {
    method: "GET",
    headers: {
      "x-api-key": "xq_YOUR_KEY_HERE",
    },
  });
  const draft = await response.json();
  if (!response.ok) {
    throw new Error(`${response.status} ${draft.error}: ${draft.message}`);
  }

  console.log(draft.id, draft.text, draft.updatedAt);
  ```

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

  draft_id = "42"
  response = requests.get(
      f"https://xquik.com/api/v1/drafts/{draft_id}",
      headers={"x-api-key": "xq_YOUR_KEY_HERE"},
  )
  draft = response.json()
  if response.status_code != 200:
      raise RuntimeError(
          f'{response.status_code} {draft["error"]}: {draft["message"]}'
      )

  print(draft["id"], draft["text"], draft["updatedAt"])
  ```

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

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

  func main() {
      draftID := "42"
      req, err := http.NewRequest("GET", "https://xquik.com/api/v1/drafts/"+draftID, nil)
      if err != nil {
          panic(err)
      }
      req.Header.Set("x-api-key", "xq_YOUR_KEY_HERE")

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

      var draft map[string]interface{}
      if err := json.NewDecoder(resp.Body).Decode(&draft); err != nil {
          panic(err)
      }
      if resp.StatusCode != http.StatusOK {
          panic(fmt.Sprintf("%d %v: %v", resp.StatusCode, draft["error"], draft["message"]))
      }

      fmt.Println(draft["id"], draft["text"], draft["updatedAt"])
  }
  ```
</CodeGroup>

## Read the tweet draft fields

The API returns one draft object. It omits optional fields that you did
not supply during creation.

| Field | Meaning | Review use |
| - | - | - |
| `id` | Stable Xquik draft ID | Keep it for later retrieval or deletion. |
| `text` | Exact saved tweet text | Review this copy before publishing. |
| `topic` | Optional composition topic | Keep the intended subject. |
| `goal` | Optional composition goal | Check engagement, followers, authority, or conversation intent. |
| `createdAt` | ISO 8601 creation timestamp | Record when someone created the draft. |
| `updatedAt` | ISO 8601 update timestamp | Compare the returned record with a cached review copy. |

The `text` field contains one saved string. It can contain up to 25,000
characters. The `topic` field can contain up to 500 characters. The `goal`
value can be `engagement`, `followers`, `authority`, or `conversation`.

This response contains no public tweet ID. A draft remains private until a
separate X write request publishes approved text.

## Keep Xquik and native X drafts separate

Native X drafts appear inside the X compose interface. Native thread drafts can
contain several connected posts. Native posts can also include photos, GIFs,
or video.

An Xquik draft stores one text value plus optional composition context. It has
no thread sequence, media collection, reply target, or native X draft ID.

| Draft source | Retrieve it here? | Retrieval method |
| - | - | - |
| Xquik Create Draft API | Yes | Call `GET /drafts/{id}`. |
| Xquik List Drafts API | Yes | Copy an ID, then call this route. |
| X Unsent posts | No | Open the native X compose interface. |
| Published tweet or thread | No | Use an X tweet read endpoint. |

Do not send a public tweet ID to this route. Tweet IDs and Xquik draft IDs
identify different resources.

## Build a tweet draft review workflow

1. Save tweet text through `POST /drafts`.
2. Store the returned Xquik draft ID.
3. Retrieve the draft before human or agent review.
4. Compare its text, topic, goal, and timestamps.
5. Approve or reject the exact returned text.
6. Publish approved text through a separate X write route.
7. Delete the saved draft when retention rules allow it.

This route provides no edit operation. Create a new draft when approved text
must change. Keep the old ID until reviewers accept the replacement.

Use [Create Tweet](/api-reference/x-write/create-tweet) only after approval.
Reading a draft never sends text to followers or creates likes and replies.

## Recover from tweet draft lookup errors

| Status | Error | Cause | Fix |
| - | - | - | - |
| `200` | Draft object | The account owns the requested draft | Read the returned fields. |
| `400` | `invalid_id` | The path value is not a parseable draft ID | Copy an ID from Create Draft or List Drafts. |
| `401` | `unauthenticated` | The credential is missing or invalid | Replace the API key or bearer token. |
| `404` | `draft_not_found` | The draft is absent or belongs to another account | Verify the ID and authenticated account. |
| `429` | `rate_limit_exceeded` | Too many requests reached the route | Wait for `Retry-After`, then retry once. |

The route returns the same `404` for missing drafts and other-account IDs. Clients
cannot use it to discover another account's draft IDs.

Never retry `400`, `401`, or `404` without changing the request. Retry `429`
only after the server's delay.

## Tweet draft retrieval questions

### Where can I find an Xquik tweet draft?

Call List Drafts first. Copy the returned `id`, then request this endpoint.

### Can this API retrieve my native X drafts?

No. Native X drafts remain under Unsent posts. This route reads Xquik records
created through the draft API.

### Does one draft include a Twitter thread?

No. The response contains one text string. It includes no thread order or
connected-post collection.

### Does the response include media or reply targets?

No. The draft object contains no media, reply target, or tweet ID.

### Can this route publish or update the draft?

No. This route only reads the saved record. Create replacement text or publish
through separate endpoints.

### Can I retrieve a deleted draft?

No. A deleted draft returns `404`. Xquik provides no restore endpoint.

### Does retrieving a draft consume credits?

No. This authenticated lookup is free and consumes no Xquik credits.

## Path parameters

<ParamField path="id" type="string" required>
  The unique Xquik draft ID. Copy it from [Create Draft](/api-reference/drafts/create) or [List Drafts](/api-reference/drafts/list).
</ParamField>

## Headers

<ParamField header="x-api-key" type="string">
  Your Xquik API key. Generate one from the [dashboard](https://xquik.com/dashboard).
</ParamField>

<ParamField header="Authorization" type="string">
  An OAuth bearer token formatted as `Bearer YOUR_TOKEN`. Send this header or `x-api-key`, not both.
</ParamField>

## Response

### 200 OK

<ResponseField name="id" type="string">
  Unique draft ID.
</ResponseField>

<ResponseField name="text" type="string">
  The draft tweet text.
</ResponseField>

<ResponseField name="topic" type="string">
  Topic the tweet is about. Omitted if not set.
</ResponseField>

<ResponseField name="goal" type="string">
  Optimization goal. Omitted if not set.
</ResponseField>

<ResponseField name="createdAt" type="string">
  ISO 8601 creation timestamp.
</ResponseField>

<ResponseField name="updatedAt" type="string">
  ISO 8601 last update timestamp.
</ResponseField>

```json theme={null}
{
  "id": "42",
  "text": "Just shipped dark mode. What feature should we build next?",
  "topic": "product update",
  "goal": "conversation",
  "createdAt": "2026-02-24T10:30:00.000Z",
  "updatedAt": "2026-02-24T10:30:00.000Z"
}
```

### 400 Invalid ID

```json theme={null}
{ "error": "invalid_id", "message": "Invalid ID format." }
```

The provided draft ID is not a valid format.

### 401 Unauthenticated

```json theme={null}
{
  "error": "unauthenticated",
  "message": "Authentication required. Provide a valid API key or bearer token."
}
```

Missing or invalid API key.

### 404 Not found

```json theme={null}
{ "error": "draft_not_found", "message": "Draft not found." }
```

No draft exists with this ID, or it belongs to a different account.

### 429 Rate limited

```json theme={null}
{
  "error": "rate_limit_exceeded",
  "message": "Too many requests. Try again later.",
  "retryAfter": 1
}
```

Too many requests. Wait for the `Retry-After` header before retrying.

<Note>
  **Related.** [List Drafts](/api-reference/drafts/list) to see all your drafts, [Create Draft](/api-reference/drafts/create) to save a new one, or [Delete Draft](/api-reference/drafts/delete) to remove this draft.
</Note>


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.