---
title: "GET /orgs/{org_id}/projects/{project_id}"
method: GET
path: "/orgs/{org_id}/projects/{project_id}"
tags: ["projects"]
---

# GET /orgs/{org_id}/projects/{project_id}

`GET /orgs/{org_id}/projects/{project_id}`

Get a project by ID.

## Path parameters

- `org_id` string, required
- `project_id` string, required

## Response `200`

Project details

- ProjectDetail
  - `auth_enabled` boolean, required — Master sign-in switch for the deployed app: when false the app is public, when true it requires end-user sign-in via `auth_providers`.
  - `auth_providers` string[], required — Enabled end-user sign-in methods for the project's deployed app login screen (for example `email`, `google`, `microsoft`, `github`). Empty when no sign-in method has been turned on.
  - `channels` ProjectChannel[], required — Messaging channel topology for the deployed app (provider → workforce). Empty when no channels are connected. Topology and configuration state only; credentials are never included.
    - `configured` boolean — Whether credentials for this binding are stored platform-side.
    - `enabled` boolean — Soft toggle from the UI. Omitted/`true` means the channel is on; `false` keeps the workforce mapping so it can be re-enabled without reconfiguring.
    - `provider` string, required — Channel provider id (for example `telegram`, `slack`).
    - `workforce` string, required — Workforce component the channel talks to — always the component's manifest uid on read.
  - `created_at` integer, required — Creation timestamp in epoch milliseconds
  - `default_role` string, nullable — Project's default role. All organization members will be assigned this role by default for this project
  - `description` string, nullable — Project description
  - `environments` EnvPreview[], required — Project environments with their latest deployment status
    - `color` string, required — Environment color
    - `id` string, required — Environment identifier
    - `last_deployment_status` string, nullable — Status of the latest deployment in this environment
    - `name` string, required — Environment name
  - `has_ui` boolean, required — Whether the project has a UI interface
  - `id` string, required — Unique project identifier
  - `integrations` IntegrationPreview[], required — Integrations active in this project
    - `id` string, required — Integration identifier
    - `logo_url` string, nullable — Integration logo URL
    - `name` string, required — Integration display name
    - `provider` string, required — Integration provider key
  - `is_public_template` boolean, required — Whether the project is a public template
  - `knowledge_bases` KbPreview[], required — Knowledge bases connected to this project (new KB system only)
    - `description` string, nullable — Knowledge base description
    - `id` string, required — Knowledge base identifier
    - `name` string, required — Knowledge base name
    - `uid` string, required — Knowledge base unique identifier
  - `name` string, required — Project name
  - `publishable_api_key` string, required — Publishable API key for this project
  - `repository_url` string, nullable — URL of the project's source code repository. When null, the project does not have source code available
  - `role` string, required — **Deprecated — will be removed.** Always `"admin"` for backwards-compatible response shape. Caller permissions are determined by v2 IAM grants, not this field. Use `/orgs/{org_id}/iam/check` or effective-grants instead.
  - `screenshot_signed_url` string, nullable — CloudFront-signed screenshot URL, minted per response (TTL-bound). Present only when the banner is a Timbal-hosted screenshot (private `orgs/{}/projects/{}/screenshots/*` prefix) and signing is configured. NOTE: screenshots live under a *private* prefix, so this URL is signed and short-lived. If a banner ever needs to live on a public / cacheable surface (timbal.ai landing pages, OG/meta image tags, emails — anywhere the URL is cached or can't be re-minted per request), copy the object to a public prefix (e.g. `orgs/{org_id}/assets/...`) and serve that unsigned instead of signing this one.
  - `screenshot_url` string, nullable — **Deprecated:** prefer `screenshot_signed_url` when present.
  - `search_text` string, nullable — Text corpus used for semantic similarity matching when recommending templates.
  - `template_description` string, nullable — Public-facing description shown when the project is listed as a template.
  - `template_uses` integer, required — Number of times this template has been used
  - `updated_at` integer, required — Last update timestamp in epoch milliseconds
  - `use_platform_iam` boolean, required — Whether the project uses the platform's IAM system for access control

## Other responses

- `403` — Insufficient permissions

## Changes

- **2026-07-17** `33e77c7fd113` — 1 info
  - added the required property `channels` to the response with the `200` status
- **2026-07-03** `e1c81d0f4235` — 6 info
  - added the optional property `screenshot_signed_url` to the response with the `200` status
  - added the optional property `search_text` to the response with the `200` status
  - added the optional property `template_description` to the response with the `200` status
  - response property `screenshot_url` deprecated
  - …2 more
- **2026-06-05** `45de91fcec33` — 1 info
  - added the non-success response with the status `403`
- **2026-04-22** `63b3777893c7` — 1 breaking
  - removed the required property `workforce` from the response with the `200` status
- **2026-04-15** `2da1655ba706` — 1 info
  - added the optional property `workforce/items/deleted_at` to the response with the `200` status

[Full history](https://skmtc.dev/timbal-ai/apis/timbal-platform-api/changes/orgs/:org_id/projects/:project_id/get.md)

---

[API](https://skmtc.dev/timbal-ai/apis/timbal-platform-api.md) · [All operations](https://skmtc.dev/timbal-ai/apis/timbal-platform-api/llms.txt) · [OpenAPI document](https://skmtc-service-production.skmtc.workers.dev/v1/apis/timbal-ai/timbal-platform-api/revisions/dd7e398ce0d3/schema)
