Start here. This is the direct spoken answer to practice first.
Why this question matters
Rate limiting is both reliability and security. A useful design protects expensive and abusive paths without randomly punishing normal clients.
I would identify callers by the best available stable signal: user id, API key, tenant, IP address, device id, or a combination. Then I would set limits by endpoint cost and risk. Login, password reset, suggestions, imports, and expensive searches may need different limits. When a limit is hit, the API returns 429 with a clear retry behavior.