# List surfaces

> Public, unauthenticated discovery of every surface and whether it is requestable right now — the live capability matrix.

`GET /v1/surfaces` returns the **live capability matrix**: every surface and whether it's requestable today. It's the source of truth for what you can capture — read it at runtime instead of hard-coding a surface list.

<Info>
  **This endpoint is deliberately unauthenticated.** `GET /v1/surfaces` and
  [`GET /v1/regions`](/api-reference/list-regions) are the only `/v1` routes
  that take no `Authorization` header, so an agent or client can enumerate
  what's live **before** it has a key. The data is public and safe; every other
  `/v1` route requires a valid Bearer token.
</Info>

## Request

<CodeGroup>

```bash cURL
curl https://api.aisearchapi.dev/v1/surfaces
```

```javascript Node
const res = await fetch('https://api.aisearchapi.dev/v1/surfaces');
const { surfaces } = await res.json();
const live = surfaces.filter((s) => s.live).map((s) => s.id);
```

```python Python
import requests

data = requests.get("https://api.aisearchapi.dev/v1/surfaces").json()
live = [s["id"] for s in data["surfaces"] if s["live"]]
```

</CodeGroup>

## Response

```json 200 OK
{
  "surfaces": [
    { "id": "chatgpt", "live": true },
    { "id": "claude", "live": true },
    { "id": "perplexity", "live": true },
    { "id": "gemini", "live": false },
    { "id": "copilot", "live": true },
    { "id": "google_ai_overview", "live": true },
    { "id": "google_ai_mode", "live": true },
    { "id": "google_search", "live": true },
    { "id": "google_news", "live": true }
  ],
  "schemaVersion": "2026-06-27"
}
```

<ResponseField name="surfaces" type="object[]">
  Every surface in the enum with its current status.

  <Expandable title="surface">
    <ResponseField name="id" type="string">
      The `surfaces` enum value to send in a search request.
    </ResponseField>
    <ResponseField name="live" type="boolean">
      `true` when the surface is requestable today. `false` means a request for it
      returns `422 UNSUPPORTED_METHOD_FOR_SURFACE` (e.g. `gemini` — see
      [Surfaces](/guides/surfaces)).
    </ResponseField>
  </Expandable>
</ResponseField>

<ResponseField name="schemaVersion" type="string">
  The current schema version, matching the `X-AISearch-Version` header.
</ResponseField>

<Tip>
  Drive your integration off `live` rather than a hard-coded list. When a
  roadmap surface (like `gemini`) goes live, your code picks it up with no
  change — the request body and response Envelope stay identical.
</Tip>

<CardGroup cols={2}>
  <Card title="Surfaces guide" icon="layer-group" href="/guides/surfaces">
    Each surface, its enum value, and what's live vs. phase 2.
  </Card>
  <Card
    title="Describe regions"
    icon="globe"
    href="/api-reference/list-regions"
  >
    The other public discovery endpoint: geo targeting.
  </Card>
</CardGroup>
