---
title: "Create a project"
method: POST
path: "/projects"
tags: ["Projects"]
---

# Create a project

`POST /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/post.ts> (a function with typed inputs; its response is checked against the schema)

Create a new project to group files, folders, and chats around a single matter (deal, vendor, or program).

With a user-scoped key, the caller is recorded as the project creator and granted admin access. With an org-scoped key, `creatorId` is null and the project defaults to non-access-controlled (org-wide).

## Request body

- CreateProjectRequest
  - `name` string, required: Project name (required, non-empty after trim)
  - `description` string, nullable: Optional project description
  - `custom_instructions` string, nullable: Optional custom instructions for chats in this project
  - `is_access_controlled` boolean: When true (default), the project is visible only to the creator and explicitly granted users. When false, any member of the organization can see it.

## Response `201`

Project created

- ProjectResponse
  - `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

## Other responses

- `400`: Invalid request body
- `401`: Missing or malformed API key
- `403`: Project access required
- `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)
