# Solo.to Profile Scraper — Links, Socials, Contacts & Team (`ahmed_jasarevic/solo-profile-scraper`) Actor

Extract complete solo.to link-in-bio profiles: profile name, avatar, bio, location, all link buttons, contact buttons (email/phone/SMS/Discord), social platform buttons, team members, embeds and QR data. For influencer outreach, creator-economy lead gen and digital business-card data buyers.

- **URL**: https://apify.com/ahmed\_jasarevic/solo-profile-scraper.md
- **Developed by:** [Ahmed Jasarevic](https://apify.com/ahmed_jasarevic) (community)
- **Categories:** Lead generation, Social media, Automation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $5.00 / 1,000 results

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 web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
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.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — 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

## Solo.to Profile Scraper — Links, Socials, Contacts & Team

### What does Solo.to Profile Scraper do?

This Actor extracts **complete [solo.to](https://solo.to) link-in-bio profiles** — the digital business cards used by millions of creators, musicians, and influencers. For any solo.to username it returns the **profile name, avatar, bio, location, every link button, contact buttons (email / phone / SMS / Discord / Telegram), social platform buttons, team members, embeds and QR data**.

It uses a **hybrid strategy**: the public `api.solo.to/{username}` JSON endpoint (no anti-bot challenge) provides reliable profile info, while a real browser (Playwright) renders the Cloudflare-protected profile page to extract links, contacts, socials and team. All traffic runs through the **Apify proxy** so your IP is never exposed. Output is delivered as a clean JSON dataset you can download as JSON, CSV, Excel or HTML, and it's fully accessible via the Apify API, scheduler and integrations.

### Why use Solo.to Profile Scraper?

- **Influencer outreach** — build lists of creators with their real social profiles, contact methods and link buttons in one pass.
- **Creator-economy lead gen** — every solo.to page is a self-maintained lead record: name, bio, location, email, phone, Discord, socials.
- **Digital business-card data buyers** — solo.to pages are literally digital business cards; this Actor turns them into structured, deduplicatable data.
- **Competitor / brand monitoring** — track what links and platforms a creator or brand promotes over time.

### How to use Solo.to Profile Scraper

1. Open the Actor on Apify and click **Start**.
2. In the **Input** tab, enter the solo.to usernames you want (e.g. `smartscrapers`, `lilnasx`) — or paste full profile URLs.
3. Optionally adjust **Max profiles**, **Max concurrency** and the **proxy group** (residential is recommended because solo.to is Cloudflare-protected).
4. Click **Start** and wait for the run to finish.
5. Open the **Dataset** tab and download the results in JSON, HTML, CSV or Excel.

### Input

| Field | Type | Description |
|---|---|---|
| `usernames` | array | Solo.to usernames to scrape (e.g. `["smartscrapers"]`) |
| `startUrls` | array | Alternative: full profile URLs |
| `maxItems` | integer | Max profiles per run (default 100) |
| `maxConcurrency` | integer | Parallel browser sessions (default 3) |
| `useApifyProxy` | boolean | Route through Apify proxy (default true) |
| `proxyGroup` | select | `BUYPROXIES94952` (residential, default), `RESIDENTIAL`, or `AUTO` |

Example input:

```json
{
  "usernames": ["smartscrapers", "lilnasx"],
  "maxItems": 50,
  "maxConcurrency": 3,
  "useApifyProxy": true,
  "proxyGroup": "BUYPROXIES94952"
}
```

### Output

One dataset item per profile. Example:

```json
{
  "url": "https://solo.to/smartscrapers",
  "username": "smartscrapers",
  "pageScraped": true,
  "name": "smartscraper",
  "location": "New York, United States",
  "bio": "SmartScrapers provides social media data scraping services...",
  "avatar": "https://cdn.solo.to/user/a/634e7d219672a1_86985361.jpg",
  "background": "https://cdn.solo.to/images/stars.jpg",
  "themeColor": "#3673FC",
  "badge": null,
  "status": { "upgraded": false, "recent_update": false, "has_links": false },
  "links": [
    { "label": "Main Channel", "url": "youtube.com/channel/UCk6...", "href": "https://www.youtube.com/channel/UCk6...", "icon": "https://cdn.solo.to/images/link/youtube.svg" }
  ],
  "contactButtons": [
    { "type": "email", "value": "hello@example.com", "href": "mailto:hello@example.com", "username": null },
    { "type": "discord", "value": "ian6120", "href": null, "username": "ian6120" }
  ],
  "socialButtons": [
    { "className": "social-button youtube-sub-button", "href": "https://www.youtube.com/@...", "iframeSrc": null, "icon": null, "label": "Subscribe" }
  ],
  "team": [{ "name": "Jane Doe", "href": "https://solo.to/janedoe" }],
  "embeds": ["https://open.spotify.com/embed/track/..."],
  "qrData": "https://solo.to/smartscrapers",
  "profileUrl": "https://solo.to/smartscrapers",
  "scrapedAt": "2026-08-08T12:00:00.000Z"
}
```

You can download the dataset in various formats such as **JSON, HTML, CSV, or Excel**.

### Data table

| Field | Description |
|---|---|
| `username` | Solo.to handle |
| `name` | Display name |
| `avatar` | Profile picture URL |
| `bio` | Bio text |
| `location` | Location text |
| `links` | Link buttons (label, display URL, href, icon) |
| `contactButtons` | Email / phone / SMS / Discord / Telegram / add-contact |
| `socialButtons` | Social platform widgets (YouTube, Spotify, X, etc.) |
| `team` | Team member names and links |
| `embeds` | Embedded content iframe URLs (videos, songs, podcasts) |
| `qrData` | URL encoded by the profile's QR code |
| `status` | Plan status, recent update flag, has-links flag |
| `pageScraped` | Whether the full page DOM was captured |

### Pricing / Cost estimation

**How much does it cost to scrape solo.to?** Each profile requires one browser page load (Playwright) plus one lightweight API call. With default settings (3 concurrent browsers) a run of 100 profiles typically finishes in a few minutes and costs a small number of compute units. Free Apify users get a **10-profile preview**; paid users can scrape unlimited profiles. Because solo.to is Cloudflare-protected, a **residential proxy group** is used by default — residential proxy traffic is billed per GB on Apify, so keep `maxItems` reasonable for large runs.

### Tips or Advanced options

- **Keep concurrency low (2–4)** — solo.to rate-limits the API (`x-ratelimit-limit: 240`) and aggressive parallel browser sessions can trigger stricter Cloudflare challenges.
- **Use the residential proxy group** (`BUYPROXIES94952`) for best success rates; switch to `AUTO` only if you want cheaper datacenter traffic.
- **Re-run periodically** to track changes — creators update their links, socials and bios frequently.
- **Combine with other bio-link scrapers** (Linktree, Beacons, Carrd, Lnk.Bio) for a full creator-identity dataset.

### FAQ, disclaimers, and support

**Is scraping solo.to legal?** Scraping publicly available profile data for research, outreach and lead generation is generally acceptable, but always respect solo.to's Terms of Service, applicable privacy laws (e.g. GDPR), and don't use the data for spam. This Actor only reads public pages.

**Known limitations** — solo.to protects its profile pages with Cloudflare's managed challenge. The Actor uses a real browser to pass it; if Cloudflare escalates to a hard block, the run still returns the reliable API profile data with `pageScraped: false`. The API itself is not protected and is the primary source for name/avatar/bio/location.

**Support** — found a bug or want a custom version (e.g. bulk username discovery, scheduled monitoring, CSV enrichment)? Open an issue on the Actor's Issues tab or contact the author for a custom solution.

# Actor input Schema

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

List of solo.to usernames to scrape (e.g. \['smartscrapers', 'lilnasx']). You can also paste full profile URLs here.

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

Alternatively, full solo.to profile URLs (https://solo.to/username).

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

Maximum number of profiles to scrape in one run.

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

Number of parallel browser sessions. Keep low to avoid rate limits.

## `proxyConfiguration` (type: `object`):

Apify Proxy settings. Residential proxies are strongly recommended — solo.to is Cloudflare-protected.

## Actor input object example

```json
{
  "usernames": [
    "smartscrapers",
    "lilnasx"
  ],
  "maxItems": 100,
  "maxConcurrency": 3,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}
```

# Actor output Schema

## `results` (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 = {
    "usernames": [
        "smartscrapers",
        "lilnasx"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("ahmed_jasarevic/solo-profile-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 = { "usernames": [
        "smartscrapers",
        "lilnasx",
    ] }

# Run the Actor and wait for it to finish
run = client.actor("ahmed_jasarevic/solo-profile-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 '{
  "usernames": [
    "smartscrapers",
    "lilnasx"
  ]
}' |
apify call ahmed_jasarevic/solo-profile-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,ahmed_jasarevic/solo-profile-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/eI2dp2LnpSSpYoFOS/builds/ORnWDcw8r8vKAnT1i/openapi.json
