Anti-abuse shields
The following caps exist so that a single bad actor cannot degrade the service for every other customer. They are orders of magnitude above any legitimate use — none of them should ever fire for a real buyer. They are published here because 'hidden ceilings' are exactly the pattern our pillar article was written against.
Per-shortcode scan flood
A single shortcode may not be scanned more than 100 times per second. Above that, the redirect is delayed rather than served — the code does not break. This cap exists only to prevent a single code from being weaponised as a denial-of-service vector against the resolver. Normal viral-scan events never approach it.
Code-creation rate
An account may create at most 5000 new codes in any rolling 24-hour window — via the dashboard or (when it lands) the management API. This is an anti-abuse ceiling, not a plan feature. A small business never approaches it; a script generating millions of codes as a spam vector hits it immediately.
Management API rate
Every API token is rate-limited to 600 requests per minute, sliding window, with standard X-RateLimit-* response headers and a 429 + Retry-After on over-limit. The management API is not yet live — this number is stated now because docs/02-api-spec.md commits to it, and we want one page to be the single source of truth whether the API is yet shipped or not.
Data export rate
Each account may run the self-serve 'download my data' export at most 1 time per minute. This is a per-account abuse shield on the streaming export path — it does not cap how often you can export per day, only how fast successive clicks can fire. A human clicking the button never approaches it.
QR image download rate
The public QR image URLs (SVG and PNG downloads) are limited to 120 requests per minute per IP address, answered with 429 + Retry-After above that. Embedding your QR image on a page is unaffected — each visitor fetches it from their own address — and a hand-run bulk download never sustains two requests per second. This shield only exists so a single source cannot burn server CPU by re-rendering one image in a loop.