Essentials
Rate limits
The per-minute budget
Each plan gets a number of requests a minute: 60 on Grow, 300 on Scale, 600 on Custom. The budget belongs to whoever bought the plan — one workspace, or the account covering several — so keys and MCP connections under it share a single allowance rather than each getting their own.
Every REST response carries what is left:
X-RateLimit-Limit: 60
X-RateLimit-Remaining: 52The window slides: it counts the requests of the last 60 seconds, not of the current clock minute, so a burst at the top of a minute can’t double the allowance.
Heavier reads cost more
A handful of endpoints read a project’s whole history to answer, so they spend more than one unit of the budget. Everything else costs 1.
| Endpoint | Units |
|---|---|
| Get impact | 5 |
| Get competitor analysis | 3 |
| Get engine detail | 3 |
| Get visibility trend | 2 |
| List gaps | 2 |
| Everything else | 1 |
The same costs apply to the matching MCP tools. On Grow that means about 12 impact reads a minute — which is far more than a sensible client needs, because impact only changes when a run finishes.
Handling a 429
Over the budget, the API answers 429 with error.code of rate_limited and a Retry-Afterheader in seconds. A refused request doesn’t spend anything.
import time
import requests
def get(path, **params):
for attempt in range(5):
response = requests.get(f"{BASE}{path}", params=params, headers=AUTH, timeout=30)
if response.status_code == 429:
time.sleep(int(response.headers.get("Retry-After", "5")))
continue
response.raise_for_status()
return response.json()
raise RuntimeError("rate limited five times in a row")429 rate_limited is the only error worth retrying unchanged. A 402 or a 403 will answer the same way until something changes on the plan, and retrying them in a loop just spends your budget.The other limits
- Drafting: at most 10 draft generations a minute per workspace, counting the ones started from the dashboard. Over that, the answer is
429— with noRetry-After, so wait a minute. - Exports: 20 a day per workspace, and one at a time per project. Asking again while one is running returns the job already in flight.
- Pages:
page_sizeis capped at 100 rows. - Prompts:50 per call to add, and the plan’s prompt limit applies to the batch as a whole.