See your limits and how much of each you are using, and ask for more. Quotas cap how many servers, vCPUs, secrets, projects and so on an account or project can hold, with defaults set by your plan. When you need a higher limit, file a quota increase request: many are approved automatically in moments, and the rest are decided by a person at Plany.
namestringRequiredgrpcurl -H "authorization: Bearer $PLANY_API_KEY" \ -d '{ "name": "accounts//quotaLimits/my-quota-limit" }' \ api.plany.cloud:443 plany.quota.v1.QuotaService/GetQuotaLimit{ "name": "accounts//quotaLimits/my-quota-limit", "metric": "quotaMetrics/my-quota-metric", "location": "", "effective_limit": "0", "default_limit": "0", "current_usage": "0", "pending_usage": "0", "unit": "", "limit_type": "LIMIT_TYPE_CONCURRENT", "reset_time": "2026-10-04T12:00:00Z"}Lists limits and live usage for a consumer. Backs the console's quota
page and the plany quota list command.
parentstringRequiredaccounts/{account} or projects/{project}.
locationstringRestrict to one location.
servicestringRestrict to the metrics of one product, e.g. secretmanager.plany.cloud.
page_sizeint32page_tokenstringgrpcurl -H "authorization: Bearer $PLANY_API_KEY" \ -d '{ "parent": "", "page_size": 50 }' \ api.plany.cloud:443 plany.quota.v1.QuotaService/ListQuotaLimits{ "quota_limits": [ { "name": "accounts//quotaLimits/my-quota-limit", "metric": "quotaMetrics/my-quota-metric", "location": "", "effective_limit": "0", "default_limit": "0", "current_usage": "0", "pending_usage": "0", "unit": "", "limit_type": "LIMIT_TYPE_CONCURRENT", "reset_time": "2026-10-04T12:00:00Z" } ], "next_page_token": ""}servicestringpage_sizeint32page_tokenstringgrpcurl -H "authorization: Bearer $PLANY_API_KEY" \ -d '{ "page_size": 50 }' \ api.plany.cloud:443 plany.quota.v1.QuotaService/ListQuotaMetrics{ "quota_metrics": [ { "name": "quotaMetrics/my-quota-metric", "display_name": "My server", "description": "", "service": "", "limit_type": "LIMIT_TYPE_CONCURRENT", "scope": "SCOPE_ACCOUNT", "unit": "", "rate_window": "300s", "plan_defaults": { "key": "0" }, "auto_approve_max": { "key": "0" } } ], "next_page_token": ""}parentstringRequiredpage_sizeint32page_tokenstringgrpcurl -H "authorization: Bearer $PLANY_API_KEY" \ -d '{ "parent": "", "page_size": 50 }' \ api.plany.cloud:443 plany.quota.v1.QuotaService/ListQuotaOverrides{ "quota_overrides": [ { "name": "accounts//quotaOverrides/my-quota-override", "metric": "quotaMetrics/my-quota-metric", "location": "", "limit": "0", "reason": "", "granted_by": "", "create_time": "2026-10-04T12:00:00Z", "expire_time": "2026-10-04T12:00:00Z" } ], "next_page_token": ""}Asks for a limit to go up.
The request is assessed straight away. If the metric can be raised automatically for your plan and the new limit is within that ceiling, it is granted at once; otherwise it waits for a person at Plany to decide.
Every metric may be asked about.
parentstringRequiredaccounts/{account} or projects/{project}.
metricstringRequiredrequested_limitint64RequiredThe ceiling being asked for. An absolute limit, not a delta — a customer knows how many servers they want to run, not how many more.
namestringIdentifierlocationstringLocation asked about. Empty means every location, matching QuotaOverride.
justificationstringWhy you need it, in your own words. Optional — most requests are settled automatically and nobody needs to read it.
Blank is accepted; a few characters are not. When a person does decide, a real sentence is what helps them.
grpcurl -H "authorization: Bearer $PLANY_API_KEY" \ -d '{ "parent": "", "quota_increase_request": { "metric": "quotaMetrics/my-quota-metric", "requested_limit": "0" } }' \ api.plany.cloud:443 plany.quota.v1.QuotaService/CreateQuotaIncreaseRequest{ "name": "accounts//quotaIncreaseRequests/my-quota-increase-request", "consumer": "", "metric": "quotaMetrics/my-quota-metric", "location": "", "requested_limit": "0", "current_limit": "0", "default_limit": "0", "unit": "", "justification": "", "state": "STATE_PENDING", "decision": "DECISION_AUTOMATIC", "granted_limit": "0", "decision_reason": "", "decided_by": "", "requested_by": "", "create_time": "2026-10-04T12:00:00Z", "decide_time": "2026-10-04T12:00:00Z", "expire_time": "2026-10-04T12:00:00Z", "quota_override": "accounts//quotaOverrides/my-quota-override"}namestringRequiredgrpcurl -H "authorization: Bearer $PLANY_API_KEY" \ -d '{ "name": "accounts//quotaIncreaseRequests/my-quota-increase-request" }' \ api.plany.cloud:443 plany.quota.v1.QuotaService/GetQuotaIncreaseRequest{ "name": "accounts//quotaIncreaseRequests/my-quota-increase-request", "consumer": "", "metric": "quotaMetrics/my-quota-metric", "location": "", "requested_limit": "0", "current_limit": "0", "default_limit": "0", "unit": "", "justification": "", "state": "STATE_PENDING", "decision": "DECISION_AUTOMATIC", "granted_limit": "0", "decision_reason": "", "decided_by": "", "requested_by": "", "create_time": "2026-10-04T12:00:00Z", "decide_time": "2026-10-04T12:00:00Z", "expire_time": "2026-10-04T12:00:00Z", "quota_override": "accounts//quotaOverrides/my-quota-override"}Lists your requests, for an account or a project.
parentstringRequiredThe account or project whose requests to list.
Restrict to one state. Unspecified returns every state, newest first — which is the customer's view of their own history. The queue asks for STATE_PENDING.
STATE_PENDINGSTATE_APPROVEDSTATE_DENIEDSTATE_WITHDRAWNpage_sizeint32page_tokenstringgrpcurl -H "authorization: Bearer $PLANY_API_KEY" \ -d '{ "parent": "", "page_size": 50 }' \ api.plany.cloud:443 plany.quota.v1.QuotaService/ListQuotaIncreaseRequests{ "quota_increase_requests": [ { "name": "accounts//quotaIncreaseRequests/my-quota-increase-request", "consumer": "", "metric": "quotaMetrics/my-quota-metric", "location": "", "requested_limit": "0", "current_limit": "0", "default_limit": "0", "unit": "", "justification": "", "state": "STATE_PENDING", "decision": "DECISION_AUTOMATIC", "granted_limit": "0", "decision_reason": "", "decided_by": "", "requested_by": "", "create_time": "2026-10-04T12:00:00Z", "decide_time": "2026-10-04T12:00:00Z", "expire_time": "2026-10-04T12:00:00Z", "quota_override": "accounts//quotaOverrides/my-quota-override" } ], "next_page_token": "", "pending_count": 0}Takes back a request before anybody has acted on it.
A customer's own, so a mistyped number does not have to occupy somebody's queue until they refuse it. Refused once decided: withdrawing an approved request would imply the override went with it, and it does not.
namestringRequiredgrpcurl -H "authorization: Bearer $PLANY_API_KEY" \ -d '{ "name": "accounts//quotaIncreaseRequests/my-quota-increase-request" }' \ api.plany.cloud:443 plany.quota.v1.QuotaService/WithdrawQuotaIncreaseRequest{ "name": "accounts//quotaIncreaseRequests/my-quota-increase-request", "consumer": "", "metric": "quotaMetrics/my-quota-metric", "location": "", "requested_limit": "0", "current_limit": "0", "default_limit": "0", "unit": "", "justification": "", "state": "STATE_PENDING", "decision": "DECISION_AUTOMATIC", "granted_limit": "0", "decision_reason": "", "decided_by": "", "requested_by": "", "create_time": "2026-10-04T12:00:00Z", "decide_time": "2026-10-04T12:00:00Z", "expire_time": "2026-10-04T12:00:00Z", "quota_override": "accounts//quotaOverrides/my-quota-override"}QuotaMetric describes something that can be limited.
Metric names are namespaced by the product that owns them, e.g. microvm.plany.cloud/instances or secretmanager.plany.cloud/secrets.
namestringIdentifierquotaMetrics/{quota_metric} where the id is the namespaced metric name.
display_namestringOutput onlydescriptionstringOutput onlyservicestringOutput onlyThe product that owns this metric, e.g. secretmanager.plany.cloud.
LIMIT_TYPE_CONCURRENTLIMIT_TYPE_RATESCOPE_ACCOUNTSCOPE_PROJECTSCOPE_PROJECT_LOCATIONSCOPE_ACCOUNT_LOCATIONunitstringOutput onlyUnit the limit is counted in: "instances", "vcpus", "bytes", "requests".
Window for a RATE metric. Ignored for CONCURRENT.
plan_defaultsmap<string, int64>Output onlyDefault limit by plan id, e.g. {"hobby": 2, "pro": 20}. The starting point before any override is applied.
auto_approve_maxmap<string, int64>Output onlyHighest limit that can be granted automatically, by plan id.
A metric with no entry for your plan can still be requested; a person at Plany decides it. It caps the resulting limit, not the size of each step, so repeated requests stop at this number.
{ "name": "quotaMetrics/my-quota-metric", "display_name": "My server", "description": "", "service": "", "limit_type": "LIMIT_TYPE_CONCURRENT", "scope": "SCOPE_ACCOUNT", "unit": "", "rate_window": "300s", "plan_defaults": { "key": "0" }, "auto_approve_max": { "key": "0" }}QuotaOverride raises or lowers a limit for one consumer.
metricstringRequiredlimitint64RequirednamestringIdentifierlocationstringLocation the override applies in. Empty means every location.
reasonstringWhy it was granted.
granted_bystringOutput onlyPrincipal that granted it.
expire_timeTimestampWhen the override lapses and the plan default returns. Empty means permanent. Temporary grants are the right tool for a launch weekend.
{ "name": "accounts//quotaOverrides/my-quota-override", "metric": "quotaMetrics/my-quota-metric", "location": "", "limit": "0", "reason": "", "granted_by": "", "create_time": "2026-10-04T12:00:00Z", "expire_time": "2026-10-04T12:00:00Z"}quota_increase_requestsrepeated QuotaIncreaseRequestmetricstringRequiredrequested_limitint64RequiredThe ceiling being asked for. An absolute limit, not a delta — a customer knows how many servers they want to run, not how many more.
namestringIdentifierconsumerstringOutput onlyaccounts/{account} or projects/{project} — whose limit this is about.
Redundant with the name's prefix and carried anyway, because every read
path here filters on it and parsing a name to filter is how a wildcard
listing acquires a bug.
locationstringLocation asked about. Empty means every location, matching QuotaOverride.
current_limitint64Output onlyWhat the limit was when the request was made, and what the plan gives. Recorded at the time rather than read live, so the request still makes sense after the limit moves.
default_limitint64Output onlyunitstringOutput onlyjustificationstringWhy you need it, in your own words. Optional — most requests are settled automatically and nobody needs to read it.
Blank is accepted; a few characters are not. When a person does decide, a real sentence is what helps them.
STATE_PENDINGSTATE_APPROVEDSTATE_DENIEDSTATE_WITHDRAWNDECISION_AUTOMATICDECISION_MANUALgranted_limitint64Output onlyWhat was actually granted. May be below requested_limit: a partial grant
is a real outcome and both the console and the email say so rather than
implying the whole ask was met.
decision_reasonstringOutput onlyThe reviewer's sentence, shown to you verbatim. Always present on a refusal, so you know what to do next.
decided_bystringOutput onlyPrincipal that decided, or empty for an automatic decision.
requested_bystringOutput onlyPrincipal that asked.
When the granted override lapses. Empty means permanent, which is what an automatic approval always is — granting for a week and reverting silently is the "why did our limit go back down" problem, deliberately created.
quota_overridestringOutput onlyThe override this request produced, .../quotaOverrides/{override}. Empty
until approved. Written in the same transaction as the state change, so an
approved request without an override is not a state this can be in.
next_page_tokenstringpending_countint32How many are still waiting on somebody, across the whole queue and regardless of the page or the state filter. What a console puts in a badge.
quota_limitsrepeated QuotaLimitnamestringIdentifiermetricstringOutput onlyMetric this limits, quotaMetrics/{quota_metric}.
locationstringOutput onlyLocation this limit applies in, for location-scoped metrics. Empty for metrics counted globally.
effective_limitint64Output onlyLimit in force: the plan default unless an override supersedes it.
default_limitint64Output onlyThe plan default, retained so a UI can show what an override changed.
current_usageint64Output onlyUnits currently held (CONCURRENT) or consumed in the window (RATE).
pending_usageint64Output onlyUnits allocated but not yet confirmed in use — reservations held by in-flight creates. Counted against the limit so two concurrent creates cannot both pass a check that only one of them fits through.
unitstringOutput onlyLIMIT_TYPE_CONCURRENTLIMIT_TYPE_RATEFor a RATE metric, when the window resets.
next_page_tokenstringquota_metricsrepeated QuotaMetricnamestringIdentifierquotaMetrics/{quota_metric} where the id is the namespaced metric name.
display_namestringOutput onlydescriptionstringOutput onlyservicestringOutput onlyThe product that owns this metric, e.g. secretmanager.plany.cloud.
LIMIT_TYPE_CONCURRENTLIMIT_TYPE_RATESCOPE_ACCOUNTSCOPE_PROJECTSCOPE_PROJECT_LOCATIONSCOPE_ACCOUNT_LOCATIONunitstringOutput onlyUnit the limit is counted in: "instances", "vcpus", "bytes", "requests".
Window for a RATE metric. Ignored for CONCURRENT.
plan_defaultsmap<string, int64>Output onlyDefault limit by plan id, e.g. {"hobby": 2, "pro": 20}. The starting point before any override is applied.
auto_approve_maxmap<string, int64>Output onlyHighest limit that can be granted automatically, by plan id.
A metric with no entry for your plan can still be requested; a person at Plany decides it. It caps the resulting limit, not the size of each step, so repeated requests stop at this number.
next_page_tokenstringquota_overridesrepeated QuotaOverridemetricstringRequiredlimitint64RequirednamestringIdentifierlocationstringLocation the override applies in. Empty means every location.
reasonstringWhy it was granted.
granted_bystringOutput onlyPrincipal that granted it.
expire_timeTimestampWhen the override lapses and the plan default returns. Empty means permanent. Temporary grants are the right tool for a launch weekend.
next_page_tokenstringQuotaIncreaseRequest is you asking for a limit to go up.
Automatic approval only ever approves. It has two outcomes, "granted" and "a person decides", and never refuses. Only a person at Plany can refuse a request, and a refusal always carries their own reason.
So every request ends in one of three ways: approved automatically, approved by a person, or refused by a person.
metricstringRequiredrequested_limitint64RequiredThe ceiling being asked for. An absolute limit, not a delta — a customer knows how many servers they want to run, not how many more.
namestringIdentifierconsumerstringOutput onlyaccounts/{account} or projects/{project} — whose limit this is about.
Redundant with the name's prefix and carried anyway, because every read
path here filters on it and parsing a name to filter is how a wildcard
listing acquires a bug.
locationstringLocation asked about. Empty means every location, matching QuotaOverride.
current_limitint64Output onlyWhat the limit was when the request was made, and what the plan gives. Recorded at the time rather than read live, so the request still makes sense after the limit moves.
default_limitint64Output onlyunitstringOutput onlyjustificationstringWhy you need it, in your own words. Optional — most requests are settled automatically and nobody needs to read it.
Blank is accepted; a few characters are not. When a person does decide, a real sentence is what helps them.
STATE_PENDINGSTATE_APPROVEDSTATE_DENIEDSTATE_WITHDRAWNDECISION_AUTOMATICDECISION_MANUALgranted_limitint64Output onlyWhat was actually granted. May be below requested_limit: a partial grant
is a real outcome and both the console and the email say so rather than
implying the whole ask was met.
decision_reasonstringOutput onlyThe reviewer's sentence, shown to you verbatim. Always present on a refusal, so you know what to do next.
decided_bystringOutput onlyPrincipal that decided, or empty for an automatic decision.
requested_bystringOutput onlyPrincipal that asked.
When the granted override lapses. Empty means permanent, which is what an automatic approval always is — granting for a week and reverting silently is the "why did our limit go back down" problem, deliberately created.
quota_overridestringOutput onlyThe override this request produced, .../quotaOverrides/{override}. Empty
until approved. Written in the same transaction as the state change, so an
approved request without an override is not a state this can be in.
QuotaLimit is the effective limit and current usage for one metric against one consumer.
namestringIdentifiermetricstringOutput onlyMetric this limits, quotaMetrics/{quota_metric}.
locationstringOutput onlyLocation this limit applies in, for location-scoped metrics. Empty for metrics counted globally.
effective_limitint64Output onlyLimit in force: the plan default unless an override supersedes it.
default_limitint64Output onlyThe plan default, retained so a UI can show what an override changed.
current_usageint64Output onlyUnits currently held (CONCURRENT) or consumed in the window (RATE).
pending_usageint64Output onlyUnits allocated but not yet confirmed in use — reservations held by in-flight creates. Counted against the limit so two concurrent creates cannot both pass a check that only one of them fits through.
unitstringOutput onlyLIMIT_TYPE_CONCURRENTLIMIT_TYPE_RATEFor a RATE metric, when the window resets.
LimitType distinguishes the two enforcement models.
| Value | Description |
|---|---|
| LIMIT_TYPE_UNSPECIFIED | |
| LIMIT_TYPE_CONCURRENT | A ceiling on simultaneously held units. Consumers must call AllocateQuota before creating and ReleaseQuota after destroying. |
| LIMIT_TYPE_RATE | A ceiling on units consumed per rolling window. Consumers call CheckQuota, which both tests and increments. |
Who decided: automatically, or a person. The outcome is the same either way.
| Value | Description |
|---|---|
| DECISION_UNSPECIFIED | |
| DECISION_AUTOMATIC | The approval policy, with no person involved. |
| DECISION_MANUAL | A person at Plany. |
| Value | Description |
|---|---|
| STATE_UNSPECIFIED | |
| STATE_PENDING | Waiting for a person at Plany to decide. |
| STATE_APPROVED | Granted, and the override in `quota_override` is in force. Reached either by policy or by a person; `decision` says which. |
| STATE_DENIED | Refused, with a reason. Only ever set by a person. |
| STATE_WITHDRAWN | Taken back by the customer before anybody acted on it. |
Level a metric is enforced at.
| Value | Description |
|---|---|
| SCOPE_UNSPECIFIED | |
| SCOPE_ACCOUNT | Counted across the whole account, all projects and regions. Used for things an account owns rather than a project — projects themselves, members, API keys. |
| SCOPE_PROJECT | Counted per project, summed across regions. |
| SCOPE_PROJECT_LOCATION | Counted per project per region. The common case for compute: 32 vCPUs in eu-west-2 does not constrain us-east-1. |
| SCOPE_ACCOUNT_LOCATION | Counted per account per region. |