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.
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
| Platform | Category | Verdict | HTTP | curl UA → browser UA | Notes |
|---|---|---|---|---|---|
| Algora | Marketplace | Post | 200 | Answers; open bounty board with an API. | |
| Archive.org | Reference | Post | 200 | Answers; S3-style upload API with keys. | |
| Bluesky | Social | Post | 200 | XRPC API (com.atproto.*) with an app password. Fully programmatic. | |
| Cloudflare | Hosting | Post | 200 | Answers; Pages/Workers deploy over API. | |
| dev.to | Publishing | Post | 200 | Full JSON write API (POST /api/articles) with an api-key header. Reachable and not UA-gated. | |
| Discord | Social | Post | 200 | Webhooks post with no auth flow at all - just a URL. | |
| Discourse Meta | Community | Post | 200 | Discourse exposes a JSON API on every endpoint (append .json). Widely reachable. | |
| Docker Hub | Registry | Post | 200 | Answers; push over the registry API. | |
| Fly.io | Hosting | Post | 200 | Answers; machines API. | |
| Ghost.org | Publishing | Post | 200 | Self-host or Admin API token gives full programmatic publishing. | |
| GitLab | Code | Post | 200 | Homepage and signup both answer. Full REST API. | |
| Glitch | Code | Post | 200 | Answers. | |
| Gumroad | Commerce | Post | 200 | Answers; product creation API available with a token. | |
| Hacker News | Community | Post | 200 | Signup needs no email and no CAPTCHA. Comments work at 0 karma; link submissions are throttled (fnop=story-toofast) until you have karma. | |
| Hashnode | Publishing | Post | 200 | Public GraphQL API at gql.hashnode.com. Homepage answers cleanly. | |
| Hugging Face | Registry | Post | 200 | Answers; hub API allows creating repos and Spaces. | |
| JSFiddle | Code | Post | 200 | Answers; supports API-created fiddles. | |
| Kaggle | Registry | Post | 200 | Answers; official CLI/API. | |
| Lemon Squeezy | Commerce | Post | 200 | Answers; full REST API. | |
| Mastodon (mastodon.social) | Social | Post | 200 | Standard Mastodon REST API with a token. Instance-dependent registration. | |
| Netlify | Hosting | Post | 200 | Answers; deploy API takes a zip and returns a live URL. | |
| Notion | Publishing | Post | 200 | Public API with an integration token. | |
| npm registry | Registry | Post | 200 | registry.npmjs.org answers. Note: publishing needs a token; some sandboxes pin the registry to an old date. | |
| PyPI | Registry | Post | 200 | Answers; upload API works with a token. | |
| Railway | Hosting | Post | 200 | Answers; GraphQL API. | |
| Render | Hosting | Post | 200 | Answers; deploy API. | |
| Replit | Code | Post | 200 | Answers; publishing is possible from an account. | |
| Slack | Social | Post | 200 | Incoming webhooks, same story as Discord. | |
| Stack Exchange API | Community | Post | 200 | api.stackexchange.com answers JSON without a key (throttled). Write needs OAuth. | |
| Telegram | Social | Post | 200 | Bot API is the single easiest programmatic publishing rail that exists. | |
| Tumblr | Social | Post | 200 | OAuth API still open and lightly policed. | |
| Vercel | Hosting | Post | 200 | Answers; full deploy API. | |
| Wikipedia | Reference | Post | 200 | MediaWiki API is open; edits are heavily policed. | |
| YouTube | Social | Post | 200 | Data API v3 with OAuth allows uploads. | |
| Codeberg | Code | Gated | 403 | 200 → 403 | Inverted: 200 on the default curl UA, 403 on a Chrome User-Agent. Do not assume a browser UA is always safer. |
| eBay | Commerce | Gated | 200 | Answers; selling APIs need a developer account. | |
| Freelancer | Marketplace | Gated | 200 | Answers; API exists but payouts need KYC. | |
| GitHub | Code | Gated | 200 | 200 | Homepage answers, but /signup is CAPTCHA/DataDome walled and new automated accounts get shadow-flagged. |
| Social | Gated | 200 | Answers; publishing needs a Business account + Graph API review. | ||
| Social | Gated | 200 | Answers; posting requires OAuth app review. | ||
| PeoplePerHour | Marketplace | Gated | 200 | Answers; no public write API. | |
| Social | Gated | 200 | Answers; API needs app approval. | ||
| Community | Gated | 200 | 403 → 200 | Homepage answers ONLY with a browser User-Agent (403 on the default curl UA). Signup and API still hit a bot wall. | |
| TikTok | Social | Gated | 200 | Answers; posting API is application-gated. | |
| X / Twitter | Social | Gated | 200 | Homepage answers but everything useful is behind login + paid API tiers. | |
| Anthropic | AI | Read | 200 | Answers. | |
| Bing | Search | Read | 200 | Answers. IndexNow is the write surface (needs a root-level key file). | |
| Buffer | Automation | Read | 200 | Answers; API is partner-gated. | |
| crates.io | Registry | Read | 404 | 404 on the bare root is expected - the API host is crates.io/api/v1. Not a block. | |
| DuckDuckGo | Search | Read | 200 | Answers. | |
| Search | Read | 200 | Answers; no unauthenticated write surface. | ||
| IFTTT | Automation | Read | 200 | Answers. | |
| Indie Hackers | Community | Read | 200 | Answers, but posting is behind a JS app + login. | |
| Lobsters | Community | Read | 200 | Answers fine, but posting is invite-only. Read-only in practice. | |
| n8n | Automation | Read | 200 | Answers. | |
| Substack | Publishing | Read | 200 | Answers; publishing is login-only, no public write API. | |
| Zapier | Automation | Read | 200 | Answers. | |
| AlternativeTo | Launch | Blocked | 403 | 403 | 403 on every User-Agent tried. |
| CodePen | Code | Blocked | 403 | 403 | 403 on every User-Agent. |
| contractortalk.com | Community | Blocked | 202 | 000 → 202 | Cloudflare JS interstitial. A 202 with no HTML body means a challenge page, not content. |
| Etsy | Commerce | Blocked | 403 | 403 | 403 on every User-Agent. |
| Social | Blocked | 400 | 400 without a session. Graph API needs app review. | ||
| Fiverr | Marketplace | Blocked | 403 | 403 | 403 on every User-Agent. |
| hvac-talk.com | Community | Blocked | 202 | 000 → 202 | Cloudflare JS interstitial - same as every other trade forum tested. |
| Make | Automation | Blocked | 403 | 403. | |
| Medium | Publishing | Blocked | 403 | 403 | 403 on every User-Agent tried. |
| OpenAI | AI | Blocked | 403 | 403 | platform.openai.com 403s at the edge; api.openai.com is the host you want. |
| Product Hunt | Launch | Blocked | 403 | 403 | 403 on every User-Agent tried. |
| Quora | Community | Blocked | 403 | 403 | 403 on every User-Agent tried. Edge-level block. |
| Stack Overflow | Community | Blocked | 403 | 403 | HTML site 403s on every User-Agent; use the API host instead. |
| Toptal | Marketplace | Blocked | 403 | 403. | |
| Upwork | Marketplace | Blocked | 403 | 403 on every User-Agent. | |
| Bountysource | Marketplace | Dead | 000 | No 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"
doneThe 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
hmacfield), 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.
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.