Aidelly Docs
REST API

Rate Limits

Per-plan rate limits, headers, and retry guidance.

Rate limits are enforced per API key per rolling minute window. Read and write operations have separate limits.

Limits by plan

PlanRead (req/min)Write (req/min)Best for
Launch6020Solo operators and early automations
Scale24090High-velocity businesses and multiple workflows
Agency480180Agencies and multi-client concurrent automations

Read operations: GET endpoints (list posts, fetch post, list connections, usage).
Write operations: POST and PATCH endpoints (create post, upload media URL, webhooks).

Response headers

Every response includes current rate limit state:

RateLimit-Limit: 60
RateLimit-Remaining: 47
RateLimit-Reset: 42
RateLimit-Policy: 60;w=60
X-RateLimit-Limit: 60
X-RateLimit-Remaining: 47
X-RateLimit-Reset: 2026-02-17T14:00:00Z
HeaderValue
RateLimit-LimitRFC 9333 maximum requests in the current window
RateLimit-RemainingRFC 9333 requests remaining in the current window
RateLimit-ResetRFC 9333 seconds until the current window resets
RateLimit-PolicyQuota and window policy extension
X-RateLimit-LimitLegacy maximum requests in the current window
X-RateLimit-RemainingLegacy requests remaining in the current window
X-RateLimit-ResetLegacy ISO timestamp when the window resets

New integrations should prefer the standard RateLimit-* fields. The X-RateLimit-* fields remain available for backwards compatibility.

Rate limit exceeded

When the limit is exceeded, the API returns 429 PUBLIC_API_RATE_LIMITED:

{
  "success": false,
  "error": {
    "code": "PUBLIC_API_RATE_LIMITED",
    "message": "Rate limit exceeded. Retry after the reset time."
  }
}

The response also includes a Retry-After header with the number of seconds to wait.

async function callWithRetry(fn, maxRetries = 3) {
  for (let attempt = 0; attempt <= maxRetries; attempt++) {
    const res = await fn();
    if (res.status !== 429) return res;

    const retryAfter = parseInt(res.headers.get('Retry-After') || '5', 10);
    if (attempt < maxRetries) {
      await new Promise(r => setTimeout(r, retryAfter * 1000));
    }
  }
  throw new Error('Rate limit retries exhausted');
}

MCP tool calls

MCP tool calls share the same rate limits as the underlying API key. If you have multiple agents using the same key, their combined requests count toward the same limit. Use separate keys per integration to isolate limits.