Skip to main content
Rate limits are applied per workspace and affect generation endpoints. Plan for them early if you’re sending generations at scale.

Types of rate limits

There are three independent rate limits, all enforced on generation requests only:
LimitApplies toWindowDescription
Image RPMPOST /v2/images/generations60 secondsMaximum image generation submissions per minute
Video RPMPOST /v2/videos/generations60 secondsMaximum video generation submissions per minute
Concurrent requestsBoth generation endpointsRollingMaximum in-flight generation requests at any time
Image and video RPM are tracked separately. The concurrent requests limit is shared across both.
Your current rate limits are shown in the developer dashboard. Limits vary by account setup.

How this affects image and video generation

  • Image generations count when you submit the generation.
  • Video generations count when you submit the generation.
  • Polling GET /v2/videos/generations/{id} is a read operation. It does not create a new generation.
  • Pending video generations can still count against your concurrent limit until they finish.

Rate limit headers

Every generation response includes headers so you can track your usage:
HeaderDescription
X-RateLimit-LimitMaximum requests allowed in the current window
X-RateLimit-RemainingRequests remaining in the current window
X-RateLimit-ResetUnix timestamp in seconds when the window resets
When you exceed the RPM limit, the API returns HTTP 429 with an additional header:
HeaderDescription
Retry-AfterSeconds to wait before retrying

Concurrent request limit

The concurrent limit caps in-flight generation requests across both endpoints. Pending video generations count against this limit. When exceeded, the API returns 429:
{
  "error": {
    "message": "Too many concurrent requests. Please wait for current requests to finish.",
    "code": "rate_limit"
  }
}

Handling rate limits

Use the Retry-After header with exponential backoff.
import GetimgAI from "getimg-ai";

const client = new GetimgAI({ maxRetries: 5 });

async function generate(payload) {
  try {
    return await client.images.generate(payload);
  } catch (err) {
    if (err instanceof GetimgAI.RateLimitError) {
      console.error("Rate limit exceeded after retries");
    }
    throw err;
  }
}
If you run your own queue, back off new generation submissions when remaining capacity is low. Keep polling separate from submission throughput control so retries do not crowd out new work.