Drıftstack docs
Docs

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)