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

# List monitors

> Retrieve all monitors for your account with tracked X accounts and event type configurations

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

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

<CodeGroup>
  ```bash cURL theme={null}
  curl -X GET https://xquik.com/api/v1/monitors \
    -H "x-api-key: xq_YOUR_KEY_HERE" | jq -c '.monitors[] | {
      monitor_id: .id,
      username,
      x_user_id: .xUserId,
      event_types: .eventTypes,
      is_active: .isActive,
      created_at: .createdAt,
      next_billing_at: .nextBillingAt,
      monitor_detail_endpoint: ("/api/v1/monitors/" + .id),
      events_endpoint: ("/api/v1/events?monitorId=" + .id),
      event_detail_endpoint_pattern: "/api/v1/events/{event_id}",
      webhooks_endpoint: "/api/v1/webhooks",
      deliveries_endpoint_pattern: "/api/v1/webhooks/{webhook_id}/deliveries"
    }'
  ```

  ```javascript Node.js theme={null}
  const response = await fetch("https://xquik.com/api/v1/monitors", {
    method: "GET",
    headers: {
      "x-api-key": "xq_YOUR_KEY_HERE",
    },
  });
  const payload = await response.json();
  for (const monitor of payload.monitors) {
    const monitorRow = {
      monitor_id: monitor.id,
      username: monitor.username,
      x_user_id: monitor.xUserId,
      event_types: monitor.eventTypes,
      is_active: monitor.isActive,
      created_at: monitor.createdAt,
      next_billing_at: monitor.nextBillingAt,
      monitor_detail_endpoint: `/api/v1/monitors/${monitor.id}`,
      events_endpoint: `/api/v1/events?monitorId=${monitor.id}`,
      event_detail_endpoint_pattern: "/api/v1/events/{event_id}",
      webhooks_endpoint: "/api/v1/webhooks",
      deliveries_endpoint_pattern: "/api/v1/webhooks/{webhook_id}/deliveries",
    };
    process.stdout.write(`${JSON.stringify(monitorRow)}\n`);
  }
  ```

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

  response = requests.get(
      "https://xquik.com/api/v1/monitors",
      headers={"x-api-key": "xq_YOUR_KEY_HERE"},
  )
  payload = response.json()
  for monitor in payload["monitors"]:
      monitor_row = {
          "monitor_id": monitor["id"],
          "username": monitor["username"],
          "x_user_id": monitor["xUserId"],
          "event_types": monitor["eventTypes"],
          "is_active": monitor["isActive"],
          "created_at": monitor["createdAt"],
          "next_billing_at": monitor["nextBillingAt"],
          "monitor_detail_endpoint": f"/api/v1/monitors/{monitor['id']}",
          "events_endpoint": f"/api/v1/events?monitorId={monitor['id']}",
          "event_detail_endpoint_pattern": "/api/v1/events/{event_id}",
          "webhooks_endpoint": "/api/v1/webhooks",
          "deliveries_endpoint_pattern": "/api/v1/webhooks/{webhook_id}/deliveries",
      }
      print(json.dumps(monitor_row))
  ```

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

  import (
      "encoding/json"
      "log"
      "net/http"
      "os"
  )

  type Monitor struct {
      ID            string   `json:"id"`
      Username      string   `json:"username"`
      XUserID       string   `json:"xUserId"`
      EventTypes    []string `json:"eventTypes"`
      IsActive      bool     `json:"isActive"`
      CreatedAt     string   `json:"createdAt"`
      NextBillingAt string   `json:"nextBillingAt"`
  }

  type MonitorListResponse struct {
      Monitors []Monitor `json:"monitors"`
      Total    int       `json:"total"`
  }

  type MonitorRow struct {
      DeliveriesEndpointPattern  string   `json:"deliveries_endpoint_pattern"`
      EventDetailEndpointPattern string   `json:"event_detail_endpoint_pattern"`
      EventsEndpoint             string   `json:"events_endpoint"`
      EventTypes                 []string `json:"event_types"`
      CreatedAt                  string   `json:"created_at"`
      IsActive                   bool     `json:"is_active"`
      MonitorDetailEndpoint      string   `json:"monitor_detail_endpoint"`
      MonitorID                  string   `json:"monitor_id"`
      NextBillingAt              string   `json:"next_billing_at"`
      Username                   string   `json:"username"`
      WebhooksEndpoint           string   `json:"webhooks_endpoint"`
      XUserID                    string   `json:"x_user_id"`
  }

  func main() {
      req, err := http.NewRequest("GET", "https://xquik.com/api/v1/monitors", nil)
      if err != nil {
          log.Fatal(err)
      }
      req.Header.Set("x-api-key", "xq_YOUR_KEY_HERE")

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

      var payload MonitorListResponse
      if err := json.NewDecoder(resp.Body).Decode(&payload); err != nil {
          log.Fatal(err)
      }
      encoder := json.NewEncoder(os.Stdout)
      for _, monitor := range payload.Monitors {
          row := MonitorRow{
              DeliveriesEndpointPattern:  "/api/v1/webhooks/{webhook_id}/deliveries",
              EventDetailEndpointPattern: "/api/v1/events/{event_id}",
              EventsEndpoint:             "/api/v1/events?monitorId=" + monitor.ID,
              EventTypes:                 monitor.EventTypes,
              CreatedAt:                  monitor.CreatedAt,
              IsActive:                   monitor.IsActive,
              MonitorDetailEndpoint:      "/api/v1/monitors/" + monitor.ID,
              MonitorID:                  monitor.ID,
              NextBillingAt:              monitor.NextBillingAt,
              Username:                   monitor.Username,
              WebhooksEndpoint:           "/api/v1/webhooks",
              XUserID:                    monitor.XUserID,
          }
          if err := encoder.Encode(row); err != nil {
              log.Fatal(err)
          }
      }
  }
  ```
