PlanyDocs
API reference

QuotaService

api.plany.cloud:443Global8 methods

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.

GetQuotaLimit

Read
plany.quota.v1.QuotaService/GetQuotaLimit

Parameters

  • namestringRequired

Returns

QuotaLimit.

grpcurl -H "authorization: Bearer $PLANY_API_KEY" \
-d '{
"name": "accounts//quotaLimits/my-quota-limit"
}' \
api.plany.cloud:443 plany.quota.v1.QuotaService/GetQuotaLimit
Example response
{
"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"
}

ListQuotaLimits

Read
plany.quota.v1.QuotaService/ListQuotaLimits

Lists limits and live usage for a consumer. Backs the console's quota page and the plany quota list command.

Parameters

  • parentstringRequired

    accounts/{account} or projects/{project}.

  • locationstring

    Restrict to one location.

  • servicestring

    Restrict to the metrics of one product, e.g. secretmanager.plany.cloud.

  • page_sizeint32
  • page_tokenstring

Returns

ListQuotaLimitsResponse.

grpcurl -H "authorization: Bearer $PLANY_API_KEY" \
-d '{
"parent": "",
"page_size": 50
}' \
api.plany.cloud:443 plany.quota.v1.QuotaService/ListQuotaLimits
Example response
{
"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": ""
}

ListQuotaMetrics

Read
plany.quota.v1.QuotaService/ListQuotaMetrics

Parameters

  • servicestring
  • page_sizeint32
  • page_tokenstring

Returns

ListQuotaMetricsResponse.

grpcurl -H "authorization: Bearer $PLANY_API_KEY" \
-d '{
"page_size": 50
}' \
api.plany.cloud:443 plany.quota.v1.QuotaService/ListQuotaMetrics
Example response
{
"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": ""
}

ListQuotaOverrides

Read
plany.quota.v1.QuotaService/ListQuotaOverrides

Parameters

  • parentstringRequired
  • page_sizeint32
  • page_tokenstring

Returns

ListQuotaOverridesResponse.

grpcurl -H "authorization: Bearer $PLANY_API_KEY" \
-d '{
"parent": "",
"page_size": 50
}' \
api.plany.cloud:443 plany.quota.v1.QuotaService/ListQuotaOverrides
Example response
{
"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": ""
}

CreateQuotaIncreaseRequest

plany.quota.v1.QuotaService/CreateQuotaIncreaseRequest

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.

Parameters

  • parentstringRequired

    accounts/{account} or projects/{project}.

  • quota_increase_requestQuotaIncreaseRequestRequired
    Show child attributes
    • metricstringRequired
    • requested_limitint64Required

      The ceiling being asked for. An absolute limit, not a delta — a customer knows how many servers they want to run, not how many more.

    • namestringIdentifier
    • locationstring

      Location asked about. Empty means every location, matching QuotaOverride.

    • justificationstring

      Why 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.

Returns

QuotaIncreaseRequest.

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
Example response
{
"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"
}

GetQuotaIncreaseRequest

Read
plany.quota.v1.QuotaService/GetQuotaIncreaseRequest

Parameters

  • namestringRequired

Returns

QuotaIncreaseRequest.

grpcurl -H "authorization: Bearer $PLANY_API_KEY" \
-d '{
"name": "accounts//quotaIncreaseRequests/my-quota-increase-request"
}' \
api.plany.cloud:443 plany.quota.v1.QuotaService/GetQuotaIncreaseRequest
Example response
{
"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"
}

ListQuotaIncreaseRequests

Read
plany.quota.v1.QuotaService/ListQuotaIncreaseRequests

Lists your requests, for an account or a project.

Parameters

  • parentstringRequired

    The 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_WITHDRAWN
  • page_sizeint32
  • page_tokenstring

Returns

ListQuotaIncreaseRequestsResponse.

grpcurl -H "authorization: Bearer $PLANY_API_KEY" \
-d '{
"parent": "",
"page_size": 50
}' \
api.plany.cloud:443 plany.quota.v1.QuotaService/ListQuotaIncreaseRequests
Example response
{
"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
}

WithdrawQuotaIncreaseRequest

plany.quota.v1.QuotaService/WithdrawQuotaIncreaseRequest

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.

Parameters

  • namestringRequired

Returns

QuotaIncreaseRequest.

grpcurl -H "authorization: Bearer $PLANY_API_KEY" \
-d '{
"name": "accounts//quotaIncreaseRequests/my-quota-increase-request"
}' \
api.plany.cloud:443 plany.quota.v1.QuotaService/WithdrawQuotaIncreaseRequest
Example response
{
"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"
}

