Profile
Endpoint
Section titled “Endpoint”GET /api/public/:username/profileReturns core profile fields and high-level counts used by widgets and profile cards.
Path params
Section titled “Path params”| Param | Type | Required | Description |
|---|---|---|---|
username | string | yes | Interis username to resolve |
Query params
Section titled “Query params”None.
Response
Section titled “Response”{ "username": "your_username", "displayUsername": "Your Username", "name": "Your Name", "image": null, "avatarUrl": null, "bio": "Public bio", "location": "Istanbul", "favoriteGenres": ["Drama", "Thriller"], "themeId": "null-log", "createdAt": "2026-01-01T12:00:00.000Z", "stats": { "entryCount": 120, "reviewCount": 42, "filmCount": 95, "listCount": 8, "followerCount": 15, "followingCount": 21 }}- Timestamps are serialized as ISO datetime strings.
favoriteGenresis an array (falls back to[]when missing).listCountis sourced from the user stats aggregate (not only public lists).
Empty state behavior
Section titled “Empty state behavior”No array-style empty state. For existing users, this endpoint returns an object.
Error behavior
Section titled “Error behavior”404when username does not exist.429when the public rate limit is exceeded.500for unexpected server errors.
Examples
Section titled “Examples”const username = 'your_username';const res = await fetch(`https://api.interis.gorkemkaryol.dev/api/public/${username}/profile`);
if (!res.ok) throw new Error(`Profile request failed: ${res.status}`);
const profile = await res.json();console.log(profile.displayUsername ?? profile.username);curl "https://api.interis.gorkemkaryol.dev/api/public/your_username/profile"Practical: render a compact profile header
Section titled “Practical: render a compact profile header”function toProfileHeader(profile) { return { title: profile.displayUsername ?? profile.username, subtitle: `${profile.stats.reviewCount} reviews · ${profile.stats.entryCount} logs`, themeId: profile.themeId, };}Next: Top 4 endpoint