# OnlyFans Scraper — Bulk Profile Data (No Login) (`cliqtomedia/onlyfans-scraper`) Actor

Scrape up to 5,000 public OnlyFans profiles per run from usernames or URLs. Get the complete public profile object, pricing, content counts, images, and published social links—without login, cookies, or paid content. Rotating proxies and platform usage are included, from $0.50 per 1,000 results.

- **URL**: https://apify.com/cliqtomedia/onlyfans-scraper.md
- **Developed by:** [Cliqto Media](https://apify.com/cliqtomedia) (community)
- **Categories:** Social media, Lead generation, Automation
- **Stats:** 1 total users, 1 monthly users, 100.0% runs succeeded, 1 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.50 / 1,000 profile lookups

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?

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

Scrape public OnlyFans profile data in bulk without an OnlyFans account. Send
up to 5,000 usernames or profile URLs per run and receive the complete public
profile object plus the social media links each creator published.

This is an unofficial, independent tool. It is not affiliated with, endorsed
by, or sponsored by OnlyFans or Fenix International Limited.

Built for large catalogs: a recorded 1,000-profile run completed in about
225 seconds. Pricing starts at $0.50 per 1,000 returned results on eligible
Apify plans.

### What this OnlyFans profile scraper does

- Accepts usernames such as `heyninarei` and full profile URLs such as
  `https://onlyfans.com/heyninarei`.
- Accepts and removes official tracking suffixes such as `/c13` and `?c13`.
- Returns every field present in the public profile response; fields are not
  restricted to a fixed allowlist.
- Fetches published social links separately after every successful profile
  lookup, even when the profile's `hasLinks` flag is false.
- Returns a clear `User not found` item for deleted or non-existent profiles
  without stopping the rest of the run.
- Writes detailed counters and diagnostics to `RUN_SUMMARY` in the run's
  key-value store.

### What it does not do

This Actor reads public profile metadata only. It does not log in, send
cookies, access posts or messages, retrieve paid content, or download media.

### Data you get

OnlyFans controls the public profile response, so the exact fields can change
between profiles and over time. A captured reference response contains more
than 80 fields. Common data includes:

| Group | Example fields |
|---|---|
| Identity | `id`, `username`, `name`, `about`, `joinDate`, `location`, `website` |
| Status | `isVerified`, `isPerformer`, `isStreaming` |
| Activity | `postsCount`, `photosCount`, `videosCount`, `audiosCount`, `favoritedCount` |
| Pricing | `subscribePrice`, promotions, subscription bundles |
| Images | `avatar`, `avatarThumbs`, `header`, `headerSize` |
| Social | `xUrl`, `instagramUrl`, `tiktokUrl`, `youtubeUrl`, `snapchatUrl`, `amazonUrl`, and dynamically named fields for other platforms |

Social platforms are not restricted to a fixed list. A new platform is emitted
as `<socialMedia>Url` when OnlyFans provides a usable URL. The table in the
Apify Output tab highlights common fields; JSON exports retain the complete
item.

### Input

```json
{
  "profileUrls": [
    "heyninarei",
    "https://onlyfans.com/ho11y_girl",
    "https://onlyfans.com/example/c13",
    "https://onlyfans.com/example?c13"
  ]
}
```

`profileUrls` is the complete public input. It accepts 1–5,000 entries in any
mix of usernames and OnlyFans profile URLs. Inputs are normalized to lowercase
canonical URLs. Repeated usernames and invalid inputs are skipped and counted
in `RUN_SUMMARY`.

The public Actor does not accept a user-provided callback URL. Use Apify
integrations, platform webhooks, or the API to consume the resulting Dataset.
Operational pacing, timeout, signing, and retry settings are owner-controlled
so every buyer receives the tested performance and cost safeguards.

### Output

Each unique valid input produces at most one dataset item. A successful item
contains the upstream profile fields, normalized social URL fields, and the
canonical `inputUrl`:

```json
{
  "id": 123456789,
  "username": "example",
  "name": "Example",
  "about": "...",
  "isVerified": true,
  "postsCount": 412,
  "photosCount": 380,
  "videosCount": 32,
  "favoritedCount": 15420,
  "subscribePrice": 9.99,
  "joinDate": "2021-04-17T00:00:00+00:00",
  "avatar": "https://...",
  "header": "https://...",
  "xUrl": "https://x.com/example",
  "instagramUrl": "https://instagram.com/example",
  "inputUrl": "https://onlyfans.com/example/"
}
```

A deleted or non-existent profile produces:

```json
{
  "error": { "code": 0, "message": "User not found" },
  "inputUrl": "https://onlyfans.com/example/"
}
```

This is the only error shape written to the dataset. Technical failures are
reported in logs and `RUN_SUMMARY` rather than being mislabeled as missing
profiles. If a safety circuit opens because requests can no longer be signed or
authorized reliably, the entire run fails instead of returning misleading
data.

A run can remain `SUCCEEDED` when isolated profiles exhaust all technical
retries. Those profiles are omitted from the dataset and are not charged as
results. The run status message then shows how many unique profiles were not
returned and points to `RUN_SUMMARY`, whose `technicallyFailed`, `unprocessed`,
and `failedInputs` fields identify the gap. A similar warning appears when a
profile was returned but its social-link request exhausted all retries.

If a run reaches the buyer's **maximum cost per run**, processing stops
gracefully. Already returned items remain available, the final status message
says that the charge limit was reached, and `RUN_SUMMARY` lists the unprocessed
profiles. Infrastructure failures such as an unavailable Dataset abort the run
instead of continuing to spend requests without storing billable results.

Results can be exported as JSON, CSV, XML, RSS, or Excel, or read through the
Apify API and integrations.

### Cost

| Apify plan tier | Price per 1,000 returned items |
|---|---:|
| Free | $1.00 |
| Starter | $0.75 |
| Scale | $0.60 |
| Business | $0.50 |

There is also a $0.0005 Actor-start event. Platform usage and rotating proxy
traffic are included in these prices, with no separate monthly rental. Both
successful profiles and `User not found` items are billable results because
both require a profile lookup. Invalid or duplicate inputs and technical
failures do not create dataset items.

### Speed and reliability

After a successful profile lookup, the Actor makes a second request for social
links. In a benchmark recorded on August 11, 2026, 1,000 inputs completed in
224.8 seconds: 968 profiles, 32 genuine `User not found` results, 1,969 OnlyFans
requests, 8.76 request starts per second, and no technical losses.

Cloud runs use rotating Apify Proxy sessions without a country restriction.
Adaptive pacing and retries respond to throttling while allowing unrelated
workers to continue.

Performance is not guaranteed: run time depends on the input mix, retries,
upstream availability, Apify platform conditions, and account limits.

For completeness-sensitive workflows, always check the final status message or
`RUN_SUMMARY`; a green `SUCCEEDED` status alone does not promise that every
valid unique input produced an item.

### Use cases

- Build or refresh a public creator directory.
- Track public subscription prices and promotions.
- Discover social accounts published by creators.
- Check whether profiles in an existing list are still available.
- Research public pricing and posting-volume signals at catalog scale.

### FAQ

#### Do I need an OnlyFans account?

No. The Actor reads public profile metadata and does not authenticate.

#### Can it retrieve posts, photos, videos, or messages?

No. It returns public profile metadata, including aggregate counts, but not the
content itself.

#### What happens when a profile is deleted or the username is wrong?

The dataset contains an item whose `error.message` is `User not found`, and the
run continues. Large old lists can contain any proportion of missing profiles.

#### Why are social links requested separately?

The public `hasLinks` flag is not reliable enough to use as a gate. In an
August 2026 production dataset, about 29% of records marked `hasLinks: false`
still had stored social links. The Actor therefore checks social links after
every successful profile lookup.

#### How many profiles can I submit?

Up to 5,000 inputs per run. Split larger lists across multiple runs.

#### Can I call it from Python or an automation tool?

Yes. Use the Apify API, Apify's JavaScript or Python client, or an Apify
integration supported by your automation platform.

#### Can the public Actor call my webhook URL?

No. User-provided callback URLs are disabled on the public Actor for security.
Use an Apify integration or platform webhook, or read the Dataset through the
API after the run finishes.

#### Where do I report a problem?

Open an Issue on this Actor's Apify Store page. Include the Run ID, Build ID,
final status message, and a short description of the expected result. Do not
post tokens, webhook secrets, or private customer data.

#### Is this Actor affiliated with OnlyFans?

No.

### Legal and usage notice

This Actor is not affiliated with, associated with, authorized by, endorsed by,
or officially connected to OnlyFans or Fenix International Limited. All
trademarks belong to their respective owners.

The Actor collects publicly available profile information only. By using it,
you confirm that you meet the age requirements for adult platforms in your
jurisdiction and that your collection and use of the data comply with
applicable laws, platform terms, and data-protection obligations.

# Actor input Schema

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

Add 1–5,000 usernames or OnlyFans profile URLs. You can mix formats. Tracking suffixes such as /c13 and ?c13 are accepted and removed automatically.

## Actor input object example

```json
{
  "profileUrls": [
    "heyninarei",
    "https://onlyfans.com/ho11y_girl/c13"
  ]
}
```

# Actor output Schema

## `results` (type: `string`):

Successful public profiles and confirmed User not found results in the default dataset.

## `runSummary` (type: `string`):

Counters, timings, retry information, and diagnostics for the run.

# 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": [
        "heyninarei",
        "https://onlyfans.com/ho11y_girl/c13"
    ]
};

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

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

```

## MCP server setup

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