</CodeGroup>

The Node.js, Python, and Go examples convert each account monitor into one
inventory row. Store `monitor_id`, `username`, `x_user_id`, `event_types`,
`is_active`, `next_billing_at`, `monitor_detail_endpoint`, `events_endpoint`,
`event_detail_endpoint_pattern`, `webhooks_endpoint`, and
`deliveries_endpoint_pattern` for backfills, support handoff, and webhook
delivery audits.

## Inventory handoff

Use `GET /monitors` after create, update, pause, or delete operations to rebuild
your account monitor inventory. The response returns up to 200 monitors ordered
by creation time and a `total` count for the returned set.

<CardGroup cols={2}>
  <Card title="Tracked Accounts" icon="users">
    Store each monitor's `id`, `username`, and `xUserId` with downstream CRM,
    warehouse, or queue records.
  </Card>

  <Card title="Detail Handoff" icon="file-search">
    Use [Get Monitor](/api-reference/monitors/get) with each `id` when a
    support workflow needs the latest event filter, active state, or billing
    checkpoint for one account monitor.
  </Card>

  <Card title="Active Billing" icon="activity">
    Filter monitors where `isActive` is `true`. Each active account monitor
    bills 21 credits per active monitor-hour; use `nextBillingAt` to schedule
    credit checks or pause stale alerts.
  </Card>

  <Card title="Webhook Alignment" icon="webhook">
    Compare each monitor's `eventTypes` with [List Webhooks](/api-reference/webhooks/list)
    before relying on signed alerts.
  </Card>

  <Card title="Event Backfill" icon="database">
    Use `id` as `monitorId` with [List Events](/api-reference/events/list) to
    audit stored account monitor events. Use returned event IDs with
    [Get Event](/api-reference/events/get) when a workflow needs the full tweet
    payload.
  </Card>

  <Card title="Delivery Audit" icon="link">
    Use [List Deliveries](/api-reference/webhooks/deliveries) for each webhook
    and join delivery `streamEventId` to event IDs. Do not use `x_event_id` as
    the delivery join key.
  </Card>

  <Card title="State Repair" icon="sliders-horizontal">
    Use [Update Monitor](/api-reference/monitors/update) to replace `eventTypes`
    or toggle `isActive`. Use [Delete Monitor](/api-reference/monitors/delete)
    only when the tracked account should stop permanently.
  </Card>
</CardGroup>

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

## Response

<Tabs>
  <Tab title="200 OK">
    <ResponseField name="monitors" type="object[]">Array of monitor objects.</ResponseField>
    <ResponseField name="monitors[].id" type="string">Unique monitor ID.</ResponseField>
    <ResponseField name="monitors[].username" type="string">Normalized X username.</ResponseField>
    <ResponseField name="monitors[].xUserId" type="string">Resolved X user ID.</ResponseField>
    <ResponseField name="monitors[].eventTypes" type="string[]">Subscribed event types.</ResponseField>
    <ResponseField name="monitors[].isActive" type="boolean">Whether the monitor is currently active.</ResponseField>
    <ResponseField name="monitors[].createdAt" type="string">ISO 8601 creation timestamp.</ResponseField>
    <ResponseField name="monitors[].nextBillingAt" type="string">Next hourly credit charge time for active monitor billing.</ResponseField>
    <ResponseField name="total" type="number">Total number of monitors.</ResponseField>

    ```json theme={null}
    {
      "monitors": [
        {
          "id": "7",
          "username": "elonmusk",
          "xUserId": "44196397",
          "eventTypes": ["tweet.new", "tweet.reply"],
          "isActive": true,
          "createdAt": "2026-02-24T10:30:00.000Z",
          "nextBillingAt": "2026-02-24T11:30:00.000Z"
        },
        {
          "id": "12",
          "username": "xquik_",
          "xUserId": "1849726401547751424",
          "eventTypes": ["tweet.new", "tweet.quote", "tweet.reply", "tweet.retweet"],
          "isActive": true,
          "createdAt": "2026-02-25T14:00:00.000Z",
          "nextBillingAt": "2026-02-25T15:00:00.000Z"
        }
      ],
      "total": 2
    }
    ```
  </Tab>

  <Tab title="401 Unauthenticated">
    ```json theme={null}
    { "error": "unauthenticated" }
    ```

    Missing or invalid API key.
  </Tab>

  <Tab title="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.
  </Tab>
</Tabs>

<Info>
  Returns up to 200 monitors. There is no pagination. [Contact support](mailto:support@xquik.com) if you need more.
</Info>

<Note>
  **Related:** [Create Monitor](/api-reference/monitors/create) to add a new monitor, [Get Monitor](/api-reference/monitors/get) to fetch one monitor, [List Events](/api-reference/events/list) to audit stored events, [Get Event](/api-reference/events/get) to inspect one event, [List Webhooks](/api-reference/webhooks/list) to compare subscriptions, or [List Deliveries](/api-reference/webhooks/deliveries) to audit webhook delivery status.
</Note>
