Loading qrserra
Loading qrserra
A practical reference for what is live, what requires an account, how protected APIs work, how crypto billing is verified, and what must be checked before production launch.
qrserra separates browser-only static QR generation from account-backed dynamic QR workflows. Free static generation stays useful without hiding the paid workflow.
The public v1 API is still a roadmap surface. The current production app routes already use the same core protection model that the future external API should keep.
GET /api/qrsList saved QR records for the signed-in workspace.
Supabase auth, workspace membership, rate limit.
POST /api/qrsCreate a dynamic QR code when the workspace plan allows it.
Same-origin, JSON-only, body limit, zod validation, plan check.
GET /api/qrs/[id]Read one workspace QR record by id.
Supabase auth, workspace ownership, id validation, rate limit.
PATCH /api/qrs/[id]Update title, destination, status, or design settings.
Same-origin, JSON-only, body limit, zod validation, plan check.
DELETE /api/qrs/[id]Archive a QR record without deleting scan history.
Same-origin, workspace ownership, plan check, rate limit.
GET /q/[shortId]Redirect active dynamic QR scans to safe http or https destinations.
Short id validation, safe URL validation, no-store redirect, limited telemetry writes.
The security model is layered: browser request checks, server validation, Supabase ownership, service-role isolation, rate limits, and deployment headers each cover a different failure mode.
Crypto checkout does not trust client values for settlement. The server creates the quote, scanners verify chain activity, and the database function applies credits idempotently.
These checks explain what has to be true before account-backed features, API persistence, admin views, chat, and billing can be considered live.
Apply supabase/schema.sql before relying on saved QR, account, admin, chat, or billing data.
Run npm run env:check for local secret shape checks.
Run npm run env:check:live after production keys and schema are applied.
Call /api/health for public uptime checks.
Call /api/health?deep=1 with Authorization: Bearer <CRON_SECRET> for backend readiness.
Use platform-level DDoS or WAF protection for volumetric traffic; app limits protect normal spam and resource abuse.