# Bio-Link Scraper — Linktree, Beacons, Komi & More (`muhammadafzal/bio-link-scraper`) Actor

Extract public bio-link profiles, outbound links, social accounts and published contacts from Linktree, Beacons, Komi, link.me and Bio Sites. Get clear blocked-page diagnostics.

- **URL**: https://apify.com/muhammadafzal/bio-link-scraper.md
- **Developed by:** [Muhammad Afzal](https://apify.com/muhammadafzal) (community)
- **Categories:** Social media
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $16.00 / 1,000 bio-link profile scrapeds

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

## Bio-Link Scraper — Linktree, Beacons, Komi, link.me & More

Extract public creator profiles and their published outbound links for creator research, partnership planning and link audits. Supply profile URLs; receive one structured dataset record per profile with name, bio, avatar, link titles and destinations, social links, and explicitly published email/phone links.

### Input

```json
{"startUrls":[{"url":"https://linktr.ee/selenagomez"},{"url":"https://therock.komi.io"},{"url":"https://beacons.ai/djhabibeats"}],"maxProfiles":3,"maxLinksPerProfile":200,"includeContacts":true,"requestTimeoutSecs":25}
```

Supports full HTTPS URLs on Linktree, Beacons, Komi creator subdomains, link.me, Bio Sites, Lnk.Bio, Taplink, Solo, Campsite, Milkshake and Pillar. The Actor uses ScrapeCreators for supported platforms (Linktree, Komi, link.me, Lnk.Bio, Pillar) with direct scraping fallback, and direct browser rendering for Beacons profiles. Beacons extracts public profile details, social handles and published outbound destinations. No custom domains, profile search, login, password-protected links, age-gate interaction, recursive crawling or destination visits.

Maximum 100 input URLs and 100 saved profiles per run; verified free-plan runs deliver at most **five profiles**. Upgrade for more. Duplicate profile URLs are merged after removing tracking parameters and fragments. Links are deduplicated by destination. The link limit defaults to 200, maximum 500; `linksTruncated` tells you when the output was capped. Contact opt-out removes mailto/tel links and contact arrays.

### Output

The default dataset contains `url`, `platform`, `username`, `displayName`, `bio`, `avatarUrl`, `links`, `socialLinks`, `emails`, `phones`, `linkCount`, `linksTruncated`, `extractionMethod` and `scrapedAt`. Missing text fields are null. Each link contains `url`, nullable `title` and `domain`, and `type` (website, social, email or phone). Social links include social content URLs as well as account URLs; no follower counts or ownership verification is inferred.

`OUTPUT` in the default key-value store reports DATA, PARTIAL, EMPTY, BLOCKED, REJECTED or FAILED, delivered profile count, confirmed profile-event count, effective limit, stop reason and per-profile diagnostics. No diagnostic rows or fabricated records enter the business dataset. Unknown empty HTML is reported as unsupported rather than a successful empty profile. Public destinations may retain site tracking parameters; the scraper does not resolve shortened URLs or gated destinations.

### Pricing

Live all-in Pay per event pricing is configured. Measured cost and billing evidence are recorded in the validation report. Platform usage pass-through is disabled.

| Event | FREE | BRONZE (2.5% off) | SILVER (5% off) | GOLD, PLATINUM, DIAMOND (20% off) |
| --- | ---: | ---: | ---: | ---: |
| Actor start | $0.01000 | $0.00975 | $0.00950 | $0.00800 |
| Profile saved (primary) | $0.02000 | $0.01950 | $0.01900 | $0.01600 |

FREE-tier examples: one profile $0.03, five $0.11, 100 $2.01. Start fee applies to empty/blocked/rejected runs; no profile event is charged without a saved valid profile. Set a total charge cap of at least $0.03; budget is checked before requests and writes. Timeout, input and result bounds independently limit underlying platform usage.

### Development

Node.js 22, Apify SDK 3.7, Cheerio, Impit and Playwright. Run `npm ci`, `npm test`, then `apify run --purge` with bounded INPUT. Public response fixtures are local evidence and excluded from upload. Run work is capped at four minutes plus the current request; sequential processing limits target load. Transient 429/5xx responses retry once with backoff. Abort/migration closes the browser and flushes diagnostics; existing dataset identities are checked on restart.

Use collected public information responsibly and comply with applicable terms and data protection obligations. This tool has no affiliation with the listed platforms. Actor and example Tasks remain private pending owner review.

# Actor input Schema

## `startUrls` (type: `array`):

Full HTTPS profile URLs: Linktree, Beacons, Komi subdomains, link.me, Bio Sites, Lnk.Bio, Taplink, Solo, Campsite, Milkshake or Pillar. No discovery or authenticated pages.

## `includeContacts` (type: `boolean`):

Extract explicit mailto and tel links; never infer contact information.

## `maxProfiles` (type: `integer`):

Maximum saved profiles. Free-plan cap is five.

## `maxLinksPerProfile` (type: `integer`):

Maximum published links saved per profile; truncation is reported.

## `requestTimeoutSecs` (type: `integer`):

Timeout per request. One retry for transient HTTP errors. Total work bounded to four minutes.

## Actor input object example

```json
{
  "startUrls": [
    {
      "url": "https://linktr.ee/selenagomez"
    }
  ],
  "includeContacts": true,
  "maxProfiles": 100,
  "maxLinksPerProfile": 200,
  "requestTimeoutSecs": 25
}
```

# Actor output Schema

## `profiles` (type: `string`):

No description

## `summary` (type: `string`):

No description

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "startUrls": [
        {
            "url": "https://linktr.ee/selenagomez"
        }
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("muhammadafzal/bio-link-scraper").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = { "startUrls": [{ "url": "https://linktr.ee/selenagomez" }] }

# Run the Actor and wait for it to finish
run = client.actor("muhammadafzal/bio-link-scraper").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "startUrls": [
    {
      "url": "https://linktr.ee/selenagomez"
    }
  ]
}' |
apify call muhammadafzal/bio-link-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,muhammadafzal/bio-link-scraper"
        }
    }
}
```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/tuSvobxWep7LDK5Er/builds/84xWwG7i4rqd3RW66/openapi.json
