# Fikfap Video Scraper (`datawatcher/fikfap-scraper`) Actor

Scrapes public video data from fikfap.com: creator, tags, views, likes, date, duration, thumbnail and the direct video file URLs. Or just the video page and file URLs.

- **URL**: https://apify.com/datawatcher/fikfap-scraper.md
- **Developed by:** [DataWatcher](https://apify.com/datawatcher) (community)
- **Features:** Limited permissions
- **Stats:** 2 total users, 1 monthly users, 0.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

$1.00 / 1,000 video 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?

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

## Fikfap Video Scraper

Scrape public **FikFap** video data from a **creator profile** or a **single video page**, with **direct .mp4 links**, as JSON, CSV or Excel or through the Apify API.

- Each row has the id, title, creator username, views and tags of one video.
- Rows also carry likes, duration, width, height, a sound flag, the posted date and the creator's OnlyFans link when the site shows one.
- The direct .mp4 links (`videoFileUrl` and `previewVideoUrl`) are filled.
- Start from a creator username, a profile URL or a video page URL.

Pricing is $1.00 per 1,000 videos, with no start fee.

### ⭐ Why this one

> **1️⃣ One schema across video sites.**
> All our video actors share one output schema and one input schema. Build your pipeline once: our other video actors ([Erome Video Scraper](https://apify.com/datawatcher/erome-scraper), [Redgifs Video Scraper](https://apify.com/datawatcher/redgifs-scraper), [XFree Video Scraper](https://apify.com/datawatcher/xfree-scraper), [Erome Video Downloader](https://apify.com/datawatcher/erome-video-downloader), [RedGIFs Video Downloader](https://apify.com/datawatcher/redgifs-video-downloader), [XFree Video Downloader](https://apify.com/datawatcher/xfree-video-downloader)) take the same input and return the same fields, so adding a site means changing the actor name, not your code.

- **One row per video.** You pay only for each unique video the actor returns.
- **Direct .mp4 links are filled.** Each row gives you the full quality file and a smaller copy to play or save.
- **Creator and tags in every row.** Each row has the creator username and the video's hashtags, so you can group and count them.
- **Size and sound included.** Rows carry width, height and a flag that says if the video has sound.
- **Honest about gaps.** Fields the site does not give are `null`.
- **Same fields as our other video scrapers.** Rows from different sites fit one table.
- **Free plan friendly.** A free plan run returns up to 1,000 results.

### 🔎 What it extracts

The actor reads public FikFap creator profiles and single video pages.

| Page type | Example URL | Input to use |
|---|---|---|
| Creator profile | `https://fikfap.com/user/creatorname` | `startUrls` or `usernames` |
| Video page | `https://fikfap.com/user/creatorname/post/1429486` | `startUrls` or `videoUrls` |

- Profile and video page URLs are accepted. A video page can also be `https://fikfap.com/post/<id>`.
- Search and hashtag pages are not supported on FikFap. `searchQueries`, `tags` and `tagSort` are ignored or refused.

### 🚀 How to scrape FikFap videos

1. Open the actor on Apify and click **Try for free**.
2. Add a creator username, a profile URL or a video page URL, and set **Max results**.
3. Click **Start**.
4. Download the **FikFap video data** as JSON, CSV or Excel from the Output tab, or fetch it with the Apify API.

Example inputs:

A creator profile:

```json
{
  "startUrls": ["https://fikfap.com/user/creatorname"],
  "maxResults": 50
}
```

A username:

```json
{
  "usernames": ["creatorname"],
  "maxResults": 100
}
```

One video page:

```json
{
  "videoUrls": ["https://fikfap.com/user/creatorname/post/1429486"]
}
```

Links-only rows:

```json
{
  "usernames": ["creatorname"],
  "onlyVideoUrls": true,
  "maxResults": 20
}
```

### 🤖 Use with AI agents (MCP)

AI assistants (Claude, ChatGPT, Cursor…) can run this actor through Apify's MCP server. Connect the server in your assistant, then ask, for example:

```text
Use the Fikfap Video Scraper to get the 50 newest videos of the FikFap creator creatorname and list the titles, views and tags in a table.
```

### 🔌 Run it your way

- **Schedule it** with Apify schedules.
- **Call it from the Apify API** and its clients (Python, JavaScript).
- **Connect it** to Make, n8n, Zapier, webhooks or Google Sheets.
- **Ask an AI agent to run it**: see [Use with AI agents (MCP)](#-use-with-ai-agents-mcp).

### 🔀 Mixing inputs and duplicates

You can mix profile URLs, usernames and video URLs in one run.

| Rule | What happens |
|---|---|
| One row per video | Each unique video is returned once. |
| First input kept | `sourceType` and `sourceUrl` keep the first input that found it. |
| Shared limit | `maxResults` is shared fairly over the inputs. What one input cannot fill goes to the others. |

### 🎬 Direct video links

On FikFap, the direct .mp4 links are filled. Every row from the approved sample has `videoFileUrl` and `previewVideoUrl`, next to the video page link in `url`.

- Use `videoFileUrl` to play or save the full quality .mp4 file.
- Use `previewVideoUrl` for the smaller .mp4 copy of the same video.
- Use `url` to open the video on the site.
- Use `thumbnailUrl` or the larger `posterUrl` for a preview image.

### 🔗 OnlyFans link

Each row has `creator.onlyfansUrl`: the creator's OnlyFans link shown on the video, else the one on the profile. It is `null` when the site shows none.

### ⚡ Links-only mode (`onlyVideoUrls`)

Set `onlyVideoUrls` to `true` and each row has only three fields: `url`, `videoFileUrl` and `previewVideoUrl`. The price per video is the same. Use it when you only need the page link and the two direct .mp4 links.

### ⚙️ Input

| Input | Type | Default | Range | Meaning |
|---|---|---|---|---|
| `startUrls` | list of text | none | | Profile or video page URLs. |
| `usernames` | list of text | none | | Creator handles, with or without `@`, or profile URLs. |
| `videoUrls` | list of text | none | | Video page URLs. One row per video. |
| `searchQueries` | list | none | | Not supported on FikFap. Ignored or refused. |
| `tags` | list of text | none | | Not supported on FikFap. Ignored or refused. |
| `tagSort` | text | none | `latest`, `popular` | Not supported on FikFap. It has no effect. |
| `onlyVideoUrls` | yes/no | `false` | | Rows with only `url`, `videoFileUrl` and `previewVideoUrl`. |
| `maxResults` | number | `100` | 1 to 1000 | Maximum number of videos returned in total. |
| `maxRequests` | number | `200` | 1 to 1000 | Maximum number of page requests in total. |
| `maxPagesPerSource` | number | `100` | 1 to 100 | Maximum listing pages read for one profile. |
| `maxScrollsPerPage` | number | `100` | 1 to 100 | Maximum "Show more" steps on one listing page. |
| `maxRequestRetries` | number | `2` | 0 to 5 | Retries after a network or server error. |
| `requestTimeoutSecs` | number | `30` | 5 to 120 | Time limit of one page request in seconds. |
| `proxyConfiguration` | object | no proxy | | Proxy settings. |

On the free plan, a run returns at most 1,000 videos, whatever `maxResults` is.

### 📦 Output: FikFap video data

One row per video. Missing data is `null`.

| Field | Type | Meaning |
|---|---|---|
| `id` | text | The site's own id of the video. |
| `url` | text | The video's page on the site. |
| `title` | text | The video's title, `null` when the creator gave none. |
| `creator.username` | text | The account handle, without `@`. |
| `creator.profileUrl` | text | The account's page on the site. |
| `creator.onlyfansUrl` | text | The creator's OnlyFans link, `null` when the site shows none. |
| `views` | number | Views of the video. |
| `likes` | number | Likes of the video. |
| `durationSeconds` | number | The video's length in seconds. |
| `width` | number | The video file's width in pixels. |
| `height` | number | The video file's height in pixels. |
| `hasAudio` | yes/no | `true` when the video file has a sound track, `false` when it is silent. |
| `tags` | list | The video's hashtags, without `#`. |
| `thumbnailUrl` | text | The video's preview image. |
| `posterUrl` | text | The larger still frame the site shows before play. |
| `dates.posted` | text | When the video was posted, in UTC with the time. |
| `dates.scraped` | text | When this run read the video. |
| `mediaType` | text | `video` or `image`. |
| `sourceType` | text | What found the video: `search`, `profile`, `tag` or `direct_video`. |
| `sourceUrl` | text | The URL that found the video. |
| `videoFileUrl` | text | The direct .mp4 link, full quality. Filled on FikFap. |
| `previewVideoUrl` | text | The smaller .mp4 copy. Filled on FikFap. |

#### Example: a full row

This row comes from a video page run.

```json
{
  "recordType": "video",
  "schemaVersion": "4.4.1",
  "source": "fikfap",
  "id": "1429486",
  "url": "https://fikfap.com/user/alinevs/post/1429486",
  "mediaType": "video",
  "sourceType": "direct_video",
  "sourceUrl": "https://fikfap.com/user/alinevs/post/1429486",
  "title": "⬇️check my FREE VIP OF ⬇️",
  "creator": {
    "username": "alinevs",
    "displayName": null,
    "profileUrl": "https://fikfap.com/user/alinevs",
    "onlyfansUrl": "https://onlyfans.com/alinevs/trial/yzsdye6iunrjsg1rglmypfq79giognen"
  },
  "taggedAccounts": [],
  "views": 62240,
  "likes": 220,
  "durationSeconds": 13.0,
  "width": 720,
  "height": 1280,
  "hasAudio": true,
  "thumbnailUrl": "https://vz-5d293dac-178.b-cdn.net/89218ae2-d79a-49a0-abcd-590fd70c9800/thumbnail.jpg?token=BBqyD8p8yQvC6fgCMdMJPCfchagMcl7Dv_WlL3D3mOI&height=768&token_count...",
  "posterUrl": "https://fikfap-external-prod.b-cdn.net/89218ae2-d79a-49a0-abcd-590fd70c9800/thumbnail.jpg?token=O67Tj1pXe1kEYZUrXTbpGLuI7NDkds8NjmEvHW_CFNE&height=1024&width...",
  "tags": [
    "lesbian"
  ],
  "videoFileUrl": "https://vz-5d293dac-178.b-cdn.net/bcdn_token=NE-eMfSmnPmJetiAbLo_au1DdU6mOG9OeMzkwe5_abw&token_countries=PL&token_path=%2F89218ae2-d79a-49a0-abcd-590fd70c980...",
  "previewVideoUrl": "https://vz-5d293dac-178.b-cdn.net/bcdn_token=NE-eMfSmnPmJetiAbLo_au1DdU6mOG9OeMzkwe5_abw&token_countries=PL&token_path=%2F89218ae2-d79a-49a0-abcd-590fd70c980...",
  "imageUrl": null,
  "dates": {
    "posted": "2025-10-21T00:50:37Z",
    "scraped": "2026-11-13T23:36:29Z"
  }
}
```

#### Example: a links-only row

```json
{
  "url": "https://fikfap.com/user/alinevs/post/1773999",
  "videoFileUrl": "https://vz-5d293dac-178.b-cdn.net/bcdn_token=08et5Dqpcm_hxfHyy_-E-kp3zHdki6sZyIKvmWPAUgk&token_countries=PL&token_path=%2F82e2af3a-e0d1-4110-b9a3-5048c0dde1ca%2F&expires=1794616592/82e2af3a-e0d1-4110-b9a3-5048c0dde1ca/play_720p.mp4",
  "previewVideoUrl": "https://vz-5d293dac-178.b-cdn.net/bcdn_token=08et5Dqpcm_hxfHyy_-E-kp3zHdki6sZyIKvmWPAUgk&token_countries=PL&token_path=%2F82e2af3a-e0d1-4110-b9a3-5048c0dde1ca%2F&expires=1794616592/82e2af3a-e0d1-4110-b9a3-5048c0dde1ca/play_240p.mp4"
}
```

### 📊 Run stats

Each row has `dates.scraped`, the time this run read the video. Use it to tell runs apart.

### 💰 Pricing

You pay per video returned. There is no start fee.

| Event | Price | When it is charged |
|---|---|---|
| Video result (`video-scraped`) | $1.00 per 1,000 events | One unique video returned by the actor (full row or links-only row). |

- Free plan: each run returns up to 1,000 results.
- No start fee.

### 🎯 Use cases

- **Creator discovery.** Collect the videos of a creator and compare views and likes.
- **Hashtag research.** Count the `tags` of the videos you collect.
- **Trend monitoring.** Run it on a schedule and track `views` and `likes` over time.
- **Catalog building.** Keep `id`, `title`, `creator.username`, `views` and `tags` in one searchable table.

### 🩺 If a run fails

The run health (the `RUN_HEALTH` record, `RUN_SUMMARY` and the last line of the log) names the cause, for example `site down: list request answered 500 x3`. Find that start of the message in the table.

| Error in the log / run health | What it means | What you do |
|---|---|---|
| `site down: <request> answered 500, 502-504, 520-526` | The site is offline or has a fault. The actor waits longer between tries, then stops the run. | Try again later. |
| `blocked: <request> answered 401, 403, 1020` or a captcha page | The site refused the request or showed a captcha page. | The actor already retries once through the Apify proxy. If it still fails, turn on the Apify proxy in the input (use the RESIDENTIAL group if it is already on). |
| `rate limited: <request> answered 429` | The site asks for fewer requests. The actor waits and slows down by itself. | Try again later. |
| `gone: <request> answered 404, 410` | The page or offer was removed. The actor skips it and it is not charged. | Nothing; this is normal. |
| `network error: <request> failed with timeout` (or connection error, DNS error) | A timeout or a broken connection. The actor retries with a pause. | Try again later. |
| `wrong answer: <request> returned HTML instead of JSON` (or an empty body) | The site answered with a page that is not data (HTML instead of JSON, an empty body). The site has probably changed. | Report it in the Issues tab; we fix it. |

### ❓ FAQ

#### How do I export FikFap videos to Excel or CSV?

Run the actor, open the Output tab and pick Excel or CSV in the export options. JSON, XML and HTML are there too, and the Apify API returns the same data.

#### How do I get direct .mp4 links in my FikFap video data?

The fields `videoFileUrl` and `previewVideoUrl` hold the direct .mp4 links, and they are filled on FikFap. `videoFileUrl` is the full quality file and `previewVideoUrl` is the smaller copy. Set `onlyVideoUrls` to `true` if you want only the links.

#### Can I get FikFap data with the API?

Yes. Call the actor with the Apify API or its clients and read the dataset. The rows are the same as in the Output tab.

#### How much does it cost to scrape FikFap?

It costs $1.00 per 1,000 videos returned, with no start fee. On the free plan, each run returns up to 1,000 results.

#### Can I combine it with other video scrapers?

Yes. All our video actors share one output schema and one input schema, so rows from different sites fit one table. See the list below.

### Data notice

This actor returns only what the site shows publicly at run time. We don't store or keep that data and are not its controller — you decide how you use it.

### 🔗 Other video scrapers (same schema)

#### Erome

- [Erome Video Scraper](https://apify.com/datawatcher/erome-scraper): links and data
- [Erome Video Downloader](https://apify.com/datawatcher/erome-video-downloader): saves the video files (.mp4)

#### RedGIFs

- [Redgifs Video Scraper](https://apify.com/datawatcher/redgifs-scraper): links and data
- [RedGIFs Video Downloader](https://apify.com/datawatcher/redgifs-video-downloader): saves the video files (.mp4)

#### XFree

- [XFree Video Scraper](https://apify.com/datawatcher/xfree-scraper): links and data
- [XFree Video Downloader](https://apify.com/datawatcher/xfree-video-downloader): saves the video files (.mp4)

### 💬 Feedback and custom work

Need another portal, a field or a custom feed? Open an issue on the Issues tab.

# Changelog

This Actor's version history is a separate document: https://apify.com/datawatcher/fikfap-scraper/changelog.md

# Actor input Schema

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

Site URLs of any supported kind: search, account profile, tag or video page. The kind is found from the URL.

## `searchQueries` (type: `array`):

Searches, each {"query": "...", "filter": "all" | "post" | "tag"} (filter optional, default "all"). A plain text line is read as {"query": text, "filter": "all"}.

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

Account handles, with or without "@", or profile URLs. Every video of each account.

## `tags` (type: `array`):

Tag names exactly as the site writes them (case and prefixes kept, e.g. pl-Amatorzy), or tag page URLs.

## `tagSort` (type: `string`):

The order of tag pages. Empty - the site's default order.

## `videoUrls` (type: `array`):

Video page URLs. Each is read directly; one row per video.

## `onlyVideoUrls` (type: `boolean`):

Each row is only the three video links {"url", "videoFileUrl", "previewVideoUrl"}: the video page and its direct .mp4 files. Same price per video.

## `maxResults` (type: `integer`):

Maximum number of videos returned, in total. Shared fairly over the inputs (each search, profile, tag or video URL gets its part; what one cannot fill goes to the others). Free plan Apify users get at most 1000 videos per run, whatever is set here (paying users have no cap).

## `maxRequests` (type: `integer`):

Maximum number of page requests the run makes, in total (listing pages and load-more steps; a direct video URL is one request).

## `maxPagesPerSource` (type: `integer`):

Maximum number of listing pages read for one search, profile or tag.

## `maxScrollsPerPage` (type: `integer`):

Maximum number of "Show more" / load-more steps on one listing page.

## `maxRequestRetries` (type: `integer`):

Retries of a request that failed on a network error or a server error. A block (403, 429, a challenge page) is never retried.

## `requestTimeoutSecs` (type: `integer`):

Time limit of one page request.

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

Proxy settings, especially useful when many detail pages are requested.

## Actor input object example

```json
{
  "onlyVideoUrls": false,
  "maxResults": 10,
  "maxRequests": 200,
  "maxPagesPerSource": 100,
  "maxScrollsPerPage": 100,
  "maxRequestRetries": 2,
  "requestTimeoutSecs": 30,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# Actor output Schema

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

One row per video (or, with Only video page URLs, one {videoUrl} row per video).

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

OUTPUT: status, sources, pages and load-more steps, video pages read, unique videos, duplicates, media URLs found, challenges, requests used, early stop and its reason, source errors, account profiles, charged events.

## `runHealth` (type: `string`):

{status, reason}: ok, degraded, or failed.

# 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 = {
    "maxResults": 10
};

// Run the Actor and wait for it to finish
const run = await client.actor("datawatcher/fikfap-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 = { "maxResults": 10 }

# Run the Actor and wait for it to finish
run = client.actor("datawatcher/fikfap-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 '{
  "maxResults": 10
}' |
apify call datawatcher/fikfap-scraper --silent --output-dataset

```

## MCP server setup

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