The QuotaMetric object

quotaMetrics/{{quota_metric}}

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.

Attributes

  • namestringIdentifier

    quotaMetrics/{quota_metric} where the id is the namespaced metric name.

  • display_namestringOutput only
  • descriptionstringOutput only
  • servicestringOutput only

    The product that owns this metric, e.g. secretmanager.plany.cloud.

  • limit_typeLimitTypeOutput only
    LIMIT_TYPE_CONCURRENTLIMIT_TYPE_RATE
  • scopeQuotaMetric.ScopeOutput only
    SCOPE_ACCOUNTSCOPE_PROJECTSCOPE_PROJECT_LOCATIONSCOPE_ACCOUNT_LOCATION
  • unitstringOutput only

    Unit the limit is counted in: "instances", "vcpus", "bytes", "requests".

  • rate_windowDurationOutput only

    Window for a RATE metric. Ignored for CONCURRENT.

  • plan_defaultsmap<string, int64>Output only

    Default limit by plan id, e.g. {"hobby": 2, "pro": 20}. The starting point before any override is applied.

  • auto_approve_maxmap<string, int64>Output only

    Highest 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.

QuotaMetric
{
"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"
}
}

The QuotaOverride object

accounts//quotaOverrides/{{quota_override}}

QuotaOverride raises or lowers a limit for one consumer.

Attributes

  • metricstringRequired
  • limitint64Required
  • namestringIdentifier
  • locationstring

    Location the override applies in. Empty means every location.

  • reasonstring

    Why it was granted.

  • granted_bystringOutput only

    Principal that granted it.

  • create_timeTimestampOutput only
  • expire_timeTimestamp

    When the override lapses and the plan default returns. Empty means permanent. Temporary grants are the right tool for a launch weekend.

QuotaOverride
{
"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"
}

