Altamar Labs
Back to Blog
reliability· 2 min read

Outbound rate limiting: why throttling yourself is part of the engineering

Almost the entire conversation about rate limiting is about protecting your own API from external abuse. The less discussed half is throttling yourself against the third-party APIs you consume.

When people talk about rate limiting, they're almost always talking about protecting their own API from clients making too many requests. There's a half of this problem that gets discussed far less, and that becomes critical the moment a system orchestrates multiple accounts or identities toward an external platform: throttling yourself against that platform's own rules, before it does it for you the hard way.

Why the problem changes with multiple identities

Respecting an external API's rate limit with a single account is relatively simple: the docs say how many requests per minute are allowed, and you just stay under that. The problem becomes genuinely different once the system orchestrates dozens of accounts toward the same platform, because the limit is no longer just "how many requests per minute in total," it's often also "how many requests per minute per individual account," and both limits need to be respected simultaneously without one noisy account eating into everyone else's rate budget.

The risk that isn't just a 429 error

The cost of exceeding a rate limit is almost never just an error response you can retry without consequence. Many platforms treat sustained limit violations as a signal of suspicious behavior, responding not with a simple error but with progressive restrictions: stricter limits for a period, manual account review, or in extreme cases, temporary or permanent suspension. A system that treats every 429 as "retry later" without adjusting its future behavior is, little by little, pushing its own accounts toward that risk zone.

Designing your own limit before the provider imposes it

The mature answer isn't reacting to the provider's limit, it's explicitly modeling it inside your own system, per account and in aggregate, and letting business logic wait its turn predictably instead of discovering the limit through brute force. This requires treating "how much request capacity does this account have left this minute" as a first-class piece of data the system checks before acting, not as a consequence discovered after the fact.

This also changes how work gets distributed across identities: if one account is approaching its limit while others have headroom, the pending operation can be reassigned to an account with available capacity, instead of forcing a retry against the same already-saturated account.

The lesson

Outbound rate limiting rarely shows up in a system's initial design, because in the early months, with low volume and few accounts, it simply doesn't manifest as a problem. It shows up exactly when the system starts succeeding and scaling, which is also the worst possible moment to discover it reactively. Designing for it ahead of time isn't paranoia, it's recognizing that any integration with an external platform imposes an implicit contract, and that respecting it proactively is cheaper than repairing an account's reputation after losing it.