# Bio-Link Scraper — Linktree, Beacons, Komi, link.me & More (`memo23/biolink-scraper`) Actor

Scrape link-in-bio profiles from Linktree, Beacons, Komi, link.me, Pillar, Tap.bio & bio.link — one actor, one schema. Name, bio, avatar, verified status, every outbound link, all social handles resolved, on-page contact email. 7 dedicated extractors. Pure HTTP, no browser. JSON or CSV out.

- **URL**: https://apify.com/memo23/biolink-scraper.md
- **Developed by:** [Muhamed Didovic](https://apify.com/memo23) (community)
- **Categories:** Social media, Lead generation, AI
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $3.00 / 1,000 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.

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

## What's an Apify Actor?

Actors are a software tools running on the Apify platform, for all kinds of web data extraction and automation use cases.
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.
Actors are written with capital "A".

## 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.
The best way to integrate Actors is as follows.

In JavaScript/TypeScript projects, use official [JavaScript/TypeScript client](https://docs.apify.com/api/client/js.md):

```bash
npm install apify-client
```

In Python projects, use official [Python client library](https://docs.apify.com/api/client/python.md):

```bash
pip install apify-client
```

In shell scripts, use [Apify CLI](https://docs.apify.com/cli/docs.md):

````bash
# MacOS / Linux
curl -fsSL https://apify.com/install-cli.sh | bash
# Windows
irm https://apify.com/install-cli.ps1 | iex
```bash

In AI frameworks, you might use the [Apify MCP server](https://docs.apify.com/platform/integrations/mcp.md).

If your project is in a different language, use the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).


# README

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

Turn any link-in-bio page into a clean, structured row. Point the actor at profile URLs from **Linktree, Beacons, Komi, link.me, Pillar, Tap.bio, or bio.link** — mix platforms freely in one run — and get back the creator's name, bio, avatar, every outbound link, every social handle, and the on-page contact email, all normalized to **one schema**.

![How it works](https://raw.githubusercontent.com/muhamed-didovic/muhamed-didovic.github.io/main/assets/how-it-works-biolink.png)

Seven dedicated extractors under one actor, plus a generic fallback for any other bio-link host — so a single dataset can hold a creator's whole cross-platform footprint. Pure HTTP, no browser.

### Why Use This Scraper?

- ✅ Seven platforms, one actor — Linktree, Beacons, Komi, link.me, Pillar, Tap.bio, and bio.link, no separate scraper per site
- ✅ One normalized schema — every platform maps onto the same `UnifiedProfile` row, so you never write per-site parsing
- ✅ Every outbound link captured — each link with its title, URL, type, and (for socials) the resolved network + handle
- ✅ On-page contact email — captured natively where the page exposes it, ready for lead-gen (no third-party enrichment)
- ✅ All social handles resolved — Instagram, TikTok, YouTube, Spotify, X, Facebook and more, each with the clean handle
- ✅ Mix platforms in one run — paste any combination of profile URLs; each is routed to the right extractor by its host
- ✅ Bulk-by-username mode — feed bare handles + a platform and let the actor build the URLs
- ✅ JSON, CSV, or Excel output, ready for spreadsheets, CRMs, and BI tools

### Overview

The Bio-Link Scraper is built for creator marketers, talent agencies, lead-gen teams, and researchers who need link-in-bio data in a spreadsheet instead of a browser tab.

You give it profile URLs (or bare usernames + a platform). Each URL is routed by hostname to a **dedicated extractor** that reads the platform's real data source — embedded page JSON, a public GraphQL API, or the rendered DOM — and returns a clean, flat row. Because every platform normalizes onto the same schema, a Linktree profile and a Komi profile come back as the same shape, side by side.

The actor is pure HTTP — no login, no browser, no API key required from you. Cloudflare-walled hosts (bio.link, Beacons) are unblocked automatically. Output is one row per profile, exportable straight to CSV or Excel.

### Supported Inputs

#### Platforms

Each profile URL is routed to its platform extractor by hostname:

| Platform | Example profile URL | Coverage |
|---|---|---|
| **link.me** | `https://link.me/danucd` | Full — identity, all links, socials, on-page email |
| **Linktree** | `https://linktr.ee/shopify` | Full — identity, all links, socials |
| **Tap.bio** | `https://tap.bio/@nasa` | Full — identity, card links, socials |
| **Komi** | `https://kennyg.komi.io` | Full — identity, all module links, socials, theme |
| **Pillar** | `https://pillar.io/ninja` | Full — identity, links, socials |
| **bio.link** | `https://bio.link/art` | Full — identity, links, socials, on-page email |
| **Beacons** | `https://beacons.ai/defleppard` | Identity + full social list + featured link (see FAQ) |
| **Any other bio-link host** | `https://example.bio/name` | Generic fallback — identity, socials, visible links |

#### Input formats

- **Profile URLs** — one or more full URLs, any mix of platforms:
  - `https://link.me/danucd`
  - `https://linktr.ee/shopify`
  - `https://kennyg.komi.io`
- **Usernames + platform** — bare handles resolved against one selected platform (bulk mode):
  - usernames: `["danucd", "another"]`, platform: `link.me`

#### Copy-pasteable input

```json
{
  "profileUrls": [
    "https://link.me/danucd",
    "https://linktr.ee/shopify",
    "https://tap.bio/@nasa",
    "https://kennyg.komi.io",
    "https://pillar.io/ninja",
    "https://bio.link/art",
    "https://beacons.ai/defleppard"
  ],
  "maxItems": 100
}
````

#### Unsupported inputs

- Search/discovery by keyword — the actor scrapes profiles you supply; it does not find creators for you
- Private, deleted, or password-locked profiles — nothing to return
- Analytics/click counts per link — bio-link platforms don't expose these publicly
- Non-bio-link URLs — feeding a random website returns only whatever generic identity markup it exposes

### Use Cases

| Audience | What they get |
|---|---|
| Creator marketing / influencer outreach | Every social handle + on-page email per creator, in one row — an instant lead list |
| Talent agencies | Build and refresh a roster's cross-platform link + contact database |
| Market & competitor research | Compare what links/products creators feature across platforms |
| Social-graph enrichment | Resolve a bio-link URL into all the creator's downstream social accounts |
| Data / growth teams | Feed normalized creator profiles into a CRM, warehouse, or BI tool |
| Monitoring | Track how a creator's featured links change over time |

### How It Works

<p align="center">
  <img src="https://raw.githubusercontent.com/muhamed-didovic/muhamed-didovic.github.io/main/assets/how-it-works-biolink.png" alt="How It Works" width="100%" />
</p>

1. **Input** — supply profile URLs (mix platforms freely) or bare usernames + a platform
2. **Route by host** — each URL is matched to its dedicated extractor by hostname; unknown hosts fall to the generic extractor
3. **Fetch the real data source** — embedded page JSON, a public GraphQL API, or the rendered DOM (Cloudflare-walled hosts are unblocked automatically), all over HTTP
4. **Normalize** — every platform's data is mapped onto one `UnifiedProfile` schema: identity, socials, links, email
5. **Output** — one flat row per profile as JSON, CSV, or Excel, stopping once `maxItems` is reached

### Input Configuration

| Field | Type | Required | Notes |
|---|---|---|---|
| `profileUrls` | `array<string>` | one of these two | Bio-link profile URLs. Mix platforms freely — each is routed by host. |
| `usernames` | `array<string>` | one of these two | Bare handles, resolved against `platform` below (bulk-by-username mode). |
| `platform` | `string` | with `usernames` | Which platform the bare handles belong to. One of `linkme`, `linktree`, `tapbio`, `beacons`, `biolink`, `komi`, `pillar`. Default `linkme`. Ignored for full `profileUrls`. |
| `includeRawData` | `boolean` | no | Attach the raw upstream payload (page JSON / GraphQL / JSON-LD) to each row for debugging or extra fields. Default `false`. |
| `maxItems` | `integer` | no | Hard cap on total dataset rows. Default `100`. Free-tier runs are capped. |
| `maxConcurrency` | `integer` | no | Maximum profiles fetched in parallel. Range 1–20. Default `10`. |
| `proxy` | `object` | no | Paying users are auto-routed through premium residential proxies (no setup). Free users can enable Apify Proxy here. Walled hosts are unblocked automatically. |

#### Common scenarios

**Mixed platforms in one run**

```json
{
  "profileUrls": [
    "https://link.me/danucd",
    "https://linktr.ee/shopify",
    "https://kennyg.komi.io",
    "https://bio.link/art"
  ]
}
```

**Bulk by username (one platform)**

```json
{
  "usernames": ["danucd", "someone", "another"],
  "platform": "linkme"
}
```

**Include the raw upstream payload**

```json
{
  "profileUrls": ["https://linktr.ee/shopify"],
  "includeRawData": true
}
```

### Output Overview

One row per profile. Every row is the same `UnifiedProfile` shape regardless of source platform:

- **Identity** — `platform`, `username`, `displayName`, `bio`, `avatar`, `cover`, `verified`, `isAdult`
- **Reach** — `visitCount`, `followerCount` (where the platform exposes them)
- **Contact** — `email`, `phone`, `location`, `websites[]`
- **Links** — `socialLinks[]` (resolved social accounts) and `links[]` (all outbound links), each with `title`, `url`, `type`, `network`, `handle`, `thumbnail`, `position`; plus `totalLinks`
- **Meta** — `theme`, `createdAt`, `updatedAt`, `scrapedAt`, and `note` (present only on partial/generic extractions)

Fields the source doesn't expose come back `null` or empty rather than missing.

### Output Samples

#### Profile row — `link.me/danucd` (links trimmed for brevity)

```json
{
  "platform": "linkme",
  "profileUrl": "https://link.me/danucd",
  "username": "danucd",
  "displayName": "Dana",
  "bio": "ALL MY LINKS👇",
  "avatar": "https://media.link.me/_resize/image/quality=90,format=webp/images/webp-images/user-profile/1169288/tmp-2541-1763300314455.webp",
  "cover": null,
  "verified": false,
  "isAdult": false,
  "visitCount": "48.5k",
  "followerCount": null,
  "email": "dana.danucd@gmail.com",
  "phone": null,
  "location": null,
  "websites": [],
  "socialLinks": [
    {
      "title": "Instagram",
      "url": "https://www.instagram.com/danucd/",
      "type": "social",
      "network": "instagram",
      "handle": "danucd",
      "thumbnail": "https://media.link.me/style/icons/v5.0/Instagram-1.png",
      "position": 4
    },
    {
      "title": "Spotify",
      "url": "https://open.spotify.com/artist/0A8XmfCL2yangEtvot3peD",
      "type": "social",
      "network": "spotify",
      "handle": "0A8XmfCL2yangEtvot3peD",
      "thumbnail": "https://media.link.me/style/icons/v5.0/Spotify-1.png",
      "position": 10
    }
  ],
  "links": [
    {
      "title": "Instagram",
      "url": "https://www.instagram.com/danucd/",
      "type": "social",
      "network": "instagram",
      "handle": "danucd",
      "position": 4
    }
  ],
  "totalLinks": 13,
  "theme": { "backgroundColor": "", "mainTextColor": "" },
  "createdAt": "2024-11-01 12:37:51",
  "updatedAt": "2025-11-16 13:43:17",
  "scrapedAt": "2026-06-30T22:41:08.912Z"
}
```

#### Beacons row (identity + socials + featured link)

```json
{
  "platform": "beacons",
  "username": "defleppard",
  "displayName": "defleppard",
  "avatar": "https://cdn.beacons.ai/user_content/.../profile_defleppard.png",
  "socialLinks": [
    { "url": "https://tiktok.com/@defleppard", "type": "social", "network": "tiktok", "handle": "defleppard" },
    { "url": "https://instagram.com/defleppard", "type": "social", "network": "instagram", "handle": "defleppard" }
  ],
  "links": [ { "title": "Featured", "url": "https://DefLeppard.com", "type": "link" } ],
  "totalLinks": 6,
  "note": "Beacons exposes identity + full social list + one featured link via JSON-LD; its multi-link button list loads from a private API and is not available HTTP-only."
}
```

### Key Output Fields

#### Identity

| Field | Description |
|---|---|
| `platform` | Which extractor produced the row (`linkme`, `linktree`, `tapbio`, `komi`, `pillar`, `biolink`, `beacons`, or `generic`) |
| `username` | Handle / slug |
| `displayName` | Human display name |
| `bio` | Bio / description text |
| `avatar` / `cover` | Absolute image URLs |
| `verified` / `isAdult` | Verified badge / age-gated flags |

#### Reach & contact

| Field | Description |
|---|---|
| `visitCount` / `followerCount` | Where the platform exposes them |
| `email` / `phone` | On-page contact captured natively (no enrichment) |
| `location` / `websites[]` | Free-text location and featured websites |

#### Links

| Field | Description |
|---|---|
| `socialLinks[]` | Resolved social accounts, each with `network` + `handle` |
| `links[]` | All outbound links, each with `title`, `url`, `type`, `network`, `handle`, `thumbnail`, `position` |
| `totalLinks` | Count of `links[]` |

#### Meta

| Field | Description |
|---|---|
| `theme` | Brand colours / theme hints where exposed |
| `createdAt` / `updatedAt` | Platform timestamps where exposed |
| `scrapedAt` | ISO timestamp of the scrape |
| `note` | Present only when extraction was partial (Beacons) or via the generic fallback |

### FAQ

#### Which platforms are supported?

link.me, Linktree, Tap.bio, Komi, Pillar, bio.link, and Beacons each have a dedicated extractor. Any other link-in-bio host falls to a generic extractor that returns identity, socials, and visible links.

#### Do I need to log in or supply an API key?

No. The actor reads public profile pages over HTTP. No login, no cookies, no API key from you.

#### Can I mix platforms in one run?

Yes — that's the point. Put any combination of profile URLs in `profileUrls`; each is routed to the right extractor by its host.

#### Is the on-page email always present?

No. `email` is only populated when the creator has published a contact email on the page (common on link.me and bio.link). It is captured natively — the actor does not perform third-party email enrichment or guessing.

#### Why is Beacons partial?

Beacons' full outbound-button list is loaded by its app from a private, header-gated API that isn't reachable with a public HTTP request. The actor still returns Beacons **identity, the full social list, and the featured link** from the page's public data, and flags the limitation in the row's `note` field. All other platforms return the complete link list.

#### Is this the official API of any of these platforms?

No. This actor is not affiliated with or endorsed by any of the platforms. It reads publicly available profile pages.

#### What does the actor NOT scrape?

Per-link click analytics, private/locked profiles, and creator discovery (it scrapes profiles you supply — it doesn't find them for you).

#### Can I export to JSON, CSV, or Excel?

Yes. Results land in the dataset and export to JSON, CSV, Excel, or the API like any Apify actor.

### Support

- **Issues & feature requests:** use the Issues tab on the actor's Apify Console page.
- **Email:** <muhamed.didovic@gmail.com>

We actively maintain this actor; if a platform changes its page structure, report it and we'll patch quickly.

### Additional Services

Need a custom bio-link platform added, a tailored export shape, a scheduled feed into your warehouse, or on-page email enrichment wired to a specific workflow? Contact <muhamed.didovic@gmail.com> — custom scraping and integration work is available.

### Explore More Scrapers

Found the creator's links? Go deeper on each account — these pair naturally with bio-link lead-gen:

- [**Instagram Profile Scraper**](https://apify.com/memo23/apify-instagram-profile-scraper) — the full Instagram profile behind the handle you resolved (bio, followers, posts)
- [**TikTok Profile Videos Scraper**](https://apify.com/memo23/tiktok-profile-videos-scraper) — a creator's TikTok content and stats from their handle
- [**LinkedIn Profiles Scraper**](https://apify.com/memo23/linkedin-profiles-cheerio) — professional and company profiles for business bio-links and B2B outreach
- [**Pinterest Scraper**](https://apify.com/memo23/pinterest-scraper) — pins and boards for creators who feature Pinterest

Full portfolio: [apify.com/memo23](https://apify.com/memo23) — social, app-store, marketplace, real-estate, and jobs scrapers.

### ⚠️ Disclaimer

This actor is an independent tool and is **not affiliated with, endorsed by, or sponsored by** link.me, Linktree, Tap.bio, Komi, Pillar, bio.link, Beacons, or any of their operators. "Linktree", "Beacons", "Komi", "Pillar", "Tap.bio", "link.me", "bio.link" and all related names, logos, and trademarks are the property of their respective owners and are used here for descriptive and identification purposes only.

The actor scrapes only **publicly accessible** profile data — the same information any visitor sees without logging in. It does not bypass authentication, access private or restricted content, or collect data behind a login.

You are responsible for how you use the data. Ensure your use complies with each platform's Terms of Service and with applicable laws and regulations, including data-protection rules such as **GDPR** and **CCPA**, especially when collecting or processing information relating to identifiable individuals. Collect and use only what you have a lawful basis to use.

### SEO Keywords

bio link scraper, link in bio scraper, Linktree scraper, Beacons scraper, Komi scraper, link.me scraper, Pillar scraper, Tap.bio scraper, bio.link scraper, link-in-bio data extractor, creator profile scraper, influencer lead generation, social handle extractor, creator contact email scraper, social media links scraper, creator database builder, link in bio API, bio link data export, multi-platform creator scraper, influencer marketing data, creator outreach list, social profile enrichment

# Actor input Schema

## `profileUrls` (type: `array`):

Bio-link profile URLs to scrape, one per line. Mix platforms freely — each URL is routed to the right extractor by its host.<br><br><b>Supported platforms — format & a real example:</b><br>• <b>link.me</b> — https://link.me/{handle}  →  https://link.me/danucd<br>• <b>Linktree</b> — https://linktr.ee/{handle}  →  https://linktr.ee/shopify  (also linktree.com/{handle})<br>• <b>Tap.bio</b> — https://tap.bio/@{handle}  →  https://tap.bio/@nasa<br>• <b>Komi</b> — https://{handle}.komi.io  →  https://kennyg.komi.io  (handle is the sub-domain)<br>• <b>Pillar</b> — https://pillar.io/{handle}  →  https://pillar.io/ninja<br>• <b>bio.link</b> — https://bio.link/{handle}  →  https://bio.link/art<br>• <b>Beacons</b> — https://beacons.ai/{handle}  →  https://beacons.ai/defleppard  (identity + full socials + featured link)<br>• <b>Any other link-in-bio page</b> — best-effort identity + socials + visible links<br><br>Prefer bulk lists from a single platform? Leave this empty and use <b>Usernames</b> + <b>Platform</b> below instead.

## `usernames` (type: `array`):

Optional. Bare handles (without the URL) to resolve against the <b>Platform</b> selected below — handy for bulk lists from one platform.

## `platform` (type: `string`):

Which platform the bare <b>Usernames</b> above belong to. Ignored for full Profile URLs.

## `includeRawData` (type: `boolean`):

Attach the raw upstream payload (NEXT\_DATA / GraphQL / JSON-LD) to each row for debugging or deeper fields. Off by default for clean output.

## `maxItems` (type: `integer`):

Hard cap on the number of profiles scraped (charging-aware).

## `maxConcurrency` (type: `integer`):

Maximum simultaneous profile fetches. Bio-link pages are light, so 10–20 is safe.

## `proxy` (type: `object`):

Optional. <b>Paying users are automatically routed through premium residential proxies</b> — no setup needed. Free users can enable Apify Proxy here. Walled hosts (bio.link, Beacons) are unblocked automatically.

## Actor input object example

```json
{
  "profileUrls": [
    "https://link.me/danucd",
    "https://linktr.ee/shopify",
    "https://tap.bio/@nasa",
    "https://kennyg.komi.io",
    "https://pillar.io/ninja",
    "https://bio.link/art",
    "https://beacons.ai/defleppard"
  ],
  "platform": "linkme",
  "includeRawData": false,
  "maxItems": 100,
  "maxConcurrency": 10,
  "proxy": {
    "useApifyProxy": false
  }
}
```

# 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 = {
    "profileUrls": [
        "https://link.me/danucd",
        "https://linktr.ee/shopify",
        "https://tap.bio/@nasa",
        "https://kennyg.komi.io",
        "https://pillar.io/ninja",
        "https://bio.link/art",
        "https://beacons.ai/defleppard"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("memo23/biolink-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 = { "profileUrls": [
        "https://link.me/danucd",
        "https://linktr.ee/shopify",
        "https://tap.bio/@nasa",
        "https://kennyg.komi.io",
        "https://pillar.io/ninja",
        "https://bio.link/art",
        "https://beacons.ai/defleppard",
    ] }

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

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

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

```

## CLI example

```bash
echo '{
  "profileUrls": [
    "https://link.me/danucd",
    "https://linktr.ee/shopify",
    "https://tap.bio/@nasa",
    "https://kennyg.komi.io",
    "https://pillar.io/ninja",
    "https://bio.link/art",
    "https://beacons.ai/defleppard"
  ]
}' |
apify call memo23/biolink-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=memo23/biolink-scraper",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "Bio-Link Scraper — Linktree, Beacons, Komi, link.me & More",
        "description": "Scrape link-in-bio profiles from Linktree, Beacons, Komi, link.me, Pillar, Tap.bio & bio.link — one actor, one schema. Name, bio, avatar, verified status, every outbound link, all social handles resolved, on-page contact email. 7 dedicated extractors. Pure HTTP, no browser. JSON or CSV out.",
        "version": "0.0",
        "x-build-id": "aONBYGt7IYC0WMUV3"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/memo23~biolink-scraper/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-memo23-biolink-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for its completion, and returns Actor's dataset items in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        },
        "/acts/memo23~biolink-scraper/runs": {
            "post": {
                "operationId": "runs-sync-memo23-biolink-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor and returns information about the initiated run in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/runsResponseSchema"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/acts/memo23~biolink-scraper/run-sync": {
            "post": {
                "operationId": "run-sync-memo23-biolink-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for completion, and returns the OUTPUT from Key-value store in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        }
    },
    "components": {
        "schemas": {
            "inputSchema": {
                "type": "object",
                "properties": {
                    "profileUrls": {
                        "title": "Profile URLs",
                        "type": "array",
                        "description": "Bio-link profile URLs to scrape, one per line. Mix platforms freely — each URL is routed to the right extractor by its host.<br><br><b>Supported platforms — format &amp; a real example:</b><br>• <b>link.me</b> — https://link.me/{handle} &nbsp;→&nbsp; https://link.me/danucd<br>• <b>Linktree</b> — https://linktr.ee/{handle} &nbsp;→&nbsp; https://linktr.ee/shopify &nbsp;(also linktree.com/{handle})<br>• <b>Tap.bio</b> — https://tap.bio/@{handle} &nbsp;→&nbsp; https://tap.bio/@nasa<br>• <b>Komi</b> — https://{handle}.komi.io &nbsp;→&nbsp; https://kennyg.komi.io &nbsp;(handle is the sub-domain)<br>• <b>Pillar</b> — https://pillar.io/{handle} &nbsp;→&nbsp; https://pillar.io/ninja<br>• <b>bio.link</b> — https://bio.link/{handle} &nbsp;→&nbsp; https://bio.link/art<br>• <b>Beacons</b> — https://beacons.ai/{handle} &nbsp;→&nbsp; https://beacons.ai/defleppard &nbsp;(identity + full socials + featured link)<br>• <b>Any other link-in-bio page</b> — best-effort identity + socials + visible links<br><br>Prefer bulk lists from a single platform? Leave this empty and use <b>Usernames</b> + <b>Platform</b> below instead.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "usernames": {
                        "title": "Usernames / handles",
                        "type": "array",
                        "description": "Optional. Bare handles (without the URL) to resolve against the <b>Platform</b> selected below — handy for bulk lists from one platform.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "platform": {
                        "title": "Platform (for the usernames list)",
                        "enum": [
                            "linkme",
                            "linktree",
                            "tapbio",
                            "beacons",
                            "biolink",
                            "komi",
                            "pillar"
                        ],
                        "type": "string",
                        "description": "Which platform the bare <b>Usernames</b> above belong to. Ignored for full Profile URLs.",
                        "default": "linkme"
                    },
                    "includeRawData": {
                        "title": "Include raw payload",
                        "type": "boolean",
                        "description": "Attach the raw upstream payload (NEXT_DATA / GraphQL / JSON-LD) to each row for debugging or deeper fields. Off by default for clean output.",
                        "default": false
                    },
                    "maxItems": {
                        "title": "Max profiles",
                        "minimum": 1,
                        "type": "integer",
                        "description": "Hard cap on the number of profiles scraped (charging-aware).",
                        "default": 100
                    },
                    "maxConcurrency": {
                        "title": "Max concurrency",
                        "minimum": 1,
                        "maximum": 20,
                        "type": "integer",
                        "description": "Maximum simultaneous profile fetches. Bio-link pages are light, so 10–20 is safe.",
                        "default": 10
                    },
                    "proxy": {
                        "title": "Proxy configuration",
                        "type": "object",
                        "description": "Optional. <b>Paying users are automatically routed through premium residential proxies</b> — no setup needed. Free users can enable Apify Proxy here. Walled hosts (bio.link, Beacons) are unblocked automatically.",
                        "default": {
                            "useApifyProxy": false
                        }
                    }
                }
            },
            "runsResponseSchema": {
                "type": "object",
                "properties": {
                    "data": {
                        "type": "object",
                        "properties": {
                            "id": {
                                "type": "string"
                            },
                            "actId": {
                                "type": "string"
                            },
                            "userId": {
                                "type": "string"
                            },
                            "startedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "finishedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "status": {
                                "type": "string",
                                "example": "READY"
                            },
                            "meta": {
                                "type": "object",
                                "properties": {
                                    "origin": {
                                        "type": "string",
                                        "example": "API"
                                    },
                                    "userAgent": {
                                        "type": "string"
                                    }
                                }
                            },
                            "stats": {
                                "type": "object",
                                "properties": {
                                    "inputBodyLen": {
                                        "type": "integer",
                                        "example": 2000
                                    },
                                    "rebootCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "restartCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "resurrectCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "computeUnits": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "options": {
                                "type": "object",
                                "properties": {
                                    "build": {
                                        "type": "string",
                                        "example": "latest"
                                    },
                                    "timeoutSecs": {
                                        "type": "integer",
                                        "example": 300
                                    },
                                    "memoryMbytes": {
                                        "type": "integer",
                                        "example": 1024
                                    },
                                    "diskMbytes": {
                                        "type": "integer",
                                        "example": 2048
                                    }
                                }
                            },
                            "buildId": {
                                "type": "string"
                            },
                            "defaultKeyValueStoreId": {
                                "type": "string"
                            },
                            "defaultDatasetId": {
                                "type": "string"
                            },
                            "defaultRequestQueueId": {
                                "type": "string"
                            },
                            "buildNumber": {
                                "type": "string",
                                "example": "1.0.0"
                            },
                            "containerUrl": {
                                "type": "string"
                            },
                            "usage": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "integer",
                                        "example": 1
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "usageTotalUsd": {
                                "type": "number",
                                "example": 0.00005
                            },
                            "usageUsd": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "number",
                                        "example": 0.00005
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
