# Limits

How many calls a team makes to the API and MCP server, and the network limits Rizamo keeps each account within.

## API and MCP [#api-and-mcp]

The same for every team, on every plan:

| Limit | A minute |
| --- | --- |
| Calls: every `/v1` request and MCP tool call | 600 |
| Writes, among those calls: `POST`, `PATCH`, `PUT` and `DELETE` on `/v1`, and MCP tools that are not read-only. Validating a post and testing a comment automation are reads; getting a connect link is a write | 120 |

- Every API key and agent of the team counts toward the same limits, and the API and the MCP server share them.
- A call counts once its key or agent is known, whatever it answers. Each tool call counts, also inside a JSON-RPC batch; MCP's `initialize` and `tools/list` do not.
- Only API keys and agents count. People signed in to the web app never do, the Developers page's Run button included, so agents at their limit never slow a person down.
- Sending a file to the upload links that `create_media` (`POST /v1/media`) returns does not count, nor does a person's upload through a `create_upload` page: only the calls that make them.
- Each Cloudflare location counts the calls that reach it, so the numbers are approximate: keep below them rather than at them.

## Over a limit [#over-a-limit]

The call does nothing and answers `429` in the [error shape](/errors), with the code `rate_limited` and a message that says which limit and when to try again.

- `Retry-After: 60`: seconds to wait. A limit counts over a minute, so after that wait there is usually room again.
- `RateLimit-Policy`: the limit it went over, as `"requests";q=600;w=60` or `"writes";q=120;w=60`: `q` calls in `w` seconds ([IETF RateLimit header fields](https://datatracker.ietf.org/doc/draft-ietf-httpapi-ratelimit-headers/)).
- No answer says how many calls are left.
- An MCP tool call over a limit is a tool error (`isError`) with the same message.
- Send the same request again after the wait, with the same `Idempotency-Key` if it had one: a refused call never used it.

## What one call takes [#what-one-call-takes]

Every list and text a call sends has a limit, given with each field in the [API reference](/api/posts/create). The ones you may meet:

| What | At most |
| --- | --- |
| A post's targets | 100 |
| Files on a post, a target or a part of a chain | 50 |
| Different files one post names in all: its own, its chain's and its targets' | 1,000 |
| Custom field values in one call | 100, a text up to 5,000 characters |
| Profiles a webhook endpoint takes events of | 500 |
| A web address Rizamo keeps or sends on (covers, link cards, imports) | 2,048 characters, `http` or `https` |

Past one, the call answers `400` `invalid_request` and names the field.

## Publishing [#publishing]

Rizamo keeps each account within what its network takes, counted over the last 24 hours:

| Network | Posts a day, per account | A minute |
| --- | --- | --- |
| Instagram | 100, every format | |
| Facebook | 30 reels; other posts have no cap | |
| TikTok | 15 | 6 |
| Threads | 250, a carousel as one, counting what every app publishes for the account; a thread's later posts count as replies, which Threads limits apart | |
| YouTube | No cap per channel from Rizamo: YouTube takes up to 200 uploads a day, shared by every app on the Google project Rizamo uses, counted in Pacific days | |

- A post over a daily cap waits and goes out once there is room, tried every hour for up to a day, then its target fails with the reason. Over a minute cap it waits a minute at a time, for up to 15 minutes.
- A YouTube upload past the day's uploads fails with the reason: try again after midnight Pacific.

### YouTube's shared quota [#youtubes-shared-quota]

Rizamo's YouTube calls share one daily quota from Google, reset at midnight Pacific time:

- Replies to comments and video deletes: up to 60 a day across all of Rizamo's channels in production (each takes 50 of Google's units), and up to 50 replies a channel a day. Each team has 15 of the 60; past its 15, a team's go on only while 15 stay free for other teams. Past them, `429` `rate_limited` until midnight Pacific.
- Reads (videos, numbers, comments): late in the Pacific day, once Google's quota is spent, they pause until midnight Pacific and pick up from where they were. Uploads and analytics have quotas of their own.
- A post with `"queue": true` takes only times where its accounts stay within their daily caps ([Posting queues](/queues)).

## Comment automations [#comment-automations]

Each account sends up to 1,000 private messages in 24 hours through its automations, and 10 a minute: private replies, reminders and links together. More wait for room, within the 7 days Meta takes a private reply to a comment.

## Short links and webhooks [#short-links-and-webhooks]

| What | Limit, per team | Over it |
| --- | --- | --- |
| Short links made | 1,000 in 24 hours | `429`: reuse a link, or try again later |
| Webhook tests | 10 a minute | `429`: try again in a minute |
| Webhook replays | 5,000 deliveries an hour, one at a time and by range together | `429`, saying when more come |

A replay of a time range sends up to 1,000 deliveries a call ([Replay](/webhooks#replay)).

## When a network asks Rizamo to slow down [#when-a-network-asks-rizamo-to-slow-down]

Rizamo waits as long as the network asks and tries again: a post keeps trying within its publishing window, and numbers and comments arrive a little later. TikTok's trending music (`search_music` on a TikTok account) is shared by every Rizamo customer: while TikTok holds it back, a new search answers `429` and asks to try again in a few minutes.
