Account limits
One read tells a person or an AI agent the rate limits and the counted limits the account is held to: each rate-limit bucket and each counted limit (sessions open at once, saved profiles, restores from the Trash, saved proxies). For each one it gives your plan’s figure, a limit agreed for your account if one applies now, the figure enforced now and, for a counted limit, how many are in use and how many are left.
Get your limits
GET /v1/account/limits
curl https://api.driftstack.dev/v1/account/limits \
-H "Authorization: Bearer $DRIFTSTACK_API_KEY"
Response (200), for a Pro account with no agreed limits, one session open, 12 saved profiles, no restores in the last 30 days and 3 saved proxies:
{
"tier": "pro_v3",
"rate_limits": [
{
"bucket_key": "global",
"plan": { "capacity": 360, "refill_per_second": 6 },
"override": null,
"effective": { "capacity": 360, "refill_per_second": 6 },
"source": "plan"
},
{
"bucket_key": "sessions:create",
"plan": { "capacity": 20, "refill_per_second": 0.1 },
"override": null,
"effective": { "capacity": 20, "refill_per_second": 0.1 },
"source": "plan"
},
{
"bucket_key": "agent_sessions:message",
"plan": { "capacity": 100, "refill_per_second": 1 },
"override": null,
"effective": { "capacity": 100, "refill_per_second": 1 },
"source": "plan"
},
{
"bucket_key": "agent_sessions:input_event",
"plan": { "capacity": 480, "refill_per_second": 120 },
"override": null,
"effective": { "capacity": 480, "refill_per_second": 120 },
"source": "plan"
},
{
"bucket_key": "agent_sessions:live",
"plan": { "capacity": 720, "refill_per_second": 12 },
"override": null,
"effective": { "capacity": 720, "refill_per_second": 12 },
"source": "plan"
},
{
"bucket_key": "agent_sessions:steps",
"plan": { "capacity": 120, "refill_per_second": 1.5 },
"override": null,
"effective": { "capacity": 120, "refill_per_second": 1.5 },
"source": "plan"
},
{
"bucket_key": "agent_sessions:tabs",
"plan": { "capacity": 120, "refill_per_second": 1.5 },
"override": null,
"effective": { "capacity": 120, "refill_per_second": 1.5 },
"source": "plan"
},
{
"bucket_key": "dashboard",
"plan": { "capacity": 360, "refill_per_second": 6 },
"override": null,
"effective": { "capacity": 360, "refill_per_second": 6 },
"source": "plan"
}
],
"caps": [
{
"key": "concurrent_sessions",
"plan": 3,
"override": null,
"effective": 3,
"usage": 1,
"remaining": 2
},
{
"key": "saved_profiles",
"plan": 100,
"override": null,
"effective": 100,
"usage": 12,
"remaining": 88
},
{
"key": "profile_restores_30d",
"plan": 10,
"override": null,
"effective": 10,
"usage": 0,
"remaining": 10
},
{
"key": "saved_proxies",
"plan": 100,
"override": null,
"effective": 100,
"usage": 3,
"remaining": 97
}
]
}
Rate-limit buckets
One row per bucket that something draws on now. The buckets and what each
covers are on Account rate limits;
dashboard is the bucket the signed-in Driftstack dashboard draws on where an
API key draws on global, so browsing the dashboard never spends your API
allowance.
| Field | Type | Notes |
|---|---|---|
plan |
object | Your plan’s figure: capacity (the burst the bucket holds) and refill_per_second. |
override |
object | null | A limit agreed for your account that sets this bucket now: its capacity, refill_per_second, expires_at (UTC, ISO 8601) and set_on_bucket. An agreed agent_sessions:message limit can carry over to agent_sessions:steps and agent_sessions:tabs, and an agreed global limit to dashboard. |
effective |
object | The figure enforced now — the one the x-ratelimit-limit header reports when a call draws on this bucket. |
source |
enum | plan, override, or session_cap: agent_sessions:live, agent_sessions:steps and agent_sessions:tabs grow with the number of sessions your account may run at once when that is raised above your plan’s. |
On a limit that carries over (set_on_bucket names another bucket), the
agreed figures are applied one by one: a figure below your plan’s figure on
that bucket binds, a figure above it never gives less than this bucket’s own,
so effective can differ from override.
The tokens left in a bucket are not in this response: every response carries
them for the bucket it drew on in x-ratelimit-remaining (see
Rate limits).
Counted limits
key |
What is counted |
|---|---|
concurrent_sessions |
Sessions open at once, starting ones included: the larger of the count POST /v1/agent-sessions refuses on and the count POST /v1/sessions refuses on. |
saved_profiles |
Profiles you keep; the Trash counts toward no limit. |
profile_restores_30d |
Restores from the Trash in the last 30 days. |
saved_proxies |
Proxies and VPNs saved on your own account (not a team’s). |
Each row has plan (your plan’s number; null when it has none, as on a
contract plan), override (a number agreed for your account that raises the
plan’s, with expires_at null: it stays until it is changed), effective
(the number enforced now; null when there is none), usage and remaining
(effective minus usage, never below 0). usage and remaining are null
when a count could not be read just now; the limits still answer.
The dashboard and the desktop app show this same sessions figure beside
your plan’s number, with the two counts it is the larger of. A session
started with a proxy holds a slot in both, so the two are never added. A
null usage is unknown, not 0: do not read it as room for another session.
These are your own account’s numbers. Work you do in a team owner’s workspace counts on the owner’s account.
The response is always about your own account: the X-Driftstack-Account
header is not honoured, and a team member reads their own limits (a key a
teammate holds on the owner’s account is the owner’s, and reads the owner’s). Work a
member does in an owner’s workspace is also held to the owner’s limits, which
only the owner, or a key held on the owner’s account, can read here.
Not listed: the per-address limit every request passes before it signs in,
the tasks and lists of steps running at once, how many AI turns may run at
once, the live transcript streams (see
AI agents), a session’s token budget,
profile storage, the longest a session may run and, on the Trial, its total
session time and whether it has ended; see
Rate limits and your plan. Requires the broad read scope; account_owner also satisfies the
gate. The call draws on global (on dashboard from the dashboard).
With the SDKs:
const limits = await client.account.limits();
limits = client.account.limits()
limits, err := client.Account.Limits(ctx)