API documentation
All routes are rate-limited per IP unless noted. Base URL: https://mcprofiles-v2.vercel.app
. Privacy.
/api/player/[query]Returns a Java player profile (Mojang session + aggregated capes + Geyser Bedrock enrichment when available).
Query params: type=java|bedrock|all (default all) — metadata only; same lookup pipeline. Use bedrock to set meta.bedrockFocus for clients.
Response: { data, meta } with cacheState, requestedType, etc.
/api/server/[address]Java and Bedrock server status via mcstatus.io (see README for provider stack).
/api/refresh/[uuid]Force-refresh a cached player profile (stricter rate limit).
/api/discoverRecent players and aggregate stats for the home page.
/api/username/checkUsername availability heuristic (Mojang 404-based).
/api/capes/exploreCape explorer over stored snapshots. Params: types (comma-separated), requireAll=true|false (multi-cape AND), sort=recent|rarity|username, limit.
/api/watchlist?sessionId=…List watches and optional alert email settings for a browser session.
/api/watchlistBody: { sessionId, playerUuid }. Free tier max 8 entries per session; Plus max 60 when subscription is active.
/api/watchlistRemove a watch (same body shape as POST).
/api/watchlist/alertConfigure email digest / notification preferences.
/api/cron/watchlistVercel Cron digest — requires Authorization: Bearer CRON_SECRET.
/api/privacy-requestPrivacy / suppression requests (see privacy page).
/api/subscription?sessionId=…Returns { plus, watchlistMax } for MCProfiles Plus status on this browser session.
/api/stripe/status{ configured: boolean } — whether Stripe keys and price id are set server-side.
/api/stripe/checkoutBody: { sessionId }. Returns { url } to Stripe Checkout when configured.
/api/stripe/webhookStripe webhook — server-only; verifies signature with STRIPE_WEBHOOK_SECRET.