Link in Bio Links API — Every Link on a Page
Documentation menu
FetchLayer FetchLayer API

List the links on a page

Just the link list for a page, optionally narrowed to one kind. This is the route where `links` sits at the top level — on /profile the same list is at `profile.links[]`, and confusing the two is the most common mistake with this API. Returns provider, handle, url, links, linkCount, totalLinks and destinationsResolved. `totalLinks` is how many entries the page has before `kind` and `limit` narrowed the list, so a filter that matches nothing is visibly a filter rather than an empty page. `destinationsResolved` says whether an absent `destination` means "not asked for" or "could not be reached". Pass `resolveDestinations` to follow every link through its redirects — that is how the retailer or affiliate network behind a shortened link is found, and it is the part almost nothing else does. Up to 500 links, 100 by default. A live page that publishes nothing is a 200 with `linkCount: 0` and a note; a page whose links could not be read at all is a 502. Billing: 1 credit.

POST /links Pages
https://api.fetchlayer.dev/link-in-bio/links
OpenAPI JSON

Headers

Authorization string required

Bearer token — your FetchLayer API key.

Parameters

profile string required

The full page address — https://linktr.ee/spotify, or linktr.ee/spotify. Not a bare handle: "spotify" alone is a 400 saying handles are not unique across services. A bare handle works only when `provider` is given too.

provider string optional

The service a bare handle belongs to (linktree, lnkbio, allmylinks, solo and 26 more). Required when `profile` is a handle rather than an address, and ignored when it is an address.

kind string optional

Return only entries of this kind: link, embed, product, social, heading or group.

limit integer optional

Maximum links returned, up to 500. Use -1 for the maximum. (default: 100)

resolveDestinations boolean optional

Follow every link through its redirects to where it really lands, filling in `destination`. Off by default: it turns one page fetch into one request per link, so a 68-link page is far slower than a 3-link one. (default: false)

format string optional

json or markdown. Markdown returns a rendered summary instead of the structured record. (default: json)

timeoutMs integer optional

Time limit for the request, in milliseconds (max 600000).

Response Fields

links

List the links on a page

transport string

The upstream source. Always "link-in-bio-page".

resultType string

Which route produced this record — profile, links, detect-provider, unwrap-link or resolve-url.

requestedUrl string

The address this result corresponds to.

scrapedAt string

ISO 8601 timestamp of the read.

blocked boolean

Always false on a successful response.

notes string[]

Caveats you can act on — a page that is live but publishes no links, a service that publishes no theme or plan details, a destination that could not be reached. Read these: an empty result always arrives with one.

pagesFetched number

Pages fetched, which is what the request costs: one credit per page. detect-provider reports 0 when it recognised the address from its shape alone, and resolve-url fetches nothing at all.

provider string

Short, stable id for the service.

handle string

The creator’s handle on that service.

url string

The page’s canonical public address.

links object[]

The entries, in the page’s own order. On this route the list is at the top level.

links[].id string

The service’s own id for the entry, stable across reads, or null.

links[].kind string

link, embed, product, social, heading or group. Coarse on purpose, so it stays stable as services change their own vocabularies.

links[].providerType string

The service’s own label for the entry, verbatim ("classic"). Free-form — do not switch on it.

links[].title string

The label shown on the button.

links[].description string

Supporting copy under the title, or null.

links[].url string

Where the page sends a visitor. Null on a heading, a group, or a gated link whose target is withheld.

links[].position number

0-based position in the page’s own order.

links[].parentId string

The id of the group or heading this sits under, or null at the top level.

links[].thumbnail object

The image on the button, or null.

links[].tracked boolean

True when clicks are routed through the service’s own click tracker rather than straight to `url`.

links[].monetized boolean

True when the link earns the creator money — an affiliate link, a product, a paid unlock.

links[].product object

Price and currency where the entry sells something, or null.

links[].gates object[]

Gates on this specific link — an age check, a payment, an email capture. Empty when it is freely clickable.

links[].destination object

Where `url` actually lands, when destinations were resolved: url, host, status, hops, truncated, title, shortened and unresolvedReason. Null when they were not asked for — check `destinationsResolved` rather than reading null as "goes nowhere".

linkCount number

Links returned, after `kind` and `limit`.

totalLinks number

Links on the page before `kind` and `limit` narrowed the list.

destinationsResolved boolean

True when destinations were resolved for the returned links, so an absent `destination` is never ambiguous.

Request

curl -X POST "https://api.fetchlayer.dev/link-in-bio/links" \
  -H "Authorization: Bearer ss-your-key" \
  -H "Content-Type: application/json" \
  -d '{"profile":"https://linktr.ee/spotify","resolveDestinations":true}'

Response

{
  "blocked": false,
  "requestedUrl": "https://linktr.ee/spotify",
  "scrapedAt": "2026-09-16T20:41:44.119Z",
  "transport": "link-in-bio-page",
  "notes": [],
  "resultType": "links",
  "pagesFetched": 1,
  "provider": "linktree",
  "handle": "spotify",
  "url": "https://linktr.ee/spotify",
  "links": [
    {
      "id": "9964805",
      "kind": "link",
      "providerType": "classic",
      "title": "Playlist 1",
      "description": null,
      "url": "https://open.spotify.com/user/0658h6ocit7uqryixhxt0uivc/playlist/4Zv9I6yJwjuPXZbB3e1Rx8?si=tQaQ38ioQRCrbS7k87rFhw",
      "position": 0,
      "parentId": null,
      "thumbnail": null,
      "tracked": false,
      "monetized": false,
      "product": null,
      "gates": [],
      "destination": {
        "url": "https://open.spotify.com/playlist/4Zv9I6yJwjuPXZbB3e1Rx8?si=tQaQ38ioQRCrbS7k87rFhw",
        "host": "open.spotify.com",
        "status": 200,
        "hops": [
          "https://open.spotify.com/playlist/4Zv9I6yJwjuPXZbB3e1Rx8?si=tQaQ38ioQRCrbS7k87rFhw"
        ],
        "truncated": false,
        "title": "Spotify",
        "shortened": false,
        "unresolvedReason": null
      }
    }
  ],
  "linkCount": 6,
  "totalLinks": 6,
  "destinationsResolved": true
}