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

Collect public OnlyFans creator profiles from URLs or usernames. Get identity, bios, images, verification, status, subscription details, content counts, engagement, activity, and public links in structured rows.

- **URL**: https://apify.com/maximedupre/onlyfans-profile-scraper.md
- **Developed by:** [Maxime Dupré](https://apify.com/maximedupre) (community)
- **Categories:** Social media, Marketing, Developer tools
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

$0.80 / 1,000 creator profiles

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?

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

### 🔎 Check public OnlyFans creator profiles

OnlyFans Profile Scraper is for researchers, marketers, creator teams, and analysts who need public creator data. Submit full public OnlyFans profile URLs or creator usernames and get structured rows with identity, bios, images, public status, subscription details, content counts, engagement, activity dates, and external links. This gives you profile data to compare or use in a workflow without copying it by hand. Private and subscriber-only content is not collected.

- Look up a public profile from a direct URL with **[OnlyFans Profile Lookup](https://apify.com/maximedupre/onlyfans-profile-scraper/examples/onlyfans-profile-lookup)**.
- Check public creator details with **[OnlyFans Public Profile Scraper](https://apify.com/maximedupre/onlyfans-profile-scraper/examples/onlyfans-public-profile-scraper)**.
- Collect structured identity, metrics, and links with **[OnlyFans Creator Data Scraper](https://apify.com/maximedupre/onlyfans-profile-scraper/examples/onlyfans-creator-data-scraper)**.
- Start a profile lookup with a bare username using **[OnlyFans Username Scraper](https://apify.com/maximedupre/onlyfans-profile-scraper/examples/onlyfans-username-scraper)**.
- Review a creator profile in structured fields with **[OnlyFans Profile Scraper](https://apify.com/maximedupre/onlyfans-profile-scraper/examples/onlyfans-profile-scraper)**.

#### 📊 Public creator profile data

Each saved row is one eligible public OnlyFans creator profile. The row keeps the first match from the submitted URL or username, with identity and bio, images, public status, subscription and offer data, content counts, engagement, audience, activity dates, and external links when the source shows them. A later match for the same profile is ignored. Fields that OnlyFans does not show may be absent.

#### ▶️ Look up profiles from URLs or usernames

**Run steps**

1. Open the Input tab.
2. Add one or more full public OnlyFans profile URLs or creator usernames.
3. Start the run and open the creator profile results in the Output tab.

One submitted value starts one profile lookup. The public input has no result limit field, so the run checks every submitted value.

#### ⚙️ Input

**Input fields**

| Field | Type | What it does |
| --- | --- | --- |
| `profiles` | array of strings | Required. Add one or more full public OnlyFans profile URLs or creator usernames. Each value starts one profile lookup. |

**Example input**

This public input comes from the successful current-beta default-input run:

```json
{
  "profiles": [
    "obeyenvynow"
  ]
}
```

#### 🧾 Output

**Dataset link**

The Output tab opens the `Creator profile results` dataset link. Each dataset row uses the same creator profile shape. The four required top-level fields are `profileUrl`, `profileId`, `username`, and `displayName`; other fields can be absent when the public source does not show them.

| Field | Type | What it does |
| --- | --- | --- |
| `dataset` | string | Opens the collected public creator profiles in the default dataset view. |

**Creator profile fields**

| Field | Type | What it does |
| --- | --- | --- |
| `profileUrl` | URL | Canonical public OnlyFans profile URL. |
| `profileId` | string | Stable identifier for the creator profile. |
| `username` | string | Creator username shown by the source. |
| `displayName` | string | Creator display name shown by the source. |
| `bio` | string | Public bio or about text from the profile. |
| `images` | object | Public profile images and available image sizes. |
| `images.avatar` | object | The public avatar image and its available sizes. |
| `images.avatar.url` | URL | Main URL for the public avatar image. |
| `images.avatar.thumbnailUrl` | URL | Source URL for an available avatar thumbnail. |
| `images.avatar.width` | integer | Width of the avatar image in pixels. |
| `images.avatar.height` | integer | Height of the avatar image in pixels. |
| `images.header` | object | The public header image and its available sizes. |
| `images.header.url` | URL | Main URL for the public header image. |
| `images.header.thumbnailUrl` | URL | Source URL for an available header thumbnail. |
| `images.header.width` | integer | Width of the header image in pixels. |
| `images.header.height` | integer | Height of the header image in pixels. |
| `verification` | object | Public verification and performer status. |
| `verification.isVerified` | boolean | Whether the source marks the creator as verified. |
| `verification.isPerformer` | boolean | Whether the source marks the profile as a performer. |
| `status` | object | Public status signals shown by the source. |
| `status.hasStories` | boolean | Whether the source shows public stories for the profile. |
| `status.isStreaming` | boolean | Whether the source shows the creator as streaming. |
| `status.hasPinnedPosts` | boolean | Whether the source shows pinned posts for the profile. |
| `status.labels` | boolean | Whether the source shows public labels for the profile. |
| `status.hasChat` | boolean | Whether the source shows chat as available for the profile. |
| `status.isRestricted` | boolean | Whether the source marks the profile as restricted. |
| `subscription` | object | Public subscription price, tipping details, and offers. |
| `subscription.price` | object | The public subscription price. |
| `subscription.price.amount` | number | Public subscription price amount. |
| `subscription.price.currency` | string | Currency code for the subscription price. |
| `subscription.tipping` | object | Public tipping availability and limits. |
| `subscription.tipping.isAvailable` | boolean | Whether the source shows tipping as available. |
| `subscription.tipping.minimumAmount` | number | Public minimum tip amount. |
| `subscription.tipping.maximumAmount` | number | Public maximum tip amount. |
| `subscription.tipping.currency` | string | Currency code for the tip amounts. |
| `subscription.offers` | array of objects | Public subscription bundles and promotions. |
| `subscription.offers[]` | object | One public subscription offer. |
| `subscription.offers[].amount` | number | Price amount for the offer. |
| `subscription.offers[].currency` | string | Currency code for the offer amount. |
| `subscription.offers[].durationMonths` | integer | Number of subscription months in the offer. |
| `subscription.offers[].discountPercent` | number | Source-provided discount percentage for the offer. |
| `subscription.offers[].label` | string | Public label or promotion text for the offer. |
| `content` | object | Public counts for posts and media. |
| `content.posts` | object | Public total and archive post counts. |
| `content.posts.total` | integer | Public total post count. |
| `content.posts.archive` | integer | Public count of posts in the archive. |
| `content.media` | object | Public media counts by type. |
| `content.media.photos` | integer | Public photo count. |
| `content.media.videos` | integer | Public video count. |
| `content.media.audios` | integer | Public audio count. |
| `engagement` | object | Public favorite and favorited counts. |
| `engagement.favoriteCount` | integer | Public count of favorites for the profile. |
| `engagement.favoritedCount` | integer | Public count of profiles that this creator has favorited. |
| `audience` | object | Public audience counts shown by the source. |
| `audience.subscriberCount` | integer | Public subscriber count when the source exposes it. |
| `activity` | object | Public activity dates shown by the source. |
| `activity.joinedAt` | ISO date-time string | Source-owned date when the creator joined. |
| `activity.firstPostAt` | ISO date-time string | Source-owned date of the first published post. |
| `activity.lastSeenAt` | ISO date-time string | Source-owned time when the profile was last seen active. |
| `externalLinks` | object | Public location, websites, wishlist, and social links. |
| `externalLinks.location` | string | Public location shown on the profile. |
| `externalLinks.websiteUrl` | URL | Public website URL linked from the profile. |
| `externalLinks.wishlistUrl` | URL | Public wishlist URL linked from the profile. |
| `externalLinks.socialAccounts` | array of objects | Public social accounts linked from the profile. |
| `externalLinks.socialAccounts[]` | object | A linked public social account. |
| `externalLinks.socialAccounts[].platform` | string | Name of the linked social platform. |
| `externalLinks.socialAccounts[].url` | URL | Public URL for the linked social account. |
| `externalLinks.socialAccounts[].username` | string | Username shown for the linked social account. |

**Example creator profile row**

This genuine row came from the successful current-beta default-input run:

```json
{
  "profileUrl": "https://onlyfans.com/obeyenvynow",
  "profileId": "13618548",
  "username": "obeyenvynow",
  "displayName": "Mistress Envy ❤️‍🔥",
  "bio": "Certified Asian Goonette Your UNfriendly Neighborhood Mistress ⭐️ ONLINE EVERYDAY ⭐️ ❌ No agency! The REAL me 🥵",
  "images": {
    "avatar": {
      "url": "https://public.onlyfans.com/files/y/yi/yif/yifvk4xb0tllradwivruv7kde0tyxfse1747001306/13618548/avatar.jpg",
      "thumbnailUrl": "https://thumbs.onlyfans.com/public/files/thumbs/c144/y/yi/yif/yifvk4xb0tllradwivruv7kde0tyxfse1747001306/13618548/avatar.jpg",
      "width": 3276,
      "height": 4096
    },
    "header": {
      "url": "https://public.onlyfans.com/files/f/fr/fri/fridga1ddtyxufpbjubqxfdg8ixttfbx1735023289/13618548/header_image.jpg",
      "thumbnailUrl": "https://thumbs.onlyfans.com/public/files/thumbs/w760/f/fr/fri/fridga1ddtyxufpbjubqxfdg8ixttfbx1735023289/13618548/header_image.jpg",
      "width": 1080,
      "height": 1620
    }
  },
  "verification": {
    "isVerified": true,
    "isPerformer": true
  },
  "status": {
    "hasStories": false,
    "isStreaming": false,
    "hasPinnedPosts": true,
    "labels": true,
    "hasChat": true,
    "isRestricted": false
  },
  "subscription": {
    "price": {
      "amount": 20,
      "currency": "USD"
    },
    "tipping": {
      "isAvailable": false,
      "minimumAmount": 5,
      "maximumAmount": 200,
      "currency": "USD"
    },
    "offers": [
      {
        "amount": 36,
        "currency": "USD",
        "durationMonths": 3,
        "discountPercent": 40,
        "label": "3 months, 40% off"
      },
      {
        "amount": 60,
        "currency": "USD",
        "durationMonths": 6,
        "discountPercent": 50,
        "label": "6 months, 50% off"
      }
    ]
  },
  "content": {
    "posts": {
      "total": 1427,
      "archive": 4
    },
    "media": {
      "photos": 1310,
      "videos": 124,
      "audios": 1
    }
  },
  "engagement": {
    "favoriteCount": 307,
    "favoritedCount": 106897
  },
  "activity": {
    "joinedAt": "2019-10-21T00:00:00+00:00",
    "firstPostAt": "2019-11-17T00:00:00+00:00",
    "lastSeenAt": "2026-09-22T20:37:33+00:00"
  },
  "externalLinks": {
    "websiteUrl": "https://obeyenvynow.com"
  }
}
```

#### 💳 Pricing

**Charged event**

This Actor uses pay-per-event pricing. The charged event covers one successfully collected public creator profile saved to the dataset.

#### 🔌 Integrations

**Use the dataset**

Open the dataset in Apify, export it, or use the Apify API. You can also use schedules and webhooks in your Apify workflow.

https://www.youtube.com/watch?v=bNACk1\_S\_6w\&list=PLObrtcm1Kw6MUrlLNDbK9QRg8VDJg0gOW\&index=4

#### ❓ FAQ

##### Can I submit URLs and usernames together?

Yes. Add full public profile URLs, bare creator usernames, or a mix of both in `profiles`.

##### What happens if I submit the same profile twice?

The first eligible match is saved. A later match for the same profile is ignored, so the saved row keeps the first submitted value that found it.

##### Is private or subscriber-only data collected?

No. The Actor reads public profile information only and does not collect private or subscriber-only content.

##### What if OnlyFans does not show a field?

That field may be absent from the row. The Actor preserves source absence instead of inventing a value.

##### Does the output include posts or media files?

The output includes public post and media counts. It does not download or mirror posts or media files.

##### Are subscription offers included?

Yes, when the public profile exposes them. Each offer can include its amount, currency, duration, discount, and public label.

##### Do I need an OnlyFans login or source credential?

No. The public input uses profile URLs and usernames, and the Actor does not ask for a customer-provided OnlyFans login or source credential.

##### What does one dataset row represent?

One row represents one successfully collected public creator profile. Optional public fields are included only when the source provides them.

### 📝 Changelog

**v0.0** (22-09-2026)

- Initial release.

### 🆘 Support

For issues, questions, or feature requests, [file a ticket](https://console.apify.com/actors/maximedupre~onlyfans-profile-scraper/issues) and I'll fix or implement it in less than 24h 🫡

### 🔗 Related Actors

- **[Influencer Scraper](https://apify.com/maximedupre/influencer-scraper)**: Find public influencer profiles across TikTok, Instagram, and YouTube.
- **[Fansly Profile Scraper](https://apify.com/maximedupre/fansly-scraper)**: Find or enrich public Fansly creator profiles with audience, content, and subscription data.
- **[TikTok Creator Analytics Scraper](https://apify.com/maximedupre/tiktok-creator-analytics)**: Analyze public TikTok creator metrics and recent posts.
- **[Patreon Scraper](https://apify.com/maximedupre/patreon-scraper)**: Collect public Patreon creator profiles, membership tiers, and posts.
- **[OnlyFans Scraper and Downloader: Source Media Links](https://apify.com/maximedupre/onlyfans-downloader)**: Collect source-hosted links and metadata for public OnlyFans media.

**Made with ❤️ by Maxime Dupré**

# Actor input Schema

## `profiles` (type: `array`):

Add one or more full public OnlyFans profile URLs or creator usernames. Each value starts one profile lookup.

## Actor input object example

```json
{
  "profiles": [
    "https://onlyfans.com/creatorname"
  ]
}
```

# Actor output Schema

## `dataset` (type: `string`):

Open the collected public creator profiles.

# 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 = {
    "profiles": [
        "obeyenvynow"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("maximedupre/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 = { "profiles": ["obeyenvynow"] }

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

```

## MCP server setup

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