# OnlyFans Profile Scraper (`hgservices/onlyfans-profile-scraper`) Actor

Scrape public OnlyFans profiles by URL or username. Get bio, subscriber and like counts, post and video counts, subscription price and social links. No login.

- **URL**: https://apify.com/hgservices/onlyfans-profile-scraper.md
- **Developed by:** [Harish Garg](https://apify.com/hgservices) (community)
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $3.00 / 1,000 scraped profiles

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

## OnlyFans Profile Scraper

**Scrape public [OnlyFans](https://onlyfans.com) profiles in bulk from profile URLs or usernames.** For each creator, get the **name, bio, avatar and header images, subscriber count, like count, post, photo and video counts, subscription price and bundles, join date, last-seen time, location, website and social media links** as clean, structured data.

Use it as an unofficial **OnlyFans API** for creator data. Run it in Apify Console with no code, call it from your own app with the Apify API, or ask an AI assistant such as Claude or ChatGPT to run it for you. Download the results as JSON, CSV, Excel, XML or HTML.

- ✅ No OnlyFans account and no login
- ✅ Mix profile URLs, usernames and `@usernames` in one list
- ✅ Duplicates and invalid entries are removed automatically
- ✅ A run summary tells you which profiles failed and why

### What is OnlyFans Profile Scraper?

OnlyFans Profile Scraper is a tool that collects the public profile data of OnlyFans creators. You give it a list of profiles, and it returns one row of data for each creator: the same information that any visitor sees on the profile page, but in a format that you can sort, filter and analyze.

Use it to check an OnlyFans subscriber count, compare creators by likes and post count, see what creators charge for a subscription, or find the Instagram, TikTok and X accounts that a creator links to.

### What data can you scrape from OnlyFans?

| Data group        | What you get                                                                                                                                  |
| ----------------- | --------------------------------------------------------------------------------------------------------------------------------------------- |
| 👤 Profile        | Username, display name, profile URL, user ID, bio, verified badge                                                                             |
| 🖼️ Images         | Avatar and header image URLs, with thumbnails and the header size                                                                             |
| 📈 Audience stats | Subscriber count (when the creator shows it), like count                                                                                      |
| 🎬 Content stats  | Number of posts, photos, videos, audios and media items, archived posts, date of the first post                                               |
| 💲 Pricing        | Monthly subscription price, subscription bundles with duration and discount, tip limits, call price                                           |
| 🕒 Activity       | Join date, last-seen time (when the creator shows it), live stream, scheduled stream and story flags                                          |
| 🔗 Links          | Website, wishlist, location, and Instagram, X (Twitter), TikTok, YouTube, Twitch, Snapchat, Facebook, Discord, Patreon, Amazon and Etsy links |

### Use cases

- **Influencer and creator research** — Compare OnlyFans creators by subscribers, likes, post counts and price before you contact them.
- **Agency and talent scouting** — Check a list of creators every week and follow their growth over time.
- **Pricing analysis** — See what creators in a niche charge, and which bundles and discounts they offer.
- **Social media mapping** — Find the Instagram, TikTok, X and YouTube accounts that are linked to an OnlyFans profile.
- **Lead lists and CRM enrichment** — Add public OnlyFans stats and links to the creator records that you already have.
- **Market research and data science** — Collect creator data at scale for reports, dashboards and analysis.

### How to scrape OnlyFans profiles

You can use OnlyFans Profile Scraper in three ways. All three give the same data.

1. [In Apify Console](#how-to-use-onlyfans-profile-scraper-in-apify-console) — no coding.
2. [With the Apify API](#how-to-use-the-onlyfans-scraper-api) — HTTP, JavaScript or Python.
3. [In an AI assistant](#how-to-use-onlyfans-profile-scraper-in-claude-chatgpt-and-other-ai-assistants) — Claude, ChatGPT, Cursor and other MCP clients.

#### How to use OnlyFans Profile Scraper in Apify Console

1. Click **Try for free** and sign in to Apify. A free account is enough.

2. In **Profile URLs or usernames**, add one profile per line. For example:

   ```text
   https://onlyfans.com/onlyfans
   oftv
   @onlyfans
   ```

3. Click **Start**.

4. When the run finishes, open the **Output** tab. View the profiles as a table, or export them as JSON, CSV, Excel, XML or HTML.

#### How to use the OnlyFans scraper API

Run the scraper and get the profiles from any programming language with the [Apify API](https://docs.apify.com/api/v2). Get your API token in Apify Console under **Settings → API & Integrations**, and replace `<YOUR_API_TOKEN>` in the examples below.

##### HTTP (cURL)

Run the scraper and get the profiles in one request:

```bash
curl -X POST "https://api.apify.com/v2/acts/hgservices~onlyfans-profile-scraper/run-sync-get-dataset-items?format=json" \
  -H "Authorization: Bearer <YOUR_API_TOKEN>" \
  -H "Content-Type: application/json" \
  -d '{ "profileUrls": ["https://onlyfans.com/onlyfans", "oftv"] }'
```

Change `format=json` to `format=csv` or `format=xlsx` to get a spreadsheet. This request waits up to 5 minutes for the run to finish. For long lists, start the run with `POST https://api.apify.com/v2/acts/hgservices~onlyfans-profile-scraper/runs`, and then get the items from the run's dataset when it finishes.

##### JavaScript / Node.js

Install the client with `npm install apify-client`:

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

const client = new ApifyClient({ token: '<YOUR_API_TOKEN>' });

const run = await client.actor('hgservices/onlyfans-profile-scraper').call({
    profileUrls: ['https://onlyfans.com/onlyfans', 'oftv'],
});

const { items } = await client.dataset(run.defaultDatasetId).listItems();
for (const profile of items) {
    console.log(profile.username, profile.subscribersCount, profile.subscribePrice);
}
```

##### Python

Install the client with `pip install apify-client` (version 3 or later). This example sorts the creators by likes:

```python
from apify_client import ApifyClient

client = ApifyClient("<YOUR_API_TOKEN>")

run = client.actor("hgservices/onlyfans-profile-scraper").call(run_input={
    "profileUrls": ["https://onlyfans.com/onlyfans", "oftv"],
})
if run is None:
    raise RuntimeError("The run was not found.")

profiles = list(client.dataset(run.default_dataset_id).iterate_items())
profiles.sort(key=lambda p: p.get("favoritedCount") or 0, reverse=True)

for profile in profiles:
    print(profile["username"], profile.get("favoritedCount"), profile.get("subscribePrice"))
```

#### How to use OnlyFans Profile Scraper in Claude, ChatGPT and other AI assistants

OnlyFans Profile Scraper works as a tool for AI assistants through the [Apify MCP server](https://mcp.apify.com). Your assistant runs the scraper, reads the profiles and uses them in its answer. You sign in to Apify the first time that you connect.

To give the assistant only this scraper, use this server URL:

```text
https://mcp.apify.com?tools=hgservices/onlyfans-profile-scraper
```

To let the assistant find and run any Actor in Apify Store, use `https://mcp.apify.com`.

**Claude (claude.ai and Claude Desktop)**

1. Open **Settings → Connectors**.
2. Select **Add → Add custom connector**.
3. Enter a name, for example `Apify`, and paste the server URL.
4. Select **Continue**, then **Add**, and sign in to Apify.

**Claude Code**

```bash
claude mcp add --transport http apify "https://mcp.apify.com?tools=hgservices/onlyfans-profile-scraper"
```

**ChatGPT**

1. Turn on **Developer mode** in ChatGPT.
2. Go to **Settings → Apps & Connectors → Create**.
3. Enter a name, paste the server URL as the **MCP Server URL**, and select **OAuth** authentication.
4. Select **Create**, and sign in to Apify.
5. In a new chat, select **+ → More**, and add the connector.

**Cursor, VS Code and other MCP clients**

Add the server URL as a remote MCP server:

```json
{
    "mcpServers": {
        "apify": {
            "url": "https://mcp.apify.com?tools=hgservices/onlyfans-profile-scraper"
        }
    }
}
```

Then ask in plain language. For example:

> Use OnlyFans Profile Scraper to get the profiles onlyfans and oftv. Make a table of their subscribers, likes, post counts and subscription price.

> Scrape these 20 OnlyFans profiles, and list the Instagram and TikTok accounts that each creator links to.

### Input

OnlyFans Profile Scraper has one input field.

| Field         | Type     | Required | Description                                                                                    |
| ------------- | -------- | -------- | ---------------------------------------------------------------------------------------------- |
| `profileUrls` | string\[] | Yes      | OnlyFans profile URLs (`https://onlyfans.com/username`) or usernames (`username`, `@username`) |

#### Input example

```json
{
    "profileUrls": ["https://onlyfans.com/onlyfans", "https://onlyfans.com/oftv", "@onlyfans"]
}
```

The scraper gets `onlyfans` one time only, because `@onlyfans` is a duplicate. Usernames are not case-sensitive.

### Output

You get one item for each profile that the scraper finds. This is a shortened example:

```json
{
    "id": 15585607,
    "username": "onlyfans",
    "name": "OnlyFans",
    "url": "https://onlyfans.com/onlyfans",
    "about": "Featuring videos by OnlyFans Creators<br />\nSee more: <a href=\"https://OnlyFans.com/OFTV\">OnlyFans.com/OFTV</a>",
    "isVerified": true,
    "avatar": "https://public.onlyfans.com/files/m/mk/mka/mkamcrf6rjmcwo0jj4zoavhmalzohe5a1640180203/avatar.jpg",
    "header": "https://public.onlyfans.com/files/j/js/jsv/jsv5w8j13rg0ganqiqfo2i1v1kulprh11671047426/15585607/header.jpg",
    "subscribePrice": 0,
    "subscribersCount": 6230740,
    "favoritedCount": 1146465,
    "postsCount": 5122,
    "photosCount": 0,
    "videosCount": 5121,
    "mediasCount": 5121,
    "joinDate": "2019-11-29T00:00:00+00:00",
    "firstPublishedPostDate": "2020-03-17T00:00:00+00:00",
    "lastSeen": null,
    "website": null,
    "location": null,
    "tipsMin": 5,
    "tipsMax": 200,
    "scrapedAt": "2026-10-19T02:25:12.635Z"
}
```

An item has up to about 90 fields. A field that does not apply to a profile can be missing.

The **Output** tab has three views:

- **Profiles** — a table with the avatar, username, name, URL, verified badge, subscribers, likes, posts, photos, videos, price, join date and last-seen time.
- **All profile fields** — every field of every profile.
- **Run summary** — the counts of scraped, failed and skipped profiles.

#### Main output fields

| Field                                                                     | Description                                                                       |
| ------------------------------------------------------------------------- | --------------------------------------------------------------------------------- |
| `id`, `username`, `name`, `url`                                           | The OnlyFans user ID, the username, the display name and the profile URL          |
| `about`, `rawAbout`                                                       | The bio as HTML, and as plain text when it is available                           |
| `isVerified`                                                              | `true` when the profile has the verified badge                                    |
| `avatar`, `avatarThumbs`, `header`, `headerThumbs`, `headerSize`          | The avatar and header image URLs, their thumbnails, and the header size           |
| `subscribersCount`, `showSubscribersCount`                                | The number of subscribers. It is `null` when the creator hides it                 |
| `favoritedCount`                                                          | The number of likes on the profile                                                |
| `postsCount`, `photosCount`, `videosCount`, `audiosCount`, `mediasCount`  | The content counts                                                                |
| `archivedPostsCount`, `firstPublishedPostDate`                            | The number of archived posts, and the date of the first post                      |
| `subscribePrice`, `subscriptionBundles`                                   | The monthly price in USD (`0` = free), and the bundles with duration and discount |
| `tipsEnabled`, `tipsMin`, `tipsMax`, `callPrice`                          | The tip settings and the price of a call                                          |
| `joinDate`, `lastSeen`                                                    | When the creator joined, and when they were last online (`null` when hidden)      |
| `website`, `wishlist`, `location`                                         | The website, the wishlist URL and the location that the creator shows             |
| `instagramUrl`, `twitterUrl`, `tiktokUrl`, `youtubeUrl`, `twitchUrl`, ... | The social media links that the creator adds                                      |
| `hasStream`, `hasScheduledStream`, `hasStories`, `hasPinnedPosts`         | Activity flags                                                                    |
| `scrapedAt`                                                               | When the profile was scraped (UTC)                                                |

Some fields, such as `subscribedBy` or `canChat`, describe the relation between the viewer and the creator. The scraper does not sign in, so these fields always have their default values.

#### Run summary

The **Run summary** shows how many profiles the scraper got, and the reason for each profile that failed and each entry that it skipped:

```json
{
    "requested": 3,
    "succeeded": 2,
    "failed": 1,
    "skipped": 1,
    "stoppedEarly": false,
    "failedProfiles": [{ "username": "no-such-user-x9z", "error": "Profile not found: no-such-user-x9z" }],
    "skippedEntries": [
        {
            "entry": "https://example.com/not-onlyfans",
            "reason": "Not an onlyfans.com URL: https://example.com/not-onlyfans"
        }
    ]
}
```

`requested` counts the unique, valid profiles in your list. `stoppedEarly` is `true` when the run stopped because it reached the maximum cost that you set for the run.

### Integrations and scheduling

Connect OnlyFans Profile Scraper to the tools that you already use with [Apify integrations](https://apify.com/integrations): **Google Sheets, Slack, Zapier, Make, n8n, Airbyte, Keboola** and more. Use **webhooks** to call your own endpoint when a run finishes.

Use **Schedules** in Apify Console to run the scraper automatically. For example, run it every Monday on your list of creators to follow their subscribers, likes, posts and price over time.

### Good to know

- **Public data only.** The scraper gets only the data that OnlyFans shows to a visitor who is not logged in. It does not get posts, photos, videos, messages or any paid content.
- **Hidden stats.** A creator can hide the subscriber count or the last-seen time. Then the field is `null`.
- **Profiles that are not found.** A deleted, renamed or banned profile is not in the dataset. The run summary shows it as `Profile not found`.
- **Invalid entries.** An entry that is not an OnlyFans profile URL or username is skipped. The run summary shows it with the reason.
- **Temporary blocks.** Sometimes OnlyFans blocks a request. The scraper tries again automatically. If a profile still fails, the run summary shows the error. Run the failed profiles again later.

### FAQ

#### Do I need an OnlyFans account?

No. You need only an Apify account. The scraper does not sign in to OnlyFans.

#### Is there an official OnlyFans API?

OnlyFans has no public API for profile data. OnlyFans Profile Scraper gives you the same public profile data as structured JSON, CSV or Excel, and you can call it through the Apify API like any other API.

#### Can I check the subscriber count of an OnlyFans creator?

Yes, when the creator shows it on the profile. The `subscribersCount` field has the number. When the creator hides it, the field is `null`. The like count (`favoritedCount`) is always available.

#### Can it download OnlyFans posts, photos or videos?

No. The scraper gets the public profile only: bio, images, stats, price and links. It cannot get content that is behind a subscription.

#### How many profiles can I scrape in one run?

There is no fixed limit. Add as many profiles as you need to one list.

#### Can I search OnlyFans for creators by keyword?

No. The scraper gets the profiles that you give it. It does not search OnlyFans.

#### Is it legal to scrape OnlyFans profiles?

The scraper collects only publicly available profile data and never signs in. A profile can contain personal data, for example a name or a location. You are responsible for using the data in line with the OnlyFans Terms of Service and the laws that apply to you, including personal-data laws such as the GDPR. Do not use the data to harass, track or identify a person. Read more in [Is web scraping legal?](https://blog.apify.com/is-web-scraping-legal/)

### Support and feedback

Did you find a bug, or do you need a field that is not here? Open an issue on the **Issues** tab. Custom solutions are available on request.

This scraper is not affiliated with or endorsed by OnlyFans or Fenix International Limited.

# Actor input Schema

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

One OnlyFans profile per line. Use a full URL such as https://onlyfans.com/onlyfans, or a username such as onlyfans or @onlyfans. The scraper removes duplicates and skips entries that are not OnlyFans profiles. You pay for each profile in the output.

## Actor input object example

```json
{
  "profileUrls": [
    "https://onlyfans.com/onlyfans",
    "oftv"
  ]
}
```

# Actor output Schema

## `overview` (type: `string`):

No description

## `results` (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 = {
    "profileUrls": [
        "https://onlyfans.com/onlyfans",
        "oftv"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("hgservices/onlyfans-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 = { "profileUrls": [
        "https://onlyfans.com/onlyfans",
        "oftv",
    ] }

# Run the Actor and wait for it to finish
run = client.actor("hgservices/onlyfans-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 '{
  "profileUrls": [
    "https://onlyfans.com/onlyfans",
    "oftv"
  ]
}' |
apify call hgservices/onlyfans-profile-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,hgservices/onlyfans-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/ogfP74f31qI2z3Mkm/builds/yxhjEweWpJp0f7xYl/openapi.json
