> ## Documentation Index
> Fetch the complete documentation index at: https://docs.gcore.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Create and manage projects

export const MethodSection = ({children}) => children ?? null;

export const MethodSwitch = ({children}) => {
  const tabs = React.Children.toArray(children).map(c => {
    if (!c || !c.props) return null;
    if (c.props.id) return c;
    const inner = c.props.children;
    if (inner && inner.props && inner.props.id) return inner;
    return null;
  }).filter(Boolean);
  const firstId = tabs.length > 0 ? tabs[0].props.id : "";
  const [active, setActive] = React.useState(firstId);
  React.useEffect(() => {
    try {
      const saved = localStorage.getItem("gcore_docs_method");
      if (saved && tabs.find(t => t.props.id === saved)) {
        setActive(saved);
      }
    } catch (_) {}
  }, []);
  React.useEffect(() => {
    try {
      document.querySelectorAll("h2[id], h3[id]").forEach(heading => {
        const visible = heading.offsetParent !== null;
        document.querySelectorAll(`a[href="#${heading.id}"]`).forEach(link => {
          if (link.closest("h1,h2,h3,h4,h5,h6")) return;
          const li = link.closest("li");
          if (li) li.style.display = visible ? "" : "none";
        });
      });
    } catch (_) {}
    window.dispatchEvent(new Event("scroll"));
  }, [active]);
  const handleClick = id => {
    setActive(id);
    try {
      localStorage.setItem("gcore_docs_method", id);
    } catch (_) {}
  };
  return <div>
      <div className="not-prose flex gap-0 border-b border-zinc-200 dark:border-zinc-800 mb-8 mt-2" role="tablist">
        {tabs.map(tab => {
    const isActive = active === tab.props.id;
    return <button key={tab.props.id} role="tab" aria-selected={isActive} onClick={() => handleClick(tab.props.id)} className={["px-4 py-2 text-sm font-medium border-b-2 -mb-px transition-colors cursor-pointer", isActive ? "border-primary text-primary" : "border-transparent text-zinc-500 hover:text-zinc-800 dark:hover:text-zinc-200"].join(" ")}>
              {tab.props.label}
            </button>;
  })}
      </div>

      {tabs.map(tab => <div key={tab.props.id} style={{
    display: active === tab.props.id ? "" : "none"
  }}>
          {tab.props.children}
        </div>)}
    </div>;
};

