Skip to main content
ExposureMedium

Application & API

Missing API Rate Limiting

Missing API rate limiting means a reachable endpoint lacks an effective request-frequency bound for a relevant client or operation. Attackers may then automate credential attempts or costly requests. Confirm the deployed policy and observed behavior before calling the control missing.

An API may answer a small test burst normally while enforcing a higher or upstream limit. Status codes and headers show only the responses observed. To assess exposure, identify the intended policy, test the public path within an authorized bound, and compare behavior with the abuse risk.

Reviewed byAmeya LambatSecurity Research Contributor, LegbaReviewed 2026-05-28 · Updated 2026-09-29

What it is

API rate limiting bounds requests by a client identity, operation, and time window. Enforcement may reject, delay, challenge, or drop excess traffic. HTTP 429 is one possible response, not a required signal. Missing rate limiting is a confirmed policy gap or ineffective control on a reachable abuse path. OWASP API4:2023 also covers limits on request size, resource use, and downstream spending.

Without an effective request or resource-use bound, an API can permit expensive or repeated operations. Authentication flows may face more password attempts. Search and export paths may consume excess compute or bandwidth. OWASP API4 documents examples of SMS charges and large-download costs. Actual impact depends on reachable operations and other controls.

At a glance

Typemissing-api-rate-limiting
Ports80, 443, 8080, 8443
ProtocolsHTTP, HTTPS
Seen onREST APIs, GraphQL APIs, Login and authentication endpoints, Password reset and OTP flows, API gateways (Kong, AWS API Gateway, Apigee), NGINX, Express.js, Spring Boot, Django REST Framework
SeverityMedium
Updated2026-09-29

How attackers find and exploit it

  • Enumerate the target's API surface through passive recon: crawl JavaScript bundles, mobile-app traffic, public OpenAPI or Swagger documents, and DNS records to build a list of reachable endpoints such as /api/v1/login, /graphql, /password-reset, and /search.
  • Probe routes and client identities for permissive behavior. A short burst without HTTP 429 or rate-limit headers does not establish that throttling is absent.
  • Identify the highest-value unthrottled endpoint, prioritizing authentication and OTP/reset flows for account takeover, and search or pagination endpoints for scraping.
  • Run credential stuffing or password spraying by replaying breached credential lists at high volume, often distributed across a proxy or residential botnet to defeat any per-IP heuristics, until valid sessions are obtained.
  • Abuse expensive operations to exhaust resources or drive cost: send large or batched payloads (for example GraphQL query batching or deeply nested queries), request oversized pagination like ?limit=9999999, or loop SMS/email triggers to overwhelm CPU, memory, third-party quotas, or billing.
  • Automate enumeration of objects and accounts by iterating identifiers or usernames to harvest data and confirm which accounts exist, using error and timing differences as oracles.

How to detect it on your surface

  • Inventory every internet-reachable API endpoint, including undocumented, legacy, and versioned paths (v1, v2, internal/), since rate limiting is frequently applied to the primary login form but forgotten on a parallel mobile or partner endpoint.
  • With authorization, run a bounded test matched to the route policy, client key, and time window. Record responses, delays, challenges, and dropped connections.
  • Inspect rate-limit signaling headers as supporting evidence. Their absence does not prove that no limit is enforced.
  • Test authentication controls within an approved safety bound. Compare failed attempts, delays, challenges, and lockout behavior with the configured per-account policy.
  • Review API gateway, WAF, and load-balancer configuration to confirm a rate-limiting or throttling policy is actually bound to each route rather than merely available but unattached.

Detection signals

  • For the same client key and policy window, traffic above the configured threshold continues normally without an equivalent delay, drop, or challenge.
  • Responses omit rate-limit headers. This observation needs policy and behavior evidence before it becomes a finding.
  • Login or reset flows permit more attempts than their configured per-account policy without lockout, backoff, or another effective challenge.
  • Pagination, search, or GraphQL endpoints honor arbitrarily large or batched requests (for example very large limit/page-size values or multi-operation batched mutations) without rejection.
  • Server-side latency, CPU, or errors rise under a bounded authorized test while the configured resource controls fail to engage.

Validate before you report

  • Agree on an authorized test budget from the route policy, client key, and time window. Record the bounded request and response sequence. A fixed sample, such as 100 requests in 60 seconds, cannot prove absence when the threshold is unknown.
  • Test through the public hostname and distinguish application responses from WAF or CDN controls, including delays, drops, and challenges.
  • Test the relevant abuse path within the approved bound, such as repeated failed logins or costly operations. Compare observed behavior with its configured policy.
  • Inspect deployed gateway, WAF, and application policy alongside observed behavior. If the policy cannot be verified, label the missing-limit claim unconfirmed.
  • Record the endpoint, method, client key, time window, expected threshold, and observed enforcement. Do not infer absence from missing 429 responses or headers alone.

