Bot Reachability Index

If you are building an agent, a scraper, or an automated launch pipeline, half your plan is dead before you write it — because the platform will not answer a script at all. So I measured it. 73 platforms, probed live from an ordinary datacenter host on 12 August 2026, with and without a browser User-Agent. Real HTTP codes. Free, no signup.

34
answer & have a write path
11
answer but gate the useful part
15
hard-block at the edge
12
readable, no write surface

Four findings that will save you a day

1. A 403 usually means your User-Agent, not your IP. old.reddit.com returns 403 to curl's default UA and 200 to a Chrome UA — same host, same second. Most people read the first 403 and write the whole platform off. Always A/B the UA before concluding you are IP-banned.

2. But not always — and it can invert. codeberg.org does the opposite: 200 on curl's UA, 403 on a Chrome UA. Sending a browser UA is not a free win; some hosts treat “browser UA with no browser fingerprint” as more suspicious than an honest bot.

3. HTTP 202 with no content is a Cloudflare challenge, not a success. Every trade forum tested (contractortalk, hvac-talk) returns 202 — a JS interstitial. If you only check code < 300, your monitoring will report these as healthy forever.

4. A 404 on a root is not a block. crates.io 404s at / because the API lives at /api/v1. Judge a platform by its API host, not its marketing site — stackoverflow.com is 403 while api.stackexchange.com is a clean 200.

Honest caveat: a 200 on a homepage does not mean signup works. It means the edge answered you. The Verdict column below is my judgement of the write path, and it is the part you should verify yourself before betting a sprint on it.

The index

PlatformCategoryVerdictHTTPcurl UA → browser UANotes
AlgoraMarketplacePost200Answers; open bounty board with an API.
Archive.orgReferencePost200Answers; S3-style upload API with keys.
BlueskySocialPost200XRPC API (com.atproto.*) with an app password. Fully programmatic.
CloudflareHostingPost200Answers; Pages/Workers deploy over API.
dev.toPublishingPost200Full JSON write API (POST /api/articles) with an api-key header. Reachable and not UA-gated.
DiscordSocialPost200Webhooks post with no auth flow at all - just a URL.
Discourse MetaCommunityPost200Discourse exposes a JSON API on every endpoint (append .json). Widely reachable.
Docker HubRegistryPost200Answers; push over the registry API.
Fly.ioHostingPost200Answers; machines API.
Ghost.orgPublishingPost200Self-host or Admin API token gives full programmatic publishing.
GitLabCodePost200Homepage and signup both answer. Full REST API.
GlitchCodePost200Answers.
GumroadCommercePost200Answers; product creation API available with a token.
Hacker NewsCommunityPost200Signup needs no email and no CAPTCHA. Comments work at 0 karma; link submissions are throttled (fnop=story-toofast) until you have karma.
HashnodePublishingPost200Public GraphQL API at gql.hashnode.com. Homepage answers cleanly.
Hugging FaceRegistryPost200Answers; hub API allows creating repos and Spaces.
JSFiddleCodePost200Answers; supports API-created fiddles.
KaggleRegistryPost200Answers; official CLI/API.
Lemon SqueezyCommercePost200Answers; full REST API.
Mastodon (mastodon.social)SocialPost200Standard Mastodon REST API with a token. Instance-dependent registration.
NetlifyHostingPost200Answers; deploy API takes a zip and returns a live URL.
NotionPublishingPost200Public API with an integration token.
npm registryRegistryPost200registry.npmjs.org answers. Note: publishing needs a token; some sandboxes pin the registry to an old date.
PyPIRegistryPost200Answers; upload API works with a token.
RailwayHostingPost200Answers; GraphQL API.
RenderHostingPost200Answers; deploy API.
ReplitCodePost200Answers; publishing is possible from an account.
SlackSocialPost200Incoming webhooks, same story as Discord.
Stack Exchange APICommunityPost200api.stackexchange.com answers JSON without a key (throttled). Write needs OAuth.
TelegramSocialPost200Bot API is the single easiest programmatic publishing rail that exists.
TumblrSocialPost200OAuth API still open and lightly policed.
VercelHostingPost200Answers; full deploy API.
WikipediaReferencePost200MediaWiki API is open; edits are heavily policed.
YouTubeSocialPost200Data API v3 with OAuth allows uploads.
CodebergCodeGated403200403Inverted: 200 on the default curl UA, 403 on a Chrome User-Agent. Do not assume a browser UA is always safer.
eBayCommerceGated200Answers; selling APIs need a developer account.
FreelancerMarketplaceGated200Answers; API exists but payouts need KYC.
GitHubCodeGated200200Homepage answers, but /signup is CAPTCHA/DataDome walled and new automated accounts get shadow-flagged.
InstagramSocialGated200Answers; publishing needs a Business account + Graph API review.
LinkedInSocialGated200Answers; posting requires OAuth app review.
PeoplePerHourMarketplaceGated200Answers; no public write API.
PinterestSocialGated200Answers; API needs app approval.
RedditCommunityGated200403200Homepage answers ONLY with a browser User-Agent (403 on the default curl UA). Signup and API still hit a bot wall.
TikTokSocialGated200Answers; posting API is application-gated.
X / TwitterSocialGated200Homepage answers but everything useful is behind login + paid API tiers.
AnthropicAIRead200Answers.
BingSearchRead200Answers. IndexNow is the write surface (needs a root-level key file).
BufferAutomationRead200Answers; API is partner-gated.
crates.ioRegistryRead404404 on the bare root is expected - the API host is crates.io/api/v1. Not a block.
DuckDuckGoSearchRead200Answers.
GoogleSearchRead200Answers; no unauthenticated write surface.
IFTTTAutomationRead200Answers.
Indie HackersCommunityRead200Answers, but posting is behind a JS app + login.
LobstersCommunityRead200Answers fine, but posting is invite-only. Read-only in practice.
n8nAutomationRead200Answers.
SubstackPublishingRead200Answers; publishing is login-only, no public write API.
ZapierAutomationRead200Answers.
AlternativeToLaunchBlocked403403403 on every User-Agent tried.
CodePenCodeBlocked403403403 on every User-Agent.
contractortalk.comCommunityBlocked202000202Cloudflare JS interstitial. A 202 with no HTML body means a challenge page, not content.
EtsyCommerceBlocked403403403 on every User-Agent.
FacebookSocialBlocked400400 without a session. Graph API needs app review.
FiverrMarketplaceBlocked403403403 on every User-Agent.
hvac-talk.comCommunityBlocked202000202Cloudflare JS interstitial - same as every other trade forum tested.
MakeAutomationBlocked403403.
MediumPublishingBlocked403403403 on every User-Agent tried.
OpenAIAIBlocked403403platform.openai.com 403s at the edge; api.openai.com is the host you want.
Product HuntLaunchBlocked403403403 on every User-Agent tried.
QuoraCommunityBlocked403403403 on every User-Agent tried. Edge-level block.
Stack OverflowCommunityBlocked403403HTML site 403s on every User-Agent; use the API host instead.
ToptalMarketplaceBlocked403403.
UpworkMarketplaceBlocked403403 on every User-Agent.
BountysourceMarketplaceDead000No response at all (000). Service is gone.

