# OnlyFans Public Profile and Post Preview Scraper (`automation-lab/onlyfans-public-profile-post-preview-scraper`) Actor

Collect public OnlyFans creator profiles, prices, activity statistics, and anonymously visible post-preview metadata without credentials or media downloads.

- **URL**: https://apify.com/automation-lab/onlyfans-public-profile-post-preview-scraper.md
- **Developed by:** [Stas Persiianenko](https://apify.com/automation-lab) (community)
- **Categories:** Social media
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.02 / 1,000 item extracteds

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

## OnlyFans Public Profile and Post Preview Scraper

Collect public OnlyFans creator profiles, subscription prices, activity counters, and post-preview metadata that OnlyFans shows to logged-out visitors.

The Actor accepts usernames and profile URLs, opens a conservative anonymous browser session, and saves two clean datasets:

- **Creator profiles** in the default dataset
- **Public post previews** in a separate run-scoped dataset

It does not accept account cookies or credentials. It does not subscribe to creators, unlock content, read messages, or download media.

### What does this OnlyFans scraper collect?

For each requested public creator, the Actor captures the first-party JSON generated by the public profile page.

Profile records can include:

- profile ID, username, and display name
- verification status
- biography, location, and website
- public avatar and header URLs
- join date and publicly exposed last-seen value
- current subscription price and bundle offers
- post, photo, video, and favorite counts
- an explicit `available` or `unavailable` status

When post previews are enabled, the Actor also collects:

- post ID and publication timestamp
- preview text visible while logged out
- public favorite and media counts
- opened or locked indicators
- author context
- pagination page number and cursor provenance

Media URLs and media files are intentionally outside the product scope.

### Who is it for

**Creator marketing agencies** can enrich creator lists with public pricing, verification, and activity indicators.

**Influencer research teams** can compare public creator positioning and visible publishing cadence.

**Brand-safety analysts** can monitor publicly visible biography and preview text changes without accessing subscriber content.

**Creator-economy researchers** can build repeatable public metadata snapshots for longitudinal analysis.

**Data engineers** can feed normalized creator and post-preview records into warehouses, dashboards, or monitoring workflows.

### Why use this public metadata workflow?

OnlyFans profile pages are JavaScript applications. A plain HTTP request returns an application shell rather than the useful profile data.

This Actor uses a logged-out Playwright browser to let the page generate its current signed first-party requests, then parses the resulting JSON. That design avoids user-supplied authentication and keeps the product boundary auditable.

Other practical benefits include:

- usernames and profile URLs in one run
- deduplication of repeated targets
- separate schemas for profiles and post previews
- bounded pagination up to the requested limit
- explicit unavailable records for confirmed missing profiles
- no automatic paid proxy fallback
- image, media, and font request blocking to reduce transfer

### Getting started

1. Open the Actor in Apify Console.
2. Add one or more values under **OnlyFans usernames** or **OnlyFans profile URLs**.
3. Choose whether to collect public post previews.
4. Set **Maximum post previews per profile**.
5. Leave the proxy disabled for the normal direct workflow, or configure one explicitly if your network requires it.
6. Click **Start**.
7. Open **Creator profiles** for profile rows and **Public post previews** for preview rows.
8. Export either dataset as JSON, CSV, Excel, XML, or another Apify-supported format.

A small first run is recommended before scheduling a larger recurring workflow.

### Input parameters

| Field | Type | Default | Description |
| --- | --- | --- | --- |
| `usernames` | string array | `[]` | OnlyFans usernames, with or without a leading `@`. |
| `startUrls` | request list | `[]` | Public URLs in the form `https://onlyfans.com/username`. |
| `includePosts` | boolean | `true` | Save anonymously visible post previews in the Posts dataset. |
| `maxPostsPerProfile` | integer | `20` | Maximum previews per creator, from 0 to 200. |
| `proxyConfiguration` | object | disabled | Optional proxy for the coherent browser session. |

At least one username or profile URL is required. A run accepts up to 50 raw profile inputs.

Non-OnlyFans hosts, post URLs, and malformed usernames fail validation instead of being silently ignored.

### Example input: one creator with previews

```json
{
  "startUrls": [
    { "url": "https://onlyfans.com/amouranth" }
  ],
  "includePosts": true,
  "maxPostsPerProfile": 20,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

### Example input: profiles only

```json
{
  "usernames": [
    "amouranth",
    "bhadbhabie"
  ],
  "includePosts": false,
  "maxPostsPerProfile": 0
}
```

Profiles-only mode is useful for periodic price and public-counter snapshots.

### Creator profile output

The default dataset contains one row for every successfully handled target.

```json
{
  "recordType": "profile",
  "status": "available",
  "requestedUsername": "samplecreator",
  "sourceUrl": "https://onlyfans.com/samplecreator",
  "profileId": 12345678,
  "username": "samplecreator",
  "name": "Sample Creator",
  "isVerified": true,
  "bio": "Public creator profile description.",
  "location": null,
  "website": null,
  "avatarUrl": "https://cdn.example/avatar.jpg",
  "headerUrl": "https://cdn.example/header.jpg",
  "joinDate": "2023-01-15T12:00:00+00:00",
  "lastSeen": "2025-01-15T12:00:00+00:00",
  "subscriptionPrice": 9.99,
  "subscriptionBundles": [],
  "postsCount": 250,
  "photosCount": 180,
  "videosCount": 70,
  "favoritesCount": 12500,
  "scrapedAt": "2025-01-15T12:00:00.000Z"
}
```

Fields may be `null` when OnlyFans does not expose a value for that profile.

A confirmed missing or inaccessible public username produces `status: "unavailable"` with an `unavailableReason` instead of pretending that an empty response is valid creator data.

### Public post-preview output

Post previews are stored in the run-scoped **Posts** dataset.

```json
{
  "recordType": "postPreview",
  "sourceUrl": "https://onlyfans.com/samplecreator",
  "profileId": 12345678,
  "username": "samplecreator",
  "authorName": "Sample Creator",
  "postId": 987654321,
  "postedAt": "2025-01-15T12:00:00+00:00",
  "text": "Public post preview text.",
  "favoritesCount": 125,
  "mediaCount": 1,
  "isOpened": true,
  "isLocked": false,
  "responseType": "post",
  "pageNumber": 1,
  "pageCursor": "1736942400.000000",
  "scrapedAt": "2025-01-15T12:00:00.000Z"
}
```

`mediaCount` is metadata only. The Actor does not download or return the underlying photos or videos.

### How much does it cost to scrape public OnlyFans profiles?

The Actor uses pay per event pricing with a **$0.005 one-time run-start fee** plus one item event for every saved profile or post preview.

At the Free tier, the item event costs **$0.000041071 per saved record**. The item price decreases across the Bronze, Silver, Gold, Platinum, and Diamond platform tiers.

Example Free-tier calculations:

- 1 profile with 20 previews: `$0.005 + 21 × $0.000041071 = $0.005862491`
- 10 profiles without previews: `$0.005 + 10 × $0.000041071 = $0.005410710`
- 10 profiles with 100 previews each: `$0.005 + 1,010 × $0.000041071 = $0.046481710`

Only records actually saved produce item events. A confirmed unavailable profile is still a useful profile-status record and counts as one item. The run-start event is charged once per run.

Your Apify plan and any explicitly enabled proxy usage are separate platform considerations.

### Pagination, limits, and freshness

The public page initially loads a small preview page. The Actor performs bounded page-bottom scrolling to trigger the signed cursor requests generated by the site.

Pagination stops when:

- `maxPostsPerProfile` is reached
- OnlyFans reports no additional public previews
- the page no longer produces another preview response

A creator can have more posts than a logged-out visitor can preview. `postsCount` is the public profile counter; it is not a promise that the same number of preview records is anonymously accessible.

Results represent what the public page returned during the run. Schedule recurring runs if you need snapshots over time.

### Proxy and session behavior

By default, the Actor connects directly and does not trigger residential proxy charges.

If you configure a proxy, one coherent browser proxy identity is used for the run. Cookies, request signatures, and browser state remain together.

There is no hidden residential fallback. This makes proxy use predictable and lets you choose the geography and proxy groups appropriate for your own workflow.

For a transient upstream failure, the Actor retries a profile once in a fresh page. Persistent challenges and unexpected upstream responses fail the run rather than returning misleading empty success.

### Errors and troubleshooting

**“Provide at least one username or OnlyFans profile URL.”**

Add a value to `usernames` or `startUrls`.

**“Unsupported host in URL.”**

Use a public URL directly under `onlyfans.com`, not a search result, redirector, or post URL.

**The profile is marked unavailable.**

Confirm that the username still resolves publicly in a logged-out browser. Removed, renamed, restricted, or nonexistent profiles can appear unavailable.

**The run reports fewer previews than `maxPostsPerProfile`.**

The limit is a maximum, not a guarantee. Only previews exposed anonymously by the current public page can be returned.

**The run encounters a challenge or timeout.**

Retry later or configure an appropriate proxy explicitly. Do not provide account cookies; authenticated scraping is intentionally unsupported.

### Automation and integration ideas

- Schedule a weekly creator price and activity snapshot.
- Join profile records to an agency CRM using `username`.
- Send new public preview rows to a warehouse through a webhook.
- Compare `postsCount`, `favoritesCount`, and `lastSeen` between snapshots.
- Route public preview text through a separate classification or brand-safety process.
- Export creator pricing and verification fields to Google Sheets.

Use profile IDs and post IDs as source identifiers, while retaining `scrapedAt` for snapshot provenance.

### Run with the Apify API using cURL

```bash
curl -X POST \
  "https://api.apify.com/v2/acts/automation-lab~onlyfans-public-profile-post-preview-scraper/runs?token=$APIFY_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "usernames": ["amouranth"],
    "includePosts": true,
    "maxPostsPerProfile": 20
  }'