<MethodSwitch>
  <MethodSection id="portal" label="Customer Portal">
    <p>Projects are goal-specific folders for organizing Cloud resources, including Virtual Machines, Bare Metal servers, and other Edge Cloud services. Each project acts as a separate environment — its resources are isolated from the resources in any other project. Access to these resources is controlled per project by specifying user permissions.</p>

    <p>Projects are accessible in the [Gcore Customer Portal](https://portal.gcore.com) via either the **Project** dropdown or the **Cloud Management** page.</p>

    <Tabs>
      <Tab title="From the Project dropdown">
        1. Navigate to the Cloud page and select the **Project** dropdown.

        2. Select **View All Projects**.

        <Frame>
          <img src="https://mintcdn.com/gcore/oxS_nLcLtEBfgfBM/images/docs/cloud/getting-started/projects/create-a-project/open-projects-from-dropdown.png?fit=max&auto=format&n=oxS_nLcLtEBfgfBM&q=85&s=a9f5c79586156dddd5ea6f1d9422af54" alt="A dropdown displaying a list of projects" width="1376" height="412" data-path="images/docs/cloud/getting-started/projects/create-a-project/open-projects-from-dropdown.png" />
        </Frame>

        3. The **Projects** page opens. Projects can be viewed, searched, and managed from here.

        <p>To open a project, click its name in list view, or click **Open project** on the project tile in grid view.</p>

        <Frame>
          <img src="https://mintcdn.com/gcore/-tGG7PWTFMtYIhJ9/images/docs/cloud/getting-started/projects/create-a-project/projects-page-grid.png?fit=max&auto=format&n=-tGG7PWTFMtYIhJ9&q=85&s=7077bb12a3bffcca915d6f606343090c" alt="Projects page in grid view showing project tiles with resource shortcuts and the Open project button" width="781" height="469" data-path="images/docs/cloud/getting-started/projects/create-a-project/projects-page-grid.png" />
        </Frame>
      </Tab>

      <Tab title="From the Cloud Management page">
        1. Navigate to **Cloud** > **Cloud Management**.

        2. Click **Projects**.

        3. The **Projects** page opens. Projects can be viewed, searched, and managed from here.

        <p>To open a project, click its name in list view, or click **Open project** on the project tile in grid view.</p>

        <Frame>
          <img src="https://mintcdn.com/gcore/oxS_nLcLtEBfgfBM/images/docs/cloud/getting-started/projects/create-a-project/open-projects.png?fit=max&auto=format&n=oxS_nLcLtEBfgfBM&q=85&s=92469d9b270c0c8731c78f45628c5b33" alt="A list of projects with the highlighted project name" width="1440" height="563" data-path="images/docs/cloud/getting-started/projects/create-a-project/open-projects.png" />
        </Frame>
      </Tab>
    </Tabs>

    ## View projects in different layouts

    <p>The **Projects** page supports two layout options:</p>

    * **List view**. Presents all projects as a concise list showing the project ID, name, and description.

    <Frame>
      <img src="https://mintcdn.com/gcore/-tGG7PWTFMtYIhJ9/images/docs/cloud/getting-started/projects/create-a-project/projects-page-list.png?fit=max&auto=format&n=-tGG7PWTFMtYIhJ9&q=85&s=fd653273290d2d6ac4f7fada9382edb8" alt="Projects page in list view showing project ID, name, and description columns" width="792" height="342" data-path="images/docs/cloud/getting-started/projects/create-a-project/projects-page-list.png" />
    </Frame>

    * **Grid view**. Presents all projects as tiles with extra information displayed: project name, ID, and a list of Cloud resources that can be created by clicking the plus button.

    <Frame>
      <img src="https://mintcdn.com/gcore/-tGG7PWTFMtYIhJ9/images/docs/cloud/getting-started/projects/create-a-project/projects-page-grid.png?fit=max&auto=format&n=-tGG7PWTFMtYIhJ9&q=85&s=7077bb12a3bffcca915d6f606343090c" alt="Projects page in grid view showing project tiles with resource shortcuts and the Open project button" width="781" height="469" data-path="images/docs/cloud/getting-started/projects/create-a-project/projects-page-grid.png" />
    </Frame>

    <p>Switch between layouts by clicking the layout icon to the right of the search bar.</p>

    ## Create a project

    <p>The Cloud page starts with a single **Default** project, created automatically for every account and can't be deleted.</p>

    <p>Additional projects can be created to organize Cloud resources. The number of projects doesn't affect billing — only the resources in use incur charges.</p>

    <p>To create a project:</p>

    1. Navigate to the **Projects** page.

    2. In the upper-right corner of the screen, select **Create project**.

    <Frame>
      <img src="https://mintcdn.com/gcore/oxS_nLcLtEBfgfBM/images/docs/cloud/getting-started/projects/create-a-project/create-project.png?fit=max&auto=format&n=oxS_nLcLtEBfgfBM&q=85&s=cb0a8b99631b4cbca99c1a11f666499f" alt="The Projects page with the Create project button highlighted" width="1026" height="353" data-path="images/docs/cloud/getting-started/projects/create-a-project/create-project.png" />
    </Frame>

    3. Enter a project name.

    <Info>
      A project name can contain between 3 and 63 characters, including Latin letters, numbers, hyphens, underscores, spaces, and dots. The name can't end with a hyphen.
    </Info>

    4. (Optional) Enter a description.

    <Frame>
      <img src="https://mintcdn.com/gcore/oxS_nLcLtEBfgfBM/images/docs/cloud/getting-started/projects/create-a-project/create-project-annotated.png?fit=max&auto=format&n=oxS_nLcLtEBfgfBM&q=85&s=b6bddb1f5a08540a7a0fa18dd3e35eb7" alt="A dialog with configuration of project name and description" width="846" height="473" data-path="images/docs/cloud/getting-started/projects/create-a-project/create-project-annotated.png" />
    </Frame>

    5. Click **Create project**.

    <p>The new project appears in the project list.</p>

    ## Manage projects

    <p>The project name and description can be edited, and the project can be deleted if the account has [appropriate permissions](/cloud/getting-started/projects/users/user-roles-and-rights). Access to the project is also configurable.</p>

    <p>The search bar helps find a specific project quickly when managing many projects.</p>

    ### Edit project name or description

    1. Navigate to the **Projects** page.

    2. Click the three-dot icon next to the project and select **Settings**. The **Project Settings** page opens.

    <Frame>
      <img src="https://mintcdn.com/gcore/oxS_nLcLtEBfgfBM/images/docs/cloud/getting-started/projects/create-a-project/annotated-project-settings.png?fit=max&auto=format&n=oxS_nLcLtEBfgfBM&q=85&s=ed2507f5e1483190f95dfea51d18c7f6" alt="Project settings menu with Open and Settings options" width="1087" height="390" data-path="images/docs/cloud/getting-started/projects/create-a-project/annotated-project-settings.png" />
    </Frame>

    3. On the **Settings** tab, update the project name or description, then click **Save Changes**.

    <Frame>
      <img src="https://mintcdn.com/gcore/oxS_nLcLtEBfgfBM/images/docs/cloud/getting-started/projects/create-a-project/project-settings-save-changes.png?fit=max&auto=format&n=oxS_nLcLtEBfgfBM&q=85&s=a45afe7bb69ea47e62df5a83b9a416bc" alt="Project settings menu with options to change project name and description" width="1156" height="395" data-path="images/docs/cloud/getting-started/projects/create-a-project/project-settings-save-changes.png" />
    </Frame>

    ### Manage project access

    <p>Viewing and modifying user access requires [Client Administrator](/cloud/getting-started/projects/users/user-roles-and-rights#client-administrator) or [Project Administrator](/cloud/getting-started/projects/users/user-roles-and-rights#project-administrator) access.</p>

    <p>To change access to the project:</p>

    1. Navigate to the **Projects** page.

    2. Click the three-dot icon next to the project and select **Settings**. The **Project Settings** page opens.

    <Frame>
      <img src="https://mintcdn.com/gcore/oxS_nLcLtEBfgfBM/images/docs/cloud/getting-started/projects/create-a-project/annotated-project-settings.png?fit=max&auto=format&n=oxS_nLcLtEBfgfBM&q=85&s=ed2507f5e1483190f95dfea51d18c7f6" alt="Project settings menu with Open and Settings options" width="1087" height="390" data-path="images/docs/cloud/getting-started/projects/create-a-project/annotated-project-settings.png" />
    </Frame>

    3. Open the **Access** tab. The tab lists all users and their roles — to invite new users, click **Invite Users**, or [manage existing access](/cloud/getting-started/projects/users/manage-user-access-to-your-project) on the dedicated page.

    <p>To configure user access across the account, click **Manage users via profile**.</p>

    <Frame>
      <img src="https://mintcdn.com/gcore/oxS_nLcLtEBfgfBM/images/docs/cloud/getting-started/projects/create-a-project/access-project-settings.png?fit=max&auto=format&n=oxS_nLcLtEBfgfBM&q=85&s=f3effb1b706406f503f49b12cfe40ea6" alt="Project access tab displaying one user added to the project" width="1440" height="607" data-path="images/docs/cloud/getting-started/projects/create-a-project/access-project-settings.png" />
    </Frame>

    ### Delete a project

    <p>Deleting a project requires [Client Administrator](/cloud/getting-started/projects/users/user-roles-and-rights#client-administrator) or [Project Administrator](/cloud/getting-started/projects/users/user-roles-and-rights#project-administrator) access.</p>

    <Warning>
      Deleting a project permanently removes all resources inside it, which can't be restored. Default projects can't be deleted.
    </Warning>

    <p>To delete a project:</p>

    1. Navigate to the **Projects** page.

    2. Click the three-dot icon next to the project and select **Delete**.

    <Frame>
      <img src="https://mintcdn.com/gcore/oxS_nLcLtEBfgfBM/images/docs/cloud/getting-started/projects/create-a-project/project-settings-delete.png?fit=max&auto=format&n=oxS_nLcLtEBfgfBM&q=85&s=a453948c99cc46da167d25f9fdd9bb91" alt="Project settings menu with Open, Settings, and Delete options" width="876" height="478" data-path="images/docs/cloud/getting-started/projects/create-a-project/project-settings-delete.png" />
    </Frame>

    3. In the confirmation dialog, type "Delete" in the text field.

    4. Click **Yes, delete**.

    <Frame>
      <img src="https://mintcdn.com/gcore/oxS_nLcLtEBfgfBM/images/docs/cloud/getting-started/projects/create-a-project/delete-project-dialog-new.png?fit=max&auto=format&n=oxS_nLcLtEBfgfBM&q=85&s=fbc9a4a11adc440b9469585fa02b9900" alt="Delete project confirmation dialog" width="584" height="460" data-path="images/docs/cloud/getting-started/projects/create-a-project/delete-project-dialog-new.png" />
    </Frame>

    <p>The portal switches to the Default project once the deletion is complete.</p>
  </MethodSection>

  <MethodSection id="api" label="REST API">
    <p>Projects are global, account-level resources — no region is required to create or manage them. Every account starts with a non-deletable **Default** project; additional projects can be created to separate teams, billing units, or environments.</p>

    <Info>
      An [API token](/account-settings/api-tokens) is required.
    </Info>

    <p>Set the following environment variable before running the examples:</p>

    ```bash theme={null}
    export GCORE_API_KEY="{YOUR_API_KEY}"
    ```

    ## Create a project

    <p>The [create project](/api-reference/cloud/projects/create-project) endpoint creates a new project under the account associated with the API token. The response contains the project ID, which is needed for subsequent operations.</p>

    | Parameter     | Required | Description                                                                                                                    |
    | ------------- | -------- | ------------------------------------------------------------------------------------------------------------------------------ |
    | `name`        | Yes      | Unique project name; 3–63 characters, Latin letters, numbers, hyphens, underscores, spaces, and dots; cannot end with a hyphen |
    | `description` | No       | Optional description                                                                                                           |

    <Tabs>
      <Tab title="Python SDK">
        ```python theme={null}
        import os
        from gcore import Gcore

        client = Gcore()

        project = client.cloud.projects.create(
            name="my-project",
            description="Production environment",
        )
        print(f"Project ID:  {project.id}")    # save as PROJECT_ID
        print(f"Name:        {project.name}")
        print(f"State:       {project.state}")
        print(f"Is default:  {project.is_default}")
        ```
      </Tab>

      <Tab title="Go SDK">
        ```go theme={null}
        import (
            "context"
            "fmt"
            "log"
            "os"

            gcore "github.com/G-Core/gcore-go"
            "github.com/G-Core/gcore-go/cloud"
            "github.com/G-Core/gcore-go/packages/param"
        )

        client := gcore.NewClient()
        ctx := context.Background()

        project, err := client.Cloud.Projects.New(ctx, cloud.ProjectNewParams{
            Name:        "my-project",
            Description: param.NewOpt("Production environment"),
        })
        if err != nil {
            log.Fatal(err)
        }
        fmt.Printf("Project ID: %d\n", project.ID)    // save as PROJECT_ID
        fmt.Printf("Name:       %s\n", project.Name)
        fmt.Printf("State:      %s\n", project.State)
        ```
      </Tab>

      <Tab title="curl">
        ```bash theme={null}
        curl -X POST "https://api.gcore.com/cloud/v1/projects" \
          -H "Authorization: APIKey $GCORE_API_KEY" \
          -H "Content-Type: application/json" \
          -d '{
            "name": "my-project",
            "description": "Production environment"
          }'
        ```

        <p>Response:</p>

        ```json theme={null}
        {
          "id": 1202779,
          "name": "my-project",
          "description": "Production environment",
          "state": "ACTIVE",
          "is_default": false,
          "client_id": 1000503,
          "created_at": "2026-05-31T06:43:54.717473",
          "deleted_at": null,
          "task_id": null
        }
        ```
      </Tab>
    </Tabs>

    ## List projects

    <p>The [list projects](/api-reference/cloud/projects/list-projects) endpoint returns all projects associated with the account. Each project includes its numeric ID, name, and state.</p>

    <Tabs>
      <Tab title="Python SDK">
        ```python theme={null}
        projects = client.cloud.projects.list()
        print(f"Count: {projects.count}")
        for p in projects.results:
            print(f"  id={p.id}  name={p.name}  state={p.state}  is_default={p.is_default}")
        ```
      </Tab>

      <Tab title="Go SDK">
        ```go theme={null}
        page, err := client.Cloud.Projects.List(ctx, cloud.ProjectListParams{})
        if err != nil {
            log.Fatal(err)
        }
        fmt.Printf("Count: %d\n", page.Count)
        for _, p := range page.Results {
            fmt.Printf("  id=%d  name=%s  state=%s\n", p.ID, p.Name, p.State)
        }
        ```
      </Tab>

      <Tab title="curl">
        ```bash theme={null}
        curl "https://api.gcore.com/cloud/v1/projects" \
          -H "Authorization: APIKey $GCORE_API_KEY"
        ```

        <p>Response:</p>

        ```json theme={null}
        {
          "count": 2,
          "results": [
            {
              "id": 1186668,
              "name": "Default",
              "state": "ACTIVE",
              "is_default": true,
              "client_id": 1000503,
              "created_at": "2026-04-17T12:43:36.848841",
              "deleted_at": null
            },
            {
              "id": 1202779,
              "name": "my-project",
              "state": "ACTIVE",
              "is_default": false,
              "client_id": 1000503,
              "created_at": "2026-05-31T06:43:54.717473",
              "deleted_at": null
            }
          ]
        }
        ```
      </Tab>
    </Tabs>

    ## Get project details

    <p>The [get project](/api-reference/cloud/projects/get-project) endpoint returns the full record for a single project, including its creation time and whether it is the default project.</p>

    <Tabs>
      <Tab title="Python SDK">
        ```python theme={null}
        PROJECT_ID = 1202779

        project = client.cloud.projects.get(project_id=PROJECT_ID)
        print(f"Name:        {project.name}")
        print(f"Description: {project.description}")
        print(f"State:       {project.state}")
        print(f"Is default:  {project.is_default}")
        print(f"Created at:  {project.created_at}")
        ```
      </Tab>

      <Tab title="Go SDK">
        ```go theme={null}
        projectID := int64(1202779)

        project, err := client.Cloud.Projects.Get(ctx, cloud.ProjectGetParams{
            ProjectID: param.NewOpt(projectID),
        })
        if err != nil {
            log.Fatal(err)
        }
        fmt.Printf("Name:       %s\n", project.Name)
        fmt.Printf("State:      %s\n", project.State)
        fmt.Printf("Is default: %v\n", project.IsDefault)
        ```
      </Tab>

      <Tab title="curl">
        ```bash theme={null}
        PROJECT_ID=1202779

        curl "https://api.gcore.com/cloud/v1/projects/$PROJECT_ID" \
          -H "Authorization: APIKey $GCORE_API_KEY"
        ```

        <p>Response:</p>

        ```json theme={null}
        {
          "id": 1202779,
          "name": "my-project",
          "description": "Production environment",
          "state": "ACTIVE",
          "is_default": false,
          "client_id": 1000503,
          "created_at": "2026-05-31T06:43:54.717473",
          "deleted_at": null,
          "task_id": null
        }
        ```
      </Tab>
    </Tabs>

    ## Update a project

    <p>The [update project](/api-reference/cloud/projects/update-project) endpoint changes a project's name or description. Only the fields included in the request are modified. The update takes effect immediately — no task polling is needed.</p>

    <Tabs>
      <Tab title="Python SDK">
        ```python theme={null}
        PROJECT_ID = 1202779

        project = client.cloud.projects.update(
            project_id=PROJECT_ID,
            name="my-project-v2",
            description="Updated description",
        )
        print(f"Name:        {project.name}")
        print(f"Description: {project.description}")
        ```
      </Tab>

      <Tab title="Go SDK">
        ```go theme={null}
        projectID := int64(1202779)

        project, err := client.Cloud.Projects.Update(ctx, cloud.ProjectUpdateParams{
            ProjectID:   param.NewOpt(projectID),
            Name:        param.NewOpt("my-project-v2"),
            Description: param.NewOpt("Updated description"),
        })
        if err != nil {
            log.Fatal(err)
        }
        fmt.Printf("Name: %s\n", project.Name)
        ```
      </Tab>

      <Tab title="curl">
        ```bash theme={null}
        PROJECT_ID=1202779

        curl -X PATCH "https://api.gcore.com/cloud/v1/projects/$PROJECT_ID" \
          -H "Authorization: APIKey $GCORE_API_KEY" \
          -H "Content-Type: application/json" \
          -d '{"name": "my-project-v2", "description": "Updated description"}'
        ```

        <p>Response:</p>

        ```json theme={null}
        {
          "id": 1202779,
          "name": "my-project-v2",
          "description": "Updated description",
          "state": "ACTIVE",
          "is_default": false,
          "client_id": 1000503
        }
        ```
      </Tab>
    </Tabs>

    ## Delete a project

    <p>The [delete project](/api-reference/cloud/projects/delete-project) endpoint permanently removes a project and all cloud resources inside it across every region. Default projects cannot be deleted. The operation is asynchronous — poll the returned task until it reaches `FINISHED`.</p>

    <Warning>
      Deleting a project removes all resources inside it permanently. This action cannot be undone.
    </Warning>

    <Tabs>
      <Tab title="Python SDK">
        ```python theme={null}
        PROJECT_ID = 1202779

        task_ids = client.cloud.projects.delete(project_id=PROJECT_ID)
        client.cloud.tasks.poll(task_ids.tasks[0])
        print("Project deleted.")
        ```
      </Tab>

      <Tab title="Go SDK">
        ```go theme={null}
        projectID := int64(1202779)

        if err := client.Cloud.Projects.DeleteAndPoll(ctx, cloud.ProjectDeleteParams{
            ProjectID: param.NewOpt(projectID),
        }); err != nil {
            log.Fatal(err)
        }
        fmt.Println("Project deleted.")
        ```
      </Tab>

      <Tab title="curl">
        ```bash theme={null}
        PROJECT_ID=1202779

        curl -X DELETE "https://api.gcore.com/cloud/v1/projects/$PROJECT_ID" \
          -H "Authorization: APIKey $GCORE_API_KEY"
        ```

        <p>Response:</p>

        ```json theme={null}
        {
          "tasks": ["32f31af7-7b03-4408-a7f5-3df3909930e9"]
        }
        ```

        <p>Poll <code>GET [https://api.gcore.com/cloud/v1/tasks/\{task\_id}](https://api.gcore.com/cloud/v1/tasks/\{task_id})</code> every 5 seconds until `state` is `FINISHED`.</p>
      </Tab>
    </Tabs>
  </MethodSection>

  <MethodSection id="terraform" label="Terraform">
    <p>Manage Edge Cloud projects as infrastructure code using [`gcore_cloud_project`](https://registry.terraform.io/providers/G-Core/gcore/latest/docs/resources/cloud_project) from the [Terraform provider](/developer-tools/terraform/overview). Use projects to isolate environments or separate teams within your account.</p>

    ## Create a project

    <p>Declares a new Edge Cloud project.</p>

    ```hcl theme={null}
    resource "gcore_cloud_project" "example" {
      name        = "my-project"
      description = "Production environment"  # optional
    }

    output "project_id" {
      value = gcore_cloud_project.example.id
    }
    ```

    ## Update a project

    <p>Edit `name` or `description` in the resource block, then run `terraform apply`.</p>

    ```hcl theme={null}
    resource "gcore_cloud_project" "example" {
      name        = "my-project-v2"
      description = "Updated description"
    }
    ```

    ## Delete a project

    <Warning>
      Deleting a project removes all Cloud resources inside it permanently. Default projects cannot be deleted.
    </Warning>

    <p>Comment out or delete the resource block, then run `terraform apply` — Terraform detects the missing declaration and removes the project.</p>

    ```hcl theme={null}
    # Remove or comment out this block:
    # resource "gcore_cloud_project" "example" {
    #   name        = "my-project"
    #   description = "Production environment"
    # }
    ```

    ```bash theme={null}
    terraform apply
    ```

    ## List projects

    <p>Returns all projects with their IDs and names.</p>

    ```hcl theme={null}
    data "gcore_cloud_projects" "all" {}

    output "project_list" {
      value = [for p in data.gcore_cloud_projects.all.items : "${p.id} - ${p.name}"]
    }
    ```

    ## Import a project

    <p>Use when a project was created outside Terraform and needs to be managed as code going forward.</p>

    ```hcl theme={null}
    resource "gcore_cloud_project" "existing" {
      name = "my-project"
    }

    # terraform import gcore_cloud_project.existing '<project_id>'
    ```
  </MethodSection>
</MethodSwitch>
