Ban Forensics Data Collection Checklist

Purpose: Exact data points to collect per banned account so the analysis model can determine which detection vectors triggered each ban. Target: Windows EC2 Hermes (has AdsPower, cookies, proxy, profile management tools) Scope: 5 banned accounts only — hailybarnes37, joycehicks2026, Key_Character6482, Ok_Bobcat9406, delilahmelendez30


Section A: Per-Account Comment History (CRITICAL — fetch first)

For each of the 5 banned accounts, collect ALL comments from Reddit’s public API.

Fetch Method

Endpoint: GET https://www.reddit.com/user/{username}/comments.json?limit=100&sort=new&raw_json=1
Paginate: Follow "after" cursor until no more results
Transport: curl via hailybarnes37's proxy (213.201.251.213:5407, user: tyzmousa, pass: rvutibqywubn)
Cookies: hailybarnes37's cookies (from AdsPower profile or rdt-cli credential.json)
Rate: 7+ second delay between every request
Account: Fetch ONE account per session

Data Points Per Comment

#FieldSourceAnalysis Purpose
A1comment_iddata.idUnique identifier, dedup
A2comment_bodydata.bodyFull text — check for question-back pattern, vagueness, AI tells
A3subredditdata.subredditSubreddit distribution, karma-farming cluster exposure
A4scoredata.scoreLow-score clusters = content not landing
A5created_utcdata.created_utcTimestamp for timing analysis
A6permalinkdata.permalinkCross-reference with ban messages, BotBouncer reports
A7parent_iddata.parent_idWas it top-level (t3_) or reply (t1_)?
A8is_top_levelDerived from A7Top-level vs reply pattern
A9gildeddata.gildedAwarded comments = high quality
A10controversialitydata.controversiality1 = upvoted AND downvoted significantly
A11editeddata.editedfalse/timestamp — did we edit? (human behavior)
A12distinguisheddata.distinguishedMod/admin distinguished (unlikely for our accounts)
A13num_reportsdata.num_reportsHow many users reported this comment (if visible)
A14removal_reasondata.removal_reasonIf removed, why?

Post Context (Fetch for each post our accounts commented on)

#FieldSourceAnalysis Purpose
A15post_titleFetch parent postDid our comment match the post’s topic/intent?
A16post_typeis_self, url, is_videoQuestion, discussion, image, link — did we match the type?
A17post_subredditdata.subredditSame as A3 but for cross-checking
A18post_scoredata.scoreDid we comment on high/low engagement posts?
A19post_num_commentsdata.num_commentsDid we target crowded or quiet threads?
A20post_authordata.authorDid we comment on our own swarm’s posts?

Derived Analysis Per Comment

#Derived FieldHow to ComputeAnalysis Purpose
A21ends_with_questionCheck if body ends with ”?”Question-back pattern detection
A22word_countlen(body.split())Length distribution per subreddit
A23has_specific_contentCheck for named items, numbers, specific referencesVagueness detection — does it name things?
A24is_vagueHeuristic: no specific nouns, no numbers, no personal anecdotesThe BotBouncer-reported pattern
A25has_question_backHeuristic: answer + question to communityThe exact reported pattern
A26ai_tell_phrasesCheck for “delve”, “tapestry”, “nuance”, “it’s important to remember”, “in conclusion”AI linguistic tells
A27time_of_dayConvert created_utc to account’s timezoneDoes activity match account’s timezone?
A28day_of_weekFrom created_utcWeekday vs weekend pattern
A29gap_from_prev_commentcreated_utc - prev_comment_created_utcAutomation detection — uniform gaps = bot

Section B: Per-Account Overview (Posts + Comments Combined)

Fetch Method

Endpoint: GET https://www.reddit.com/user/{username}/overview.json?limit=100&sort=new&raw_json=1
Paginate: Follow "after" cursor
Same transport/cookies/rate limits as Section A

Data Points

#FieldSourceAnalysis Purpose
B1All fields from Section A (for comments)SameSame
B2post_title (for submissions)data.titleWhat did we post?
B3post_bodydata.selftextFull post text
B4post_urldata.urlLink posts — what domains did we link?
B5is_self_postdata.is_selfText vs link post ratio
B6post_scoredata.scorePost performance

Section C: Account Profile (About)

Fetch Method

Endpoint: GET https://www.reddit.com/user/{username}/about.json?raw_json=1
Transport: Same proxy, logged-out (no cookies) for comparison, then logged-in (with cookies) for comparison

Data Points

#FieldSourceAnalysis Purpose
C1total_karmadata.total_karmaAccount karma at time of fetch
C2link_karmadata.link_karmaPost karma vs comment karma ratio
C3comment_karmadata.comment_karmaComment-specific karma
C4account_created_utcdata.created_utcAccount age
C5is_suspendeddata.is_suspendedCheck if Reddit shows suspension flag
C6is_verifieddata.is_verifiedEmail verification status
C7has_verified_emaildata.has_verified_emailEmail verification (CQS factor)
C8is_golddata.is_goldPremium status
C9is_moddata.is_modModerator status (unlikely)
C10subredditdata.subreddit.titleUser profile subreddit name
C11verifieddata.verifiedVerification status

