# GET /v1/projects/:projectId/sdk-apps (/docs/api/reference/sdk-apps/list-sdk-apps)



<Endpoint method="GET" path="/v1/projects/:projectId/sdk-apps" auth="Bearer" scope="projects:read" phase="1" />

Returns every SDK app attached to the project. A project typically has one per platform (iOS, Android, web) — list them to render a settings page showing which builds are instrumented.

The API key is never returned by this endpoint or the single-resource [`GET`](/docs/api/reference/sdk-apps/get-sdk-app). Keys are only shown on creation and rotation.

<Parameters
  title="Path"
  rows="[
  { name: 'projectId', type: 'string', required: true, description: 'Project ID.' },
]"
/>

<Parameters
  title="Query"
  rows="[
  { name: 'cursor', type: 'string', description: 'Opaque pagination token.' },
  { name: 'limit', type: 'integer', description: 'Page size, 1–100.', default: '25' },
  { name: 'platform', type: 'string', description: 'Filter by platform.', enum: ['ios', 'android', 'web', 'react-native', 'flutter', 'expo'] },
]"
/>

## Example request [#example-request]

<Tabs items="['curl', 'TypeScript', 'Python']">
  <Tab value="curl">
    ```bash
    curl "https://api.layers.com/v1/projects/9cb958b5-11b5-4e30-8675-5d075d52da7c/sdk-apps" \
      -H "Authorization: Bearer lp_live_01HX9Y6K7EJ4T2_4QZpN..."
    ```
  </Tab>

  <Tab value="TypeScript">
    ```ts
    const { items, nextCursor } = await layers.sdkApps.list(
      "9cb958b5-11b5-4e30-8675-5d075d52da7c"
    );
    ```
  </Tab>

  <Tab value="Python">
    ```python
    result = layers.sdk_apps.list("9cb958b5-11b5-4e30-8675-5d075d52da7c")
    ```
  </Tab>
</Tabs>

## Response [#response]

<Response status="200" description="OK">
  ```json
  {
    "items": [
      {
        "appId": "app_8ffb9410eb0eb848264f8a65",
        "name": "Acme Coffee iOS",
        "platform": "ios",
        "bundleId": "com.acmecoffee.ios",
        "androidPackage": null,
        "webDomain": null,
        "createdAt": "2026-04-18T19:25:22Z",
        "lastEventAt": "2026-04-18T19:42:11Z"
      },
      {
        "appId": "app_a1b2c3d4e5f60718293a4b5c",
        "name": "Acme Coffee Android",
        "platform": "android",
        "bundleId": null,
        "androidPackage": "com.acmecoffee.android",
        "webDomain": null,
        "createdAt": "2026-04-18T19:26:03Z",
        "lastEventAt": null
      }
    ],
    "nextCursor": null
  }
  ```

  The platform-identifier fields (`bundleId`, `androidPackage`, `webDomain`) are always present — only the one matching `platform` is non-null.
</Response>

## Errors [#errors]

| Status | Code              | When                                                                     |
| ------ | ----------------- | ------------------------------------------------------------------------ |
| 422    | `VALIDATION`      | `:projectId` is not a UUID, `limit` out of range, or `cursor` malformed. |
| 401    | `UNAUTHENTICATED` | Missing or invalid key.                                                  |
| 403    | `FORBIDDEN_SCOPE` | Key lacks `projects:read`.                                               |
| 404    | `NOT_FOUND`       | Project does not exist in the key's organization.                        |
| 429    | `RATE_LIMITED`    | Read budget exhausted.                                                   |

## See also [#see-also]

* [`POST /v1/projects/:projectId/sdk-apps`](/docs/api/reference/sdk-apps/create-sdk-app) — provision a new SDK app
* [`GET /v1/projects/:projectId/sdk-apps/:appId`](/docs/api/reference/sdk-apps/get-sdk-app) — read one app + CAPI state
