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

# Rate Limits and File Size Caps by Plan Tier

> AgentDrop rate limits, file size caps, monthly transfer counts, agent quotas, and reset windows broken down by plan. Includes 429 retry guidance for AI agents.

<Note>
  **Audience: mixed.** Limits apply to every API call. Account holders review them when selecting a plan; agents need to handle `429` responses and implement back-off.
</Note>

All limits are enforced per account. Exceeding a limit returns a `429 Too Many Requests` response with a `Retry-After` header.

## Transfer Limits

| Plan       | Transfers / Month |
| ---------- | ----------------- |
| Free       | 50                |
| Builder    | 500               |
| Team       | 5,000             |
| Scale      | 50,000            |
| Enterprise | Custom            |

* Each `POST /v1/transfers` call counts as one transfer, regardless of file count
* Downloads do not count against transfer limits
* Limits reset on your billing cycle date (day of the month you signed up)

## File Size Limits

| Plan       | Max File Size | Total Storage |
| ---------- | ------------- | ------------- |
| Free       | 50 MB         | 250 MB        |
| Builder    | 500 MB        | 25 GB         |
| Team       | 2 GB          | 100 GB        |
| Scale      | 10 GB         | 1 TB          |
| Enterprise | Custom        | Custom        |

* Max file size is per individual file, not per transfer
* Total storage is the sum of all active (non-expired, non-deleted) transfers
* When storage is full, new uploads return `413`. Delete or let transfers expire to free space.

## Download Limits

| Setting                      | Default | Range   |
| ---------------------------- | ------- | ------- |
| `max_downloads` per transfer | 10      | 1-1,000 |

* Each `GET /v1/transfers/:id/download` call decrements the counter
* When the counter hits 0, the transfer status changes to `downloaded` and further download attempts return `410 Gone`
* Set `max_downloads` in your `POST /v1/transfers` request to control this

## Transfer Expiry

| Plan       | Max Retention |
| ---------- | ------------- |
| Free       | 24 hours      |
| Builder    | 14 days       |
| Team       | 30 days       |
| Scale      | 90 days       |
| Enterprise | Custom        |

* Set `expires_in` when creating a transfer: `1h`, `12h`, `24h`, `7d`, `14d`, `30d`, `90d`
* Expired transfers return `410 Gone` on download attempts
* Expired file data is deleted automatically

## API Key Limits

| Plan       | Max API Keys |
| ---------- | ------------ |
| Free       | 2            |
| Builder    | 10           |
| Team       | 50           |
| Scale      | Unlimited    |
| Enterprise | Unlimited    |

## Agent Limits

| Plan       | Max Agents |
| ---------- | ---------- |
| Free       | 2          |
| Builder    | 10         |
| Team       | 50         |
| Scale      | 200        |
| Enterprise | Custom     |

## Connection Limits

| Plan       | Max Account Connections |
| ---------- | ----------------------- |
| Free       | 5                       |
| Builder    | 25                      |
| Team       | 100                     |
| Scale      | Unlimited               |
| Enterprise | Unlimited               |

An account connection is a trust link between two AgentDrop accounts. Cross-account transfers require an active connection.

## Rate Limits

| Endpoint                                  | Limit                 |
| ----------------------------------------- | --------------------- |
| `POST /v1/transfers`                      | 60 requests / minute  |
| `GET /v1/transfers`                       | 120 requests / minute |
| `GET /v1/transfers/:id`                   | 120 requests / minute |
| `GET /v1/transfers/:id/download`          | 30 requests / minute  |
| `DELETE /v1/transfers/:id`                | 30 requests / minute  |
| `POST /v1/accounts/:id/api-keys`          | 10 requests / minute  |
| `DELETE /v1/accounts/:id/api-keys/:keyId` | 10 requests / minute  |

Rate limits are per API key, not per account. If you need higher limits, contact support.

## Rate Limit Headers

Every response includes rate limit information:

| Header                  | Description                                               |
| ----------------------- | --------------------------------------------------------- |
| `X-RateLimit-Limit`     | Maximum requests allowed in the window                    |
| `X-RateLimit-Remaining` | Requests remaining in the current window                  |
| `X-RateLimit-Reset`     | Unix timestamp when the window resets                     |
| `Retry-After`           | Seconds to wait before retrying (only on `429` responses) |

## Handling Rate Limits

When you receive a `429` response, wait for the duration specified in the `Retry-After` header before retrying.

```python theme={null}
import time
import requests

response = requests.post(url, headers=headers, data=data, files=files)

if response.status_code == 429:
    retry_after = int(response.headers.get("Retry-After", 60))
    time.sleep(retry_after)
    response = requests.post(url, headers=headers, data=data, files=files)
```

```javascript theme={null}
const response = await fetch(url, { method: "POST", headers, body: form });

if (response.status === 429) {
  const retryAfter = parseInt(response.headers.get("Retry-After") || "60");
  await new Promise((r) => setTimeout(r, retryAfter * 1000));
  // Retry the request
}
```
