API documentation

All routes are rate-limited per IP unless noted. Base URL: https://mcprofiles-v2.vercel.app . Privacy.

GET/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.

GET/api/server/[address]

Java and Bedrock server status via mcstatus.io (see README for provider stack).

POST/api/refresh/[uuid]

Force-refresh a cached player profile (stricter rate limit).

GET/api/discover

Recent players and aggregate stats for the home page.

GET/api/username/check

Username availability heuristic (Mojang 404-based).

GET/api/capes/explore

Cape explorer over stored snapshots. Params: types (comma-separated), requireAll=true|false (multi-cape AND), sort=recent|rarity|username, limit.

GET/api/watchlist?sessionId=…

List watches and optional alert email settings for a browser session.

POST/api/watchlist

Body: { sessionId, playerUuid }. Free tier max 8 entries per session; Plus max 60 when subscription is active.

DELETE/api/watchlist

Remove a watch (same body shape as POST).

PATCH/api/watchlist/alert

Configure email digest / notification preferences.

GET/api/cron/watchlist

Vercel Cron digest — requires Authorization: Bearer CRON_SECRET.

POST/api/privacy-request

Privacy / suppression requests (see privacy page).

GET/api/subscription?sessionId=…

Returns { plus, watchlistMax } for MCProfiles Plus status on this browser session.

GET/api/stripe/status

{ configured: boolean } — whether Stripe keys and price id are set server-side.

POST/api/stripe/checkout

Body: { sessionId }. Returns { url } to Stripe Checkout when configured.

POST/api/stripe/webhook

Stripe webhook — server-only; verifies signature with STRIPE_WEBHOOK_SECRET.