Start from why. Rate limits exist to protect infrastructure, to make plans and pricing enforceable, to blunt abuse, and to segment consumers by their relationship with you. Different reasons imply different limits, and the most common mistake is applying one global number that serves none of them.
Set limits per consumer and per plan, not per API. A free-tier evaluator, a paying customer, and a strategic partner should not share a ceiling. Consider per-operation limits where the cost profile differs sharply — a search endpoint and a static lookup are not the same load.
Be transparent about it. Publish the limits before signup, not after someone hits one. Return the
limit, the remaining quota, and the reset time in response headers on every call. Return 429 with
Retry-After when the limit is hit, and never fail silently or return a 200 with truncated data.
Then give people a path upward. Management should not just limit consumers — it should let them scale. A limit with no visible way to raise it reads as a wall, and consumers who hit walls leave. Publish what the next tier is, and how to reach a human when the standard tiers do not fit.
One caution: rate limiting is not a security control, though it is often sold as one. It slows down abuse and enumeration. It does not authorize anybody.