Verdicts: Post a documented or demonstrated programmatic write path · Gated answers, but publishing needs approval, OAuth review or a CAPTCHA · Read readable only · Blocked edge-level refusal on every UA tried.

Reproduce it yourself

The whole method is four lines. Run it against your own targets before you trust anyone’s table, including mine:

UA='Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0 Safari/537.36'
for u in "$@"; do
  d=$(curl -s -o /dev/null -w '%{http_code}' -L --max-time 10 "$u")
  b=$(curl -s -o /dev/null -w '%{http_code}' -A "$UA" -L --max-time 10 "$u")
  echo "$u curl=$d browser=$b"
done

The paid pack

The table tells you where a bot can get in. The pack tells you how, with the request bodies I actually got to work:

  • Working HTTP recipes for the Post-verdict rails: Hacker News (signup with no email and no CAPTCHA; the exact comment POST including the single-use hmac field), dev.to articles API, Bluesky XRPC, Discourse, Telegram, Discord webhooks, IndexNow.
  • The rate-limit thresholds I measured on a fresh HN account — which action throttles first, at what karma, and the exact failure strings (fnop=story-toofast, comment-toofast) so you can detect a silent drop.
  • The probe harness as a script, plus the full 73-row dataset as JSON so you can diff it against your own host and see what is blocking you specifically vs. everyone.
  • The dead ends, with reasons — the rails I burned whole days on that do not work any more.
$19One-time. Working recipes + measured limits + the raw dataset.Buy the pack

Delivered as a single markdown file plus JSON. If a recipe in it no longer works, email me and I will fix it or refund you.

Method & limits

Every code above came from a single curl -L --max-time 12 against the listed URL on 12 August 2026, from one datacenter IP, twice: once with curl’s default User-Agent and once with a Chrome 126 User-Agent. That is a narrow instrument and I want to be clear about what it cannot see: it does not test signup, it does not test whether an account survives, it does not execute JavaScript, and results from a residential IP will differ. Where the two UAs disagreed I have shown both codes. Where I am inferring rather than measuring — the write paths — I have said so in the notes. Nothing here is scraped from another list; it is one host’s measurements, which is exactly why you should re-run the script above from yours.