# OnlyFans Creator Profile Pro | No Cookie | No Login (`rexreus/onlyfans-creator-profile-public-data-scraper`) Actor

Batch public OnlyFans creator cards — handle, stats, socials, public price — without login or media theft.

- **URL**: https://apify.com/rexreus/onlyfans-creator-profile-public-data-scraper.md
- **Developed by:** [REXREUS D.O](https://apify.com/rexreus) (community)
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $2.50 / 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/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

<p align="center">
  <h1 align="center">OnlyFans Creator Profile Scraper</h1>
  <img src="https://res.cloudinary.com/ewnqk3k9/image/upload/f_auto,q_auto/apify-actor-onlyfans-scraper.png" alt="OnlyFans public creator profile scraper banner" width="896" align="center">
  <p align="center">
    <strong>Batch public OnlyFans creator cards — handle, stats, socials, public price — without login or media theft.</strong>
  </p>
  <p align="center">
    <em>HTTP-only (Crawlee + got-scraping) · TypeScript · no Playwright · no cookies · 18+</em>
  </p>
  <p align="center">
    <a href="#quick-start"><img src="https://img.shields.io/badge/Quick_Start-Apify_Console-green?style=flat-square" alt="Quick Start"></a>
    <a href="https://apify.com"><img src="https://img.shields.io/badge/Runs_on-Apify-ff443e?style=flat-square" alt="Apify"></a>
    <a href="https://nodejs.org"><img src="https://img.shields.io/badge/Node.js-≥20-339933?style=flat-square&logo=node.js&logoColor=white" alt="Node.js"></a>
  </p>
</p>

Unofficial **OnlyFans public creator intelligence Actor** for agencies, affiliate teams, creator managers, and CRM enrichment. Turn a list of handles or public profile URLs into clean, CSV-ready creator records—without login cookies, private media, DMs, or paid-content access.

### Built for teams that need creator data fast

- **Discover prospects:** batch-check public handles before outreach.
- **Enrich CRM records:** capture display name, verification, audience counts, bio, links, public price, and presence.
- **Export cleanly:** one normalized row per creator; download JSON, CSV, Excel, or HTML from Apify.
- **Control spend:** HTTP-first, browser-free collection with per-item errors instead of failed batches.

### Why this Actor?

| Feature | What you get |
|---|---|
| Username **or** URL input | Mix `@handle` lists and `https://onlyfans.com/{username}` URLs |
| Public profile card | `displayName`, `isVerified`, `about`, public counts, `joinDate`, avatar/header URL strings |
| Flat socials | `instagram`, `twitter`, `tiktok`, `website`, plus `otherSocials[]` for CSV |
| Public price + presence | `subscriptionPrice` and `lastSeen` only when publicly shown |
| Fail per item | `continueOnError` writes `{ username, error, scrapedAt }` without losing the batch |
| Cheap HTTP | 512 MB, no browser, optional Apify Proxy when Cloudflare blocks |
| Honest limits | No posts, media files, DMs, cookies, or private-content access; max 200 profiles/run |

### Quick start

#### Apify Console

1. Open the Actor and click **Start**.
2. Prefill is the official public handle `onlyfans`. Add more usernames or profile URLs if you need a batch.
3. Enable Apify Proxy if you see `blocked_403` / Cloudflare.
4. Results land in **Storage → Dataset**. Download JSON, CSV, Excel, or HTML.

### How it works

```
usernames[] / profileUrls[]
        │
        ▼
  validate + allowlist + dedupe (max 200)
        │
        ▼
  GET https://onlyfans.com/{username}   (got-scraping)
        │
        ▼
  public app-token + cdn2 key/hash + guest sign from public 2313.js
        │
        ▼
  GET /api2/v2/users/{username}  (no sess / no login)
        │
        ▼
  CreatorProfile row → Dataset
        │
        └── error row on 404 / 403 / 429 / spa_shell
```

### Input

See the **Input** tab for the Console form. Cookies, passwords, and tokens are rejected.

```json
{
  "usernames": ["onlyfans"],
  "maxItems": 1,
  "continueOnError": true,
  "proxy": { "useApifyProxy": false }
}
```

| Field | Type | Required | Default | Description |
|---|---|---|---|---|
| `usernames` | string\[] | no\* | `["onlyfans"]` prefill | Handles without `@`. Charset `[A-Za-z0-9._-]`, max 50 chars |
| `profileUrls` | string\[] / request list | no\* | — | `https://onlyfans.com/{username}` or `www.onlyfans.com` only |
| `maxItems` | integer | no | `100` | Hard cap **200** |
| `continueOnError` | boolean | no | `true` | Push an error row and keep going |
| `proxy` | object | no | `{ "useApifyProxy": true }` | Apify proxy editor |

\*Provide at least one username or profile URL.

#### Recipes

**One official profile (local smoke):**

```json
{
  "usernames": ["onlyfans"],
  "maxItems": 1,
  "continueOnError": true,
  "proxy": { "useApifyProxy": false }
}
```

**Batch usernames + URLs:**

```json
{
  "usernames": ["onlyfans", "@SomeCreator"],
  "profileUrls": ["https://onlyfans.com/anothercreator"],
  "maxItems": 50,
  "continueOnError": true,
  "proxy": { "useApifyProxy": true }
}
```

**Residential proxy when datacenter is challenged:**

```json
{
  "usernames": ["onlyfans"],
  "maxItems": 1,
  "continueOnError": true,
  "proxy": {
    "useApifyProxy": true,
    "apifyProxyGroups": ["RESIDENTIAL"]
  }
}
```

### Output

You can download the dataset as JSON, HTML, CSV, or Excel. One item per input username.

Successful item (shape; live values depend on the public page):

```json
{
  "username": "onlyfans",
  "displayName": "OnlyFans",
  "profileUrl": "https://onlyfans.com/onlyfans",
  "isVerified": true,
  "about": "Featuring videos by OnlyFans Creators",
  "location": null,
  "postsCount": 5020,
  "photosCount": 0,
  "videosCount": 5020,
  "subscribersCount": 6180733,
  "instagram": null,
  "twitter": null,
  "tiktok": null,
  "website": null,
  "otherSocials": [],
  "subscriptionPrice": 0,
  "joinDate": "2019-11-29T00:00:00+00:00",
  "lastSeen": null,
  "avatarUrl": "https://public.onlyfans.com/files/.../avatar.jpg",
  "headerUrl": "https://public.onlyfans.com/files/.../header.jpg",
  "scrapedAt": "2026-09-11T08:38:47.781Z",
  "error": null
}
```

Failed item:

```json
{
  "username": "missinguser",
  "profileUrl": "https://onlyfans.com/missinguser",
  "displayName": null,
  "error": "not_found",
  "scrapedAt": "2026-09-11T00:00:00.000Z",
  "otherSocials": []
}
```

| Field | Type | Description |
|---|---|---|
| `username` | string | Normalized handle |
| `displayName` | string | null | Public display name |
| `profileUrl` | string | `https://onlyfans.com/{username}` |
| `isVerified` | boolean | null | Public verified flag |
| `about` | string | null | Public bio |
| `location` | string | null | Creator-supplied string only (no geocode) |
| `postsCount` / `photosCount` / `videosCount` / `subscribersCount` | number | null | Public counts |
| `instagram` / `twitter` / `tiktok` / `website` | string | null | Flat social columns |
| `otherSocials` | string\[] | Remaining public social URLs |
| `subscriptionPrice` | number | null | Public subscribe price |
| `joinDate` / `lastSeen` | string | null | Public timestamps if shown |
| `avatarUrl` / `headerUrl` | string | null | Public image **URLs**, not files |
| `scrapedAt` | string | ISO-8601 |
| `error` | string | null | `null` on success; `not_found`, `blocked_403`, `blocked_429`, `empty_body`, `cloudflare_challenge`, … |

No cookie, token, or HTML dump fields.

### Cost, limits, proxy

- Memory: **512 MB** HTTP (not a 2048 MB browser Actor).
- Concurrency: sequential per run in v1 (tens–hundreds of handles; keep it polite).
- Time: design target ~2–5s per profile on a warm HTTP path.
- CU: research estimate ~0.0005–0.002 CU / profile at 256–512 MB. Confirm on a live `apify run`.
- Proxy: default Console input uses Apify Proxy. Local `INPUT.json` sets `useApifyProxy: false` so `apify run --purge` works offline. Switch proxy on if you hit Cloudflare.
- Cap: `maxItems` default 100, hard 200.

This listing is **not** an official OnlyFans API and does not include media bandwidth.

### Troubleshooting

| Symptom | Cause | Fix |
|---|---|---|
| `not_found` | Handle missing or unpublished | Check the username; 404 is an error row, not a crash |
| `blocked_403` / `blocked_429` / `cloudflare_challenge` | Challenge or rate limit | Enable Apify Proxy (residential if datacenter fails), retry later |
| `spa_shell` / `parse_incomplete` | Guest sign failed or SPA HTML fallback | Rebuild (`tsc`) then `apify run --purge`. Chunk `2313.js` must load. |
| `Host not allowed` / `Credentials in URL rejected` | Bad URL | Only `https://onlyfans.com/{user}`; no `user:pass@`, no other hosts |
| `Provide usernames or profileUrls` | Empty input | Add at least one handle or URL |
| Dataset empty after local run | Looked at Console | Inspect `storage/datasets/default/` — local runs stay local |

### FAQ

**Does this download OnlyFans videos or photos?**
No. Avatar/header are URL strings only. No media files, PPV, or DMs.

**Do I need cookies or a login?**
No. Session cookies, `auth.json`, and tokens are out of scope and rejected.

**Can it scrape private or paid profiles?**
No. Public `/api2/v2/users/{username}` with guest headers only. No PPV, DMs, or media.

**What happens if one username 404s in a batch?**
With `continueOnError: true` (default) you get an error row and the rest continue.

**How many profiles per run?**
Default 100, hard cap 200.

**Is this an official OnlyFans API?**
No. Unofficial, 18+, not affiliated.

**Will Cloudflare always work?**
Not guaranteed. Use proxy + backoff. If HTTP stays empty, v1 writes an error row rather than launching a browser.

### Limitations

- Public metadata only. You are responsible for OnlyFans ToS, Apify AUP, and privacy law (GDPR and equivalents).
- `location` and `lastSeen` are personal data when they identify a person. Store only if public; do not geocode; do not infer schedules; do not publish a searchable PII warehouse.
- Adult content: operators and end users must be 18+.
- No CAPTCHA solving, no cookie harvesting, no discovery/search, no reverse social lookup, no 90-field raw dumps.
- Automated collection of OnlyFans data may breach their Terms / AUP. Use for legitimate purposes only.

> This Actor extracts what a creator has chosen to show on a **public** profile. Results can still contain personal data. Do not scrape personal data unless you have a legitimate reason. If you are unsure, consult a lawyer. Not legal advice.

### Run it

Open the Actor on Apify Console and click **Start**, or run locally with `apify run --purge`.

# Actor input Schema

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

OnlyFans usernames (without @).

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

https://onlyfans.com/{username} URLs.

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

Maximum profiles to fetch (cap 200).

## `continueOnError` (type: `boolean`):

Push an error row and continue when a profile fails.

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

Apify proxy recommended against Cloudflare.

## Actor input object example

```json
{
  "usernames": [
    "onlyfans"
  ],
  "maxItems": 100,
  "continueOnError": true,
  "proxy": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

## `dataset` (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": [
        "onlyfans"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("rexreus/onlyfans-creator-profile-public-data-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": ["onlyfans"] }

# Run the Actor and wait for it to finish
run = client.actor("rexreus/onlyfans-creator-profile-public-data-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": [
    "onlyfans"
  ]
}' |
apify call rexreus/onlyfans-creator-profile-public-data-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,rexreus/onlyfans-creator-profile-public-data-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/36loFFG8Et1AuJS89/builds/76w3VDlgWgeMgiERd/openapi.json
