# `Tinkex.RateLimiter`
[🔗](https://github.com/North-Shore-AI/tinkex/blob/v0.4.0/lib/tinkex/rate_limiter.ex#L1)

Shared backoff state per `{base_url, api_key}` combination.

# `limiter`

```elixir
@type limiter() :: :atomics.atomics_ref()
```

# `clear_backoff`

```elixir
@spec clear_backoff(limiter()) :: :ok
```

Clear any active backoff window.

# `for_key`

```elixir
@spec for_key({String.t(), String.t() | nil}) :: limiter()
```

Get or create the limiter for a `{base_url, api_key}` tuple.

# `set_backoff`

```elixir
@spec set_backoff(limiter(), non_neg_integer()) :: :ok
```

Set a backoff window in milliseconds.

# `should_backoff?`

```elixir
@spec should_backoff?(limiter()) :: boolean()
```

Determine whether the limiter is currently in a backoff window.

# `wait_for_backoff`

```elixir
@spec wait_for_backoff(limiter()) :: :ok
```

Block until the backoff window has passed.

---

*Consult [api-reference.md](api-reference.md) for complete listing*
