# Welink > Welink is a portfolio social platform for developers. Showcase projects, follow makers, and discover trending developer work. Welink lets developers publish projects with rich previews, post updates, follow other makers, and chat. The home feed mixes posts and projects, ranked for relevance. ## Pages - [Home](/): For-you and following feeds mixing developer posts and projects. - [Explore](/explore): Discover trending projects and developers across the platform. - [Developer API](/developers): Public read-only JSON API docs and API key management. - [Dev Card Studio](/tools/dev-card): Generate a shareable developer card. - [Terms and Privacy](/terms): Terms of use and privacy policy. - [Sign in](/auth): Sign in or create a Welink account. ## Public API Base URL: https://pmhfhyuqhndjfbzbzclx.supabase.co/functions/v1/public-api Read-only JSON, CORS enabled, cacheable for 60 seconds. No server required: call it directly from a static site. ### Endpoints - `GET /v1/profile?username=NAME` - public profile fields and links. - `GET /v1/projects?username=NAME&limit=20&offset=0` - projects, newest first. - `GET /v1/posts?username=NAME&limit=20&offset=0` - posts, newest first. - `GET /v1/portfolio?username=NAME` - profile, projects and posts in one call. ### Parameters - `username` (string): the Welink username. Optional when an API key is sent; it then resolves to the key owner. - `limit` (1-50, default 20) - `offset` (integer, default 0) ### Authentication Optional. Send an API key created on /developers as the `x-api-key` header, or as the `api_key` query parameter. ### Rate limits 120 requests per minute with an API key, 20 per minute without one. Every response carries `X-RateLimit-Limit`, `X-RateLimit-Remaining` and `X-RateLimit-Reset`. Exceeding the limit returns HTTP 429 with `Retry-After`. ### Example ```js const res = await fetch( "https://pmhfhyuqhndjfbzbzclx.supabase.co/functions/v1/public-api/v1/portfolio?username=fanueldx25", { headers: { "x-api-key": "wlk_..." } } ); const { profile, projects, posts } = await res.json(); ``` ### Response shapes `profile`: username, display_name, bio, avatar_url, cover_url, location, availability, skills[], links{github,website,twitter,linkedin}, verified, joined_at, url. `projects[]`: id, title, description, cover_url, images[], tech_stack[], live_url, repo_url, created_at, url. `posts[]`: id, content, images[], preview_title, preview_description, preview_url, preview_image_url, created_at, url. ### Errors `invalid_api_key` (401), `profile_unavailable` (403), `profile_not_found` (404), `method_not_allowed` (405), `rate_limited` (429), `internal_error` (500).