Logged-Out vs Logged-In Comparison

#ComparisonWhy
C12Fetch about.json logged-out (no cookies) via proxySee what others see — if profile shows “suspended” or 404
C13Fetch about.json logged-in (with hailybarnes37 cookies)See what the account sees — banned accounts may see themselves as normal
C14Compare C12 vs C13If logged-in shows normal but logged-out shows suspended = shadowban/suspension

Section D: BotBouncer Evidence (Already Collected — Verify Completeness)

Already Done ✅

  • Per-username search on r/BotBouncer for all 5 accounts
  • Fetched full post + comment content for 3 known BotBouncer posts
  • Fetched the offending comment for hailybarnes37 (surviving)

Still Needed

#Data PointHow to GetPurpose
D1Check if joycehicks2026 has a BotBouncer postSearch not found — try Google: site:reddit.com/r/BotBouncer "joycehicks2026"May exist but not via Reddit search
D2Check if Key_Character6482 has a BotBouncer postSame Google search methodSame
D3Check if Ok_Bobcat9406 has a BotBouncer postSame Google search methodSame
D4Check r/BotBouncer wiki for list of participating subredditsFetch https://www.reddit.com/r/BotBouncer/wiki/indexKnow which subs have BotBouncer installed
D5Fetch BotBouncer source: karmaFarmingSubsCheck.tshttps://github.com/fsvreddit/bot-bouncer/blob/main/src/karmaFarmingSubsCheck.tsGet the actual list of subs BotBouncer considers karma-farming
D6Fetch BotBouncer source: aiAnalysis/ directoryhttps://github.com/fsvreddit/bot-bouncer/tree/main/src/aiAnalysisUnderstand what AI patterns BotBouncer checks for

Section E: Subreddit Ban Messages (from our monitoring pipeline)

From reddit_metrics.db (if accessible on Windows EC2)

#Data PointTablePurpose
E1All subreddit bans per accountbans tableWhich subs banned each account, when, and why
E2Ban message bodybans.ban_bodyThe actual ban reason text from mods
E3Offending comment permalinkbans.comment_permalinkLink to the specific comment that triggered the ban
E4Ban status (pending/accepted)bans.statusWhether the ban was accepted or appealed

From profile-registry.json (already have partial data)

#Data PointPathPurpose
E5karma_history snapshotsreddit.karma_historyKarma trajectory over time
E6today_commentsreddit.today_commentsRecent comments with body_preview
E7account statusprofile.statusactive/suspended/shadowbanned
E8account creation datereddit.account_createdAccount age

Section F: Timing & Behavioral Pattern Analysis

Compute From Section A Data

#AnalysisHow to ComputePurpose
F1Comments per dayGroup by date(created_utc)Burst detection — 13/day is suspicious
F2Comments per hourGroup by hour(created_utc)Activity time distribution
F3Active hours vs account timezoneCompare F2 to account TZDoes activity match the account’s supposed timezone?
F4Day-of-week distributionGroup by weekdayAutomation = uniform; human = weekend-heavy or weekday-heavy
F5Inter-comment gapsSort by created_utc, compute deltasUniform gaps (e.g. 7min) = automation; random = human
F6Subreddit rotation orderSequence of subreddits commented inSame order each session = bot pattern
F7Comment length distributionword_count per commentAll similar length = templated; varied = human
F8Score distributionScore per comment per subredditLow scores across the board = content not landing
F9Question-ending rate% of comments ending with ”?” per subredditQuestion-back pattern rate
F10Vagueness rate% of comments flagged as vague (A24)The BotBouncer-reported pattern
F11Reply thread depthCheck if any comments have child repliesFire-and-forget vs genuine conversation
F12Deleted comment detectionGaps in comment_id sequenceDouble-comments that were deleted

Section G: Cross-Account Correlation (Needs All 5 Accounts’ Data)

Compute After All Accounts Are Fetched

#AnalysisHow to ComputePurpose
G1Subreddit overlap matrixFor each pair of accounts, count shared subredditsHigh overlap = coordinated farming
G2Timing correlationFor each pair, check if comments are within same time windowSame-session activity = coordination
G3Comment similarity (cross-account)Pairwise comparison of comment bodiesSame AI prompt → similar comments
G4Swarm participation overlapCross-reference with swarm_campaigns/swarm_actionsWhich accounts acted on same posts
G5IP/proxy sharing matrixFor each pair, check if they shared IP/proxyIP correlation = account linking
G6Account creation cohortGroup by creation dateMarch cohort vs June cohort ban rate
G7Karma trajectory comparisonPlot karma over time for all 5Banned vs safe trajectory differences
G8Comment style fingerprintStructural analysis: opener pattern, sentence structure, vocabularySame prompt = same style fingerprint