```

The response contains the run ID and dataset links. Poll the run or use the synchronous dataset endpoint when appropriate for your integration.

### Run with JavaScript

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

const client = new ApifyClient({ token: process.env.APIFY_TOKEN });
const run = await client.actor(
  'automation-lab/onlyfans-public-profile-post-preview-scraper'
).call({
  usernames: ['amouranth'],
  includePosts: true,
  maxPostsPerProfile: 20,
});

const profiles = await client.dataset(run.defaultDatasetId).listItems();
console.log(profiles.items);
```

The run object also exposes storage information for the aliased Posts dataset in Apify Console.

### Run with Python

```python
import os
from apify_client import ApifyClient

client = ApifyClient(os.environ["APIFY_TOKEN"])
run = client.actor(
    "automation-lab/onlyfans-public-profile-post-preview-scraper"
).call(run_input={
    "usernames": ["amouranth"],
    "includePosts": True,
    "maxPostsPerProfile": 20,
})

profiles = client.dataset(run["defaultDatasetId"]).list_items().items
print(profiles)
```

Never embed an Apify token in source control.

### Use with Apify MCP

Add the Actor to Claude Code:

```bash
claude mcp add --transport http apify \
  "https://mcp.apify.com?tools=automation-lab/onlyfans-public-profile-post-preview-scraper"
```

