---
title: "Linkme Profile API"
method: GET
path: "/v1/linkme/profile"
tags: ["Linkme"]
---

# Linkme Profile API

`GET /v1/linkme/profile`

## Request

- Base URL: `https://api.captapi.com`
- URL: `https://api.captapi.com/v1/linkme/profile`
- Auth: one of:
  - HTTP bearer
  - API key in header `X-API-Key`

Linkme profile → bio, profileVisitCount, featured links, webLinks, email/infoLinks, stripeStatus.

Paste a Linkme URL (link.me/danucd) and get the public profile from Linkme's dehydrated SSR payload (TanStack $tsr) — not HTML meta tags or the site footer. Identity: id, username, displayName, firstName/lastName when distinct, bio, avatar + isDefaultProfilePicture. Audience: profileVisitCount (e.g. 15.9k) and totalLinks (Linkme's SSR counter — not links[].length). Flags: verifiedAccount, isAmbassador, isPrivate. Timestamps: createdAt/updatedAt. links[] are featured CTA rows; webLinks[] are social icon groups; infoLinks[] carry email/contact — three separate buckets, not a union. stripeStatus{tipsEnabled,stripeEnabled} signals monetization; socials{} + other[] cover mapped/unmapped networks. Flat 1 credit. Pass cache=true or cacheMaxAge (1d/3d/7d/14d/30d) for the shared response cache.

Docs: https://captapi.com/apis/linkme-profile

## Query parameters

- `url` string, required
- `cache` boolean
- `cacheMaxAge` '1d' | '3d' | '7d' | '14d' | '30d'

## Response `200`

Success. The data object for this endpoint.

- object
  - `success` unknown, required
  - `data` object, required
    - `platform` string: Platform identifier for this response (matches the endpoint's platform).
    - `id` string: Linkme profile id as a hex string.
    - `url` string: On the page: https://link.me/{username}. On a link row: outbound destination.
    - `username` string: Linkme account username (bare, no @). Canonical account handle.
    - `handle` string: Account handle.
    - `displayName` string: firstName + lastName when present. Canonical human-readable name (no name/handle twins).
    - `name` string: Name of the item or account. On profile endpoints: deprecated alias of displayName (one release).
    - `firstName` string: Given name from Linkme when distinct from displayName. Omitted when it would duplicate displayName with no lastName.
    - `avatar` string: Profile image URL on media.link.me. Check isDefaultProfilePicture before treating it as a real photo.
    - `profileVisitCount` string: Public profile visit count as Linkme displays it (string, e.g. "15.9k" or "29"). One of the few audience metrics in the link-in-bio block.
    - `createdAt` string: Profile createdAt from Linkme (YYYY-MM-DD HH:mm:ss).
    - `updatedAt` string: Profile updatedAt from Linkme (YYYY-MM-DD HH:mm:ss).
    - `email` string: Public email from infoLinks when published. Null when unset.
    - `socials` object
      - `appleMusic` string: Apple music URL.
      - `spotify` string: Spotify URL.
      - `instagram` string: Instagram URL.
      - `facebook` string: Facebook URL.
      - `twitter` string: Twitter URL.
      - `youtube` string: Youtube URL.
      - `tiktok` string: Tiktok URL.
      - `twitch` string: Twitch URL.
      - `threads` string: Threads URL.
    - `chatId` string: Chat id. Example: "LinkMe-1169288".
    - `bio` string: Creator bio from the dehydrated profile. Empty string when unset.
    - `description` string: Description text.
    - `links` object[]: Featured CTA buttons [{id?, title, url, thumbnail?, description?}]. Never Privacy Policy / Terms footer rows. Not a union of webLinks/infoLinks — iterate links alone for CTAs.
      - `url` string: On the page: https://link.me/{username}. On a link row: outbound destination.
      - `title` string: Title of this links item.
      - `id` string: Id of this links item.
      - `thumbnail` string: Thumbnail image URL.
    - `linkCount` integer: Number of featured CTA rows in links[] (not footer chrome). Prefer this when you need array length.
    - `totalLinks` integer: Linkme SSR profile.totalLinks — the platform's own counter from the dehydrated profile. Not derived from links[], webLinks[], or infoLinks[] (those are separate surfaces and their lengths can disagree with this number).
    - `webLinks` object[]
      - `title` string: Title of this web links item.
      - `linkId` integer: Stable id for a bio link when Meta exposes one.
      - `links` object[]: Featured CTA buttons [{id?, title, url, thumbnail?, description?}]. Never Privacy Policy / Terms footer rows. Not a union of webLinks/infoLinks — iterate links alone for CTAs.
        - `linkValue` string
        - `faceValue` string
        - `baseUrl` string
    - `infoLinks` object[]
      - `title` string: Title of this info links item.
      - `linkId` integer: Stable id for a bio link when Meta exposes one.
      - `links` object[]: Featured CTA buttons [{id?, title, url, thumbnail?, description?}]. Never Privacy Policy / Terms footer rows. Not a union of webLinks/infoLinks — iterate links alone for CTAs.
        - `linkValue` string
        - `faceValue` string
    - `other` object[]
      - `url` string: On the page: https://link.me/{username}. On a link row: outbound destination.
      - `title` string: Title of this other item.
      - `type` string: Content type of the item.
    - `stripeStatus` object
      - `tipsEnabled` boolean: Tips enabled. Example: false.
      - `stripeEnabled` boolean: Stripe enabled. Example: false.
    - `isDefaultProfilePicture` boolean: True when Linkme is serving a placeholder avatar (e.g. default/profile/avatar-2.png) — not the creator's photo.
    - `verifiedAccount` boolean: True when Linkme marks the account verified.
    - `isAmbassador` boolean: True when the profile is a Linkme ambassador.
    - `isPrivate` boolean: True when the profile is private.

## Other responses

- `400`: Bad request: wrong platform URL, unknown endpoint, or an invalid parameter value. Not billed.
- `401`: Missing, invalid or revoked API key. Not billed.
- `402`: Not enough credits for this request. Not billed.
- `404`: The resource does not exist or is not public. Not billed.
- `422`: A required parameter is missing or has the wrong type. Not billed.
- `429`: Rate limit reached. Wait for Retry-After seconds. Not billed.
- `502`: The platform could not be reached or returned nothing usable. Retryable, not billed. 503 and 504 use the same envelope.

---

[API](https://skmtc.dev/captapi/apis/captapi-api.md) · [All operations](https://skmtc.dev/captapi/apis/captapi-api/llms.txt) · [OpenAPI document](https://skmtc.dev/captapi/apis/captapi-api/revisions/c9b9ac5ff1bd?raw)
