ChartnautDocs

API limits

Your plan sets how hard the CLI, the MCP server and the API can be used. The limits are per account: every API key you make shares them, so a second key adds no capacity.

Free

Starter

Pro

Ultra

API, MCP and CLI access

None

Included

Included

Included

Requests a minute

None

120

300

600

Heavy calls at once

None

2

3

5

Long polls at once

None

4

6

10

Runs at once

1

2

3

5

What each one counts

Requests a minute counts every API call from every key on the account, including each call the CLI makes for you and each request an AI app's tool call makes over MCP. Limits and cost lists what each MCP tool makes.

Heavy calls at once counts calls that do real work while you wait: validating a script, creating or saving one, running a definition over history and starting a run.

Long polls at once counts calls that hold open until a run finishes, such as chartnaut run waiting for its result.

Runs at once is shared with the app and the Agent, so it has its own page.

At the cap

Past requests a minute, calls are refused with rate_limited until the minute rolls on. Past heavy calls at once, the next one is refused with busy until one of the others answers. Past long polls at once, nothing fails: the call answers straight away with the run as it stands, and your code or the CLI asks again.

The CLI retries rate_limited and busy for you, then exits with code 5 if they still fail. Limits covers how each limit behaves and how to retry from your own code.

On Free, every call is refused with plan_limit: API access is included on Starter and above. The CLI exits with code 3. The Developers page still opens on Free, and keys made on a paid plan can be listed and revoked there after a downgrade, but they stop working until you upgrade again.

See your limits

chartnaut usage --json prints your plan's numbers under api_limits:

"api_limits": {
  "requests_per_minute": 300,
  "concurrent_heavy": 3,
  "concurrent_waits": 6
}

Plain chartnaut usage does not print them; it shows runs at once on its concurrent_runs line. From your own code, GET /usage returns the same block.

Get more

Spread calls out, let long polls finish before starting more, or upgrade. A new plan's limits apply within a minute, and a key refused on Free starts working again within a minute of upgrading.