ListQuotaIncreaseRequestsResponse

  • quota_increase_requestsrepeated QuotaIncreaseRequest
    Show child attributes
    • metricstringRequired
    • requested_limitint64Required

      The ceiling being asked for. An absolute limit, not a delta — a customer knows how many servers they want to run, not how many more.

    • namestringIdentifier
    • consumerstringOutput only

      accounts/{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.

    • locationstring

      Location asked about. Empty means every location, matching QuotaOverride.

    • current_limitint64Output only

      What 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 only
    • unitstringOutput only
    • justificationstring

      Why 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_WITHDRAWN
    • DECISION_AUTOMATICDECISION_MANUAL
    • granted_limitint64Output only

      What 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 only

      The reviewer's sentence, shown to you verbatim. Always present on a refusal, so you know what to do next.

    • decided_bystringOutput only

      Principal that decided, or empty for an automatic decision.

    • requested_bystringOutput only

      Principal that asked.

    • create_timeTimestampOutput only
    • decide_timeTimestampOutput only
    • expire_timeTimestampOutput only

      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 only

      The 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_tokenstring
  • pending_countint32

    How 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.

ListQuotaLimitsResponse

  • Show child attributes
    • namestringIdentifier
    • metricstringOutput only

      Metric this limits, quotaMetrics/{quota_metric}.

    • locationstringOutput only

      Location this limit applies in, for location-scoped metrics. Empty for metrics counted globally.

    • effective_limitint64Output only

      Limit in force: the plan default unless an override supersedes it.

    • default_limitint64Output only

      The plan default, retained so a UI can show what an override changed.

    • current_usageint64Output only

      Units currently held (CONCURRENT) or consumed in the window (RATE).

    • pending_usageint64Output only

      Units 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 only
    • limit_typeLimitTypeOutput only
      LIMIT_TYPE_CONCURRENTLIMIT_TYPE_RATE
    • reset_timeTimestampOutput only

      For a RATE metric, when the window resets.

  • next_page_tokenstring

ListQuotaMetricsResponse

  • Show child attributes
    • namestringIdentifier

      quotaMetrics/{quota_metric} where the id is the namespaced metric name.

    • display_namestringOutput only
    • descriptionstringOutput only
    • servicestringOutput only

      The product that owns this metric, e.g. secretmanager.plany.cloud.

    • limit_typeLimitTypeOutput only
      LIMIT_TYPE_CONCURRENTLIMIT_TYPE_RATE
    • scopeQuotaMetric.ScopeOutput only
      SCOPE_ACCOUNTSCOPE_PROJECTSCOPE_PROJECT_LOCATIONSCOPE_ACCOUNT_LOCATION
    • unitstringOutput only

      Unit the limit is counted in: "instances", "vcpus", "bytes", "requests".

    • rate_windowDurationOutput only

      Window for a RATE metric. Ignored for CONCURRENT.

    • plan_defaultsmap<string, int64>Output only

      Default limit by plan id, e.g. {"hobby": 2, "pro": 20}. The starting point before any override is applied.

    • auto_approve_maxmap<string, int64>Output only

      Highest 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_tokenstring

ListQuotaOverridesResponse

  • quota_overridesrepeated QuotaOverride
    Show child attributes
    • metricstringRequired
    • limitint64Required
    • namestringIdentifier
    • locationstring

      Location the override applies in. Empty means every location.

    • reasonstring

      Why it was granted.

    • granted_bystringOutput only

      Principal that granted it.

    • create_timeTimestampOutput only
    • expire_timeTimestamp

      When the override lapses and the plan default returns. Empty means permanent. Temporary grants are the right tool for a launch weekend.

  • next_page_tokenstring

QuotaIncreaseRequest

QuotaIncreaseRequest 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.

  • metricstringRequired
  • requested_limitint64Required

    The ceiling being asked for. An absolute limit, not a delta — a customer knows how many servers they want to run, not how many more.

  • namestringIdentifier
  • consumerstringOutput only

    accounts/{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.

  • locationstring

    Location asked about. Empty means every location, matching QuotaOverride.

  • current_limitint64Output only

    What 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 only
  • unitstringOutput only
  • justificationstring

    Why 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_WITHDRAWN
  • DECISION_AUTOMATICDECISION_MANUAL
  • granted_limitint64Output only

    What 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 only

    The reviewer's sentence, shown to you verbatim. Always present on a refusal, so you know what to do next.

  • decided_bystringOutput only

    Principal that decided, or empty for an automatic decision.

  • requested_bystringOutput only

    Principal that asked.

  • create_timeTimestampOutput only
  • decide_timeTimestampOutput only
  • expire_timeTimestampOutput only

    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 only

    The 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

QuotaLimit is the effective limit and current usage for one metric against one consumer.

  • namestringIdentifier
  • metricstringOutput only

    Metric this limits, quotaMetrics/{quota_metric}.

  • locationstringOutput only

    Location this limit applies in, for location-scoped metrics. Empty for metrics counted globally.

  • effective_limitint64Output only

    Limit in force: the plan default unless an override supersedes it.

  • default_limitint64Output only

    The plan default, retained so a UI can show what an override changed.

  • current_usageint64Output only

    Units currently held (CONCURRENT) or consumed in the window (RATE).

  • pending_usageint64Output only

    Units 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 only
  • limit_typeLimitTypeOutput only
    LIMIT_TYPE_CONCURRENTLIMIT_TYPE_RATE
  • reset_timeTimestampOutput only

    For a RATE metric, when the window resets.

Enums

LimitType

LimitType distinguishes the two enforcement models.

ValueDescription
LIMIT_TYPE_UNSPECIFIED
LIMIT_TYPE_CONCURRENTA ceiling on simultaneously held units. Consumers must call AllocateQuota before creating and ReleaseQuota after destroying.
LIMIT_TYPE_RATEA ceiling on units consumed per rolling window. Consumers call CheckQuota, which both tests and increments.

QuotaIncreaseRequest.Decision

Who decided: automatically, or a person. The outcome is the same either way.

ValueDescription
DECISION_UNSPECIFIED
DECISION_AUTOMATICThe approval policy, with no person involved.
DECISION_MANUALA person at Plany.

QuotaIncreaseRequest.State

ValueDescription
STATE_UNSPECIFIED
STATE_PENDINGWaiting for a person at Plany to decide.
STATE_APPROVEDGranted, and the override in `quota_override` is in force. Reached either by policy or by a person; `decision` says which.
STATE_DENIEDRefused, with a reason. Only ever set by a person.
STATE_WITHDRAWNTaken back by the customer before anybody acted on it.

QuotaMetric.Scope

Level a metric is enforced at.

ValueDescription
SCOPE_UNSPECIFIED
SCOPE_ACCOUNTCounted across the whole account, all projects and regions. Used for things an account owns rather than a project — projects themselves, members, API keys.
SCOPE_PROJECTCounted per project, summed across regions.
SCOPE_PROJECT_LOCATIONCounted per project per region. The common case for compute: 32 vCPUs in eu-west-2 does not constrain us-east-1.
SCOPE_ACCOUNT_LOCATIONCounted per account per region.