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 and Job Count Pricing tier Compute Time and Job Count
Account capacity (users, models) Pricing tier Users and Models
External QPU access (shared tokens) Owner or admin External QPU Time

Compute Time and Job Count

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

  • Compute time:
    • 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).
  • Job count: Total number of solve jobs you can submit, regardless of how long each one runs.

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 and Models

These are fixed limits on what your pricing tier allows you to have, not on what you've consumed. They don'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.
  • Models per user: The maximum number of models you can store on Luna at any one time. This counts currently existing models, so deleting a model frees a slot. You can delete models from the Luna dashboard or with model.delete_luna().

Need a higher limit?

Both limits scale with your pricing tier. Upgrade to raise either one.


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).
  • SOLVE_JOB_NUM_QUOTA_EXCEEDED: Job count exhausted for the current cycle.
  • OPTIMIZATIONS_NUMBER_QUOTA_EXCEEDED: Already at the maximum number of stored models.
  • 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",
    "SOLVE_JOB_NUM_QUOTA_EXCEEDED",
    "OPTIMIZATIONS_NUMBER_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

All four 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, job count, models) and your organization's user count against its limit.