---
title: "List projects"
method: GET
path: "/projects"
tags: ["Projects"]
---

# List projects

`GET /projects`

## Request

- Base URL: `https://app.gc.ai/api/external/v1`
- URL: `https://app.gc.ai/api/external/v1/projects`
- Auth: API key in header `Authorization`
- TypeScript: <https://skmtc.dev/gc-ai/apis/gc-ai-external-api/docs/projects/get.ts> (a function with typed inputs; its response is checked against the schema)

List projects accessible to the caller, optionally filtered by name.

With a user-scoped key (`u:gcai_...`), the user sees projects they created, projects shared with them, and non-access-controlled projects. With an org-scoped key (`gcai_...`), only non-access-controlled (org-wide) projects are returned.

## Query parameters

- `limit` integer: Max items to return (default 100, max 500)
- `offset` integer, nullable: Number of items to skip (default 0)
- `search` string: Case-insensitive substring match on project name

## Response `200`

Paginated list of projects

- ProjectListResponse
  - `projects` ProjectResponse[], required
    - `id` string, uuid, required: Unique project identifier
    - `name` string, required: Project name
    - `description` string, nullable, required: Project description, or null if unset
    - `custom_instructions` string, nullable, required: Custom instructions injected into chats opened in this project
    - `is_access_controlled` boolean, required: When true, only the creator and explicitly granted users can see the project. When false, any member of the organization can see it.
    - `my_access_level` 'read' | 'write' | 'admin' | 'null', nullable, required: Caller's access level on this project: `admin` (creator or explicitly granted admin), `write`, `read`, or `null` if the caller has no recorded grant. `null` is also returned for org-scoped keys, which carry no user identity.
    - `created_at` string, required: ISO 8601 creation timestamp
    - `updated_at` string, required: ISO 8601 last-update timestamp
  - `pagination` Pagination, required
    - `limit` number, required: Page size
    - `offset` number, required: Current offset
    - `has_more` boolean, required: Whether more results exist

## Other responses

- `400`: Result set too large for offset pagination
- `401`: Missing or malformed API key
- `403`: Invalid API key
- `429`: Rate limit exceeded. See [Rate Limits](https://docs.gc.ai/api-reference/concepts/rate-limits) for the tiers, limits, and how to back off.
- `500`: Internal server error
- `503`: Service temporarily unavailable

---

[API](https://skmtc.dev/gc-ai/apis/gc-ai-external-api.md) - [All operations](https://skmtc.dev/gc-ai/apis/gc-ai-external-api/llms.txt) - [OpenAPI document](https://skmtc.dev/gc-ai/apis/gc-ai-external-api/revisions/2bbdfddf7107?raw)
