OF-Scraper is a command line downloader for a subscription you already pay for
A completely revamped and redesigned fork, reimagined from scratch based on the original onlyfans-scraper
At a glance
- What is it?
- OF-Scraper is a Python command line tool that downloads media from OnlyFans and performs bulk actions such as liking and unliking posts, and it is built around a subscription you must already hold. The project ships stable and development builds on PyPI, a Docker image and a binary, and its own README states plainly that it cannot bypass pay walls and that a subscription is required.
- Who is it for?
- OF-Scraper is a reasonable choice for a user who subscribes to a creator and wants their own library downloaded in bulk, organised by the tool's own filtering and metadata rules, without clicking through a web interface. It is the wrong tool for anyone without a subscription, since the README states models cannot be scraped anonymously, and it is the wrong tool if you need to bypass a pay wall, which it explicitly cannot do.
- Can I use it commercially?
- Yes. MIT is a permissive licence: you can use, modify and sell software built on it, as long as you keep its copyright and licence notices.
- Is it still maintained?
- Yes. The repository last received commits 128 days ago.
- What is it written in?
- Mainly Python, according to GitHub's language statistics.
Answers come from the project's GitHub data, last synced on October 23, 2026, and from our analysis. They are not legal advice.
Editorial analysis
The two constraints that define the tool
The README opens with a notice rather than a feature list, and the notice is the most important part of the documentation. First, OF-Scraper cannot bypass pay walls. Second, it requires a subscription to the model, and models cannot be scraped anonymously whether the subscription is free or paid.
That pair of statements narrows the use case to a specific one. The tool operates inside a subscription you already hold, with your own authentication, on content the service is already willing to show you. It is a bulk downloader and automation client for a catalogue you are entitled to view, not a way to reach content you are not paying for.
The project then describes itself as a command line tool that lets you download media from OnlyFans and perform bulk actions including liking or unliking posts. The bulk actions are worth noting on their own, because liking a post is a write operation against the account, and a tool that can like thousands of posts in a batch is a different risk category from one that only reads.
Two disclaimers appear under the documentation heading. The first states that the tool is not affiliated, associated or partnered with OnlyFans in any way, that the authors are not authorised, endorsed or sponsored by OnlyFans, and that all OnlyFans trademarks remain the property of Fenix International Limited. The second calls the program theoretical, says it is for educational purposes, and says it may or may not work, with the user accepting full responsibility.
The fork history explains the config file you inherit
OF-Scraper started as a fork of the original onlyfans-scraper, and the README is candid that the fork has drifted. It says the project underwent substantial architectural changes resulting in a significantly revamped codebase compared to the original master, that some modifications are detailed in the CHANGES.md file in the repository, and that most are only documented in the commit history.
The more useful part for a new user is the migration guidance, because a lot of installs will come from the tool it grew out of. To maintain compatibility with existing folders, the README says to modify the metadata option within the config file and to configure the save_path, dir_path and filename settings so the outputs line up with an existing setup.
The reason the metadata option matters is stated explicitly. The inherited metadata files from the DIGITALCRIMINALS script play an important part in preventing redundant downloads by acting as a check for duplicates. In other words, the metadata files are the download ledger, and a migration that does not point at them means re-downloading everything.
Three documentation links are given for the adjustment: a migration guide, a config options page, and a page on customizing the save path. The rest of the section ends with a practical offer, ask in the Discord or open an issue if you need help with what to change to accomplish this.
An async HTTP stack behind a Textual terminal interface
The dependency list in pyproject.toml describes the implementation better than the README does. The HTTP layer is httpx with the http2 extra, alongside httpx-aiohttp, and there is a limiter and aiolimiter for rate limiting, tenacity for retries, and schedule for scheduled runs. The asynchronous storage and parsing libraries are aiofiles, aiosqlite, bs4 and lxml.
The terminal interface is built on Textual, pinned to exactly version 1.0.0, with rich for output, prompt-toolkit and inquirerpy for prompts, and tqdm for progress bars. The exact pin on Textual matters for anyone who tries to install it in an environment where another package wants a different version.
Three dependencies tell you the tool is doing more than plain HTTP. browser-cookie3 is present, which is how a session is picked up from a local browser rather than typed in. pywidevine appears alongside it, and the crypto/ directory in the repository plus a cosign.pub file point to signature or key handling for the widevine part of the request chain. mpegdash is also listed, which is a dash manifest library, and the ffmpeg extra in the optional dependencies pulls in pyffmpeg, so media that is delivered as a segmented stream can be handled.
There is also a speedtest-cli dependency and a psutil dependency, which fits a tool that reports connection quality and process state while it runs. The Python version supported is narrow: requires-python is set to greater than or equal to 3.11 and less than 3.14, so 3.13 is the ceiling and 3.11 is the floor.
Three ways to get it, and the Docker one is the most opinionated
The release story is split across channels. The stable build is on PyPI under the name ofscraper, and the README notes that Docker and binary releases are also available. Development builds are found in the project release history on the same PyPI page, and the recent tags show a stream of dev builds for 3.14.7 with the commit hash and a timestamp baked into the version string.
The command is a single console script, ofscraper, pointing at ofscraper.__main__:main. The package builds with hatchling and hatch-vcs, which is how the version is derived from git tags rather than being written by hand.
The Docker route is where the operational assumptions are visible, because the compose file in the repository is annotated. The service is of-scraper, the container is named ofscraper, and the image is ghcr.io/datawhores/of-scraper:main. Two directories are mounted, the configuration directory to /home/ofscraper/.config/ofscraper/ and the data directory to /home/ofscraper/data/.
volumes:
# Mount your configuration directory (replace ./config/ with your host path)
- ./config/:/home/ofscraper/.config/ofscraper/
# Mount your data storage directory (replace ./data/ with your host path)
- ./data/:/home/ofscraper/data/The compose file also keeps stdin open and allocates a pseudo-TTY, both annotated as being for interactive processes, and the default command is a sleep infinity so the container stays up for you to exec into. The commented environment variables USER_NAME, USER_ID, GROUP_ID and GROUP_NAME exist because the compose file notes that mounted volume permissions depend on the host UID and GID, defaulting to 1000:1000.
The image is built in two stages with uv and Python 3.11, and the builder stage installs build-essential and python3-dev, with a comment explaining that this is needed to compile packages like psutil, particularly on non AMD64 platforms. The version string is computed from the highest git tag and the short commit hash, or overridden by a BUILD_VERSION argument.
Two known failure areas have their own pinned issue threads
The README routes two specific problems to fixed issue threads, which is a useful signal about what actually breaks in practice.
The first is authentication, and it points at issue 442. The second covers downloading problems and the empty model list error, and it points at issue 542. Both are listed near the top of the document, before the main description, which suggests they are the two things a new user hits first.
The empty model list case is the interesting one, because it is where the subscription requirement becomes visible. If the tool retrieves no models, the possible explanations narrow quickly: the account is not subscribed, the session was not picked up correctly, or the service changed something. Since the tool cannot fetch models anonymously, an unauthenticated or wrongly authenticated run has nothing to list.
The general issue policy is stated too. Feature request issues are fine, and bug report issues that lack the requested information will be closed. Issues can be opened in the repository, or raised on Discord, and there is a private reporting channel where a ticket can be created so that only you and the admins can see the discussion. A separate feedback board exists for feature requests.
For a project that scrapes a service which actively changes, the existence of a documented, linked thread per failure mode is the difference between a tool you can debug and one you cannot.
MIT licensed, with the maintenance signal in the dev build names
The licence is MIT, with the file at the repository root, and the package metadata agrees. That is the permissive end of the scale, so the code can be read, modified and redistributed with attribution.
On maintenance, the useful signal is the shape of the releases rather than the tag name. The three most recent releases are all dev builds of 3.14.7, dated 2026-06-17, 2026-06-03 and 2026-05-20, and the last push was on 2026-06-17. There is a codecov badge in the README, and the repository has a test/ directory, a specs/ directory and a plugins.py at the root, so the project has automated test coverage and a plugin entry point rather than a single script.
The scope of what is committed to is also worth stating plainly. The README calls the tool theoretical, for educational purposes, and says it may or may not work, and it points at the fact that the underlying service is a commercial platform that changes. Even a project that documents its own breakage honestly is a project whose reliability depends on something outside its control, and that is the boundary an adopter has to accept.
The project also runs a Discord server, a ClearFlask feedback board, and a donation page with BTC and ETH addresses. A CHANGES.md, a CONTRIBUTING.md and a docs/ directory sit in the repository root alongside the code.
Editorial conclusion
OF-Scraper is a reasonable choice for a user who subscribes to a creator and wants their own library downloaded in bulk, organised by the tool's own filtering and metadata rules, without clicking through a web interface. It is the wrong tool for anyone without a subscription, since the README states models cannot be scraped anonymously, and it is the wrong tool if you need to bypass a pay wall, which it explicitly cannot do. Verify first that your Python version falls inside the supported range of 3.11 to 3.13, and read the two pinned issue threads on authentication and on failed downloads before you debug anything else.
Frequently asked questions
Does OF-Scraper work without a subscription?
No. The README states that OF-Scraper requires a subscription to the model and that models cannot be scraped anonymously whether the subscription is free or paid. It also states that the tool cannot bypass pay walls.
How do I install OF-Scraper?
The stable build is published on PyPI as ofscraper, and the README notes that Docker and binary releases are also available. The Docker image is ghcr.io/datawhores/of-scraper:main, and the console script is ofscraper, defined in the package metadata.
What does OF-Scraper do besides downloading?
The README describes it as a command line tool that lets you download media from OnlyFans and perform bulk actions including liking or unliking posts, with an extensive array of filtering features for choosing what to scrape.
Why is nothing downloaded and the model list empty?
The README points at a specific issue thread, number 542, for downloading problems and the empty model list error, and a separate thread, number 442, for authentication issues. Authentication issues are a common source of the error given the tool's requirement of an existing subscription.
How do I move my existing library over from the DIGITALCRIMINALS script?
The README says to modify the metadata option within the config file and to configure the save_path, dir_path and filename settings so the outputs match your existing layout. The inherited metadata files are what prevents redundant downloads by acting as a duplicate check.
Official sources
Add this badge to your README
If you maintain this project, the badge below links readers to this analysis and shows its maintenance status from the daily GitHub snapshot. Paste the markdown into your README; add ?metric=license or ?metric=stars to the image URL for a different field.
[](https://hysenlabs.com/projects/datawhores-of-scraper)Was this useful?