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

# Limits

> Request quota, keyword entitlements, and how your plan changes both.

Two different things bound your usage: **credits** (what a call costs — see [Credits](/credits))
and the limits on this page (how often you may call, how many keywords you may run, and how
many searches those fan out to). Your plan sets both.

What a plan sells is **keywords × terms × freshness**. Credits are the meter underneath and
the abuse fuse — every plan includes far more of them than a monitoring account spends.

## Plan entitlements

| Plan | Keywords | Terms / search | Min interval | Active searches | Requests / min | Monthly credits |
| - | - | - | - | - | - | - |
| Free | 1 | 3 | 3600s | 2 | 60 | 1,000 |
| Solo | 3 | 10 | 900s | 25 | 350 | 150,000 |
| Growth | 10 | 25 | 300s | 80 | 700 | 650,000 |
| Pro | 30 | 50 | 60s | 250 | 1,200 | 2,500,000 |

`Solo` is the display name of the `starter` tier — `accounts.plan_tier` and the API still
say `starter`.

**Active searches** is the fan-out fuse, not the axis you shop on: one keyword claims one
slot per search per enabled Source (`searchSlots` in [the estimate](/keywords#estimate)), and
the cap sits well above what a plan's keywords produce in normal use. You meet the keyword
cap first.

Credit packs top up your balance but never change the limits above — those move only with
the plan.

<h2 id="terms">
  Terms per search
</h2>

A search carries either a single `query` or a list of `terms`, never both. A term list is
OR'd into **one** upstream request, so a brand plus its variants costs one poll and one
tick — the same as a single term. Your plan caps the list length.

`terms` is accepted only on the Sources whose own search supports boolean OR, measured
live rather than read off their docs:

| Source | `terms` | How they join |
| - | - | - |
| X | ✓ | `OR` |
| Reddit | ✓ | `OR` |
| Youtube | ✓ | `\|` |
| RSS / Google News | ✓ | `OR` |
| Hacker News | — | Algolia ANDs every token it is given, `OR` included |
| Bluesky | — | The AT Protocol query ANDs its tokens the same way |
| Vinted | — | A catalog search is not a boolean text search |

Sending `terms` to one of the last three answers **400** `VALIDATION` naming the Source. It
is never split into several searches behind your back: that would be a surprise invoice.

## Plan features

Beyond the four figures above, a plan also unlocks a short list of **dashboard features** —
capabilities a tier has or does not have, rather than has more of:

| Feature | Free | Solo | Growth | Pro |
| - | - | - | - | - |
| Semantic rules & weekly reports | — | — | ✓ | ✓ |

These gate the dashboard only. **Nothing on `/v1` is ever gated by plan features** — every
plan reaches the full pull surface, metered by credits and bounded by the request quota
above. A plan change never makes an API call that used to work start failing.

## Request quota

`/v1/*` is limited per **Account** (not per API key) in a rolling 60-second window, at the
requests-per-minute figure for your plan. Exceeding it returns **429** with
`code: "TOO_MANY_REQUESTS"`; see [Errors — Rate limits](/errors#rate-limits) for the
envelope and the `RateLimit-*` / `Retry-After` headers.

Because the quota is per Account, extra API keys do not buy extra throughput.

<h2 id="polling-limits">
  Interval and slot limits
</h2>

Polling limits are enforced at **two** levels, and the stricter one wins.

### Minimum interval

```
effective minimum = max(plan minimum, source minimum)
```

Source minimums are 60s for X, Reddit and Youtube, 120s for Bluesky, Hacker News and RSS, 15s for Vinted,
and **21600s (6 h) for AI answers** ([Keywords](/keywords#per-source-limits)).
Because the plan floor is never below 60s, **Vinted's 15s Source floor is not reachable on any
current plan**: the fastest Vinted polling is 60s, on Pro. On Free the effective minimum is
3600s, so `refreshIntervalSeconds: 15` is rejected with **400** `VALIDATION` even though the
Source itself allows it.

| Plan | X / Reddit / Youtube | Bluesky / Hacker News / RSS | Vinted |
| - | - | - | - |
| Free | 3600s | 3600s | 3600s |
| Solo | 900s | 900s | 900s |
| Growth | 300s | 300s | 300s |
| Pro | 60s | 120s | 60s |

AI answers floors at **6 h** on every plan — the Source floor wins, and a run
there is a paid prompt rather than a feed fetch.

The maximum is **86400s** (24 h) on every plan and Source, except AI answers,
which allows up to **604800s** (7 days) for the same reason.

A slow interval trades coverage for cost: each tick reads one page of the Source, so a
busy term polled daily reports what fits in that page and misses whatever scrolled past
it in between. Pick the slow end for terms that are quiet, not for terms that are noisy.

### Active search cap

Creating or editing a keyword checks the plan's cap on active searches **account-wide
across all Sources**. `POST /v1/keywords/estimate` answers how many slots a body would
take (`searchSlots.requested`) against what is in use and the plan's limit, before you
write anything.

Each Source also has its own ceiling on active searches per Account, whatever the plan:
**50** on Vinted, **10** on AI answers and TikTok, **20** on every other Source. Three
Reddit searches count as three, whichever keywords they sit in. A write that would cross
a ceiling is refused with **400** `VALIDATION` naming the Source.

## Downgrades pause what no longer fits

Moving to a lower plan does not delete anything. Polling that now breaks the new
entitlements (faster than the new minimum, or beyond the new cap) is paused with
`pausedReason: plan_entitlement`. The oldest are kept first; the newest are
paused.

Nothing resumes automatically. After upgrading again, call
`POST /v1/keywords/{id}/resume`. Resume re-checks the cap and interval, and names what
could not follow in `blockedSources`.

<Note>
  A Source paused by support (`admin_paused`) cannot be resumed with the API: a keyword
  resume leaves it stopped and names it in `blockedSources`.
</Note>

## Next steps

* [Credits](/credits) — what each call costs
* [Keywords](/keywords): lifecycle and per-Source behaviour
* [Errors](/errors) — status codes and the error envelope


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.