curl, python3, a text editor, a CSV viewer or spreadsheet app, an email address you control, and access to each broker’s opt-out page or privacy contact. Record installed versions with the check commands below.A data broker is a company that collects and resells personal profiles. An opt-out is the broker’s process for stopping the sale or display of your data. This workflow is local-first: you keep the request text, confirmations, and verification output on your own machine.

curl and python3 installed. Check them before starting; do not assume a version.nano, vim, VS Code, or Notepad++.column command. If column is missing, use cat.If you are choosing consumer AI tools for this workflow, see AI tools for everyday people: what is actually useful.
Check the base tools:
curl --version
python3 --version
bash --version
Example output shape:
curl 8.x.x ...
Python 3.x.x
GNU bash, version 5.x.x ...
Your versions can differ. Save the output in ~/privacy-removal/tool-versions.txt so you can reproduce the workflow later.
What to do: Create a folder structure, a request log, and a short inventory of the personal data you want removed. Use one row per broker, not one row per data point.
mkdir -p ~/privacy-removal/{inbox,outbox,evidence}
cd ~/privacy-removal
printf 'broker,category,profile_url,request_date,request_id,status,next_check\n' > removal-log.csv
curl --version > tool-versions.txt
python3 --version >> tool-versions.txt
Create the inventory file:
cat > inventory.txt <<'EOF'
Full name: Alex Example
City: Example City
Emails: alex@example.com
Phone: +1-555-0100
Usernames: alex-example
Public profile URLs to check:
- https://<broker-domain>/profile/123
EOF
Replace every <...> value with the real value from the broker’s page or your own records. Keep the example row format:
broker,category,profile_url,request_date,request_id,status,next_check
Acme Data,people-search,https://<broker-domain>/profile/123,2025-01-15,ACME-12345,submitted,2025-02-14
Why: A local log prevents duplicate requests and gives you evidence if a profile reappears. The inventory keeps the minimum facts needed for a deletion request; do not collect more than the broker asks for.
How to check: Confirm the files exist and the CSV header is correct.
find . -maxdepth 2 -type f -print
head -1 removal-log.csv
Expected output:
./removal-log.csv
./inventory.txt
./tool-versions.txt
broker,category,profile_url,request_date,request_id,status,next_check

What to do: Create one reusable deletion-request template, render a broker-specific copy, submit it through the broker’s published channel, and log the request ID.
Create the template:
cd ~/privacy-removal
cat > deletion-request.txt <<'EOF'
To: <broker-privacy-contact>
Subject: Personal data deletion request - <full-name>
Broker: <broker-name>
Profile URL: <profile-url>
Requester: <full-name>
Contact email: <email>
Please delete the personal data associated with the profile above. If your organization requires a specific form or identity check, reply with the required channel and the request reference number.
Thank you,
<full-name>
EOF
Render an example request with Python’s standard library:
python3 - <<'PY'
from pathlib import Path
fields = {
"<broker-privacy-contact>": "privacy@acme-data.invalid",
"<full-name>": "Alex Example",
"<broker-name>": "Acme Data",
"<profile-url>": "https://acme-data.invalid/profile/123",
"<email>": "alex@example.com",
}
text = Path("deletion-request.txt").read_text()
for key, value in fields.items():
text = text.replace(key, value)
Path("outbox/request-acme.txt").write_text(text)
print("wrote outbox/request-acme.txt")
PY
Expected output:
wrote outbox/request-acme.txt
The .invalid domain is a reserved example domain. Replace it with the real broker contact and profile URL from the broker’s privacy page.
Submit the generated text through the broker’s opt-out form or privacy email. After submission, copy the confirmation into inbox/ and add the request ID to the CSV:
printf 'Acme Data,people-search,https://<broker-domain>/profile/123,2025-01-15,ACME-12345,submitted,2025-02-14\n' >> removal-log.csv
| Evidence | Local path | What it proves |
|---|---|---|
| Exact request text | `outbox/request-acme.txt` | What you sent and when |
| Broker confirmation | `inbox/acme-confirmation.eml` | Request ID and broker response |
| Public profile check | `evidence/acme-profile-check.html` | Whether the page was still reachable |
Why: A rendered copy proves the exact wording and recipient. A request ID is the reference you use in follow-ups. The table keeps evidence separate from your working notes.
How to check: Confirm that no placeholder remains and that the log row is present.
grep -q '<' outbox/request-acme.txt && echo "ERROR: placeholder remains" || echo "OK: no placeholders"
grep 'ACME-12345' removal-log.csv
Expected output:
OK: no placeholders
Acme Data,people-search,https://<broker-domain>/profile/123,2025-01-15,ACME-12345,submitted,2025-02-14
If you use an AI agent to draft replies or sort confirmations, apply the controls in AI agent security: protecting your data during automation.