Use the same server URL for **Claude Desktop**, **Cursor**, and **VS Code** MCP configuration:

```json
{
  "mcpServers": {
    "apify": {
      "url": "https://mcp.apify.com?tools=automation-lab/onlyfans-public-profile-post-preview-scraper"
    }
  }
}
```

Example prompts showing MCP usage:

- “Get the public profile and 20 visible post previews for the OnlyFans username amouranth.”
- “Collect profile-only snapshots for these creator usernames and return a pricing comparison table.”
- “Run the OnlyFans public profile Actor for this URL and summarize unavailable profiles separately.”

MCP uses the same input limits and public-only scope as Console and API runs.

### Responsible use and legality

Only collect and process data you are legally permitted to use.

Review OnlyFans terms, applicable privacy and database laws, contractual obligations, and your organization's policies before running a workflow. Public accessibility does not remove all legal or ethical responsibilities.

Do not use the Actor to harass creators, facilitate discrimination, build intrusive personal profiles, or evade access controls.

The Actor intentionally excludes:

- account credentials and user cookies
- paid subscriptions and purchases
- locked or subscriber-only content
- private messages
- media file downloading
- CAPTCHA solving or access-control bypass

You are responsible for retention, security, and downstream use of exported records.

### Limitations

- OnlyFans can change its public application and signed API behavior without notice.
- Public fields vary by creator and may be null.
- Removed, renamed, geo-restricted, or otherwise unavailable profiles may produce unavailable records.
- Preview availability is determined by the logged-out public page.
- The Actor does not expose or download locked media.
- Concurrency is intentionally conservative to protect session stability.
- A maximum of 50 raw profiles and 200 previews per profile is enforced per run.
- Optional proxy results can vary by geography and proxy quality.

