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

# Twitter post monitor list & tracked post metrics

> List up to 200 post monitors per page with each post, author, event types, active state & 6 metrics with gains since tracking began. Listing monitors is free.

**200**

```json theme={null}
{
  "monitors": [],
  "total": 0,
  "hasMore": false
}
```

**400**

```json theme={null}
{
  "error": "invalid_input",
  "message": "Invalid input. Check the request body."
}
```

**401**

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

**403**

```json theme={null}
{
  "error": "forbidden",
  "message": "This API key calls paid X read routes only, such as GET /api/v1/x/tweets/search. Create a Full access key at dashboard.xquik.com/account?tab=api-keys to call this route."
}
```

**429**

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

> For the complete documentation index, see [llms.txt](/llms.txt).

List every post monitor on your account. Each row holds the post, its author,
its event types & its 6 metrics. Each metric shows its current value & its gain
since tracking began.

**Free.** This endpoint does not consume credits.

```bash cURL theme={null}
curl "https://xquik.com/api/v1/monitors/posts?limit=50" \
  -H "x-api-key: xq_YOUR_KEY_HERE" |
  jq -c '.monitors[] | {
    post_monitor_id: .id,
    post_url: .postUrl,
    author_username: .authorUsername,
    is_active: .isActive,
    paused_reason: (.pausedReason // null),
    likes: .metrics.likes.current,
    like_gain: .metrics.likes.gain
  }'
```

```javascript Node.js theme={null}
const response = await fetch("https://xquik.com/api/v1/monitors/posts?limit=50", {
  headers: { "x-api-key": "xq_YOUR_KEY_HERE" },
});
const page = await response.json();
for (const monitor of page.monitors) {
  const row = {
    post_monitor_id: monitor.id,
    post_url: monitor.postUrl,
    author_username: monitor.authorUsername,
    is_active: monitor.isActive,
    paused_reason: monitor.pausedReason ?? null,
    likes: monitor.metrics.likes.current,
    like_gain: monitor.metrics.likes.gain,
  };
  process.stdout.write(`${JSON.stringify(row)}\n`);
}
```

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

response = requests.get(
    "https://xquik.com/api/v1/monitors/posts",
    headers={"x-api-key": "xq_YOUR_KEY_HERE"},
    params={"limit": 50},
)
page = response.json()
for monitor in page["monitors"]:
    row = {
        "post_monitor_id": monitor["id"],
        "post_url": monitor["postUrl"],
        "author_username": monitor["authorUsername"],
        "is_active": monitor["isActive"],
        "paused_reason": monitor.get("pausedReason"),
        "likes": monitor["metrics"]["likes"]["current"],
        "like_gain": monitor["metrics"]["likes"]["gain"],
    }
    print(json.dumps(row))
```

Each example prints 1 row per monitor. Pass `nextCursor` as `cursor` until
`hasMore` is `false`.

## Review every tracked post

| Question | Field | Next step |
| - | - | - |
| Which post is this? | `postUrl` & `authorUsername` | Open the post before you change the monitor. |
| Is it still billing? | `isActive` & `nextBillingAt` | Pause monitors nobody reads. |
| Did Xquik pause it? | `pausedReason` | Add credits, or delete monitors of deleted posts. |
| How far has engagement moved? | `metrics.*.gain` | Read hourly gains for the trend. |

A monitor paused with `insufficient_credits` resumes once you add credits &
turn it on. `x_post_deleted`, `x_post_protected` & `x_post_unavailable` mean
X stopped showing the post.

## Headers

**x-api-key** `string` *required*

Your API key. Session cookie authentication is also supported. Generate a key from the [dashboard](https://dashboard.xquik.com/en/account?tab=api-keys).

## Query parameters

**limit** `integer`

Monitors per page, from 1 to 200. Default `200`.

**cursor** `string`

The previous page's `nextCursor`. The `after` alias also works.

## Response

### 200 OK

**monitors** `object[]`

Post monitors, each shaped like the [Get Post Monitor](/api-reference/monitors/get-post.md) response.

**total** `number`

Post monitors on this page.

**hasMore** `boolean`

`true` when another page exists.

**nextCursor** `string`

Cursor for the next page. Present when `hasMore` is `true`.

### 400 Invalid input

`limit` or `cursor` is invalid. Send a `nextCursor` value unchanged.

### 401 Unauthenticated

Missing or invalid API key.

### 429 Rate limited

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

> [!NOTE]
>
> **Related.** [Create Post Monitor](/api-reference/monitors/create-post.md), [Get Post Monitor](/api-reference/monitors/get-post.md), [Post Monitor Metrics](/api-reference/monitors/post-metrics.md), or [List Events](/api-reference/events/list.md).


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