> For the complete documentation index, see [llms.txt](https://cloakedkeys.gitbook.io/ofsc/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://cloakedkeys.gitbook.io/ofsc/reference/cli.md).

# Command-line options

> ℹ️ This page is copied from the fork's `reference/` folder and is regenerated there. Don't edit it here; run `scripts/sync_reference.py` to refresh it.

## Command-line reference

Every command and option the CLI accepts. The page is built from the click program in `ofscraper/utils/args/`. Option names, types, defaults and help text come from the option definitions.

Each option lists these fields, when they apply: **Also** (other names), **Dest**, **Type**, **Default**, **Commands** (which commands accept it), **Config fallback**, **Defined in**, then its help text and any **Note**. **Config fallback** means the option's value comes from that `config.json` key when the option isn't given (`merged_settings` in `ofscraper/utils/settings.py`). [README.md](/ofsc/reference.md) explains how options, `config.json` and environment variables combine.

### Contents

* [Commands](#commands)
* [`--action` modes](#--action-modes)
* [Options](#options)
  * [Program Options](#program-options)
  * [Logging Options](#logging-options)
  * [Download Options](#download-options)
  * [Media Filters Options](#media-filters-options)
  * [Filename Modification Options](#filename-modification-options)
  * [Posts Filters Options](#posts-filters-options)
  * [Automation Options](#automation-options)
  * [User Selection Options](#user-selection-options)
  * [User List Filter Options](#user-list-filter-options)
  * [Advanced User List Filter Options](#advanced-user-list-filter-options)
  * [Model Sort & Processing Order Options](#model-sort--processing-order-options)
  * [Advanced Search & Processing Options](#advanced-search--processing-options)
  * [Program Scripts](#program-scripts)
  * [Advanced Program Options](#advanced-program-options)
  * [Other options](#other-options)
  * [Table Filter Options](#table-filter-options)
  * [Content Options](#content-options)
  * [Metadata Options](#metadata-options)
  * [Sorting for the table](#sorting-for-the-table)

### Commands

Run `OF-Scraper [OPTIONS] [COMMAND] [COMMAND OPTIONS]`.

#### Main program (no command)

Runs when no subcommand is given. The entry point is `ofscraper/__main__.py`. Then `Manager.pick()` calls `commands/scraper/scraper.main()`, which cleans temp files and the database and checks the CDM. After that, the run goes one of these ways:

* With `--daemon`, it prompts for actions if none were given, then reruns on a schedule.
* With `--action` or `--scrape-paid`, it runs those actions once. It repeats with prompts if the infinite-loop config is on.
* With only Fansly `--live` or `--live-watch`, it records livestreams.
* Otherwise it opens the interactive menu: Action, Auth (edit `auth.json`), Config (edit `config.json`), Profile, Merge databases and Quit.

The run reads `auth.json` and `config.json` from the profile. It writes media under `save_location` and rows to each creator's `user_data.db`.

Accepts 102 options. Its `--help` summary: OF-Scraper Options.

#### `manual`

`ofscraper manual -u URL...` or `-f FILE` (one is required). Downloads specific posts, given as OnlyFans URLs (post, chat message, story, highlight) or bare post ids. A bare id is looked up on the timeline, then in that creator's purchases. It forces `force_all`, so existing files are downloaded again. It writes posts and media to the creator's `user_data.db` and media under `save_location`, then runs the after-download script.

Accepts 51 options. Its `--help` summary: Manually download media by providing a list of urls or IDs.

#### `msg_check`

`ofscraper msg_check -u ITEM...` or `-f FILE`. Each item is a creator username, a model id, or a chat URL (`onlyfans.com/my/chats/chat/<id>` or `onlyfans.com/my/chats/<id>/?id=<message id>`), whose number is taken as the model id. Any other item is skipped with a warning. It fetches the creator's messages and purchases, writes them to `user_data.db`, and opens an interactive table of the media. Unlocked rows in the table can be queued for download, and a background thread downloads them. The messages and purchases come from the check cache unless you pass `--force`. The cache expires after 3 days.

Accepts 51 options. Its `--help` summary: The msg\_check subcommand gathers information on media content from messages It presents this data in a table format with filtering options for focused searches Allows unlocked media entries to be directly downloaded through the table.

#### `story_check`

`ofscraper story_check -u USERNAME...` (or `-f`). Fetches the creators' stories and highlights from the API, without the check cache. It writes them to `user_data.db` and opens the same downloadable media table.

Accepts 49 options. Its `--help` summary: The story\_check subcommand gathers information on media content from stories and highlights It presents this data in a table format with filtering options for focused searches Allows unlocked media entries to be directly downloaded through the table.

#### `paid_check`

`ofscraper paid_check -u USERNAME_OR_ID...` (or `-f`). Fetches each creator's purchased content, writes it to `user_data.db` and opens the media table. The content comes from the check cache unless you pass `--force`. A deleted creator, named `DELETED_MODEL_PLACEHOLDER`, is read from all purchases.

Accepts 51 options. Its `--help` summary: The paid\_check subcommand gathers information on media content from purchases It presents this data in a table format with filtering options for focused searches Allows unlocked media entries to be directly downloaded through the table.

#### `post_check`

`ofscraper post_check -u URL_OR_USERNAME...` or `-f FILE`. Takes `onlyfans.com/<username>` URLs or bare usernames. It fetches the areas in `--check-area` (default Timeline, Pinned, Archived and Streams; Labels is also available), writes them to `user_data.db` and opens the media table. The areas come from the check cache unless you pass `--force`. All check commands set `force_all` and `after=0`.

Accepts 53 options. Its `--help` summary: The post\_check subcommand gathers information on media content from posts It presents this data in a table format with filtering options for focused searches Allows unlocked media entries to be directly downloaded through the table.

#### `metadata`

`ofscraper metadata --metadata check|update|complete`, with the usual user and area options (`--scrape-paid` takes a mode too). It uses the API to update the creators' `user_data.db` without downloading. The modes differ as follows:

* `check` refreshes metadata fields only.
* `update` also sets download status and file names from the files actually on disk.
* `complete` marks media downloaded and takes a new filename if there is one.

`--mark-stray` marks database media that are missing from the scrape (within `--after` and `--before`) as locked. `--anon` uses anonymous credentials.

Accepts 85 options. Its `--help` summary: Uses API to modify db files without the need for downloading.

#### `db`

`ofscraper db`, with user selection, area (`-o`) and media filters (type, size, length, downloaded, locked, preview, protected, post and media ids, dates), sorting and a hard limit. `--post-id` and `--media-id` take one id, or several separated by commas or spaces. An id is decimal digits, from any script. A value with no id in it, or with anything else (such as `²` or `-4`), is a usage error. It reads media rows from each selected creator's `user_data.db` and prints them as a table. `-ep`/`--export PATH` also writes a `.csv`. It makes no API calls for the media itself. With several creators, every selected creator's rows go into the one CSV. `--unmark-permanent-skips` narrows the rows to the permanent `skip_download_script` skips and sets them back to not downloaded after printing them.

Accepts 61 options. Its `--help` summary: Print information from the database.

#### `recover_collisions` (separate entry point)

`python -m ofscraper.commands.recover_collisions DB [--apply] [--undo FILE] [--path-root DIR]`. It uses argparse and is not part of the CLI (see `COLLISION_RECOVERY.md`). It works offline on one creator's `user_data.db` and finds recorded paths that different media share. It prints a JSON report. `--apply` resets `downloaded=0` for those media and writes a JSON undo file beside the database. `--undo FILE` previews the restore of those flags, or with `--apply` performs it. It never touches media files and doesn't contact OnlyFans.

Run `python -m ofscraper.commands.recover_collisions DATABASE [OPTIONS]`.

* `DATABASE`: One model's user\_data.db
* `--apply`: Apply the previewed recovery or undo operation
* `--undo`: Preview restoring flags from a recovery undo file
* `--path-root`: Original working directory for relative recorded paths

#### `stash_sync` (separate entry point)

`python -m ofscraper.commands.stash_sync PATH... [--apply] [--scan] [--path-map LOCAL=STASH]`. It uses argparse and is not part of the CLI (see `STASH.md`). It reads creators' `user_data.db` files offline (a folder such as `<profile>/.data` is searched for them) and, over Stash's GraphQL API, fills empty fields of each downloaded file's scene or image: performer, studio, date, title, details, code, URL and source tags. A Fansly database (`schema_flags` `site=fansly`) gets the `Fansly` studio and links, @mentioned creators as performers, the media ID as code, a preview tag, hashtags as tags, and a gallery per post or message. It never overwrites a value already in Stash, and without `--apply` it only prints a JSON report. It doesn't contact OnlyFans or Fansly.

Run `python -m ofscraper.commands.stash_sync PATH... [OPTIONS]`.

* `PATHS`: user\_data.db files, or folders to search for them (e.g. /.data)
* `--apply`: write to Stash; without it, only report
* `--url`: Stash GraphQL URL (default <http://localhost:9999/graphql>, or $STASH\_URL)
* `--api-key`: Stash API key, if Stash has a password (default $STASH\_API\_KEY)
* `--studio`: studio to set for every site (default OnlyFans, or Fansly for Fansly databases)
* `--tag-prefix`: prefix for the source tags for every site, e.g. 'OnlyFans Paid' (default 'OnlyFans ', or 'Fansly ' for Fansly databases)
* `--no-tags`: don't add tags (source tags, and for Fansly the preview tag and hashtags)
* `--organized`: also mark items as organized
* `--path-map`: rewrite a path prefix when Stash sees the files elsewhere (e.g. in Docker); repeatable
* `--scan`: with --apply, have Stash scan the download folders first and wait for it

#### Scripts in `scripts/`

* `scripts/commit_version.sh`: CI helper. Works out the commit-based version string, hashes and push type from git for the build workflows.
* `scripts/creator_names.py`: `python scripts/creator_names.py [--all | --find NAME | --add MODEL_ID NAME [--force] | --csv FILE] [--data-dir DIR]`. Lists the usernames each creator account has had, from the `profiles` table of every `<data-dir>/<model_id>/user_data.db` (default: the main profile's `.data` folder). `--add` appends a name. It works on OnlyFans databases only.
* `scripts/determine_docker_stable_dev_tags.py`: CI helper. Asks the GitHub API for commit timestamps to decide the stable and dev Docker image tags.
* `scripts/entry/`: Docker internals. `entrypoint.sh`, `lib_user_setup.sh`, `lib_paths.sh` and `lib_permissions.sh` set up the container user, the data and config paths and the permissions, then start the app.
* `scripts/retry_action.sh`: CI helper. Retries a command up to N times, with a sleep between attempts.

### `--action` modes

The main program's `--action` (`-a`) picks what a non-interactive run does; without it, the interactive menu asks. Values can be combined (e.g. `download,like`).

* `unlike`: Removes likes from already-liked posts in the selected like areas, the same way as `like`. It runs `like.process_unlike`. It can't be combined with `like`.
* `like`: Likes (favorites) posts in the selected like areas that aren't liked yet. It sends one request at a time, with a random sleep between requests (`MIN/MAX_SLEEP_DURATION_LIKE`). A post that toggles the wrong way is toggled again. It runs `like.process_like`, then the after-like action script. The code warns that OnlyFans allows about 1000 likes per hour.
* `download`: Scrapes the selected areas (`--posts`) for each selected creator. It downloads the media that pass the filters into `save_location`, using `dir_format` and `file_format`, and records them in the creator's `user_data.db`. With `--text` (or `--text-only`) it also writes post text to `.txt` files. It runs `downloader()` in `commands/scraper/actions/download`, then the after-download action script.

### Options

#### Program Options

**`--version`**

* **Also:** `-v`
* **Dest:** `version` · **Type:** flag · **Default:** off
* **Commands:** all
* Show the version and exit.

**`--config`**

* **Also:** `-cg`
* **Dest:** `config` · **Type:** text · **Default:** none
* **Commands:** all
* **Defined in:** `ofscraper/utils/args/parse/arguments/program.py`
* Change location of config folder/file

**`--profile`**

* **Also:** `-r`
* **Dest:** `profile` · **Type:** text · **Default:** none
* **Commands:** all
* **Defined in:** `ofscraper/utils/args/parse/arguments/program.py`
* Change which profile you want to use If not set then the default profile is used, based on the config.json file Profiles are always within the config.json file parent directory

**`--site`**

* **Dest:** `site` · **Type:** one of `onlyfans`, `fansly` · **Default:** none
* **Commands:** all
* **Defined in:** `ofscraper/utils/args/parse/arguments/program.py`
* Site to use for this run: onlyfans or fansly If not set, the profile's site.json decides, and OnlyFans is the default

**`--env-files`**

* **Dest:** `env_files` · **Type:** path; repeatable · **Default:** none
* **Commands:** all
* **Defined in:** `ofscraper/utils/args/parse/arguments/program.py`
* Path to a custom environment variables file (.env).
* **Note:** Loaded before settings are built. It replaces `advanced_options.env_files` instead of adding to it.

#### Logging Options

**`--output`**

* **Also:** `-p`
* **Dest:** `output_level` · **Type:** one of `PROMPT`, `LOW`, `NORMAL`, `DEBUG` · **Default:** `'NORMAL'`
* **Commands:** all
* **Defined in:** `ofscraper/utils/args/parse/arguments/logging.py`
* Set console output log level
* **Note:** `LOW` and `PROMPT` hide status lines and the live progress screen. Errors and prompts still show. `LOW` also shows warnings; `PROMPT` shows only errors.

**`--no-live-screen`**

* **Also:** `-nl`, `--no-live`, `--no-rich`
* **Dest:** `no_rich` · **Type:** flag · **Default:** off
* **Commands:** all
* **Defined in:** `ofscraper/utils/args/parse/arguments/logging.py`
* Turn off rich ui live display features

**`--discord`**

* **Also:** `-dc`
* **Dest:** `discord_level` · **Type:** one of `OFF`, `LOW`, `NORMAL` · **Default:** `'OFF'`
* **Commands:** all
* **Config fallback:** `discord`
* **Defined in:** `ofscraper/utils/args/parse/arguments/logging.py`
* Set discord log level

**`--log`**

* **Also:** `-l`
* **Dest:** `log_level` · **Type:** one of `OFF`, `LOW`, `NORMAL`, `DEBUG`, `TRACE` · **Default:** none
* **Commands:** all
* **Defined in:** `ofscraper/utils/args/parse/arguments/logging.py`
* Set log file level

#### Download Options

**`--no-auto-resume`**

* **Also:** `-ar`
* **Dest:** `no_auto_resume` · **Type:** flag · **Default:** off
* **Commands:** main program, `manual`, `msg_check`, `story_check`, `paid_check`, `post_check`, `metadata`
* **Config fallback:** `download_options.auto_resume`
* **Defined in:** `ofscraper/utils/args/parse/arguments/download.py`
* Cleanup temp .part files (removes resume ability)
* **Note:** Turns `download_options.auto_resume` off for the run.

**`--downloadbars`**

* **Also:** `-db`, `--download-bars`, `--download-bar`
* **Dest:** `downloadbars` · **Type:** flag · **Default:** off
* **Commands:** main program, `manual`, `msg_check`, `story_check`, `paid_check`, `post_check`, `metadata`
* **Config fallback:** `advanced_options.downloadbars`
* **Defined in:** `ofscraper/utils/args/parse/arguments/download.py`
* Show individual download progress bars

**`--downloadsem`**

* **Also:** `-sd`, `--downloadsems`, `--download-sems`, `--download-sem`, `--sems`, `--sem`
* **Dest:** `download_sem` · **Type:** integer · **Default:** none
* **Commands:** main program, `manual`, `msg_check`, `story_check`, `paid_check`, `post_check`, `metadata`
* **Config fallback:** `performance_options.download_sems`
* **Defined in:** `ofscraper/utils/args/parse/arguments/download.py`
* Number of concurrent downloads per thread

**`--download-limit`**

* **Also:** `-dl`
* **Dest:** `download_limit` · **Type:** text, parsed by `parse_size` · **Default:** none
* **Commands:** main program, `manual`, `msg_check`, `story_check`, `paid_check`, `post_check`, `metadata`
* **Config fallback:** `performance_options.download_limit`
* **Defined in:** `ofscraper/utils/args/parse/arguments/download.py`
* Maximum download speed per second can parse Human readable string '10MB' or int representing bytes per second
* **Note:** Values below 1024 bytes per second are raised to 1024. All downloads in the run share the limit.

#### Media Filters Options

**`--quality`**

* **Also:** `-q`
* **Dest:** `quality` · **Type:** one of `240`, `720`, `source` · **Default:** none
* **Commands:** main program, `manual`, `msg_check`, `story_check`, `paid_check`, `post_check`, `metadata`
* **Defined in:** `ofscraper/utils/args/parse/arguments/media_content.py`
* **Note:** The lowest video quality to accept. The smallest available quality at or above it is downloaded, or `source` when none matches (`ofscraper/utils/args/accessors/quality.py`, `classes/of/media.py`). Without this option, `source` is used.

**`--mediatype`**

* **Also:** `-mt`, `--mediatypes`, `--media-types`, `--media-type`
* **Dest:** `mediatypes` · **Type:** one of `Videos`, `Audios`, `Images`; repeatable · **Default:** `[]`
* **Commands:** all
* **Config fallback:** `download_options.filter`
* **Defined in:** `ofscraper/utils/args/parse/arguments/media_content.py`
* Filter by media type (Videos, Audios, Images)

**`--size-max`**

* **Also:** `-sx`
* **Dest:** `size_max` · **Type:** text, parsed by `parse_size` · **Default:** none
* **Commands:** all
* **Config fallback:** `content_filter_options.file_size_max`
* **Defined in:** `ofscraper/utils/args/parse/arguments/media_content.py`
* Filter out files larger than the given size (bytes or human-readable, e.g., 10mb)

**`--size-min`**

* **Also:** `-sm`
* **Dest:** `size_min` · **Type:** text, parsed by `parse_size` · **Default:** none
* **Commands:** all
* **Config fallback:** `content_filter_options.file_size_min`
* **Defined in:** `ofscraper/utils/args/parse/arguments/media_content.py`
* Filter out files smaller than the given size (bytes or human-readable, e.g., 10mb)

**`--length-max`**

* **Also:** `-lx`
* **Dest:** `length_max` · **Type:** integer range · **Default:** none
* **Commands:** all
* **Config fallback:** `content_filter_options.length_max`
* **Defined in:** `ofscraper/utils/args/parse/arguments/media_content.py`
* max duration in seconds (whole number, e.g. 90); only applies to videos

**`--length-min`**

* **Also:** `-lm`
* **Dest:** `length_min` · **Type:** integer range · **Default:** none
* **Commands:** all
* **Config fallback:** `content_filter_options.length_min`
* **Defined in:** `ofscraper/utils/args/parse/arguments/media_content.py`
* min duration in seconds (whole number, e.g. 90); only applies to videos

**`--media-id`**

* **Also:** `-mid`
* **Dest:** `media_id` · **Type:** text; repeatable · **Default:** none
* **Commands:** all
* **Defined in:** `ofscraper/utils/args/parse/arguments/media_content.py`, `ofscraper/utils/args/parse/arguments/metadata_filters.py`
* Filter media based on media id

**`--max-media-count`**

* **Also:** `-mxc`
* **Dest:** `max_count` · **Type:** integer · **Default:** `0`
* **Commands:** main program, `manual`, `metadata`, `db`
* **Config fallback:** `download_options.max_post_count`
* **Defined in:** `ofscraper/utils/args/parse/arguments/media_content.py`
* Maximum number of media to process

**`--media-sort`**

* **Also:** `-mst`
* **Dest:** `mediasort` · **Type:** one of `random`, `text`, `text`, `date`, `filename` · **Default:** none
* **Commands:** main program, `manual`, `msg_check`, `story_check`, `paid_check`, `post_check`, `metadata`
* **Defined in:** `ofscraper/utils/args/parse/arguments/check.py`, `ofscraper/utils/args/parse/arguments/media_content.py`
* Changes media processing order before actions Example: for download

**`--media-desc`**

* **Also:** `-mdc`
* **Dest:** `media_desc` · **Type:** flag · **Default:** off
* **Commands:** main program, `manual`, `msg_check`, `story_check`, `paid_check`, `post_check`, `metadata`
* **Defined in:** `ofscraper/utils/args/parse/arguments/media_content.py`
* Sort the media list in descending order

**`--force-all`**

* **Also:** `-e`, `--dupe`, `--dupe-all`
* **Dest:** `force_all` · **Type:** flag · **Default:** off
* **Commands:** main program, `manual`, `metadata`
* **Defined in:** `ofscraper/utils/args/parse/arguments/media_content.py`
* Download all found files regardless of database presence

**`--force-model-unique`**

* **Also:** `-eq`, `--dupe-model-unique`, `--dupe-model`
* **Dest:** `force_model_unique` · **Type:** flag · **Default:** off
* **Commands:** main program, `manual`, `metadata`
* **Defined in:** `ofscraper/utils/args/parse/arguments/media_content.py`
* Only download found files with media ids not present for the current model in the database

**`--before`**

* **Also:** `-be`
* **Dest:** `before` · **Type:** Arrow · **Default:** none
* **Commands:** main program, `manual`, `metadata`
* **Defined in:** `ofscraper/utils/args/parse/arguments/media_content.py`
* Process media from posts at or before the given date (MM/DD/YYYY) for likes, unlikes, and downloads

**`--after`**

* **Also:** `-af`
* **Dest:** `after` · **Type:** Arrow · **Default:** none
* **Commands:** main program, `manual`, `metadata`
* **Defined in:** `ofscraper/utils/args/parse/arguments/media_content.py`
* Process media from posts at or after the given date (MM/DD/YYYY) for likes, unlikes, and downloads

**`--redownload`**

* **Also:** `-rd`, `--re-download`
* **Dest:** `redownload` · **Type:** flag · **Default:** off
* **Commands:** main program, `manual`, `metadata`
* **Defined in:** `ofscraper/utils/args/parse/arguments/media_content.py`
* Forces scanning and redownloading of all files in selected post types
* **Note:** Sets `force_all`, `--after 2000` and `--before` tomorrow for the run. Every item is scanned and downloaded again. The merge happens in `merged_settings`.

**`--preview`**

* **Also:** `-pv`, `-npv`, `--no-preview`
* **Dest:** `preview` · **Type:** flag · **Default:** none
* **Commands:** `db`
* Flag for filtering accounts based on preview status. \[select one --preview or --no-preview]

**`--created-before`**

* **Also:** `-cb`
* **Dest:** `created_before` · **Type:** Arrow · **Default:** none
* **Commands:** `db`
* **Defined in:** `ofscraper/utils/args/parse/arguments/metadata_filters.py`
* Process media created at or before the given date (MM/DD/YYYY) for likes, unlikes, and downloads

**`--created-after`**

* **Also:** `-cf`
* **Dest:** `created_after` · **Type:** Arrow · **Default:** none
* **Commands:** `db`
* **Defined in:** `ofscraper/utils/args/parse/arguments/metadata_filters.py`
* Process media created at or after the given date (MM/DD/YYYY) for likes, unlikes, and downloads

#### Filename Modification Options

**`--original`**

* **Also:** `-g`
* **Dest:** `original` · **Type:** flag · **Default:** off
* **Commands:** main program, `manual`, `msg_check`, `story_check`, `paid_check`, `post_check`, `metadata`
* **Config fallback:** `file_options.truncation_default`
* **Defined in:** `ofscraper/utils/args/parse/arguments/file.py`
* Don't truncate long paths
* **Note:** Turns off file name truncation for the run, whatever `file_options.truncation_default` says.

**`--space-replacer`**

* **Also:** `-sr`
* **Dest:** `space_replacer` · **Type:** text · **Default:** none
* **Commands:** main program, `manual`, `msg_check`, `story_check`, `paid_check`, `post_check`, `metadata`
* **Config fallback:** `file_options.space_replacer`
* **Defined in:** `ofscraper/utils/args/parse/arguments/file.py`
* character to replace spaces with

**`--textlength`**

* **Also:** `-tl`
* **Dest:** `textlength` · **Type:** integer · **Default:** none
* **Commands:** main program, `manual`, `msg_check`, `story_check`, `paid_check`, `post_check`, `metadata`
* **Config fallback:** `file_options.textlength`
* **Defined in:** `ofscraper/utils/args/parse/arguments/file.py`
* max length of text

**`--text-type`**

* **Also:** `-tt`
* **Dest:** `text_type` · **Type:** one of `word`, `letter` · **Default:** none
* **Commands:** main program, `manual`, `msg_check`, `story_check`, `paid_check`, `post_check`, `metadata`
* **Config fallback:** `file_options.text_type_default`
* **Defined in:** `ofscraper/utils/args/parse/arguments/file.py`
* set length based on word or letter

#### Posts Filters Options

**`--posts`**

* **Also:** `-o`, `--post`
* **Dest:** `posts` · **Type:** one of `Highlights`, `All`, `Archived`, `Messages`, `Timeline`, `Pinned`, `Streams`, `Stories`, `Purchased`, `Profile`, `Labels`, `Labels+`, `Labels*`; repeatable · **Default:** `[]`
* **Commands:** main program, `metadata`, `db`
* **Defined in:** `ofscraper/utils/args/parse/arguments/check.py`, `ofscraper/utils/args/parse/arguments/post_content.py`
* Select areas for batch actions (comma or space separated). Note: 'all' excludes labels. To include them, use 'all,labels' or specific tags like 'labels+' or 'labels\*'.

**`--download-area`**

* **Also:** `-da`
* **Dest:** `download_area` · **Type:** one of `Highlights`, `All`, `Archived`, `Messages`, `Timeline`, `Pinned`, `Stories`, `Purchased`, `Profile`, `Streams`, `Labels`, `Labels+`, `Labels*`; repeatable · **Default:** `[]`
* **Commands:** main program
* **Defined in:** `ofscraper/utils/args/parse/arguments/post_content.py`
* Perform download in specified areas (comma or space separated). Has preference over --posts for download action

**`--like-area`**

* **Also:** `-la`
* **Dest:** `like_area` · **Type:** one of `All`, `Archived`, `Timeline`, `Pinned`, `Labels`, `Streams`; repeatable · **Default:** `[]`
* **Commands:** main program
* **Defined in:** `ofscraper/utils/args/parse/arguments/post_content.py`
* Perform like/unlike in selected areas (comma or space separated). Has preference over --posts for like action

**`--protected-only`**

* **Also:** `-to`, `-no`, `--normal-only`
* **Dest:** `download_type` · **Type:** flag · **Default:** none
* **Commands:** main program, `msg_check`, `story_check`, `paid_check`, `post_check`, `metadata`, `db`
* Filter downloads by type. --protected-only: For content that requires decryption. --normal-only: For content that does not require decryption.

**`--post-id`**

* **Also:** `-pd`, `--postid`
* **Dest:** `post_id` · **Type:** text; repeatable · **Default:** none
* **Commands:** main program, `msg_check`, `story_check`, `paid_check`, `post_check`, `metadata`, `db`
* **Defined in:** `ofscraper/utils/args/parse/arguments/metadata_filters.py`, `ofscraper/utils/args/parse/arguments/post_content.py`
* Filter posts based on post id

**`--max-post-count`**

* **Also:** `-xc`
* **Dest:** `max_count` · **Type:** integer · **Default:** `0`
* **Commands:** main program
* **Config fallback:** `download_options.max_post_count`
* **Defined in:** `ofscraper/utils/args/parse/arguments/post_content.py`
* Maximum number of posts to process

**`--post-sort`**

* **Also:** `-pst`
* **Dest:** `post_sort` · **Type:** one of `date` · **Default:** `'date'`
* **Commands:** main program, `metadata`
* **Defined in:** `ofscraper/utils/args/parse/arguments/post_content.py`
* Changes post processing order before actions Example: for like or unlike

**`--post-desc`**

* **Also:** `-pdc`
* **Dest:** `post_desc` · **Type:** flag · **Default:** off
* **Commands:** main program
* **Defined in:** `ofscraper/utils/args/parse/arguments/post_content.py`
* Sort the post list in descending order Example: for like or unlike

**`--filter`**

* **Also:** `-ft`
* **Dest:** `filter` · **Type:** text; repeatable · **Default:** `['.*']`
* **Commands:** main program, `metadata`
* **Defined in:** `ofscraper/utils/args/parse/arguments/post_content.py`
* Filter posts by regex (case-sensitive if uppercase characters included) uses raw python string

**`--neg-filter`**

* **Also:** `-nf`
* **Dest:** `neg_filter` · **Type:** text; repeatable · **Default:** `[]`
* **Commands:** main program, `metadata`
* **Defined in:** `ofscraper/utils/args/parse/arguments/post_content.py`
* Filter posts to exclude those matching regex (case-styensitive if uppercase characters included) uses raw python string

**`--block-ads`**

* **Also:** `-ba`
* **Dest:** `block_ads` · **Type:** flag · **Default:** off
* **Commands:** main program
* **Defined in:** `ofscraper/utils/args/parse/arguments/post_content.py`
* Filter posts with regex to block posts with common words for advertisements

**`--label`**

* **Also:** `-lb`
* **Dest:** `label` · **Type:** text; repeatable · **Default:** `[]`
* **Commands:** main program, `metadata`
* **Defined in:** `ofscraper/utils/args/parse/arguments/post_content.py`
* Filter by label

**`--mass-only` (main program)**

* **Also:** `-mm`, `-ms`, `--mass-skip`
* **Dest:** `mass_msg` · **Type:** flag · **Default:** none
* **Commands:** main program
* **Defined in:** `ofscraper/utils/args/parse/arguments/post_content.py`
* Flag for enabling/disabling mass content or promos \[select one --mass-only or --mass-skip]

**`--only-timed`**

* **Also:** `-ok`, `-sk`, `--skip-timed`
* **Dest:** `timed_only` · **Type:** flag · **Default:** none
* **Commands:** main program, `metadata`
* Flag for enabling/disabling promotional or temporary posts \[select one --only-timed or --skip-timed]

**`--scrape-paid`**

* **Also:** `-sp`
* **Dest:** `scrape_paid` · **Type:** flag · **Default:** off
* **Commands:** main program, `metadata`
* **Defined in:** `ofscraper/utils/args/parse/arguments/post_content.py`, `ofscraper/utils/args/parse/group_bundles/metadata.py`
* Scrape entire paid page (can take a very long time)

**`--text` (main program)**

* **Also:** `-t`, `--download-text`
* **Dest:** `text` · **Type:** flag · **Default:** off
* **Commands:** main program
* **Defined in:** `ofscraper/utils/args/parse/arguments/check.py`, `ofscraper/utils/args/parse/arguments/post_content.py`
* Download text files alongside media

**`--text-only` (main program)**

* **Also:** `-tx`, `--download-text-only`
* **Dest:** `text_only` · **Type:** flag · **Default:** off
* **Commands:** main program
* **Defined in:** `ofscraper/utils/args/parse/arguments/check.py`, `ofscraper/utils/args/parse/arguments/post_content.py`
* Download ONLY text files, skipping all media
* **Note:** Also turns on `--text`. Text files are written and media is skipped.

**`--mass-only` (`metadata`)**

* **Also:** `-mm`, `--mass-skip`
* **Dest:** `mass_msg` · **Type:** flag · **Default:** none
* **Commands:** `metadata`
* **Defined in:** `ofscraper/utils/args/parse/arguments/post_content.py`
* Flag for enabling/disabling mass content or promos \[select one --mass-only or --mass-skip]

#### Automation Options

**`--action`**

* **Also:** `-a`, `--actions`
* **Dest:** `actions` · **Type:** one of `unlike`, `like`, `download`; repeatable · **Default:** `[]`
* **Commands:** main program
* **Defined in:** `ofscraper/utils/args/parse/arguments/automatic.py`
* Select batch action(s) to perform \[like,unlike,download]. Accepts space or comma-separated list. Like and unlike cannot be combined.

**`--daemon`**

* **Also:** `-d`
* **Dest:** `daemon` · **Type:** float · **Default:** none
* **Commands:** main program
* **Defined in:** `ofscraper/utils/args/parse/arguments/automatic.py`
* Run script in the background. Set value for how many minutes between script runs

**`--live`**

* **Dest:** `live` · **Type:** flag · **Default:** off
* **Commands:** main program
* **Defined in:** `ofscraper/utils/args/parse/arguments/automatic.py`
* Fansly only: record the selected creators (all followed creators without -u) who are live now, then continue

**`--live-watch`**

* **Dest:** `live_watch` · **Type:** flag · **Default:** off
* **Commands:** main program
* **Defined in:** `ofscraper/utils/args/parse/arguments/automatic.py`
* Fansly only: keep checking who is live and record them; with --daemon it runs beside the scheduled scrapes

**`--live-interval`**

* **Dest:** `live_interval` · **Type:** integer range · **Default:** none
* **Commands:** main program
* **Defined in:** `ofscraper/utils/args/parse/arguments/automatic.py`
* Fansly only: seconds between live checks in --live-watch (default 60, plus up to 10 s of jitter)

**`--live-max`**

* **Dest:** `live_max` · **Type:** integer range · **Default:** none
* **Commands:** main program
* **Defined in:** `ofscraper/utils/args/parse/arguments/automatic.py`
* Fansly only: most livestreams recorded at the same time (default 2)

**`--live-chat`**

* **Dest:** `live_chat` · **Type:** flag · **Default:** off
* **Commands:** main program
* **Defined in:** `ofscraper/utils/args/parse/arguments/automatic.py`
* Fansly only: also save livestream chat to a .jsonl file (read-only; off by default)

#### User Selection Options

**`--usernames` (`usernames`)**

* **Also:** `-u`, `--username`, `--users`, `--user`
* **Dest:** `usernames` · **Type:** text; repeatable · **Default:** none
* **Commands:** main program, `metadata`, `db`
* **Defined in:** `ofscraper/utils/args/parse/arguments/check.py`, `ofscraper/utils/args/parse/arguments/user_select.py`
* Select which username to process (name,name2). Set to ALL for all users

**`--excluded-username`**

* **Also:** `-eu`
* **Dest:** `excluded_username` · **Type:** text; repeatable · **Default:** none
* **Commands:** main program, `metadata`, `db`
* **Defined in:** `ofscraper/utils/args/parse/arguments/user_select.py`
* Select which usernames to exclude (name,name2). Has preference over --username. Also skips these models during --scrape-paid, e.g. --scrape-paid --excluded-username name

**`--user_list`**

* **Also:** `-ul`, `--user-list`, `--userlist`, `--userlists`, `--user-lists`
* **Dest:** `userlist` · **Type:** text; repeatable · **Default:** none
* **Commands:** main program, `metadata`, `db`
* **Config fallback:** `advanced_options.default_user_list`
* **Defined in:** `ofscraper/utils/args/parse/arguments/user_select.py`
* Filter by userlist. Note: the lists 'ofscraper.main', 'ofscraper.expired', and 'ofscraper.active' are reserved and should not be the name of any list you have on OF

**`--black_list`**

* **Also:** `-bl`, `--black-lists`, `--blacklist`, `--blacklists`, `--black-list`
* **Dest:** `blacklist` · **Type:** text; repeatable · **Default:** none
* **Commands:** main program, `metadata`, `db`
* **Config fallback:** `advanced_options.default_black_list`
* **Defined in:** `ofscraper/utils/args/parse/arguments/user_select.py`
* Remove all users from selected list. Note: the lists 'ofscraper.main', 'ofscraper.expired', and 'ofscraper.active' are reserved and should not be the name of any list you have on OF

#### User List Filter Options

**`--current-price`**

* **Also:** `-cp`
* **Dest:** `current_price` · **Type:** one of `paid`, `free` · **Default:** none
* **Commands:** main program, `metadata`, `db`
* **Defined in:** `ofscraper/utils/args/parse/arguments/user_list.py`
* Filter accounts based on either the subscription price, lowest claimable promotional price, or regular price

**`--renewal-price`**

* **Also:** `-rp`
* **Dest:** `renewal_price` · **Type:** one of `paid`, `free` · **Default:** none
* **Commands:** main program, `metadata`, `db`
* **Defined in:** `ofscraper/utils/args/parse/arguments/user_list.py`
* Filter accounts based on either the lowest claimable promotional price, or regular price

**`--regular-price`**

* **Also:** `-gp`
* **Dest:** `regular_price` · **Type:** one of `paid`, `free` · **Default:** none
* **Commands:** main program, `metadata`, `db`
* **Defined in:** `ofscraper/utils/args/parse/arguments/user_list.py`
* Filter accounts based on the regular price

**`--promo-price`**

* **Also:** `-pp`
* **Dest:** `promo_price` · **Type:** one of `paid`, `free` · **Default:** none
* **Commands:** main program, `metadata`, `db`
* **Defined in:** `ofscraper/utils/args/parse/arguments/user_list.py`
* Filter accounts based on either the lowest promotional price regardless of claimability, or regular price

**`--last-seen-only`**

* **Also:** `-lo`, `-ls`, `--last-seen-skip`
* **Dest:** `last_seen` · **Type:** flag · **Default:** none
* **Commands:** main program, `metadata`, `db`
* Flag for filtering accounts based on last seen being visible \[select one --last-seen-only or --last-seen-skip]

**`--free-trial-only`**

* **Also:** `-fo`, `-fs`, `--free-trial-skip`
* **Dest:** `free_trial` · **Type:** flag · **Default:** none
* **Commands:** main program, `metadata`, `db`
* **Defined in:** `ofscraper/utils/args/parse/arguments/check.py`
* Flag for enabling/disabling accounts with free trial \[must be normally paid] \[select one --free-trial-only or --free-trial-skip]

**`--promo-only`**

* **Also:** `-po`, `-ps`, `--promo-skip`
* **Dest:** `promo` · **Type:** flag · **Default:** none
* **Commands:** main program, `metadata`, `db`
* Flag for enabling/disabling accounts with a claimable promo price \[select one --promo-only or --promo-skip]

**`--all-promo-only`**

* **Also:** `-ao`, `--all-promo-skip`
* **Dest:** `all_promo` · **Type:** flag · **Default:** none
* **Commands:** main program, `metadata`, `db`
* **Defined in:** `ofscraper/utils/args/parse/arguments/user_list.py`
* Flag for enabling/disabling accounts with any promo price \[select one all-promo-only or --all-promo-skip]

**`--active-subscription`**

* **Also:** `-ts`, `--active-subscriptions`, `-es`, `--expired-subscription`, `--expired-subscriptions`
* **Dest:** `sub_status` · **Type:** flag · **Default:** none
* **Commands:** main program, `metadata`, `db`
* Flag for enabling/disabling accounts with active or expired subscription \[select one --active-subscription or --expired-subscription]

**`--renew-on`**

* **Also:** `-ro`, `-rf`, `--renew-off`
* **Dest:** `renewal` · **Type:** flag · **Default:** none
* **Commands:** main program, `metadata`, `db`
* Flag for enabling/disabling accounts set to renew renew flag on \[select one --renew-on or --renew-off]

#### Advanced User List Filter Options

**`--promo-price-min`**

* **Also:** `-ppn`
* **Dest:** `promo_price_min` · **Type:** integer · **Default:** none
* **Commands:** main program, `metadata`, `db`
* **Defined in:** `ofscraper/utils/args/parse/arguments/advanced_user_filter.py`
* Filter accounts where the lowest promo price matches or falls above the provided value

**`--promo-price-max`**

* **Also:** `-ppm`
* **Dest:** `promo_price_max` · **Type:** integer · **Default:** none
* **Commands:** main program, `metadata`, `db`
* **Defined in:** `ofscraper/utils/args/parse/arguments/advanced_user_filter.py`
* Filter accounts where the lowest promo price matches or falls below the provided value

**`--regular-price-min`**

* **Also:** `-gpn`
* **Dest:** `regular_price_min` · **Type:** integer · **Default:** none
* **Commands:** main program, `metadata`, `db`
* **Defined in:** `ofscraper/utils/args/parse/arguments/advanced_user_filter.py`
* Filter accounts where the regular price matches or falls above the provided value

**`--regular-price-max`**

* **Also:** `-gpm`
* **Dest:** `regular_price_max` · **Type:** integer · **Default:** none
* **Commands:** main program, `metadata`, `db`
* **Defined in:** `ofscraper/utils/args/parse/arguments/advanced_user_filter.py`
* Filter accounts where the regular price matches or falls below the provided value

**`--current-price-min`**

* **Also:** `-cpn`
* **Dest:** `current_price_min` · **Type:** integer · **Default:** none
* **Commands:** main program, `metadata`, `db`
* **Defined in:** `ofscraper/utils/args/parse/arguments/advanced_user_filter.py`
* Filter accounts where the current regular price matches or falls above the provided value

**`--current-price-max`**

* **Also:** `-cpm`
* **Dest:** `current_price_max` · **Type:** integer · **Default:** none
* **Commands:** main program, `metadata`, `db`
* **Defined in:** `ofscraper/utils/args/parse/arguments/advanced_user_filter.py`
* Filter accounts where the current price matches or falls below the provided value

**`--renewal-price-min`**

* **Also:** `-rpn`
* **Dest:** `renewal_price_min` · **Type:** integer · **Default:** none
* **Commands:** main program, `metadata`, `db`
* **Defined in:** `ofscraper/utils/args/parse/arguments/advanced_user_filter.py`
* Filter accounts where the renewal regular price matches or falls above the provided value

**`--renewal-price-max`**

* **Also:** `-rpm`
* **Dest:** `renewal_price_max` · **Type:** integer · **Default:** none
* **Commands:** main program, `metadata`, `db`
* **Defined in:** `ofscraper/utils/args/parse/arguments/advanced_user_filter.py`
* Filter accounts where the renewal price matches or falls below the provided value

**`--last-seen-before`**

* **Also:** `-lsb`
* **Dest:** `last_seen_before` · **Type:** Arrow · **Default:** none
* **Commands:** main program, `metadata`, `db`
* **Defined in:** `ofscraper/utils/args/parse/arguments/advanced_user_filter.py`
* Filter accounts by last seen being at or before the given date (YYYY-MM-DD format)

**`--last-seen-after`**

* **Also:** `-lsa`
* **Dest:** `last_seen_after` · **Type:** Arrow · **Default:** none
* **Commands:** main program, `metadata`, `db`
* **Defined in:** `ofscraper/utils/args/parse/arguments/advanced_user_filter.py`
* Filter accounts by last seen being at or after the given date (YYYY-MM-DD format)

**`--expired-after`**

* **Also:** `-ea`
* **Dest:** `expired_after` · **Type:** Arrow · **Default:** none
* **Commands:** main program, `metadata`, `db`
* **Defined in:** `ofscraper/utils/args/parse/arguments/advanced_user_filter.py`
* Filter accounts by expiration/renewal being at or after the given date (YYYY-MM-DD format)

**`--expired-before`**

* **Also:** `-eb`
* **Dest:** `expired_before` · **Type:** Arrow · **Default:** none
* **Commands:** main program, `metadata`, `db`
* **Defined in:** `ofscraper/utils/args/parse/arguments/advanced_user_filter.py`
* Filter accounts by expiration/renewal being at or before the given date (YYYY-MM-DD format)

**`--subscribed-after`**

* **Also:** `-sa`
* **Dest:** `subscribed_after` · **Type:** Arrow · **Default:** none
* **Commands:** main program, `metadata`, `db`
* **Defined in:** `ofscraper/utils/args/parse/arguments/advanced_user_filter.py`
* Filter accounts by subscription date being after the given date (YYYY-MM-DD format)

**`--subscribed-before`**

* **Also:** `-sb`
* **Dest:** `subscribed_before` · **Type:** Arrow · **Default:** none
* **Commands:** main program, `metadata`, `db`
* **Defined in:** `ofscraper/utils/args/parse/arguments/advanced_user_filter.py`
* Filter accounts by sub date being at or before the given date (YYYY-MM-DD format)

#### Model Sort & Processing Order Options

**`--sort`**

* **Also:** `-st`
* **Dest:** `sort` · **Type:** one of `name`, `subscribed`, `expired`, `current-price`, `renewal-price`, `regular-price`, `promo-price`, `last-seen` · **Default:** `'Name'`
* **Commands:** main program, `metadata`, `db`
* **Defined in:** `ofscraper/utils/args/parse/arguments/user_sort.py`
* What to sort the model list by

**`--desc`**

* **Also:** `-ds`
* **Dest:** `desc` · **Type:** flag · **Default:** off
* **Commands:** main program, `metadata`, `db`
* **Defined in:** `ofscraper/utils/args/parse/arguments/user_sort.py`
* Sort the model list in descending order

#### Advanced Search & Processing Options

**`--users-first`**

* **Also:** `-uf`, `--user-first`, `--usersfirst`, `--userfirst`
* **Dest:** `users_first` · **Type:** flag · **Default:** off
* **Commands:** main program, `metadata`
* **Defined in:** `ofscraper/utils/args/parse/arguments/advanced_processing.py`
* Process all users first rather than one at a time (affects --action)

**`--username-individual-search`**

* **Also:** `-fi`, `--user-individual-search`, `-fl`, `--username-list-search`, `--user-list-search`
* **Dest:** `username_search` · **Type:** flag · **Default:** none
* **Commands:** main program, `metadata`
* Set the search strategy when --username is provided. --individual: Search each username as a separate request. --list: Search entire enabled lists before filtering (default).

#### Program Scripts

**`--after-action-script`**

* **Also:** `-aas`
* **Dest:** `after_action_script` · **Type:** text · **Default:** none
* **Commands:** main program, `manual`, `msg_check`, `story_check`, `paid_check`, `post_check`
* **Config fallback:** `script_options.after_action_script`
* **Defined in:** `ofscraper/utils/args/parse/arguments/scripts.py`
* Runs a script after an action for a model has completed.

**`--naming-script`**

* **Also:** `-ns`
* **Dest:** `naming_script` · **Type:** text · **Default:** none
* **Commands:** main program, `manual`, `msg_check`, `story_check`, `paid_check`, `post_check`
* **Config fallback:** `script_options.naming_script`
* **Defined in:** `ofscraper/utils/args/parse/arguments/scripts.py`
* Runs a script to dynamically generate the final filename or path for a media item.

**`--post-script`**

* **Also:** `-ps`
* **Dest:** `post_script` · **Type:** text · **Default:** none
* **Commands:** main program, `manual`, `msg_check`, `story_check`, `paid_check`, `post_check`
* **Config fallback:** `script_options.post_script`
* **Defined in:** `ofscraper/utils/args/parse/arguments/scripts.py`
* Runs a script after processing all users (e.g., after a full scrape operation)

**`--after-download-script`**

* **Also:** `-adl`
* **Dest:** `after_download_script` · **Type:** text · **Default:** none
* **Commands:** main program, `manual`, `msg_check`, `story_check`, `paid_check`, `post_check`
* **Config fallback:** `script_options.after_download_script`
* **Defined in:** `ofscraper/utils/args/parse/arguments/scripts.py`
* Runs script after download has completed

**`--skip-download-script`**

* **Also:** `-sdl`
* **Dest:** `skip_download_script` · **Type:** text · **Default:** none
* **Commands:** main program, `manual`, `msg_check`, `story_check`, `paid_check`, `post_check`
* **Config fallback:** `script_options.skip_download_script`
* **Defined in:** `ofscraper/utils/args/parse/arguments/scripts.py`
* Runs a script to dynamically skip a download

**`--retry-permanent-skips`**

* **Dest:** `retry_permanent_skips` · **Type:** flag · **Default:** off
* **Commands:** main program, `manual`, `msg_check`, `story_check`, `paid_check`, `post_check`
* **Defined in:** `ofscraper/utils/args/parse/arguments/scripts.py`
* Ask the skip download script again about the files it skipped for good (skip-permanent) for the creators in this run
* **Note:** The files `skip_download_script` skipped for good (`medias.skip_permanent = 1`) are no longer treated as downloaded for the run, so the creators' files in the run are offered to the script again. Areas are scanned in full unless `--after` is given, since those files can be in older posts. A file the script keeps downloads. `skip-permanent` keeps it skipped for good. A plain skip counts as skipped and sets it back to not downloaded, so the next run asks again. Without a script set, nothing skips them, so they download. Real downloads and other rows don't change.

#### Advanced Program Options

**`--no-cache`**

* **Also:** `-nc`
* **Dest:** `no_cache` · **Type:** flag · **Default:** off
* **Commands:** main program, `manual`, `msg_check`, `story_check`, `paid_check`, `post_check`, `metadata`
* **Defined in:** `ofscraper/utils/args/parse/arguments/advanced_program.py`
* Disable cache and forces consecutive api scan
* **Note:** Disables both the general cache and the API cache for the run, and turns off incremental downloads. Setting `advanced_options.cache-mode` to `disabled` in `config.json` does the same.

**`--no-api-cache`**

* **Also:** `-nca`
* **Dest:** `no_api_cache` · **Type:** flag · **Default:** off
* **Commands:** main program, `manual`, `msg_check`, `story_check`, `paid_check`, `post_check`, `metadata`
* **Defined in:** `ofscraper/utils/args/parse/arguments/advanced_program.py`
* Forces consecutive api scan
* **Note:** Disables only the API response cache. Setting `advanced_options.cache-mode` to `api_disabled` does the same.

**`--key-mode`**

* **Also:** `-k`
* **Dest:** `key_mode` · **Type:** one of `cdrm`, `manual` · **Default:** none
* **Commands:** main program, `manual`, `msg_check`, `story_check`, `paid_check`, `post_check`, `metadata`
* **Config fallback:** `cdm_options.key-mode-default`
* **Defined in:** `ofscraper/utils/args/parse/arguments/advanced_program.py`
* Key mode for decrypting content
* **Note:** `cdrm` posts the request headers, cookies included, to cdrm-project.com. `manual` uses the local CDM files (`--private-key`, `--client-id`).

**`--private-key`**

* **Also:** `-pk`
* **Dest:** `private_key` · **Type:** text · **Default:** none
* **Commands:** main program, `manual`, `msg_check`, `story_check`, `paid_check`, `post_check`, `metadata`
* **Config fallback:** `cdm_options.private-key`
* **Defined in:** `ofscraper/utils/args/parse/arguments/advanced_program.py`
* private key path for manual cdrm

**`--client-id`**

* **Also:** `-ci`
* **Dest:** `client_id` · **Type:** text · **Default:** none
* **Commands:** main program, `manual`, `msg_check`, `story_check`, `paid_check`, `post_check`, `metadata`
* **Config fallback:** `cdm_options.client-id`
* **Defined in:** `ofscraper/utils/args/parse/arguments/advanced_program.py`
* client id path for manual cdrm

**`--dynamic-rules`**

* **Also:** `-dr`, `--dynamic-rule`
* **Dest:** `dynamic_rules` · **Type:** one of `digitalcriminals`, `manual`, `generic`, `datawhores`, `xagler`, `rafa`, `dc`, `digital`, `digitals`, `digitalcriminal` · **Default:** none
* **Commands:** main program, `manual`, `msg_check`, `story_check`, `paid_check`, `post_check`, `metadata`
* **Config fallback:** `advanced_options.dynamic-mode-default`
* **Defined in:** `ofscraper/utils/args/parse/arguments/advanced_program.py`
* Dynamic signing

**`--update-profile`**

* **Also:** `-up`
* **Dest:** `update_profile` · **Type:** flag · **Default:** off
* **Commands:** all
* **Defined in:** `ofscraper/utils/args/parse/arguments/advanced_program.py`
* Get up-to-date profile info instead of using cache

**`--auth-fail`**

* **Also:** `-al`, `--auth-quit`
* **Dest:** `auth_fail` · **Type:** flag · **Default:** off
* **Commands:** main program, `manual`, `msg_check`, `story_check`, `paid_check`, `post_check`, `metadata`
* **Defined in:** `ofscraper/utils/args/parse/arguments/advanced_program.py`
* quit on authentication failure, rather then prompting

#### Other options

**`--force`**

* **Also:** `-fo`, `--forced`, `--forced-scan`, `--force-scan`
* **Dest:** `force` · **Type:** flag · **Default:** off
* **Commands:** `manual`, `msg_check`, `story_check`, `paid_check`, `post_check`
* **Defined in:** `ofscraper/utils/args/parse/arguments/check.py`
* Force retrieval of new posts info from API

**`--text` (`manual`, `msg_check`, `paid_check`, `post_check`)**

* **Also:** `-tn`, `--download-text`
* **Dest:** `text` · **Type:** flag · **Default:** off
* **Commands:** `manual`, `msg_check`, `paid_check`, `post_check`
* **Defined in:** `ofscraper/utils/args/parse/arguments/check.py`, `ofscraper/utils/args/parse/arguments/post_content.py`
* Download Text files in addition to media

**`--text-only` (`manual`, `msg_check`, `paid_check`, `post_check`)**

* **Also:** `-tp`, `--download-text-only`
* **Dest:** `text_only` · **Type:** flag · **Default:** off
* **Commands:** `manual`, `msg_check`, `paid_check`, `post_check`
* **Defined in:** `ofscraper/utils/args/parse/arguments/check.py`, `ofscraper/utils/args/parse/arguments/post_content.py`
* Download Text files, but skip download media
* **Note:** Also turns on `--text`. Text files are written and media is skipped.

**`--url`**

* **Also:** `-u`
* **Dest:** `url` · **Type:** text; repeatable · **Default:** none
* **Commands:** `manual`, `msg_check`, `post_check`
* **Defined in:** `ofscraper/utils/args/parse/arguments/check.py`, `ofscraper/utils/args/parse/arguments/user_select.py`
* Scan posts via space or comma seperated list of urls

**`--file` (`file`)**

* **Also:** `-f`
* **Dest:** `file` · **Type:** file; repeatable · **Default:** none
* **Commands:** `manual`, `msg_check`, `post_check`
* **Defined in:** `ofscraper/utils/args/parse/arguments/check.py`
* Scan posts via a file with line-separated URL(s)

**`--usernames` (`check_usernames`)**

* **Also:** `-u`, `--username`, `--users`, `--user`
* **Dest:** `check_usernames` · **Type:** text; repeatable · **Default:** none
* **Commands:** `story_check`, `paid_check`
* **Defined in:** `ofscraper/utils/args/parse/arguments/check.py`, `ofscraper/utils/args/parse/arguments/user_select.py`
* Scan stories/highlights via username(s)

**`--file` (`file_usernames`)**

* **Also:** `-f`
* **Dest:** `file_usernames` · **Type:** file; repeatable · **Default:** none
* **Commands:** `story_check`, `paid_check`
* **Defined in:** `ofscraper/utils/args/parse/arguments/check.py`
* Scan via a file with line-separated username(s)

**`--export`**

* **Also:** `-ep`
* **Dest:** `export` · **Type:** path · **Default:** none
* **Commands:** `db`
* **Defined in:** `ofscraper/utils/args/parse/group_bundles/db.py`
* export the table as a csv file

**`--unmark-permanent-skips`**

* **Dest:** `unmark_permanent_skips` · **Type:** flag · **Default:** off
* **Commands:** `db`
* **Defined in:** `ofscraper/utils/args/parse/group_bundles/db.py`
* Un-mark the files the skip download script skipped for good (skip-permanent) among the selected rows, so the next run asks the script about them again. Filter with the creator, post id and media id options
* **Note:** `ofscraper db` only. Of the rows the other options select (creator, `--post-id`, `--media-id` and the media filters), it keeps those `skip_download_script` skipped for good, prints them, and sets them back to not downloaded with `skip_permanent` cleared. The next normal run asks the script about them again. A media's download state is kept on all of its rows, so its rows in other posts change too. Other rows never change. Without it, `db` only reads.

#### Table Filter Options

**`--unlocked`**

* **Also:** `-ucl`, `-lc`, `--locked`
* **Dest:** `unlocked` · **Type:** flag · **Default:** none
* **Commands:** `msg_check`, `story_check`, `paid_check`, `post_check`, `db`
* Flag for filtering accounts based on whether media is unlocked \[select one --unlock or --locked]

**`--downloaded`**

* **Also:** `-dwl`, `-ndw`, `--not-downloaded`
* **Dest:** `downloaded` · **Type:** flag · **Default:** none
* **Commands:** `msg_check`, `story_check`, `paid_check`, `post_check`, `db`
* Flag for filtering accounts based on whether media is downloaded \[select one --downloaded or --not-downloaded]

**`--posted-after`**

* **Also:** `-pf`
* **Dest:** `posted_after` · **Type:** Arrow · **Default:** none
* **Commands:** `msg_check`, `story_check`, `paid_check`, `post_check`, `db`
* **Defined in:** `ofscraper/utils/args/parse/arguments/metadata_filters.py`
* Filter out posts posted on or after the given date (MM/DD/YYYY) for likes, unlikes, and downloads

**`--posted-before`**

* **Also:** `-pb`
* **Dest:** `posted_before` · **Type:** Arrow · **Default:** none
* **Commands:** `msg_check`, `story_check`, `paid_check`, `post_check`, `db`
* **Defined in:** `ofscraper/utils/args/parse/arguments/metadata_filters.py`
* Filter out posts posted at on or before the given date (MM/DD/YYYY) for likes, unlikes, and downloads

#### Content Options

**`--timeline-strict`**

* **Also:** `-tls`
* **Dest:** `timeline_strict` · **Type:** flag · **Default:** off
* **Commands:** `post_check`
* **Defined in:** `ofscraper/utils/args/parse/arguments/post_content.py`
* When timeline is select removes pinned and archived

**`--check-area`**

* **Also:** `-ca`, `--post`, `--posts`
* **Dest:** `check_area` · **Type:** one of `All`, `Archived`, `Timeline`, `Pinned`, `Labels`, `Streams`; repeatable · **Default:** `['Timeline', 'Pinned', 'Archived', 'Streams']`
* **Commands:** `post_check`
* **Defined in:** `ofscraper/utils/args/parse/arguments/check.py`, `ofscraper/utils/args/parse/arguments/post_content.py`
* Select areas to check (multiple allowed, separated by spaces)

#### Metadata Options

**`--metadata`**

* **Also:** `-md`
* **Dest:** `metadata` · **Type:** one of `complete`, `update`, `check` · **Default:** none
* **Commands:** `metadata`
* **Defined in:** `ofscraper/utils/args/parse/group_bundles/metadata.py`
* METADATA MODES check: Updates metadata fields for the specified area via an API This option does not check for new filenames update: This mode performs two actions: 1. Updates download status and filenames based on the presence of actual files 2. Updates metadata fields for the specified area via an API complete: Marks the download as complete and updates metadata fields via an API It also uses a new filename if one is available

**`--mark-stray-locked`**

* **Also:** `-ms`, `--mark-stray`
* **Dest:** `mark_stray` · **Type:** flag · **Default:** off
* **Commands:** `metadata`
* **Defined in:** `ofscraper/utils/args/parse/group_bundles/metadata.py`
* Sets unmatched media items as locked This is done per api type excluding labels, and is limited to --after and --before range

**`--anon`**

* **Also:** `-an`
* **Dest:** `anon` · **Type:** flag · **Default:** off
* **Commands:** `metadata`
* **Defined in:** `ofscraper/utils/args/parse/group_bundles/metadata.py`
* Use anonymise creditional forces --individual flag force --list flag to be removed most media is ignored

#### Sorting for the table

**`--db-sort`**

* **Also:** `-dst`
* **Dest:** `db_sort` · **Type:** one of `posted`, `created`, `filename`, `length`, `postid`, `mediaid`, `size` · **Default:** `'posted'`
* **Commands:** `db`
* **Defined in:** `ofscraper/utils/args/parse/arguments/post_content.py`
* Changes order of table

**`--db-asc`**

* **Also:** `-bdc`
* **Dest:** `db_asc` · **Type:** flag · **Default:** off
* **Commands:** `db`
* **Defined in:** `ofscraper/utils/args/parse/arguments/post_content.py`
* Change the sort order of table to ascending


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## Querying This Documentation
If you need additional information that is not directly available in this page, you can query the documentation by asking a question.

Perform an HTTP GET request on the following URL with the `ask` and `goal` query parameters:

```
GET https://cloakedkeys.gitbook.io/ofsc/reference/cli.md?ask=<question>&goal=<user_goal>
```

`ask` is the immediate question: it should be specific, self-contained, and written in natural language.
`goal` is what the user is ultimately trying to achieve, the reason they need the answer. Sharing it helps GitBook give you a better, more relevant answer. A goal is most helpful when it describes the outcome the user wants rather than restating the question. For example, with `ask=how do I create an API token`, a goal like `automate deployments from our CI pipeline` lets GitBook tailor the answer to that use case.

The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
