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.
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.
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.
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.
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)
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
}