Rate Limits
Per-plan quotas and best practices for handling 429 responses
The AWSYS.CO API enforces rate limits to ensure fair usage and platform stability. Limits are applied per account and vary by plan.
Limits by Plan
| Plan | Links / day | API requests / min | Bulk requests / hr |
|---|---|---|---|
| Free | 25 | 30 | — |
| Pro | 10,000 | 300 | 10 |
| Builder | Unlimited | 1,000 | 50 |
Bulk endpoint access requires the Pro plan or higher. The Bulk endpoint is not available on the Free plan.
Rate Limit Response Headers
Every API response includes headers to help you track your current usage:
| Header | Description |
|---|---|
X-RateLimit-Limit |
Maximum requests allowed in the current window |
X-RateLimit-Remaining |
Requests remaining in the current window |
X-RateLimit-Reset |
Unix timestamp (seconds) when the current window resets |
Example response headers
HTTP/1.1 200 OK
X-RateLimit-Limit: 300
X-RateLimit-Remaining: 247
X-RateLimit-Reset: 1748181660
Rate Limit Error Response
When you exceed a rate limit, the API responds with 429 Too Many Requests:
HTTP/1.1 429 Too Many Requests
Retry-After: 42
{
"error": "Too Many Requests",
"code": "RATE_LIMITED"
}
The Retry-After header tells you how many seconds to wait before retrying.
Cloud Functions Note
Rate limits are enforced in-memory per Cloud Functions instance. Under high traffic, Google Cloud Run may spin up additional instances, each with independent counters. Effective limits may be slightly higher than stated in burst scenarios, but you should still implement backoff — you may hit a fresh instance on any request.
Best Practices
Implement exponential backoff
When you receive a 429, wait before retrying. Double the wait time on each subsequent failure up to a maximum.
async function callWithBackoff(fn, maxRetries = 5) {
let delay = 1000; // start with 1 second
for (let attempt = 0; attempt < maxRetries; attempt++) {
try {
return await fn();
} catch (err) {
if (err.status !== 429 || attempt === maxRetries - 1) throw err;
await new Promise(resolve => setTimeout(resolve, delay));
delay = Math.min(delay * 2, 60_000); // cap at 60 seconds
}
}
}
Cache short link results
If your application creates the same short link multiple times (e.g. the same destination URL on every page load), cache the result locally and reuse the existing short URL instead of making repeated API calls.
Use bulk for batch creation
Creating many links? A single Bulk Operations request for up to 1,000 links uses far fewer API calls than individual POST /api/createShort requests.
Monitor your daily limit
The daily link creation limit resets at midnight UTC. If you are on the Free plan and running automated workflows, consider upgrading to Pro to avoid the 25-link/day ceiling that can block all link creation for the rest of the day.