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

# List Cloud Browser Profiles

> List all saved cloud browser profiles for your account along with pagination metadata and your plan's saved-profile and concurrent-running allowances.

Retrieve every cloud browser profile saved under your account together with account-wide quota fields that tell you how many profiles you can save (`limit`), how many can run at the same time (`runningLimit`), and how many are currently occupying a running slot (`runningCount`). This endpoint accepts `x-api-key`, a session JWT in `Authorization: Bearer <token>`, or a dashboard session cookie.

<ParamField query="page" type="integer" default="1">
  Page number to retrieve. Defaults to `1`; invalid or non-positive values fall back to `1`. Maximum is `10000`.
</ParamField>

<ParamField query="pageSize" type="integer" default="10">
  Number of profiles per page. Defaults to `10`; invalid or non-positive values fall back to `10`. Maximum is `10`.
</ParamField>

## Response

<ResponseField name="ok" type="boolean">
  Always `true` on success.
</ResponseField>

<ResponseField name="data" type="array">
  List of saved cloud browser profile objects for the requested page.

  <Expandable title="Profile object fields">
    <ResponseField name="id" type="string (UUID)">
      Persistent profile identifier. Use this value in path parameters for start, stop, detail, and delete.
    </ResponseField>

    <ResponseField name="source" type="string">
      Origin of the profile: `manual` for profiles created with `POST /cloud-browsers`, or `launch` for profiles created with `POST /cloud-browsers/launch`.
    </ResponseField>

    <ResponseField name="deleteOnStop" type="boolean">
      Always `false` in current API responses. Profiles are retained after stop unless explicitly deleted.
    </ResponseField>

    <ResponseField name="remark" type="string | null">
      Optional label saved at creation or via PATCH.
    </ResponseField>

    <ResponseField name="browserSettings" type="object">
      Saved configuration (viewport, locale, timezoneId, proxy display info, cookies, fingerprint). Proxy credentials are stripped from responses.
    </ResponseField>

    <ResponseField name="proxyDisplayIp" type="string | null">
      Last observed proxy exit IP address, or `null` if not yet set.
    </ResponseField>

    <ResponseField name="proxyDisplayRegion" type="string | null">
      Last observed proxy region, or `null` if not yet set.
    </ResponseField>

    <ResponseField name="lastOpenedAt" type="string (RFC3339) | null">
      Timestamp of the most recent successful start, or `null` if the profile has never run.
    </ResponseField>

    <ResponseField name="updatedAt" type="string (RFC3339)">
      Timestamp of the most recent profile update.
    </ResponseField>

    <ResponseField name="runtime" type="object">
      Current runtime status for this profile.

      <Expandable title="Runtime fields">
        <ResponseField name="runtimeKind" type="string">
          `neko` or `worker_cdp`.
        </ResponseField>

        <ResponseField name="status" type="string">
          `starting`, `running`, `stopping`, or `stopped`. Both `starting` and `stopping` reserve a running slot.
        </ResponseField>

        <ResponseField name="sessionId" type="string">
          Present when an active session exists.
        </ResponseField>

        <ResponseField name="expiresAt" type="string (RFC3339)">
          Session expiry timestamp; present when an active session exists.
        </ResponseField>

        <ResponseField name="connectUrl" type="string">
          Direct URL to the interactive browser viewer. Only present when `status` is `running`. Open it in a browser signed in as the profile owner. Never append API keys or proxy credentials to this URL.
        </ResponseField>
      </Expandable>
    </ResponseField>
  </Expandable>
</ResponseField>

<ResponseField name="pagination" type="object">
  Standard pagination envelope.

  <Expandable title="Pagination fields">
    <ResponseField name="page" type="integer">
      Current page number.
    </ResponseField>

    <ResponseField name="pageSize" type="integer">
      Number of items returned on this page.
    </ResponseField>

    <ResponseField name="total" type="integer">
      Total number of saved profiles across all pages.
    </ResponseField>

    <ResponseField name="totalPages" type="integer">
      Total number of pages given the current `pageSize`.
    </ResponseField>
  </Expandable>
</ResponseField>

<ResponseField name="limit" type="integer">
  Your plan's saved-profile allowance: the maximum number of profiles you can save at once. Creating a new profile when you have reached this limit returns `409`.
</ResponseField>

<ResponseField name="runningLimit" type="integer">
  Your account's concurrent running allowance. A value of `0` blocks all new starts. An unset or negative limit defaults to `1`. Lowering this value does not stop currently running sessions.
</ResponseField>

<ResponseField name="runningCount" type="integer">
  Total number of sessions currently in `starting`, `running`, or `stopping` state across all your profiles, pages, and API keys. This count excludes temporary Remote CDP sessions created via `/cdp/sessions`.
</ResponseField>

| Code | Meaning |
| - | - |
| `200` | Success |
| `401` | Unauthenticated |
| `403` | Session limit reached (`SESSIONS_PER_API_KEY_LIMIT_REACHED`) |
| `500` | Internal error |
| `503` | Runtime unavailable |

<Note>
  `runningCount` includes sessions in **all three active states** (`starting`, `running`, and `stopping`) because all three reserve a running slot. A session does not release its slot until it reaches `stopped`.
</Note>

<RequestExample>
  ```bash cURL theme={null}
  curl --fail-with-body --silent --show-error --max-time 65 \
    -X GET 'https://api.adscrawl.net/cloud-browsers?page=1&pageSize=10' \
    -H 'x-api-key: <api-key>'
  ```
</RequestExample>

<ResponseExample>
  ```json 200 OK theme={null}
  {
    "ok": true,
    "data": [
      {
        "id": "<browser-id>",
        "source": "manual",
        "deleteOnStop": false,
        "remark": "work profile",
        "browserSettings": {
          "viewport": {
            "width": 1440,
            "height": 900
          }
        },
        "proxyDisplayIp": null,
        "proxyDisplayRegion": null,
        "lastOpenedAt": null,
        "updatedAt": "2026-09-07T08:00:00.000Z",
        "runtime": {
          "runtimeKind": "neko",
          "status": "stopped"
        }
      }
    ],
    "pagination": {
      "page": 1,
      "pageSize": 10,
      "total": 1,
      "totalPages": 1
    },
    "limit": 10,
    "runningLimit": 1,
    "runningCount": 0
  }
  ```
</ResponseExample>