What looks like this but isn't

  • A high threshold or alternate enforcement response is not an absent limit. Compare deployed policy with observed behavior; keep the finding unconfirmed if the policy is unavailable.
  • Throttling may live upstream at a CDN, WAF, or API gateway rather than on the application, so a clean origin response does not prove the public-facing path is unprotected; test through the real internet-facing hostname.
  • Authentication endpoints may enforce per-account lockout or CAPTCHA instead of per-IP rate limiting, which still mitigates credential stuffing; verify that no anti-automation control engages before concluding the endpoint is exposed.
  • A non-production, sandbox, or intentionally public read-only endpoint may have rate limiting deliberately relaxed; confirm the endpoint serves real users or sensitive operations before assigning impact.

Remediation

  • Enforce rate limiting on every internet-facing endpoint at the API gateway, reverse proxy, or framework layer, keying limits on the strongest available client identity (authenticated token or API key first, then IP) and returning HTTP 429 with a Retry-After header.
  • Apply stricter, dedicated anti-automation limits to authentication, password-reset, OTP, and other sensitive endpoints, going beyond ordinary API throttling as OWASP recommends for these high-value flows.
  • Add credential-stuffing defenses that do not rely on per-IP limits alone: enforce or step up multi-factor authentication, implement progressive delays and account lockout on repeated failures, and check submitted passwords against known-breached lists.
  • Constrain resource cost per request by validating and capping payload size, pagination limits, query depth and complexity (for GraphQL), and the number of batched operations, addressing the resource-consumption side of OWASP API4:2023.
  • Set hard spending caps on metered services where available. Where caps are unavailable, use billing alerts and a response plan; alerts warn of cost but do not bound it.
  • Monitor and alert on 429 rates, per-client request volume, and authentication failure spikes, then feed this telemetry back into tuning thresholds and triggering graduated responses.

Operational checklist

  • Maintain a living inventory of all public API endpoints and require that each new or changed route ships with an explicit, attached rate-limiting policy before release.
  • Default-deny on rate limits: new endpoints inherit a sensible global throttle unless a route-specific policy is defined, so nothing reaches production unthrottled by omission.
  • Hold authentication, reset, and OTP endpoints to a stricter standard with lockout/backoff plus MFA, and review these controls whenever the auth flow changes.
  • Review deployed route policies and sample public paths with bounded authorized tests. Do not classify a limit as missing based only on absent 429 responses or headers.
  • Review metered downstream services. Apply available hard spending caps, and assign an owner to respond to billing alerts where caps are unavailable.
  • Track 429 volume, top talkers, and login-failure ratios on a dashboard and alert on anomalous spikes that indicate stuffing, scraping, or DoS in progress.

What to do next

Prioritize endpoints whose configured limits are absent or ineffective for a real abuse path. Inventory routes, identify the intended policy and client key, then test safely through the public hostname. Record both policy and observed enforcement. If either remains unknown, keep the conclusion unconfirmed while you investigate.

Methodology

Each guide is written by our team, reviewed by a named security contributor, and cited against primary sources such as OWASP, CISA, NIST, and MITRE. We update pages when the underlying guidance changes. See our contributors and company.

FAQs.

Is missing API rate limiting a vulnerability on its own, or only when combined with other weaknesses?
It is a real exposure in its own right because it enables resource-exhaustion denial of service and uncaps the cost of abusive requests, which is why OWASP tracks it as API4:2023 Unrestricted Resource Consumption. Its severity often rises further when it sits in front of an authentication endpoint, because it then amplifies credential stuffing and brute-force attacks against accounts.
Why is rate limiting alone not enough to stop credential stuffing?
Attackers distribute credential-stuffing traffic across large proxy and residential botnet pools, so a single low request count per IP can still total millions of attempts. OWASP's Credential Stuffing Prevention Cheat Sheet recommends layering rate limiting with MFA, breached-password checks, device and connection fingerprinting, and progressive delays rather than relying on any single threshold.
What HTTP status code and headers indicate rate limiting is present?
HTTP 429 signals that a server chose to report too many requests. RFC 6585 makes Retry-After optional and does not require servers to use 429. Servers may also delay, drop, or challenge requests. Verify the configured policy and observed behavior rather than inferring absence from headers.
Does adding rate limiting risk blocking legitimate users?
Properly designed limits target abuse, not normal usage: thresholds are set above realistic human and integration traffic, keyed on authenticated identity where possible, and return a clear 429 with Retry-After so well-behaved clients can back off. Sensitive endpoints like login can use stricter per-account controls and step-up MFA rather than aggressive per-IP blocks to avoid penalizing shared networks.
How does Legba Adversary handle Missing API Rate Limiting?
A defensible Adversary finding pairs the deployed route policy with a bounded, authorized test of the relevant abuse path. A short burst without 429 or headers is inconclusive. If the policy cannot be verified, keep the finding unconfirmed and identify the missing evidence.

References

  1. 01
  2. 02
  3. 03
  4. 04
  5. 05
  6. 06

Weakness references (CWE)

Keep exploring

Try it on the next page you do not trust

Legba is a Chrome extension with two modes. Ghost gives you a private browser route. Shield opens a page in an isolated browser off your device.

Free for 30 days. No card required.

Ghost. A private route for your browser. Shield. An isolated browser, off your device. Choose the mode. Close when finished.