> **For coding agents and LLMs:** This is one Social Fetch marketing page (markdown export). For API orientation start with [`/llms.txt`](https://www.socialfetch.dev/llms.txt); for auth and crawl rules use [`/agents.txt`](https://www.socialfetch.dev/agents.txt); for every operation use [`/llms-endpoints.txt`](https://www.socialfetch.dev/llms-endpoints.txt).

## This page

- **On-site (HTML):** <https://www.socialfetch.dev/platforms/lnk-bio>
- **Markdown (.mdx) URL:** <https://www.socialfetch.dev/platforms/lnk-bio.mdx>

---

# Lnk.Bio API. Profiles and links as JSON.

Read a public Lnk.Bio profile, page through every link on it, search inside one profile's links, and walk the public profile directory. Name the handle, get typed JSON.

- Profiles + links
- Search inside one profile
- 1 credit per request

Social Fetch exposes four routes under `/v1/lnk-bio`. `GET /v1/lnk-bio/profiles/{handle}` returns one public profile with its identity, bio, avatar, social and contact icons, page tabs, embed blocks and the links on its main page. `GET /v1/lnk-bio/profiles/{handle}/links` pages through every link on that profile, up to 200 per page. `GET /v1/lnk-bio/profiles/{handle}/links/search` searches the text of one profile's links and returns at most 30 matches. `GET /v1/lnk-bio/profiles` walks the public profile directory.

Handles are used as the profile shows them. Case is preserved, and `@`, `&` and `+` are real handle characters: `sportsillustrated`, `Curate.in`, `S&S` and `@brastel.thai` all name public pages. A percent-encoded handle in the public path is decoded once.

Every response uses the `{ data, meta }` envelope. A profile that does not exist comes back as HTTP 200 with `data.lookupStatus` set to `not_found`, not as an error. Link and directory lists carry `page.hasMore` and `page.nextCursor`; the cursor is opaque and only works for the same handle or the same `modifiedSince` filter. On the directory, a page can be empty while `page.hasMore` is true, so follow `page.nextCursor`.

## What you can get

- Profile identity: display name, bio, avatar, verified flag, connected username, timezone, custom domain, share image and page tabs with their heading and text.
- Up to 1,000 main-page links on a profile, and up to 200 per page on the links route, with title, URL, thumbnail, zero-based position, group heading, badge and block type.
- Social and contact icons with a normalized platform slug, the raw network code and the icon title.
- Link search inside one profile, up to 30 matches and no paging.
- The public profile directory with handle, profileUrl, lastModified, changeFrequency and priority, filterable with modifiedSince.
- Typed not_found for missing profiles, and opaque cursors for long link lists and directory walks.

## Lnk.Bio endpoints

| Endpoint | Request | Credits | Docs |
| --- | --- | --- | --- |
| Profile | GET /v1/lnk-bio/profiles/{handle} | 1 credit Failed requests are free | [docs](https://www.socialfetch.dev/docs/api/v1/lnk-bio/profiles/handle/get) |
| Profiles | GET /v1/lnk-bio/profiles | 1 credit Failed requests are free | [docs](https://www.socialfetch.dev/docs/api/v1/lnk-bio/profiles/get) |
| Links | GET /v1/lnk-bio/profiles/{handle}/links | 1 credit Failed requests are free | [docs](https://www.socialfetch.dev/docs/api/v1/lnk-bio/profiles/handle/links/get) |
| Search links | GET /v1/lnk-bio/profiles/{handle}/links/search | 1 credit Failed requests are free | [docs](https://www.socialfetch.dev/docs/api/v1/lnk-bio/profiles/handle/links/search/get) |

## How to start

1. **Create an API key.** Sign up at Social Fetch and copy a key (`sfk_…`). New accounts get 100 free credits, enough to try every Lnk.Bio route on a few profiles.
2. **Pick the route and handle.** Use the handle as the profile shows it, for example `GET /v1/lnk-bio/profiles/sportsillustrated` for the profile, or `GET /v1/lnk-bio/profiles/sportsillustrated/links?limit=200` for a full page of links. Send `x-api-key` on every request.
3. **Branch on lookupStatus and page.** Check `data.lookupStatus` before storing a row. Keep requesting with `page.nextCursor` while `page.hasMore` is true, and bill from `meta.creditsCharged`.

## Pricing

Each Lnk.Bio route charges one credit per completed request, and each page of `links.list` or `profiles.list` is its own request. `meta.creditsCharged` on every response is the billing source of truth. New accounts start with 100 free credits.

## Compared with the official API

Lnk.Bio's documented API is built for account holders and needs OAuth, so it is not a way to read another person's public profile. Social Fetch covers the public side: one profile, its links in pages up to 200, a text search inside those links, and the public profile directory. All four routes share one JSON shape, use `lookupStatus` for a missing profile, and use cursors instead of offsets you have to compute.

## FAQ

### Is there a Lnk.Bio API for public profiles and links?

Yes. Social Fetch has four Lnk.Bio routes under /v1/lnk-bio: a profile, its links, a search inside those links, and the public profile directory. Authenticate with your Social Fetch API key in x-api-key.

### How do I pass a handle?

Use the handle as the profile shows it. Case is preserved, and @, &, +, *, . and _ are valid characters, so sportsillustrated, Curate.in, S&S and @brastel.thai all work. A percent-encoded handle in the path is decoded once. Handles are 2 to 128 characters.

### Why is linksTotal null on a profile response?

linksTotal is null when the total is not known from this response; call GET /v1/lnk-bio/profiles/{handle}/links for the full count. When the response holds every link, linksTotal equals the number of links returned.

### How many links can I get at once?

GET /v1/lnk-bio/profiles/{handle}/links takes limit from 1 to 200 and defaults to 100. Read page.nextCursor while page.hasMore is true. The cursor only works for the same handle. linksTotal is the known total, and page.hasMore says whether another page exists.

### What does link search return?

GET /v1/lnk-bio/profiles/{handle}/links/search?query=draft returns up to 30 matching links from that one profile, the query in data.query, and page.hasMore false because search has no paging. data.truncatedAtLimit is true when the 30-match cap was hit. The query is 1 to 100 characters. No match is a found profile with an empty links list.

### What is in the public profile directory?

GET /v1/lnk-bio/profiles returns rows with handle, profileUrl, lastModified, changeFrequency and priority. limit is 1 to 500 and defaults to 100. modifiedSince keeps only profiles changed at or after a time, and the cursor is tied to that filter. With a narrow filter, a page can be empty while page.hasMore is true; keep following page.nextCursor. The directory lists profiles only, not their links, and a listed handle can still return not_found if the profile has since been removed.

### What are block links and why is url null?

A block link opens a form, image tag or carousel instead of a destination. It still has an id, title, position and group, but data.links[].url is null and data.links[].blockType names the block, for example form. All other links carry a public http or https url.

### Does HTTP 200 mean the profile exists?

No. HTTP 200 means the request finished. Check data.lookupStatus: not_found means the profile does not exist, and the profile is null with empty links, socials and embeds.

### How much does the Lnk.Bio API cost?

Each completed request charges one credit, and each page of a list is its own request. Check meta.creditsCharged on every response. New accounts get 100 free credits.

### Can I use the Lnk.Bio routes from agents or MCP?

Yes. Every Lnk.Bio route is a typed MCP tool and is reachable through Ask (POST /v1/ask) in plain English. Use the typed routes for production jobs.

## Related

- [Lnk.Bio Profile API](https://www.socialfetch.dev/platforms/lnk-bio/profiles-handle): Identity, bio, social icons and the first links (`GET /v1/lnk-bio/profiles/{handle}`).
- [Lnk.Bio Links API](https://www.socialfetch.dev/platforms/lnk-bio/profiles-handle-links): Every link on a profile, up to 200 per page (`GET /v1/lnk-bio/profiles/{handle}/links`).
- [Lnk.Bio Link Search API](https://www.socialfetch.dev/platforms/lnk-bio/profiles-handle-links-search): Search inside one profile's links, up to 30 matches (`GET /v1/lnk-bio/profiles/{handle}/links/search`).
- [Lnk.Bio Directory API](https://www.socialfetch.dev/platforms/lnk-bio/profiles): Walk the public profile directory with lastModified and priority (`GET /v1/lnk-bio/profiles`).
- [Ask in plain English](https://www.socialfetch.dev/ask): Route a natural-language Lnk.Bio question to the matching operation.
- [Hosted MCP](https://www.socialfetch.dev/mcp): Call Lnk.Bio tools from Cursor or Claude with the same credit metering as REST.
