---
title: "Get public user profile"
method: GET
path: "/v1/profiles/{handle}"
tags: ["profiles"]
---

# Get public user profile

`GET /v1/profiles/{handle}`

Get a user's public profile by their handle.

This is a public endpoint - no authentication required.

Returns 404 if:
- Handle not found
- User's profile is set to private

The response includes:
- **handle**: The user's handle
- **created_at**: When the account was created
- **stats**: Aggregated tip statistics (sent/received counts and totals)
- **earning_addresses**: Wallet addresses that can earn tips (Smart Account wallets)
- **social_links**: Linked social profiles (Twitter, GitHub, etc.)

## Path parameters

- `handle` string, required — User handle (case-insensitive)

## Response `200`

Successful Response

- PublicProfileResponse — Response model for GET /v1/profiles/{handle}. Returns public profile information for a user with a claimed handle. Only returned if the user has set is_profile_public=true.
  - `handle` string, required — User's handle (e.g., 'alice')
  - `description` string, nullable — Profile bio (max 280 characters)
  - `avatar_url` string, nullable — User-selected avatar URL from verified social identity
  - `theme` ProfileTheme — Theme customization for a public profile.
    - `accent_color` string, nullable — Hex accent color (e.g., '#4CAF50')
    - `preset` string, nullable — Theme preset name (e.g., 'dark', 'light', 'ocean')
  - `created_at` string, required — Account creation date (ISO 8601)
  - `stats` ProfileStats, required — Aggregated tip statistics for a public profile.
    - `tips_sent_count` integer, required — Total number of tips sent
    - `tips_sent_usd` string, required — Total USD value of tips sent
    - `tips_received_count` integer, required — Total number of tips received
    - `tips_received_usd` string, required — Total USD value of tips received
  - `earning_addresses` ProfileEarningAddress[] — Wallets that can earn tips
    - `address` string, required — Wallet address for earning tips
    - `network` string, required — Network (e.g., 'base', 'solana')
    - `label` string, required — Display label (e.g., 'Earning Wallet', 'Linked Wallet')
    - `is_primary` boolean — Whether this is the primary earning wallet
  - `social_links` ProfileSocialLink[] — Linked social profiles
    - `platform` string, required — Platform name (e.g., 'x', 'github', 'youtube')
    - `url` string, required — Full URL to the social profile
    - `verified` boolean — Whether ownership has been verified
    - `verified_at` string, nullable — When ownership was verified (ISO 8601)
    - `is_featured` boolean — Whether this link is featured prominently on the profile
    - `display_name` string, nullable — Display name from the platform profile
  - `referral_code` string, nullable — User's shareable referral code (e.g., 'GRV-ABC123')
  - `tip_to_talk_min` number, nullable — Minimum tip in USD for paid messages (Tip to Talk). NULL = disabled.
  - `is_claimed` boolean — Whether this profile has been claimed by the creator. Pre-registered profiles are unclaimed until the creator authenticates.
  - `tip_button_label` string — CTA label for the tip button on the profile page. Feed/content contexts should always show 'Tip' regardless.

## Other responses

- `404` — Profile not found or private
- `422` — Validation Error

---

[API](https://skmtc.net/grove/apis/grove-api.md) · [All operations](https://skmtc.net/grove/apis/grove-api/llms.txt) · [OpenAPI document](https://skmtc-service-staging.skmtc.workers.dev/v1/apis/grove/grove-api/versions/f286b48a8105/schema)
