API ReferenceapiidentityGET /v1/users/by-handle/{handle}

GET /v1/users/by-handle/\{handle\}

Service: identity · operationId: (none)

Public profile lookup for a user handle

Required scopes

(no scope declared — review service config)

Path parameters

  • handle (string) required

Responses

200 Public profile resolved by handle

{
  "type": "object",
  "properties": {
    "user_id": {
      "type": "string"
    },
    "display_name": {
      "type": [
        "string",
        "null"
      ]
    },
    "bio": {
      "type": [
        "string",
        "null"
      ]
    },
    "avatar_url": {
      "type": [
        "string",
        "null"
      ]
    },
    "badges": {
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "description": "Badge ID"
          },
          "type": {
            "type": "string",
            "description": "'verified' | 'credential' | 'achievement'"
          },
          "label": {
            "type": "string",
            "description": "Human-readable badge label"
          },
          "color": {
            "type": [
              "string",
              "null"
            ],
            "description": "Badge color"
          },
          "icon": {
            "type": [
              "string",
              "null"
            ],
            "description": "Icon name"
          },
          "tooltip": {
            "type": [
              "string",
              "null"
            ],
            "description": "Tooltip text"
          },
          "granted_at": {
            "type": "string",
            "description": "ISO 8601 timestamp"
          }
        },
        "required": [
          "id",
          "type",
          "label",
          "color",
          "icon",
          "tooltip",
          "granted_at"
        ]
      }
    },
    "follower_count": {
      "type": "number"
    },
    "joined_at": {
      "type": [
        "string",
        "null"
      ]
    },
    "display_full_name": {
      "type": "boolean",
      "description": "If false, viewers should render display name as 'First L.'"
    },
    "specialties": {
      "type": "array",
      "items": {
        "type": "string"
      },
      "description": "Free-form coach specialty chips (e.g. 'GI health')"
    },
    "coach_booking_url": {
      "type": [
        "string",
        "null"
      ],
      "description": "Deeplink to /coach/{id}/book when user holds the coach role"
    },
    "mutual_followers_count": {
      "type": "number",
      "description": "Always 0 from identity; mutual follower count is computed by the community follows API"
    },
    "kind": {
      "type": "string",
      "enum": [
        "member",
        "coach",
        "team"
      ],
      "description": "Profile kind derived from user role"
    },
    "day_on_loop": {
      "type": [
        "number",
        "null"
      ],
      "description": "Days since onboarding completed (member only)"
    },
    "active_protocol_label": {
      "type": [
        "string",
        "null"
      ],
      "description": "Current protocol label (member only)"
    },
    "ig_handle": {
      "type": [
        "string",
        "null"
      ],
      "description": "Instagram handle"
    },
    "follows_me": {
      "type": "boolean",
      "description": "Whether the profile user follows the viewer"
    },
    "is_blocked": {
      "type": "boolean",
      "description": "Whether the viewer has blocked this user"
    },
    "is_blocked_by": {
      "type": "boolean",
      "description": "Whether this user has blocked the viewer"
    },
    "mutual_follows_count": {
      "type": "number",
      "description": "Number of mutual follows with the viewer"
    },
    "handle": {
      "type": "string"
    },
    "role_label": {
      "type": [
        "string",
        "null"
      ]
    },
    "social_links": {
      "type": "object",
      "properties": {
        "instagram": {
          "type": [
            "string",
            "null"
          ]
        },
        "twitter": {
          "type": [
            "string",
            "null"
          ]
        },
        "youtube": {
          "type": [
            "string",
            "null"
          ]
        }
      },
      "required": [
        "instagram",
        "twitter",
        "youtube"
      ]
    }
  },
  "required": [
    "user_id",
    "display_name",
    "bio",
    "avatar_url",
    "badges",
    "follower_count",
    "joined_at",
    "display_full_name",
    "specialties",
    "coach_booking_url",
    "mutual_followers_count",
    "kind",
    "day_on_loop",
    "active_protocol_label",
    "ig_handle",
    "follows_me",
    "is_blocked",
    "is_blocked_by",
    "mutual_follows_count",
    "handle",
    "role_label",
    "social_links"
  ]
}

404 Profile not found for handle

{
  "type": "object",
  "properties": {
    "error": {
      "type": "string"
    },
    "message": {
      "type": "string"
    }
  },
  "required": [
    "error",
    "message"
  ]
}

502 Unable to resolve handle

{
  "type": "object",
  "properties": {
    "error": {
      "type": "string"
    },
    "message": {
      "type": "string"
    }
  },
  "required": [
    "error",
    "message"
  ]
}

Example

curl -X GET https://identity.platform.loop.health/v1/users/by-handle/{handle} \
  -H "Authorization: Bearer $ACCESS_TOKEN"