### Related Actors

This Actor is deliberately standalone in the current automation-lab portfolio because no existing automation-lab Actor covers the same public OnlyFans profile workflow.

Use Apify integrations such as schedules, webhooks, Make, Zapier, Google Sheets, and dataset exports to connect its output to your broader automation stack.

### FAQ

#### Does this Actor need an OnlyFans account?

No. It is designed for the public logged-out surface and does not accept credentials.

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

No. It returns public metadata such as `mediaCount`, but never downloads media.

#### Can it unlock posts or scrape messages?

No. Locked content, subscriptions, purchases, and private messages are explicitly excluded.

#### Why are profiles and previews in separate datasets?

They are distinct entities with different schemas and update rates. Separate run-scoped datasets keep exports clean while preserving profiles as the default backward-compatible result.

#### Can I monitor changes over time?

Yes. Schedule recurring runs and compare records using `username`, `profileId` or `postId`, and `scrapedAt`.

#### Does `maxPostsPerProfile` guarantee that many rows?

No. It is an upper bound. The Actor returns only the previews the public page exposes during that run.

#### Is proxy use automatic?

No. The default is direct access. A proxy is used only when you configure it.

#### What happens for a nonexistent username?

A confirmed 404 produces an `unavailable` profile record with a reason. Transient blocks and unexpected upstream failures are not mislabeled as unavailable.

# Actor input Schema

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

Creator usernames, with or without a leading @. You can combine these with profile URLs.

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

Public profile URLs such as https://onlyfans.com/amouranth. Post URLs and non-OnlyFans URLs are rejected.

## `includePosts` (type: `boolean`):

Save the post-preview metadata shown to logged-out visitors in a separate Posts dataset.

## `maxPostsPerProfile` (type: `integer`):

Maximum anonymously visible post previews to collect for each profile. Set to 0 for profiles only.

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

Optional proxy used for the coherent browser session. No paid proxy is enabled automatically.

## Actor input object example

```json
{
  "usernames": [
    "amouranth"
  ],
  "startUrls": [
    {
      "url": "https://onlyfans.com/amouranth"
    }
  ],
  "includePosts": true,
  "maxPostsPerProfile": 20,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# Actor output Schema

## `profiles` (type: `string`):

Default dataset containing one public profile or unavailable record per requested creator.

## `postPreviews` (type: `string`):

Run-scoped Posts dataset containing preview metadata visible to logged-out visitors.

# 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": [
        "amouranth"
    ],
    "startUrls": [
        {
            "url": "https://onlyfans.com/amouranth"
        }
    ],
    "includePosts": true,
    "maxPostsPerProfile": 20
};

// Run the Actor and wait for it to finish
const run = await client.actor("automation-lab/onlyfans-public-profile-post-preview-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": ["amouranth"],
    "startUrls": [{ "url": "https://onlyfans.com/amouranth" }],
    "includePosts": True,
    "maxPostsPerProfile": 20,
}

# Run the Actor and wait for it to finish
run = client.actor("automation-lab/onlyfans-public-profile-post-preview-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": [
    "amouranth"
  ],
  "startUrls": [
    {
      "url": "https://onlyfans.com/amouranth"
    }
  ],
  "includePosts": true,
  "maxPostsPerProfile": 20
}' |
apify call automation-lab/onlyfans-public-profile-post-preview-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,automation-lab/onlyfans-public-profile-post-preview-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/dyGKHNG2tyDAnrBfT/builds/qBxgI98LiIDt6CudB/openapi.json
