⌨ typer API

Running on port 50684

Endpoints

MethodPathDescriptionAuth
POST/auth/sessionExchange a Google ID token for a 30-day session JWTGoogle JWT
GET/meCurrent user + per-language profile updated_at + settings updated_atsession JWT
DELETE/meWipe the caller's user row (cascades to profiles + settings) — gated by ACCOUNT_DELETE_ALLOWLISTallowlisted
GET/me/profile/:langServer profile for a language (404 if none)session JWT
PUT/me/profile/:langUpsert profile for a language (last-write-wins)session JWT
GET/me/settingsServer settings (404 if none)session JWT
PUT/me/settingsUpsert settings (last-write-wins)session JWT
PUT/me/handleClaim or release a public handle (3-24 chars, [a-z0-9-])session JWT
GET/leaderboard?lang=&limit=Top opted-in public cards ordered by bestWpmpublic
GET/u/:handlePublic card for a claimed handle (404 if none)public
GET/booksPublic Library catalog (slug, title, author, lang, sizes)public
GET/books/:slugFull book JSON (paragraphs + chapters)public
GET/me/booksAll of the caller's per-book reading progresssession JWT
PUT/me/books/:slugUpsert a book's progress (last-write-wins)session JWT
POST/feedbackSubmit a bug report or feature requestoptional
POST/tips/checkoutCreate a Stripe Checkout Session for a voluntary tipoptional
POST/webhooks/stripeStripe webhook receiver (checkout.session.completed)signature
GET/admin/feedbackList recent feedback rows (newest first)admin
DELETE/admin/feedback/:idDelete a feedback rowadmin
GET/admin/tipsList recent tips + paid-sum totaladmin

Setup checks ✓

Database
Postgres reachable — 1 profiles from 1 users
Google Client ID
Configured
Session JWT secret
30-day session JWTs enabled
CORS origins
https://typer.fjrois.com, https://typer.training, https://typerrr.netlify.app, https://master--typerrr.netlify.app, http://localhost:5173, http://localhost:5174, http://localhost:5175
Dev auth
disabled
Admin emails
fjroissiso@gmail.com
Account-delete allowlist
DELETE /me allowed for: fjroissiso@gmail.com
Stripe
Tips enabled (return origin: https://typer.training)