> ## Documentation Index
> Fetch the complete documentation index at: https://docs.cybr.com/llms.txt
> Use this file to discover all available pages before exploring further.

> ## Agent Instructions
> These docs cover learner integrations through Hosted Lab Pages, the SDK, and the REST API. Content management is outside this integration scope.
> Read the setup page for the chosen approach before implementing it. Keep organization API keys and hosted mint secrets on the server.
> The public SDK is coming soon. Check the SDK quickstart for current availability. Do not invent installation commands or direct readers to a private package.
> Cybr provides completion tracking and CTF verification. The integrating platform decides whether to award points.

# Rate limits and concurrency

> Handle learner launch limits and organization capacity.

## Launch limits

By default, launch limits apply per learner within your organization over a rolling five-minute window:

| Membership | Launches per window |
| - | - |
| `free` | 1 |
| `premium` | 15 |

These limits are configurable. The API response gives the wait time for your request.

Ending a lab does not reset the launch window. Membership comes from your server access policy.

The API returns a rate-limit error with a wait duration. The SDK exposes that duration as `retryAfter` in seconds.

## Organization capacity

An organization also has a limit on active deployments. The default cap is 75. This can be changed for your organization. Contact us for help.

The SDK returns `concurrency_limited` with `activeCount` and `limit`. Teardown must release capacity before another launch can use that slot.

A successful end request does not promise immediate slot availability.

## Other operations

The launch window does not count status reads, flag submissions, or guide answers. Discussion reads and writes have separate limits.

A five-second status interval is the SDK default. Repeated launch requests do not make provisioning faster.

## Handle a limit

```ts theme={null}
import { CybrLabsError } from '@cybr/labs-sdk'

try {
  await cybr.deployments.launch({ labId, learnerId })
} catch (error) {
  if (error instanceof CybrLabsError && error.code === 'rate_limited') {
    console.log('Wait seconds:', error.retryAfter)
  }
  throw error
}
```

The UI can show a wait and let the learner request another launch. A long automatic wait is not required.

The SDK only retries short rate-limit waits within its retry configuration. See [client configuration](/reference/client).

For a different organization cap, contact [support@cybr.com](mailto:support@cybr.com).
