Create and manage projects, the containers everything you run lives in. Every game server, sandbox, network, secret and repository belongs to a project, and a project belongs to an account, which pays for it. Use projects to separate environments or games, and grant people access to one project without giving them the rest.
Creates a project. Fails with RESOURCE_EXHAUSTED if the account is at its projects-per-account quota, and with FAILED_PRECONDITION if the account has no credit.
display_namestringRequiredaccountstringRequiredOwning account, accounts/{account}. Changing it is a transfer, done
through a dedicated flow rather than UpdateProject.
namestringIdentifierprojects/{project}.
project_idstringImmutableShort id unique across Plany, e.g. "survival-eu". Appears in resource names and API URLs, so it is immutable once set.
labelsmap<string, string>Labels are copied onto every usage record the project generates, which is how a studio splits one bill across games, environments or customers.
default_locationstringDefault location for resources created without an explicit one.
project_idstringDesired short id. Empty derives one from display_name, appending a suffix if that is taken.
request_idstringgrpcurl -H "authorization: Bearer $PLANY_API_KEY" \ -d '{ "project": { "display_name": "My server", "account": "accounts/" } }' \ api.plany.cloud:443 plany.project.v1.ProjectService/CreateProject{ "name": "projects/", "project_id": "my-project", "display_name": "My server", "account": "accounts/", "state": "STATE_ACTIVE", "labels": { "key": "" }, "default_location": "", "create_time": "2026-10-04T12:00:00Z", "update_time": "2026-10-04T12:00:00Z", "purge_time": "2026-10-04T12:00:00Z", "etag": "W/\"1\"", "active_locations": [ "" ]}grpcurl -H "authorization: Bearer $PLANY_API_KEY" \ -d '{ "name": "projects/" }' \ api.plany.cloud:443 plany.project.v1.ProjectService/GetProject{ "name": "projects/", "project_id": "my-project", "display_name": "My server", "account": "accounts/", "state": "STATE_ACTIVE", "labels": { "key": "" }, "default_location": "", "create_time": "2026-10-04T12:00:00Z", "update_time": "2026-10-04T12:00:00Z", "purge_time": "2026-10-04T12:00:00Z", "etag": "W/\"1\"", "active_locations": [ "" ]}accountstringRestrict to one account. Empty lists every project the caller can see across all their accounts, which is what the console's project picker wants.
page_sizeint32page_tokenstringfilterstringAIP-160 filter, e.g. state = "ACTIVE" AND labels.env = "prod".
order_bystringshow_deletedboolInclude projects in PENDING_DELETION, which are hidden by default.
grpcurl -H "authorization: Bearer $PLANY_API_KEY" \ -d '{ "page_size": 50 }' \ api.plany.cloud:443 plany.project.v1.ProjectService/ListProjects{ "projects": [ { "name": "projects/", "project_id": "my-project", "display_name": "My server", "account": "accounts/", "state": "STATE_ACTIVE", "labels": { "key": "" }, "default_location": "", "create_time": "2026-10-04T12:00:00Z", "update_time": "2026-10-04T12:00:00Z", "purge_time": "2026-10-04T12:00:00Z", "etag": "W/\"1\"", "active_locations": [ "" ] } ], "next_page_token": ""}display_namestringRequiredaccountstringRequiredOwning account, accounts/{account}. Changing it is a transfer, done
through a dedicated flow rather than UpdateProject.
namestringIdentifierprojects/{project}.
project_idstringImmutableShort id unique across Plany, e.g. "survival-eu". Appears in resource names and API URLs, so it is immutable once set.
labelsmap<string, string>Labels are copied onto every usage record the project generates, which is how a studio splits one bill across games, environments or customers.
default_locationstringDefault location for resources created without an explicit one.
grpcurl -H "authorization: Bearer $PLANY_API_KEY" \ -d '{ "project": { "display_name": "My server", "account": "accounts/" }, "update_mask": "display_name" }' \ api.plany.cloud:443 plany.project.v1.ProjectService/UpdateProject{ "name": "projects/", "project_id": "my-project", "display_name": "My server", "account": "accounts/", "state": "STATE_ACTIVE", "labels": { "key": "" }, "default_location": "", "create_time": "2026-10-04T12:00:00Z", "update_time": "2026-10-04T12:00:00Z", "purge_time": "2026-10-04T12:00:00Z", "etag": "W/\"1\"", "active_locations": [ "" ]}Begins project deletion.
The project enters STATE_PENDING_DELETION and can be restored with UndeleteProject until it is purged.
namestringRequiredetagstringdisallow_non_emptyboolRefuse the delete if the project still holds resources, instead of cascading. The safe default for scripted teardown.
validate_onlyboolrequest_idstringIdempotency key. A retry returns the original operation rather than starting a second teardown, which matters because deletion fans out across every region and running it twice would race with itself.
grpcurl -H "authorization: Bearer $PLANY_API_KEY" \ -d '{ "name": "projects/" }' \ api.plany.cloud:443 plany.project.v1.ProjectService/DeleteProject{}namestringRequiredgrpcurl -H "authorization: Bearer $PLANY_API_KEY" \ -d '{ "name": "projects/" }' \ api.plany.cloud:443 plany.project.v1.ProjectService/UndeleteProject{ "name": "projects/", "project_id": "my-project", "display_name": "My server", "account": "accounts/", "state": "STATE_ACTIVE", "labels": { "key": "" }, "default_location": "", "create_time": "2026-10-04T12:00:00Z", "update_time": "2026-10-04T12:00:00Z", "purge_time": "2026-10-04T12:00:00Z", "etag": "W/\"1\"", "active_locations": [ "" ]}projectstringlocationstringresources_totalint32resources_deletedint32errorstringcurrent_stepstring{ "project": "projects/", "locations": [ { "location": "", "resources_total": 0, "resources_deleted": 0, "error": "" } ], "current_step": ""}Per-region teardown progress, so a stuck region is visible rather than hidden behind a single aggregate percentage.
locationstringresources_totalint32resources_deletedint32errorstring{ "location": "", "resources_total": 0, "resources_deleted": 0, "error": ""}projectsrepeated Projectdisplay_namestringRequiredaccountstringRequiredOwning account, accounts/{account}. Changing it is a transfer, done
through a dedicated flow rather than UpdateProject.
namestringIdentifierprojects/{project}.
project_idstringImmutableShort id unique across Plany, e.g. "survival-eu". Appears in resource names and API URLs, so it is immutable once set.
STATE_ACTIVESTATE_PENDING_DELETIONSTATE_SUSPENDEDlabelsmap<string, string>Labels are copied onto every usage record the project generates, which is how a studio splits one bill across games, environments or customers.
default_locationstringDefault location for resources created without an explicit one.
When a pending deletion becomes irreversible.
etagstringOutput onlyactive_locationsrepeated stringOutput onlyLocations this project has resources in. Maintained by regional services so that a project-wide delete knows which regions to fan out to without asking every region in the fleet.
next_page_tokenstringProject groups resources, scopes quota and carries the labels that spend is broken down by.
display_namestringRequiredaccountstringRequiredOwning account, accounts/{account}. Changing it is a transfer, done
through a dedicated flow rather than UpdateProject.
namestringIdentifierprojects/{project}.
project_idstringImmutableShort id unique across Plany, e.g. "survival-eu". Appears in resource names and API URLs, so it is immutable once set.
STATE_ACTIVESTATE_PENDING_DELETIONSTATE_SUSPENDEDlabelsmap<string, string>Labels are copied onto every usage record the project generates, which is how a studio splits one bill across games, environments or customers.
default_locationstringDefault location for resources created without an explicit one.
When a pending deletion becomes irreversible.
etagstringOutput onlyactive_locationsrepeated stringOutput onlyLocations this project has resources in. Maintained by regional services so that a project-wide delete knows which regions to fan out to without asking every region in the fleet.
| Value | Description |
|---|---|
| STATE_UNSPECIFIED | |
| STATE_ACTIVE | |
| STATE_PENDING_DELETION | Deletion requested, inside the retention window. Resources are stopped and billing has ceased, but everything is restorable. |
| STATE_SUSPENDED | Owning account has no credit. Workloads are stopped; the project itself is untouched and resumes on top-up. |