Self-hosted CLI that automates CCPA/CPRA data-broker opt-out requests via Playwright
Reason this release was yanked:
Not ready
Project description
OptOut
Self-hosted CLI tool that automates submitting opt-out and data-deletion requests to data brokers.
You run it on your own machine with your own information. There is no central server, no accounts, no SaaS. Because you are the data subject submitting on your own behalf, the entire "authorized agent" legal apparatus that commercial services like DeleteMe and Optery have to build does not apply here.
What it does and does not do
Does:
- Submit opt-out / deletion requests to people-search and marketing data brokers.
- Track deadlines (CCPA: 45 days, GDPR: 30 days, etc.) and surface overdue requests.
- Re-scan brokers periodically and re-submit if your data reappears.
- Open a real browser window (Chromium) so you solve CAPTCHAs — no bot-detection arms race.
- Send opt-out emails from your own inbox so brokers can't block "the service."
Does not:
- Submit requests for anyone other than the person running the tool.
- Touch credit bureaus (Experian, Equifax, TransUnion) — those have separate, regulated dispute processes.
- Remove government records, court filings, or news articles.
- Guarantee removal from sites that ignore opt-out requests.
- Store your personal information anywhere except your own machine (
~/.config/optout/).
Install
Requirements: Python 3.11+ and pip (or uv).
git clone https://github.com/your-username/optout.git
cd optout
pip install -e ".[dev]" # or: uv pip install -e ".[dev]"
playwright install chromium # one-time browser download
Quickstart
1. Initialize your profile
optout init
The interactive wizard asks for your name, address, email, and SMTP credentials. It writes ~/.config/optout/config.yml (mode 600) and creates the local SQLite database.
2. Queue brokers for opt-out
optout brokers list # see all supported brokers
optout queue # queue all brokers
optout queue --broker whitepages # queue one specific broker
3. Submit opt-out requests
optout submit
A browser window opens for each web-form broker. Follow the on-screen prompts — select your listing, solve CAPTCHAs, confirm emails. Email-method brokers are submitted automatically using your configured SMTP credentials.
4. Check status
optout status
Shows a table of every submission: method used, current status, statutory deadline, and days remaining.
5. Re-scan periodically
optout monitor
Checks which brokers still list you and re-queues any that have re-added your data. Cron-friendly — run it monthly.
Commands
optout init # interactive setup wizard
optout brokers list [--category] # list all known brokers
optout brokers info <slug> # details + your submission history for one broker
optout scan [--broker SLUG] # check which brokers currently list you
optout queue [--broker SLUG] # add brokers to the submission queue
optout submit [--broker SLUG] # process the queue and submit opt-outs
optout status [--broker] [--status] # table of submissions, deadlines, callouts
optout monitor # one-shot re-scan (schedule with cron or launchd)
optout escalate # send follow-ups for submissions past their deadline
optout export # dump all submission history as JSON
Configuration
~/.config/optout/config.yml is generated by optout init. Key sections:
profile:
legal_name: "Jane Q Public"
current_address:
street: "123 Main St"
city: "Austin"
state: "TX"
zip: "78701"
emails:
current: ["jane@example.com"]
phones:
current: ["+15125551234"]
email:
method: smtp
smtp:
host: smtp.gmail.com
port: 587
username: jane@example.com
password_env: OPTOUT_SMTP_PASSWORD # never stored in the file itself
playwright:
headless: false # keep false so you can solve CAPTCHAs
slow_mo_ms: 0
monitoring:
rescan_interval_days: 30
Sensitive values (SMTP passwords) are read from environment variables, not stored in the config file.
Supported brokers
| Slug | Name | Method | Verification |
|---|---|---|---|
whitepages |
Whitepages | Web form | Phone (SMS) |
spokeo |
Spokeo | Web form | |
beenverified |
BeenVerified | Web form | |
radaris |
Radaris | None | |
mylife |
MyLife | None |
Community contributions add brokers as YAML files — see CONTRIBUTING.md.
Running tests
pytest # full suite
pytest tests/test_production_brokers.py # validate all broker YAMLs only
Legal basis
OptOut cites the applicable statute in every opt-out email and web-form submission:
- CCPA §1798.105 (California Consumer Privacy Act) — right to deletion, 45-day response window
- CPRA (California Privacy Rights Act) — extends CCPA, same 45-day window
- GDPR Art. 17 (General Data Protection Regulation) — right to erasure, 30-day response window
- VCDPA, CPA, CTDPA, UCPA — state-level equivalents
Each broker's YAML lists which statutes apply. The tool automatically includes the correct citation in every submission.
Honest limitations
- Removal is not guaranteed. Some brokers comply reliably; others are slow or re-add data.
- Web-form flows break when brokers redesign their opt-out pages. If a broker's steps stop working, open an issue or submit a YAML fix.
- CAPTCHAs require your attention — the tool will pause and prompt you.
- Email submissions depend on your SMTP server being reachable and not blocked by the broker.
- Data frequently reappears (60–90 days is typical). Use
optout monitorto catch this.
License
AGPL-3.0-only. See LICENSE.
This license was chosen intentionally: anyone who forks this and runs it as a hosted service must publish their changes. The project's legal model depends on each user running their own copy — a hosted fork changes the legal character of the tool.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file optout-0.1.0.tar.gz.
File metadata
- Download URL: optout-0.1.0.tar.gz
- Upload date:
- Size: 67.9 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
12a246c947aeb8fe5a2e0a8e7412a63109d217c36dc54e7bbbca27a69b7bbb3d
|
|
| MD5 |
f15ac2d21ace40974fd20da0a78eb239
|
|
| BLAKE2b-256 |
e3137e7865baa67f01a6c8389f5a1c4d2d5c1a3acd59344ccd9e82377a6d2b1f
|
Provenance
The following attestation bundles were made for optout-0.1.0.tar.gz:
Publisher:
release.yml on Blake104/OptOut
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
optout-0.1.0.tar.gz -
Subject digest:
12a246c947aeb8fe5a2e0a8e7412a63109d217c36dc54e7bbbca27a69b7bbb3d - Sigstore transparency entry: 1513235969
- Sigstore integration time:
-
Permalink:
Blake104/OptOut@3f6b55a5879cefa45b8f009c28e46243a4aca1dc -
Branch / Tag:
refs/tags/v0.1.0 - Owner: https://github.com/Blake104
-
Access:
private
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@3f6b55a5879cefa45b8f009c28e46243a4aca1dc -
Trigger Event:
push
-
Statement type:
File details
Details for the file optout-0.1.0-py3-none-any.whl.
File metadata
- Download URL: optout-0.1.0-py3-none-any.whl
- Upload date:
- Size: 56.4 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
fbdf53c09feb7a2cd411a21e397480fb67a6f2b77c171fa56da81ca26bd24319
|
|
| MD5 |
c1eded09cb86415ad188771d073f0a1f
|
|
| BLAKE2b-256 |
a3b8ef8a7c4f69889bbd54ba5e16e60e59c55d00f2138d23770b0c447a835619
|
Provenance
The following attestation bundles were made for optout-0.1.0-py3-none-any.whl:
Publisher:
release.yml on Blake104/OptOut
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
optout-0.1.0-py3-none-any.whl -
Subject digest:
fbdf53c09feb7a2cd411a21e397480fb67a6f2b77c171fa56da81ca26bd24319 - Sigstore transparency entry: 1513236072
- Sigstore integration time:
-
Permalink:
Blake104/OptOut@3f6b55a5879cefa45b8f009c28e46243a4aca1dc -
Branch / Tag:
refs/tags/v0.1.0 - Owner: https://github.com/Blake104
-
Access:
private
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@3f6b55a5879cefa45b8f009c28e46243a4aca1dc -
Trigger Event:
push
-
Statement type: