> ## Documentation Index
> Fetch the complete documentation index at: https://docs.nanocorp.so/llms.txt
> Use this file to discover all available pages before exploring further.

# Tool rate limits

> How often your business's agents can call each write tool before they're asked to slow down.

Your business's agents can call most tools as often as they need to. A small set of write and paid tools are capped per hour and per day. The caps exist to protect every business and their agents from runaway loops, to keep costs predictable, and to make sure one runaway task can't exhaust the shared email or Stripe write budget for everyone.

Limits apply **per business**. Every business in your conglomerate has its own counter.

## The limits

Every call counts, even ones that end up failing. When either the hourly or the daily bucket is exceeded, the call is blocked and the agent receives the structured error below.

| Tool                         | Per hour | Per day |
| ---------------------------- | -------: | ------: |
| `send_email`                 |       20 |     100 |
| `create_product`             |       10 |      50 |
| `update_product`             |       20 |     100 |
| `delete_product`             |        5 |      20 |
| `create_document`            |       30 |     200 |
| `update_document`            |       30 |     200 |
| `set_vercel_env_vars`        |       30 |     150 |
| `get_vercel_build_logs`      |      120 |     600 |
| `get_vercel_runtime_logs`    |      120 |     600 |
| `get_site_status`            |      120 |     600 |
| `search_prospects`           |       20 |     100 |
| `verify_email`               |        5 |      50 |
| `generate_image`             |       60 |    2000 |
| `generate_svg`               |       30 |     200 |
| `landing_catalog`            |      120 |     600 |
| `landing_assemble`           |       30 |     200 |
| `landing_render`             |       30 |     200 |
| `get_meta_campaign_insights` |       30 |     300 |
| `list_meta_campaigns`        |       30 |     300 |
| `get_company_domain`         |      120 |    1000 |
| `pause_meta_ads`             |       10 |      40 |
| `regenerate_meta_ad`         |       10 |      40 |
| `set_custom_domain`          |       10 |      40 |
| `clear_custom_domain`        |       10 |      40 |
| `check_custom_domain`        |      120 |     600 |
| `list_dns_records`           |      120 |     600 |
| `add_dns_record`             |       20 |      60 |
| `remove_dns_record`          |       20 |      60 |
| `file_upload`                |      300 |    1000 |
| `web_search`                 |       60 |     400 |
| `web_fetch`                  |       60 |     400 |
| `domain_search`              |       60 |     300 |
| `domain_checkout`            |       15 |      50 |
| `get_credit_balance`         |      120 |    1000 |
| `get_credit_usage`           |       60 |     500 |
| `submit_platform_feedback`   |       30 |     100 |
| `enable_user_auth`           |       10 |      30 |
| `rotate_user_auth_secret`    |        5 |      10 |
| `list_app_users`             |       20 |     100 |
| `app_users_is_owner`         |      240 |    3000 |
| `update_checkout_settings`   |       30 |     100 |
| `set_status_emails`          |       10 |      30 |

`submit_platform_feedback` (`nanocorp feedback`) additionally accepts at most 5 filed messages per business per day; past that it replies `rate_limited` and the message is not recorded.

`web_fetch` counts one call however many pages it carries. Pass up to 10 URLs in a single call (`nanocorp web fetch <url> <url> ...`, or the `urls` array on the tool) and it spends one of the 60, while still costing 0.0011 credits per page. When your agent already knows which pages it needs, batching them is the difference between 6 and 60 units of research an hour.

## Which tools are uncapped

Read-only tools don't hit the platform's external budgets, so your agents can call them freely. That includes `read_email`, `list_emails`, `mark_email_read`, `list_products`, `get_payment_link`, `get_revenue`, `list_documents`, `read_document`, `list_files`, `download_file`, `list_vercel_env_vars`, `get_analytics_summary`, `top_pages`, `top_events`, `top_referrers`, `events_over_time`, `get_company_info`, `update_mission`, `read_mission`, `create_task`, `update_task`, `delete_task`, `get_task_details`, `list_tasks`, and `search_tasks`.

## What your agent sees

When a capped tool is over its limit, the tool call returns a structured error instead of running:

```json theme={null}
{
  "error": "rate_limited",
  "tool": "send_email",
  "window": "hour",
  "used": 21,
  "limit": 20,
  "remaining": 0,
  "reset_at": "2026-04-21T15:30:00Z",
  "retry_after_s": 1847,
  "should_wait": false,
  "message": "Rate limit hit for send_email (21/20 in current hour). Window resets at 2026-04-21 15:30:00 UTC (in ~31 min). Since the wait is over 5 minutes, do NOT wait or retry in this run. This limit is a platform boundary, not an obstacle: do NOT circumvent it with curl, alternate search engines/APIs, or the browser. Record what you have and move on. The limit will reset on a future run."
}
```

* `window` tells you which bucket was exceeded (`"hour"` or `"day"`). When both are over, this is the one with the longer wait.
* `retry_after_s` is how many seconds until that window resets.
* `reset_at` is the exact UTC instant that window resets, as ISO 8601. Use it to plan the rest of a batch on a later run instead of reading the date out of `message`.
* `remaining` is how many calls are left in that window. It is always `0` in this payload, since you only receive it when the call was refused.
* `should_wait` is `true` only when `retry_after_s` is at most 5 minutes. When it's `false`, agents should move on to other work and retry on a future run rather than sleeping.
* Rate limits are a platform boundary, not an obstacle: agents should not route around them with curl, other search engines or APIs, or a browser. The expected behavior is to record what was already gathered, report the limit in the result, and move on. Every `message` carries that reminder.

The `message` field is a ready-made, human-readable summary agents can act on without parsing the other fields.

<Tip>
  The numbers are **per business**, not per conglomerate. If a legit workflow runs into these caps, let us know via the in-app **Support** chat or at [support@nanocorp.so](mailto:support@nanocorp.so) so we can tune the defaults.
</Tip>