What to do: Check the public profile URL, save the HTTP result, update the CSV status, and set a recheck date.
cd ~/privacy-removal
curl -L -s -o evidence/acme-profile-check.html -w '%{http_code}\n' 'https://<broker-domain>/profile/123'
Example result:
404
A 404 supports removal: the profile page is no longer reachable. A 200 means the page is still live. A 403 or 429 is inconclusive; open the URL manually in a private browser window and record what you see.
Update the log after verification:
python3 - <<'PY'
import csv
from pathlib import Path
p = Path("removal-log.csv")
rows = list(csv.DictReader(p.open()))
for row in rows:
if row["request_id"] == "ACME-12345":
row["status"] = "removed"
row["next_check"] = "2025-02-14"
with p.open("w", newline="") as f:
writer = csv.DictWriter(f, fieldnames=rows[0].keys())
writer.writeheader()
writer.writerows(rows)
print("updated")
PY
Expected output:
updated
Final checklist:
outbox/inbox/evidence/Why: Removal is not complete when the form is submitted. You need a public-page check and a dated follow-up because profiles can be recreated or relisted.
How to check: Confirm the status changed and the evidence file is not empty.
grep 'ACME-12345' removal-log.csv
wc -c evidence/acme-profile-check.html
Expected output shape:
Acme Data,people-search,https://<broker-domain>/profile/123,2025-01-15,ACME-12345,removed,2025-02-14
1234 evidence/acme-profile-check.html
The byte count will differ. A zero-byte file means the request produced no saved body; rerun curl without -s and inspect the error.
Problem. The verification command cannot resolve the broker host.
curl: (6) Could not resolve host: <broker-domain><broker-domain> with the exact host from the broker’s privacy page, then test DNS before rerunning the check:getent hosts <real-broker-domain>
curl -I 'https://<real-broker-domain>/'
Problem. The Python renderer cannot find the template.
python3: can't open file 'render_request.py': [Errno 2] No such file or directorycd ~/privacy-removal
ls -la
python3 - <<'PY'
from pathlib import Path
print(Path("deletion-request.txt").exists())
PY
Expected output:
True
Problem. The placeholder check reports an error.
ERROR: placeholder remains<...> fields in deletion-request.txt were not replaced before submission.grep -n '<' outbox/request-acme.txt
You now have a local evidence log, a tested request template, and a verification command. Next, replace the example broker with a real one, submit one request, and schedule the recheck date in your calendar.
Do I have to pay a data broker to delete my data?
Use the broker’s published free opt-out or privacy contact where one exists. If a broker offers a paid service, verify the price and terms on its own page before paying.
How long does a data broker deletion request take?
Deadlines vary by broker and jurisdiction. Check the broker’s privacy notice or confirmation email for the stated deadline; do not rely on a fixed number from another guide.
Can I remove a people-search profile without creating an account?
Many brokers provide a web form or privacy email that does not require a full account. If the form requires verification, use the minimum identity proof the broker documents and keep the confirmation.
Are local tools enough to keep my data removed?
Local tools give you a repeatable log and evidence, but they do not force a broker to act. You still need to submit each request through the broker’s channel and recheck the public profile on your scheduled date.