Section H: CQS (Contributor Quality Score)

Fetch Method

For each banned account (if still able to post):
1. Visit r/WhatIsMyCQS
2. Create a new post with the word "test"
3. Bot responds with the account's current CQS tier

NOTE: Banned accounts cannot post. This check should be done on ACTIVE accounts only.
For banned accounts, CQS is unknowable post-ban — but if we have pre-ban CQS data in the DB, use that.
#Data PointHow to GetPurpose
H1Pre-ban CQS (if logged)Check reddit_metrics.db for CQS fieldWas CQS already declining before ban?
H2Current CQS for active accountsr/WhatIsMyCQS test postCheck if active accounts are also at risk

Section I: Browser Fingerprint & Proxy Data (From AdsPower)

From AdsPower Profile API

#Data PointSourcePurpose
I1Canvas fingerprintAdsPower profile configCheck for fingerprint sharing across accounts
I2WebGL rendererAdsPower profile configSame
I3Font listAdsPower profile configSame
I4Screen resolutionAdsPower profile configSame
I5TimezoneAdsPower profile configShould match account’s assigned timezone
I6User agentAdsPower profile configShould be consistent per profile
I7Proxy IP assignedAdsPower profile configMatch against BAN-PATTERN-HANDOFF IPs
I8Proxy typeAdsPower profile configWebshare vs Decodo
I9Profile creation dateAdsPower APIWhen was the profile created?
I10Proxy change historyAdsPower API or logsHas the proxy ever been changed? (IP change = fingerprint shift)

Section J: Swarm Campaign Data (If Available)

From reddit_metrics.db

#Data PointTablePurpose
J1All swarm campaignsswarm_campaignsWhat campaigns were run?
J2Actions per campaignswarm_actionsWhich accounts did what in each campaign?
J3Target post per campaignswarm_campaigns.target_postWhat post was targeted?
J4Action timingswarm_actions.timestampWere actions within a tight time window?
J5Action typeswarm_actions.actionupvote, comment, etc.
J6Playbook usedswarm_campaigns.playbookWhich playbook template was used?

Section K: Account Creation Data (If Available)

#Data PointHow to GetPurpose
K1Creation dateabout.jsoncreated_utcAlready in profile-registry
K2Creation IPAdsPower profile creation logsCheck for batch creation from same IP
K3Creation browser fingerprintAdsPower profile creation logsCheck for shared fingerprints at creation
K4Email used for registrationAdsPower profile notes or Reddit account settingsCheck for email pattern similarity
K5Username patternVisual inspection”Adjective_Noun_Number” pattern across accounts
K6Verified email statusabout.jsonhas_verified_emailCQS factor, unverified = lower CQS

Output Format

Consolidated Data File

{
  "metadata": {
    "collection_date": "2026-08-12",
    "accounts_analyzed": ["hailybarnes37", "joycehicks2026", "Key_Character6482", "Ok_Bobcat9406", "delilahmelendez30"],
    "data_source": "Reddit JSON API via hailybarnes37 proxy + AdsPower API + reddit_metrics.db",
    "transport": "curl via 213.201.251.213:5407 (Webshare AEST)",
    "rate_limit": "7+ second delay between requests"
  },
  "accounts": {
    "hailybarnes37": {
      "profile": { ... Section C ... },
      "comments": [ ... Section A ... ],
      "overview": [ ... Section B ... ],
      "botbouncer": { ... Section D ... },
      "subreddit_bans": [ ... Section E ... ],
      "timing_analysis": { ... Section F ... },
      "fingerprint": { ... Section I ... },
      "swarm_data": { ... Section J ... },
      "creation_data": { ... Section K ... }
    },
    ...
  },
  "cross_account_analysis": { ... Section G ... }
}

Analysis Prompt

A model-agnostic ANALYSIS_PROMPT.md will be generated after data collection, asking the analysis model to:

  1. Rank detection vectors by severity for each account
  2. Identify the most likely primary trigger for each ban
  3. Identify shared patterns across all 5 banned accounts
  4. Compare banned vs active accounts on each vector
  5. Produce actionable recommendations for preventing future bans

Fetching Priority

PrioritySectionWhy First
P0 (Critical)Section A — Comment HistoryCore data for all analysis
P0 (Critical)Section C — Account Profile (logged-out)Confirms ban status
P1 (High)Section E — Subreddit Bans (from DB)Links bans to specific comments
P1 (High)Section D5-D6 — BotBouncer source codeGet actual karma-farming sub list
P2 (Medium)Section B — OverviewPost history context
P2 (Medium)Section I — Fingerprint dataCheck fingerprint sharing
P2 (Medium)Section J — Swarm dataCheck coordination patterns
P3 (Lower)Section G — Cross-account analysisComputed after all accounts fetched
P3 (Lower)Section H — CQSActive accounts only (banned can’t be checked)
P3 (Lower)Section K — Creation dataMay not be available