Skip to content

Quotas

Luna enforces limits on compute time, account capacity, and external QPU access. Compute and capacity limits come from your pricing tier. Shared QPU token access and budgets are set by your organization's owner or admin.

Quota Set by Section
Compute time Pricing tier Compute Time
Account capacity (users) Pricing tier Users
External QPU access (shared tokens) Owner or admin External QPU Time

Compute Time

These quotas are per-user, tracked independently, and reset on a fixed cycle. Exhausting one doesn't affect the other.

  • CPU: Total seconds you can spend on classical and internal-hybrid solvers.
  • GPU: Total seconds you can spend on GPU providers (aqarios-gpu and cudaq-gpu).

Reset cycle

Each cycle is exactly 30 days, anchored to your account's creation date, so the reset date drifts from one calendar month to the next.


Users

This is a fixed limit on what your pricing tier allows you to have, not on what you've consumed. It doesn't reset on a cycle.

  • Users per organization: The maximum number of members your organization can have. New members can only be added through the Luna dashboard. The limit is enforced server-side at invitation time.

Need a higher limit?

This limit scales with your pricing tier. Upgrade to raise it.


External QPU Time (Shared Tokens)

If your organization is on a paid pricing tier, an owner or admin can grant a group access to a shared external-vendor QPU token (D-Wave, IBM, Q-CTRL, AWS Braket). See QPU Tokens for the setup flow.

On top of granting access, an owner or admin can attach time-budget policies to a shared token. There are two kinds:

  • Group time quota: A single budget for the whole group on a given shared token. All members draw from the same pool. Configurable from the Luna dashboard or the SDK.
  • User time quota: A per-member override on a given shared token, useful when one member needs a different slice of the group's pool. Configurable from the SDK only. Dashboard support isn't available yet.

Both policies live in an admin-defined [start, end] window and don't auto-reset. To grant a new period, an admin updates the window.

You can check a shared QPU token's current time quota from the SDK:

Python
from luna_quantum import LunaSolve

ls = LunaSolve("<YOUR_LUNA_API_KEY>")

# Read the group's remaining quota on a shared token
group_quota = ls.qpu_token.get_group_time_quota(qpu_token_name="<TOKEN_NAME>")

# Read a specific user's quota on a shared token
user_quota = ls.qpu_token.get_user_time_quota(
    qpu_token_name="<TOKEN_NAME>",
    user_email="user@example.com",
)

Each call returns the configured quota, quota_used, and the [start, end] window.

Free-tier behavior

External-QPU-token quotas only apply on paid pricing tiers. If your organization drops to a free tier, Luna stops enforcing existing policies so no one gets locked out. Upgrading back to a paid tier resumes enforcement.


Handling Quota Errors

When you exceed a quota, the SDK raises a LunaServerError. The internal_code field tells you which quota was hit:

  • SOLVE_JOB_TIME_QUOTA_EXCEEDED: CPU or GPU time exhausted (the platform doesn't distinguish them in the error code).
  • SHARED_QPU_TOKEN_QUOTA_EXCEEDED: No remaining time on a shared external QPU token.
Python
from luna_quantum.client.error.luna_server_error import LunaServerError

QUOTA_CODES = {
    "SOLVE_JOB_TIME_QUOTA_EXCEEDED",
    "SHARED_QPU_TOKEN_QUOTA_EXCEEDED",
}

try:
    solve_job = algorithm.run(model, name="MyJob")
except LunaServerError as e:
    if e.error_message.internal_code in QUOTA_CODES:
        print(f"Quota hit ({e.error_message.internal_code}): {e.error_message.message}")
    else:
        raise

Both come back as HTTP 403. The message field is a human-readable description ready for display.


Checking Your Usage

The Luna dashboard shows your current usage for each per-user quota (CPU time, GPU time) and your organization's user count against its limit.