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.