Skip to main content

Overview

RunTools enforces limits to ensure fair usage and platform stability. Limits vary by plan — see Pricing for plan details.

Sandbox Limits

LimitFreeProTeamEnterprise
Concurrent sandboxes520100Unlimited
Max sandbox runtime1 hour4 hours24 hoursUnlimited
Idle timeout (auto-pause)10 min30 min2 hoursCustom
vCPUs per sandbox24816
Memory per sandbox2 GB4 GB16 GB64 GB
Disk per sandbox10 GB50 GB100 GB500 GB
Snapshots per sandbox31050Unlimited
Snapshot retention7 days30 days90 daysUnlimited

Storage Limits

LimitFreeProTeamEnterprise
Total workspace storage10 GB50 GB500 GBUnlimited
File upload size100 MB500 MB2 GB10 GB
Files per directory10,00050,000100,000Unlimited

Agent Limits

LimitFreeProTeamEnterprise
Agent runtimes31050Unlimited
Agent deployments31050Unlimited
Concurrent runs520100Unlimited
Run timeout5 min30 min2 hoursCustom
Max tokens per run100K200K500KUnlimited
Schedules-10100Unlimited
Triggers-10100Unlimited

Tool Limits

LimitFreeProTeamEnterprise
Tool calls/month10010,000100,000Unlimited
Custom tools320UnlimitedUnlimited
Tool execution timeout30s60s5 min30 min

Code Execution Limits

LimitFreeProTeamEnterprise
Executions/month1005,00050,000Unlimited
Execution timeout30s60s5 min30 min
Output size1 MB10 MB50 MB100 MB

AIP Hub Limits

LimitFreeProTeamEnterprise
Sessions101001,000Unlimited
Blocks per session1001,00010,000Unlimited
Total context blocks1,00010,000100,000Unlimited
Max tokens per session100K500K2MUnlimited
Search queries/day1001,00010,000Unlimited

API Rate Limits

LimitFreeProTeamEnterprise
Requests/minute603001,000Custom
Requests/hour1,00010,00050,000Custom
WebSocket connections520100Unlimited
Burst limit1050200Custom

Rate Limit Headers

Every API response includes rate limit headers:
X-RateLimit-Limit: 300
X-RateLimit-Remaining: 299
X-RateLimit-Reset: 1609459200

Handling Rate Limits

import { RateLimitError } from '@runtools/sdk';

try {
  await rt.sandboxes.create({ template: 'nodejs-20' });
} catch (error) {
  if (error instanceof RateLimitError) {
    console.log(`Rate limited. Retry after ${error.retryAfter}ms`);
    await new Promise(r => setTimeout(r, error.retryAfter));
    // Retry...
  }
}

Checking Usage

const usage = await rt.usage.get();

console.log(usage);
// {
//   sandboxes: { active: 3, limit: 20 },
//   storage: { usedGb: 12.5, limitGb: 50 },
//   toolCalls: { thisMonth: 4521, limit: 10000 },
//   executions: { thisMonth: 892, limit: 5000 },
//   apiCalls: { thisMinute: 45, limit: 300 },
// }

// Check specific resource
const canCreate = usage.sandboxes.active < usage.sandboxes.limit;

Limit Notifications

Get notified when approaching limits:
// Configure notifications
await rt.notifications.configure({
  usageWarning: 80,  // Notify at 80% usage
  channels: ['email', 'webhook'],
  webhookUrl: 'https://myapp.com/runtools-alerts',
});

Requesting Limit Increases

For temporary or permanent limit increases:
// Request limit increase
await rt.limits.requestIncrease({
  resource: 'concurrent_sandboxes',
  requested: 50,
  reason: 'Load testing for product launch',
  duration: '7d',  // Temporary increase
});
Or contact support for Enterprise-level custom limits.

Best Practices

Paused sandboxes don’t count against concurrent limits. Pause when not in use.
Instead of listing 50 tools in your agent, use tool_search for dynamic discovery.
When rate limited, use exponential backoff with jitter for retries.
Set up notifications at 80% to avoid hitting limits unexpectedly.
Delete snapshots you no longer need to free up storage.