Rate Limits

How the WinWinKit API throttles excessive traffic and how to react when you hit a limit.

Calls to our REST API are rate limited to provide equitable access for everyone and to prevent abuse. We are going to keep evolving these limits as we gather more information, and encourage your feedback.

Limits

Client-facing API requests are limited per project, based on your plan, over a rolling one-minute window. The limit is shared across all of your app’s end users.

PlanRequests per minute
Free120
Starter600
Essential1,200
Scale2,400

Traffic is additionally subject to a per-IP safeguard that protects against short bursts and abuse:

IntervalRequests per minute
1 second30
10 seconds90
1 minute300

Requests made with a Secret API Key are server-to-server and governed solely by per-project plan limit — no per-IP limits apply.

Response headers

WinWinKit API follows the IETF RateLimit header fields for HTTP standard. Every response to a client-facing request advertises the current limit via its RateLimit-Policy and RateLimit fields, and a rate-limited (429) response additionally includes a Retry-After field:

RateLimit-Policy: "project-plan";q=600;w=60
RateLimit: "project-plan";r=587;t=42
Retry-After: 42
Header NameDescription
RateLimit-Policyq is your plan’s quota and w is the window in seconds.
RateLimitr is the requests remaining in the current window (0 once you’re rate limited) and t is the seconds until it resets.
Retry-AfterSeconds to wait before retrying. Sent only on a 429 Too Many Requests response.

These are standard structured-field headers — any client library that understands the RateLimit specification can consume them directly. Prefer reading these headers over hard-coding the limits, since we evolve them over time.

Handling rate limit errors

Once you exceed the limit, the WinWinKit API returns a 429 Too Many Requests response. It carries the rate-limit headers described above — with RateLimit reporting r=0 and a Retry-After field — alongside the standard error body:

{
  "errors": [
    {
      "code": "TOO_MANY_REQUESTS",
      "status": 429,
      "message": "Too Many Requests",
      "source": null
    }
  ]
}

Honor Retry-After and retry after a short backoff. If you consistently hit the limit during normal usage, batch where you can and avoid tight polling — most user state can be read once and cached client-side.