V2EX API & Scraper
The V2EX API returns topics, replies, members and nodes from China's biggest developer community as clean JSON — no login, no token and no China exit required.
🤖 Using an AI assistant? Copy this link into ChatGPT / Claude / Cursor — it reads every endpoint and parameter instantly and tells you if this API fits your use case.
The primary search endpoint runs full-text search across V2EX topics and returns id, title, the full post body, url, the node it belongs to (id, name, Chinese and English titles), the author, reply_count, created_at and the matching snippets. You can also pull latest and hot topics, page one node with node_topics, expand a single topic with its reply thread, read a member profile with their user_topics, and browse the node taxonomy — the live nodes action reports 1,364 nodes. It suits developer-sentiment research, Chinese tech-market monitoring and training-set collection. One ReefAPI key, one shared credit pool, the standard envelope.
V2EX node slugs and their numeric ids
Almost every action here is scoped by a node, the sub-forum slug, and the search index stores nodes as bare numeric ids. These pairs are what you need to move between the two. Each row was read live on 2026-08-27 from the response that returned it.
| node slug | Title (Chinese / English) | node id | Measured on 2026-08-27 |
|---|---|---|---|
| qna | 问与答 / Questions and Answers | 12 | 241,092 topics, 4,511 subscribers, parent node v2ex |
| jobs | 酷工作 / Jobs | 43 | 60,700 topics, 6,539 subscribers, no parent node |
| programmer | 程序员 / Programmer | 300 | Read from the node block of topic 1236386 |
| all4all | 二手交易 / All for All | 69 | Read from the node block of a search hit |
| promotions | 推广 / Promotions | 864 | Read from the node block of a search hit |
The directory holds 1,364 nodes in total. nodes with a name returns exactly one for roughly 650 bytes; nodes with a query searches slug, Chinese title and English title together. Every timestamp comes back twice: created_at as Unix epoch seconds (1787750719) and created_at_iso as UTC (2026-08-26T13:25:19Z), same for last_touched_at and joined_at. meta.rate_limit passes V2EX's own budget straight through, with x-rate-limit-limit 600, the remaining count, and an epoch reset.
Real request and response JSON
Captured from the indexed primary action, search, on .
{
"method": "POST",
"url": "https://api.reefapi.com/v2ex/v1/search",
"headers": {
"x-api-key": "$REEF_KEY",
"content-type": "application/json"
},
"body": {
"q": "爬虫",
"limit": 10
}
}{
"ok": true,
"meta": {
"api": "v2ex",
"endpoint": "search",
"mode": "live",
"latency_ms": 2489.1,
"record_count": 10,
"bytes": 828296,
"cache_hit": false,
"stop_reason": "limit_reached",
"index": "sov2ex",
"match_is_loose_upstream": true,
"node_names_resolved": true,
"charged_credits": 1,
"version": "1.0.0"
},
"data": {
"topics": [
{
"id": 1244213,
"source": "v2ex",
"title": "[求职/远程] Python 后端, 8 年开发经验,主 Python / Go,找长期稳定远程工作",
"content": "大家好,在下目前常驻河北,没有在职约束,可以尽快开始。\n\n想找一份长期稳定的远程后端工作。国内远程优先,英语团队也愿意尝试;全职优先,长期稳定的 Contract / 项目合作也可以聊。\n\n对 title 没有太强执念,更看重实际工作内容、相对正常的作息,以及团队是否适合长期合作。\n\n关于我\n\n做后端大约 8 年,主要使用 Python ,也有 Go 的生产项目经验。\n\n我的定位不偏算法、ML 、DBA 或 DevOps ,比较擅长的是:\n\n拿到一个后端需求后,从接口 / 系统设计一路推进到开发、集成、部署和实际上线。\n\n之前的一些工作经历:\n\n讯飞未来:独立负责过耳机 Voice Double 声音克隆功能的后端交付,使用 FastAPI + WebSocket 做流式 TTS 服务,包括模型服务、Redis 、ELK 、Nginx 等,生产环境支持 20 QPS 。\n字节跳动:做过 Python CDN 根因分析服务,以及 Go CDN 供应商管理平台,涉及采购、报表、故障流程、RBAC 、多租户等。\n爱奇艺 / 神州优车 / 更早的工作经历:做过 Serverless 工作流、爬虫任务平台、Python API 、Django 工作流引擎等生产系统。\n\n2024 年底离开上一份全职工作后,主要在做一些独立软件项目和 AI 辅助开发实践,期间没有全职任职。现在希望重新回到一份长",
"url": "https://www.v2ex.com/t/1244213",
"node": {
"id": 507,
"name": "cv",
"title": "求职",
"title_en": "CV",
"url": "https://www.v2ex.com/go/cv"
},
"author": {
"username": "MCTW",
"url": "https://www.v2ex.com/u/MCTW"
},
"reply_count": 0,
"created_at": 1790137044,
"created_at_iso": "2026-09-23T04:17:24Z",
"match_snippets": [
"奇艺 / 神州优车 / 更早的工作经历:做过 Serverless 工作流、爬虫任务平台、Python API 、Django 工作流引擎等生产系统"
],
"score": null
},
{
"id": 1244182,
"source": "v2ex",
"title": "9HTTP|试用 500M,动态住宅 7 折 / 长效静态 7 折 / 无限住宅",
"content": "## 9HTTP 试用说明\n\n注册即可**免费试用 500MB**,有需要的可以先测试一下再决定。\n\n👉 [9HTTP 官网,免费试用]( https://www.9http.com/?ref=v2ex)\n\n购买时输入优惠码即可享受折扣。\n\n有问题也可以联系:\nhttps://t.me/gz_9http\n\n## 核心资源指标\n\n- IP 池规模:**9000 万 + 真实住宅 IP**\n- 覆盖:**195 + 国家 / 地区**,支持国家、州、城市、ASN 多级定向\n- 平均响应:< 500ms ,服务可用性 99.9%\n- 协议:HTTP/HTTPS/ SOCKS5 ,API 、账密认证、白名单多种接入,快速集成爬虫、自动化框架。\n\n## 产品线\n\n### 1 、动态住宅代理( 7 折)\n\n真实家庭 IP ,支持自动轮换 + Sticky 粘性会话,按流量计费。\n\n- 适合:公开网页采集、SERP 抓取、价格监控、广告验证、短期自动化任务\n\n### 2 、长效静态 ISP 代理( 7 折)\n\n独享 ISP 固定 IP ,无限会话保持,城市级定位,企业 SLA 保障。\n\n- 适合:社媒账号矩阵、长期业务、需要固定 IP 的业务场景,降低风控关联风险\n\n### 3 、无限住宅代理\n\n**无限流量套餐**,真实动态住宅 IP ,自定义带宽、专用代理服务器。\n\n- 适合 AI 模型训",
"url": "https://www.v2ex.com/t/1244182",
"node": {
"id": 864,
"name": "promotions",
"title": "推广",
"title_en": "Promotions",
"url": "https://www.v2ex.com/go/promotions"
},
"author": {
"username": "9HTTP",
"url": "https://www.v2ex.com/u/9HTTP"
},
"reply_count": 0,
"created_at": 1790133106,
"created_at_iso": "2026-09-23T03:11:46Z",
"match_snippets": [
"、白名单多种接入,快速集成爬虫、自动化框架。\n\n## 产品线\n\n### 1 、动态住宅代理( 7 折)\n\n真实家庭 IP ,支持自动轮换 + Sticky"
],
"score": null
},
{
"id": 1244119,
"source": "v2ex",
"title": "[🎁] ZooProxy 住宅代理 ✅稳定、便宜、适合爬虫和跨境",
"content": "免费试用,覆盖 195 + 国家和地区。每日动态更新 IP 池,确保节点纯净度与匿名性。为大规模数据采集业务提供可靠选择。覆盖全球地区,精准数据获取,安全高效增长,全球纯净住宅 IP 稳定可靠。\n\n🚀 高性能保障\n- √ 高品质原生住宅 IP 池\n- √ 99.92%网络可用率,7×24 小时长期在线\n- √ 平均响应速度< 0.5 秒\n- √ 500 线程高并发失败率仅约 0.12%\n- √ 高峰期延迟波动涨幅不足 20%\n\n💰 价格优惠透明\n- → 动态住宅 IP 低至 **$0.38/GB**\n- → 静态 ISP 独享 IP 低至 **$0.9/IP**\n- → 无限流量端口低至 **$0.38/端口/天**\n- → 新用户可享免费试用额度\n- → 流量不过期,用不完自动结转,绝不浪费\n\n✅使用场景\n- 数据采集、爬虫\n- 跨境电商、社媒多账号\n- 企业级持续采集\n- 网站本地化测试\n\n🎁200MB 动态住宅流量兑换码领取方式\n\n[点击注册]( https://zooproxy.com/?kwd=zsy-v2ex)👉留言邮箱👉充值到账号",
"url": "https://www.v2ex.com/t/1244119",
"node": {
"id": 864,
"name": "promotions",
"title": "推广",
"title_en": "Promotions",
"url": "https://www.v2ex.com/go/promotions"
},
"author": {
"username": "0livia",
"url": "https://www.v2ex.com/u/0livia"
},
"reply_count": 0,
"created_at": 1790126535,
"created_at_iso": "2026-09-23T01:22:15Z",
"match_snippets": [
"[🎁] ZooProxy 住宅代理 ✅稳定、便宜、适合爬虫和跨境",
"/端口/天**\n- → 新用户可享免费试用额度\n- → 流量不过期,用不完自动结转,绝不浪费\n\n✅使用场景\n- 数据采集、爬虫\n- 跨境电商、社媒多"
],
"score": null
}
],
"total_matches_upstream": 12889,
"returned": 10,
"offset": 0,
"query": "爬虫",
"match": "any",
"source": "v2ex"
}
}What the V2EX API does
| Action | Description | Concrete use case | Key params |
|---|---|---|---|
| search | Full-text search across EVERY V2EX topic since 2010 (title + body + replies) — the historical archive the site's own JSON API does not expose. Filter by node, date range and sort by recency or relevance; each hit returns the full post body, author handle, node, reply count and markup-free match snippets. | Content platforms call search to get full-text search across EVERY V2EX topic since 2010 (title + body + replies). | q, match, sort, order, node, ... |
| node_topics | The newest topics of one V2EX node (sub-forum) with the COMPLETE post body — a live freshness feed for a niche: 'jobs' for hiring posts, 'outsourcing' for project leads, 'qna' for buying-intent questions, 'programmer' for developer chatter. Returns the node's own metadata (topic count, subscriber count) alongside. | Research tools call node_topics to get the newest topics of one V2EX node (sub-forum) with the COMPLETE post body. | node_name, limit |
| latest | The newest topics across the WHOLE of V2EX (all nodes), each with its full post body — a single-call firehose of what the Chinese dev community is posting right now (typically ~47 topics, the freshest usually minutes old). | Community analysts call latest to get the newest topics across the WHOLE of V2EX (all nodes), each with its full post body. | limit |
| hot | Today's most-discussed V2EX topics with full bodies — the site's own hot list, ordered by the traction the community itself gave them. | Media monitors call hot to get today's most-discussed V2EX topics with full bodies. | limit |
| topic | One V2EX topic by id or URL: the full post body plus the COMPLETE reply thread (every reply, in order, with author handle and timestamp) — the discussion is where the buying intent, the tool recommendations and the salary numbers actually live. | Content platforms call topic to get one V2EX topic by id or URL. | id, with_replies, replies_limit |
| user_topics | The newest topics posted by one V2EX member, with full bodies — follow a recruiter, a vendor or a prolific poster without watching every node. | Research tools call user_topics to get the newest topics posted by one V2EX member, with full bodies. | username, limit |
| member | Public profile of a V2EX member by handle or id: tagline, bio, website, github/twitter handle, self-typed location, join date and PRO status. Only what the member published themselves — the API exposes no e-mail, phone or real name. | Community analysts call member to get public profile of a V2EX member by handle or id. | username |
| nodes | The V2EX node taxonomy — all 1364 sub-forums with slug, Chinese and English title, topic count, subscriber count and parent node. Pass `name` for one node, or `query` to search the directory (matches slug, Chinese title and English title). This is how you find the `node_name` for `node_topics` and the `node` filter for `search`. | Media monitors call nodes to get the V2EX node taxonomy. | name, query, limit |
Call search from your stack
curl -X POST https://api.reefapi.com/v2ex/v1/search \
-H "x-api-key: $REEF_KEY" \
-H "content-type: application/json" \
-d '{"q":"爬虫","limit":10}'import requests
r = requests.post(
"https://api.reefapi.com/v2ex/v1/search",
headers={"x-api-key": REEF_KEY},
json={
"q": "爬虫",
"limit": 10
},
)
print(r.json()["data"])const res = await fetch("https://api.reefapi.com/v2ex/v1/search", {
method: "POST",
headers: {
"x-api-key": process.env.REEF_KEY,
"content-type": "application/json",
},
body: JSON.stringify({
"q": "爬虫",
"limit": 10
}),
});
const { ok, data, meta, error } = await res.json();Ask your MCP-connected assistant: call reefapi.v2ex.search with {"q":"爬虫","limit":10}.Who uses this API and why
- Developer-relations teams call search to find every V2EX thread discussing their product or a competitor.
- China-market researchers use node_topics on nodes like qna or programmer to track what local developers are asking about.
- Dataset builders use topic to pull a post body together with its complete reply thread as structured JSON.
- Community analysts use member and user_topics to profile an active contributor's posting history.
Questions developers ask before integrating
How do I find the right V2EX node slug?
Call nodes. Pass query to search the directory by slug, Chinese title or English title, or pass name to fetch exactly one node cheaply. The whole taxonomy is 1,364 nodes. The ones that carry commercial traffic are qna (问与答, node id 12, 241,092 topics measured 2026-08-27), jobs (酷工作, id 43, 60,700 topics), programmer (程序员, id 300) and outsourcing (外包). The slug is what node_topics and the search node filter both want.
Why did match=all return zero rows when the search reports thousands of matches?
Because the upstream index is loose and match=all is applied to the page you got back, not to the whole index. A live search for 树莓派 教程 with match all on 2026-08-27 returned total_matches_upstream 2,650, filtered_out 5 and returned 0: the index handed over five hits, none of which actually contained both tokens, and all five were dropped. The upstream total stays large because it counts loose matches. Raise limit so more rows survive the filter, or use the default match=any and score the results yourself.
How far back does the search go, and how deep can I page?
Every topic since 2010, title, body and replies. A live search for 爬虫 (web scraping) on 2026-08-27 reported total_matches_upstream 12,849. Paging is the real limit: the index refuses anything past offset + limit = 1000, so with limit 50 you can reach 20 pages and no further. Narrow with node, since and until rather than paging deeper.
Does the topic action return every reply?
It returns up to replies_limit, and it tells you when it stopped. A live read of topic 1236386 with replies_limit 2 came back with replies_returned 2, replies_total 8, replies_truncated true and replies_match_counter true. reply_count on the topic object is always the true total, so truncation is never silent. replies_limit goes up to 1,000.
Why does node_topics only ever return ten topics?
That is the node feed's own ceiling, and the response says so: meta.feed_cap 10 with meta.paginated false. The limit parameter is capped at 10 for the same reason. node_topics is a freshness feed, not an archive. For depth in one node, use search with the node filter, which reaches the full history.
Why does the author object differ between search and the other actions?
The search index and the site's own JSON API return different amounts of member data. A search hit's author carries only username and url. A node_topics, latest, hot or topic row carries id, username, url, tagline and avatar, and each reply also carries author_id alongside the nested author. If you need the numeric member id, take it from one of those actions or from member, not from a search hit.
Can last_touched_at be earlier than created_at?
Yes, and it was on a live read. Topic 1237466 in the jobs node returned created_at 1787750719 (2026-08-26T13:25:19Z) with last_touched_at 1787750659 (2026-08-26T13:24:19Z), sixty seconds earlier. V2EX sets the two from different clocks on the posting path, so do not assume last_touched_at is greater than or equal to created_at and do not compute a duration from the pair.
Does the response tell me how much V2EX quota is left?
It does. meta.rate_limit on node_topics, topic, member and nodes passes V2EX's own headers straight through: x-rate-limit-limit 600, x-rate-limit-remaining, and x-rate-limit-reset as an epoch second. That budget is the site's, counted per hour, and it is separate from your ReefAPI credits. The search action goes through a different index and does not report it.
What is the V2EX API?
V2EX API is a ReefAPI endpoint group for topics, replies, members and nodes from china's biggest developer community. It returns live JSON through POST requests under /v2ex/v1.
Is the V2EX API free to try?
Yes. ReefAPI starts with 1,000 free credits, no card required. V2EX calls use the same shared credit balance as every other ReefAPI engine.
Do I need a V2EX login or account?
No login to V2EX is needed for the API response. You call ReefAPI with your x-api-key header, and the playground can run live examples before you create a production key.
How fresh is the V2EX data?
The page example is captured from a live search call, and production requests fetch live data through ReefAPI rather than a static sample.
How many credits does the V2EX API use?
V2EX actions currently cost 1 credit per successful call. Failed or blocked calls are free. All APIs draw from one credit pool.
Can I call V2EX from an AI assistant or MCP client?
Yes. Connect ReefAPI once through MCP and your assistant can call v2ex actions with the same key, credit pool and JSON envelope used by normal REST requests.