# GET /v1/projects/:id (/docs/api/reference/projects/get-project)



<Endpoint method="GET" path="/v1/projects/:id" auth="Bearer" scope="projects:read" phase="1" />

Returns the full project record: brand context resolved from ingestion, the layers attached to it, current approval policy, and the state of each ingestion source (GitHub, website, App Store). This is the endpoint to call when your UI needs to render a project detail page.

The project must belong to your key's organization; cross-org reads return `404 NOT_FOUND` rather than revealing the project exists.

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

## Example request [#example-request]

<Tabs items="['curl', 'TypeScript', 'Python']">
  <Tab value="curl">
    ```bash
    curl https://api.layers.com/v1/projects/prj_01HX9Y7K8M2P4RSTUV56789AB \
      -H "Authorization: Bearer lp_live_01HX9Y6K7EJ4T2_4QZpN..."
    ```
  </Tab>

  <Tab value="TypeScript">
    ```ts
    const project = await layers.projects.get("prj_01HX9Y7K8M2P4RSTUV56789AB");
    ```
  </Tab>

  <Tab value="Python">
    ```python
    project = layers.projects.get("prj_01HX9Y7K8M2P4RSTUV56789AB")
    ```
  </Tab>
</Tabs>

## Response [#response]

<Response status="200" description="OK">
  ```json
  {
    "id": "9cb958b5-11b5-4e30-8675-5d075d52da7c",
    "organizationId": "2481fa5c-a404-44ed-a561-565392499abc",
    "name": "Acme Coffee iOS",
    "status": "active",
    "customerExternalId": "acme-coffee",
    "timezone": "America/Los_Angeles",
    "primaryLanguage": "en",
    "ownerEmail": "growth@gicgrowth.com",
    "brand": null,
    "brandContext": {
      "appName": "Acme Coffee",
      "appDescription": "Pre-order your neighborhood coffee shop's daily brew.",
      "tagline": "Skip the line, keep the ritual.",
      "audience": "Urban professionals, 25–45",
      "icp": "Mobile-first coffee loyalists",
      "brandVoice": "Friendly, unfussy, a little wry",
      "keywords": ["coffee", "order ahead", "mobile payments"],
      "primaryLanguage": "en",
      "logoUrl": "https://media.layers.com/.../logo.png"
    },
    "ingestState": {
      "github": { "status": "completed", "jobId": "job_01HXA1NHKJ...", "completedAt": "2026-04-10T09:19:33Z" },
      "website": null,
      "appstore": { "status": "completed", "completedAt": "2026-04-10T09:21:02Z" }
    },
    "requiresApproval": false,
    "firstNPostsBlocked": 3,
    "currentBlockedCount": 0,
    "metadata": null,
    "createdAt": "2026-04-10T09:14:22.000000+00:00",
    "updatedAt": "2026-04-15T17:01:09.000000+00:00"
  }
  ```

  Notes on shape:

  * `requiresApproval`, `firstNPostsBlocked`, `currentBlockedCount` are flat fields (not nested under `approvalPolicy`).
  * `brand` is reserved for the project's brand record; `null` until a brand is attached.
  * The `layers` collection is read separately via the project layers endpoint — it is not embedded in this response.
</Response>

## Errors [#errors]

| Status | Code              | When                                                                                                   |
| ------ | ----------------- | ------------------------------------------------------------------------------------------------------ |
| 401    | `UNAUTHENTICATED` | Missing or invalid key.                                                                                |
| 403    | `FORBIDDEN_SCOPE` | Key lacks `projects:read`.                                                                             |
| 404    | `NOT_FOUND`       | Project does not exist, or it lives in another organization, or `X-Layers-Customer-Id` does not match. |
| 422    | `VALIDATION`      | `:id` is not a UUID. The path parameter is validated pre-flight; non-UUIDs never reach the database.   |
| 429    | `RATE_LIMITED`    | Read budget exhausted.                                                                                 |

## See also [#see-also]

* [`PATCH /v1/projects/:id`](/docs/api/reference/projects/patch-project) — update fields
* [`GET /v1/projects/:id/events`](/docs/api/reference/telemetry/events) — SDK event stream
* [Approval concept](/docs/api/concepts/approval) — how `approvalPolicy` gates publishes
