Skip to main content
ReferenceUpdated · 3 min read

Free-tier rate limits and BYOK quotas

How Skrebe's demo limits work, when they apply, and what changes once you bring your own API key.

Skrebe ships a free demo tier so you can try translation and proofread without an API key. Once you bring your own key (BYOK), Skrebe stops counting and the provider counts instead. This page is the full surface.

The two demo tiers

When you don't have a saved API key, every AI request — translate, proofread, suggest — runs against the shared Skrebe pool. Two limits apply, in this order:

LimitWho it tracksQuotaWindowWhat you see when hit
Demo (anonymous)The IP you connect from5 requests1 hour"Demo limit reached (5/hr). Sign in for higher limits."
Daily (signed-in)Your Skrebe account50 requests24 hours"Daily limit reached (50/day). Resets in HH:MM."

Signing in moves you off the anonymous bucket onto the signed-in bucket. There's no overlap — your IP's anonymous quota and your account's daily quota are separate counters.

The current count lives in the user menu (top-right). It reads 0/5 this hour when anonymous and 0/50 today when signed in. When you've saved your own key, the chip flips to Unlimited.

The burst layer (everyone)

A separate per-IP burst limit is always on, including for signed-in users. It exists to stop abuse from a single machine and is generous enough that real usage almost never trips it:

  • 60 requests per hour, per IP, refilling continuously.

If you do hit it (e.g. running a script), the response is 429 with a Too many requests from this IP message. Wait a minute and continue.

What "BYOK" actually does

Once Skrebe sees a valid API key for the selected provider on each request, both the demo quota and the daily quota are bypassed. From Skrebe's side you become unlimited — the provider's own rate limits and billing take over. That means:

  • Speed and concurrency are governed by the provider's plan, not Skrebe.
  • Cost is whatever the provider charges per token; Skrebe never bills you.
  • Errors from the provider (rate-limit, expired key, billing hold) surface in Skrebe as a translate/proofread failure with the provider's message.

When a request gets blocked

A blocked request returns 429 with two headers worth knowing: X-RateLimit-Remaining and X-RateLimit-Reset (Unix timestamp). The in-app toast quotes the wait time in human form. Subsequent retries before reset will all be rejected — backing off is the only fix until the window rolls over.

If you regularly hit the daily 50/day cap on the free tier, that's the signal to set up BYOK. See Set up your own API key (BYOK) and Supported providers and models.

What's not rate-limited

  • Anything that doesn't call a model: opening a document, editing locally, running the ALUPEC linter, scrolling the dictionary or glossary, exporting .papia.json or .papia-preset.json.
  • Local-mode runs (developers hitting localhost) skip all rate-limit layers by design — the limits exist for the hosted app, not for your machine.