> ## Documentation Index
> Fetch the complete documentation index at: https://docs.limitem.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Concepts

> Four fields. That's the model.

## Namespace

A namespace is the bucket your limits live in. Use your app or service name — `contiguity-api`, `console`, `webhooks`.

Two services should not share a namespace unless they intend to share a quota.

## Product

Optional. Appended to the namespace as `namespace.product`.

`product` is slugified: lowercased, and anything that isn't `a-z` or `0-9` becomes `_`.

```text theme={null}
tesla + "Model X"  →  tesla.model_x
```

Use it to split one app into separate quotas (SMS vs email, free vs paid, inbound vs outbound).

## Identifier

The thing you're limiting. A user id, an IP, an API key, a phone number — whatever is unique per subject.

```text theme={null}
user:123
ip:203.0.113.4
+15555550123
```

The same identifier in two namespaces is two independent counters.

## Limit and duration

`limit` is how many requests are allowed. `duration` is the window, in seconds on the API.

The SDK also accepts `"30s"`, `"5m"`, `"1h"`, and `"1d"`.

<Note>
  Limits must be at least `1` and at most `1,000,000`. Duration must be at least `1` second and at most one year.
</Note>

## Algorithms

Default is `fixed-window`. See [Algorithms](/algorithms/overview) if you need bursts, smoother windows, or traffic shaping.

## Fail-open

If Limitem is unreachable — or the SDK times out — the request is **allowed**.

That's intentional. A limiter that takes Contiguity down is worse than a limiter that misses a few extra requests.

<AccordionGroup>
  <Accordion title="How do I know it failed open?">
    The API includes `degraded: true` on the success payload. The SDK sets `failover: true`.
  </Accordion>

  <Accordion title="Can I fail closed instead?">
    Yes, in the SDK: `fail_closed: true`. Timeouts and 5xx then come back as `allowed: false` with `failover: true`.
  </Accordion>
</AccordionGroup>
