Read China's remote-work briefs, budget included, as JSON
The Shixian API returns remote-work and freelance contract briefs from China's remote-work board as clean JSON, with no login and no China exit required.
4 active endpoints, on 1 and 2 credit tiers.
- POST/shixian/v1/search
- POST/shixian/v1/jobs
- POST/shixian/v1/job
- POST/shixian/v1/filters
What Shixian endpoints does ReefAPI ship?
4 live read endpoints. Read-only data API: no writes, no account actions, no dashboard access on the target site.
Shixian API
3 of 4 endpoints, ready to run
One page of the board — twenty briefs with the complete requirement text, the client's published budget in CNY and how many people have applied.
{ "ok": true, "meta": { "api": "shixian", "endpoint": "jobs", "mode": "live", "latency_ms": 1321.3, "record_count": 20, "cache_hit": false }, "data": { "jobs": [ { "id": "0829901317", "source": "shixian", "url": "https://shixian.com/jobs/0829901317", "title": "【远程】【区块链】后端工程师 MEME 交易方向", "job_type": "远程全职", "job_type_en": "remote_full_time", "description": "产品:https://logearn.com\n\n需要技能:Java, On Chain Data, AI Coding\n\n职位描述:\n1. 新链接入:负责新增 EVM 链与 Solana 生态的采集接入,包括节点接入、区块与日志采集、数据解析及下游数据链路打通,交付可供业务消费的完整数据集。\n2. DEX / Launchpad 解析:负责新增 DEX 与代币发行平台的协议解析,涵盖 AMM(V2 / V3 / V4 Hook)、Bonding Curve 及各类协议 Fork,实现流动性池发现、费率结构、发行阶段与成交归属的准确建模。\n3. 数据质量与稳定性:对采集数据的准确性与时效性负责;建立数据质量校验与异常监控机制,定位并修复解析偏差;治理采集链路的可用性问题,包括区块重组、节点异常与限流、消费积压等容错场景;建设面向业务的数据服务能力,为钱包、交易、风控、资产分析、DeFi 数据分析等场景提供稳定的后端 API。\n4. 技术跟进与架构演进:持续跟进链上协议与生态的技术演进,将新出现的协议形态快速纳入采集能力;优化采集系统架构与抽象设计,提升新链、新协议的接入效率。\n\n职位要求:\n\n1. 后端开发经验:3 年以上 Java 服务端开发经验,具备高并发数据处理系统的设计与实现能力,熟悉分布式消息队列、关系型数据库、缓存与 NoSQL 存储的生产实践。\n2. 区块链基础:熟悉区块链底层原理与链上协议基础,具备扎实的链上数据解析能力;理解交易结构、事件日志与 ABI 编解码机制,能够独立完成合约事件与调用数据的解析与语义还原。有链上数据处理经验,熟悉区块同步、交易解析、合约事件解析、地址资产统计、Token/NFT 数据处理等场景。\n3. DEX / Launchpad:熟悉主流 DEX 协议的数据模型,掌握 Uniswap V2 / V3 / V4 及其生态 Fork 的核心机制;对典型 Launchpad(Bonding Curve 类代币发行平台)的运行机制有深入研究。\n4. 问题定位与数据意识:具备系统化的线上问题定位能力与严谨的数据验证意识,能够通过对照实验与反向验证确认结论,而非依赖经验推断。\n\n加分项\n\n1. 类似经验者:有 DeFi、DEX、区块链浏览器、链上风控、资产分析平台相关项目经验;有高 TPS 链数据处理、海量地址资产计算、实时余额更新、交易风险识别等经验。\n2. AI Native 工程习惯:熟练使用 Claude Code 等 AI 编码工具完成开发与问题排查,理解其能力边界并对产出保持验证意识;能够将可复用的流程与领域知识沉淀为团队资产,持续提升团队而非个人的效率。\n3. Solana 链上数据经验:具备 Solana 链上数据处理经验,熟悉其账户模型与指令解析机制。\n4. Solidity 阅读能力:具备 Solidity 代码阅读能力,能够在缺少文档与 ABI 的情况下,通过合约字节码与链上交易分析其行为。", "budget": { "amount": 26000, "currency": "CNY", "period": null, "label": "预算", "raw": "26000 元" }, "rate": { "amount": 1000, "currency": "CNY", "per": "8小时", "raw": "预估 1000元 / 8小时" }, "duration": { "days": 26, "raw": "26天" }, "published_relative": "4 天前发布", "published_approx_iso": "2026-08-24T17:30:38Z", "published_approx_days_ago": 4, "applicant_count": 4 }, { "id": "1672901098", "source": "shixian", "url": "https://shixian.com/jobs/1672901098", "title": "Java 后端开发工程师: 动环系统", "job_type": "远程全职", "job_type_en": "remote_full_time", "description": "岗位职责:\n1. 负责 UPS、精密空调、配电柜、温湿度传感器等设备的物联网采集服务开发与维护;\n2. 负责实时监控、告警联动策略、工单流转、资产台账等核心业务接口开发;\n3. 实现国密(SM2/SM3/SM4)数据加密、权限分级控制、操作日志审计等政企/军工刚需功能;\n4. 负责海量时序监控数据的存储、查询与历史报表统计;\n5. 对接主流物联网协议(MQTT、Modbus、SNMP、BACnet 等),完成信创环境适配与迁移。\n\n任职要求:\n1. 本科及以上学历,计算机、软件工程、物联网等相关专业,3年以上 Java 后端开发经验;\n2. 熟练掌握 SpringBoot / SpringCloud(优先使用商用合规发行版),熟悉 MyBatis-Plus;\n3. 有国产数据库经验优先:达梦、人大金仓、OceanBase;熟悉时序数据库(TDengine 企业版优先);\n4. 熟悉国产中间件优先:东方通 TongMQ / 金蝶 Apusic、东方通 TongRedis 等;\n5. 熟悉 MQTT、Modbus、SNMP 等物联网协议,有实际采集服务开发经验;\n6. 具备国密算法(SM2/SM3/SM4)应用经验,或了解权限分级、日志审计等安全功能;\n7. 有信创项目经验、政企/军工项目背景者优先;能适应离线部署、内外网隔离等场景。\n\n加分项:\n- 有动环监控、DCIM、机房监控系统开发经验;\n- 熟悉 WebSocket、国产容器平台(华为云 IEF、浪潮 K8s 等);\n- 有等保、国密测评配合经验。", "budget": { "amount": 17600, "currency": "CNY", "period": null, "label": "预算", "raw": "17600 元" }, "rate": { "amount": 800, "currency": "CNY", "per": "8小时", "raw": "预估 800元 / 8小时" }, "duration": { "days": 22, "raw": "22天" }, "published_relative": "5 天前发布", "published_approx_iso": "2026-08-23T17:30:38Z", "published_approx_days_ago": 5, "applicant_count": 6 }, { "id": "2179900918", "source": "shixian", "url": "https://shixian.com/jobs/2179900918", "title": "MiniMax H3 视频工作流全栈工程师", "job_type": "远程兼职", "job_type_en": "remote_part_time", "description": "搭建minimax h3 服务器 服务器租赁, 实现电商短视频创作 短视频复刻 每天需要500条左右的数量。\n公司内部 多人使用, 固定几个h3的工作流 文生图 图生视频 视频生视频 。", "budget": { "amount": 10000, "currency": "CNY", "period": null, "label": "预算", "raw": "10000元" }, "rate": { "amount": 10000, "currency": "CNY", "per": null, "raw": "预估 10000 元" }, "duration": { "days": 15, "raw": "15天" }, "published_relative": "6 天前发布", "published_approx_iso": "2026-08-22T17:30:38Z", "published_approx_days_ago": 6, "applicant_count": 5 } ], "returned": 20, "page": 1, "page_size": 20, "filters": { "city": "all", "category": "all", "type": "all", "sort": "default" }, "source_url": "https://shixian.com/job/all", "source": "shixian" } }
How the Shixian API works
Shixian is a normal ReefAPI surface — the same four rules that hold for every other engine on the key.
No OAuth app, no request signing, no per-site account. One key covers all 184 engines.
Every route is a POST with a JSON body. Parameters are validated against the published schema before anything is charged.
Credits, not seats. Failed and blocked calls are never charged, and cache hits cost nothing.
One envelope everywhere. meta carries latency_ms, record_count and the endpoint that answered.
Pull only the fresh end of the board, on a schedule
This board is an archive as much as a feed, and depth on it means age rather than volume. If you want live briefs, the first few pages are the whole product.
{"page": 1, "sort": "nobody"}Twenty briefs with the full requirement text, a CNY budget on 20 of 20, an applicant count on 19 of 20, and an approximate publication date on each.
{"q": "爬虫", "pages": 5, "limit": 20}Scanned 100 briefs and returned the matches, reporting match_ratio_pct in the meta so you can widen `pages` when the ratio is low.
The live end of a board most Western tooling never reaches, with the client's own budget attached to every brief.
curl -X POST https://api.reefapi.com/shixian/v1/jobs \
-H "x-api-key: $REEF_KEY" \
-H "content-type: application/json" \
-d '{}'{
"ok": true,
"data": { … },
"meta": {
"api": "shixian",
"endpoint": "jobs",
"mode": "live",
"latency_ms": …,
"record_count": …
},
"error": null
}How the board is shaped, and what each filter costs you
This board has no search endpoint of its own, its two halves live on separate routes that cannot be combined, and its budget field means two different things depending on contract shape. Those three facts decide how you should call it. All figures measured on 2026-08-27.
| Parameter or field | Behavior | Measured |
|---|---|---|
| search q | Matched here after scanning board pages, because the site has no keyword endpoint | '爬虫' over 6 pages scanned 120 briefs and matched 5, a match_ratio of 4.17% |
| fields | Which part of the brief the term is matched against | '数据采集' over 200 briefs: 3 matches on title only, 6 on description only |
| pages | 20 briefs per page, default 5, ceiling 25. Scanning stops early once limit is hit | pages 10 scanned exactly 200 briefs |
| page depth | Consecutive pages share no ids. Past the end you get NOT_FOUND, not an empty success | page 1 and page 2 overlapped on 0 of 20 ids; page 299 returned NOT_FOUND naming ~164 as the end |
| type full-time | 远程全职. budget is the per-workday rate multiplied by the quoted duration | 1000 CNY per 8-hour day, 26 days, budget 26000 CNY |
| type part-time | 远程兼职. budget is the whole engagement over the quoted 工期 | 10000 CNY over a 15-day duration, with rate.per null |
| city or category vs type | Separate routes on the site, so they cannot be combined | city beijing with type full-time returned INVALID_PARAM explaining both routes |
| Unknown filter slug | Rejected here, because the site would silently ignore it and serve the unfiltered board | city 'wuhan' returned INVALID_PARAM with the 21 allowed slugs in error.detail |
| sort nobody | 无人投递, briefs with no applicants yet | applicant_count came back null on 5 of 5 rows, the filter confirming itself |
| published_approx_iso | Derived from the site's relative string, accurate to the day at best | '2 天前发布' became 2026-08-24T22:44:10Z, i.e. the query time minus two days |
Everything except job_type_en is Chinese. Titles, requirement bodies, city names, role categories and the raw budget strings all come back as published, and job_type_en is the only translated field, carrying remote_full_time or remote_part_time. Plan for CJK text end to end rather than expecting an English mirror.
Where the board ends, how old each page is, and what search actually does
Measured on 2026-08-28 by sampling five depths of the board and reading two search runs. One of these lines goes against us and it is written into the meta by the engine itself.
No login is involved and nothing is tied to an account of yours. On the board itself the poster is anonymous: employer.name was null on all 128 rows we sampled across five pages, leaving an opaque board id. Opening a single brief is different — the job action did return the poster's board handle and their avatar on the one we opened, so if anonymity matters in your pipeline, read the board and not the brief.
Every response carries board_end_measured in the meta — 164 in our runs — so you never have to discover the ceiling by walking into it. Page 164 returned the last 8 briefs. Page 300 returned a clean NOT_FOUND whose message names the ceiling and adds that a filtered board ends sooner. No engine in this batch handles the end of a list better.
This is the thing to know before you crawl it. Page 1 briefs had a median age of about 60 days. Page 5, 210 days. Page 20, two years. Page 50, four years. The final page, nine to ten years. About 3,280 briefs are reachable in total, but only the first handful of pages are a live market — the rest is an archive, and it is useful as one.
Against us, stated by the engine rather than discovered by us. The meta returns upstream_keyword_param_ignored true and search_is_client_side true: the board's own keyword parameter does nothing, so the engine pulls pages and matches locally. It reports the arithmetic too — one run scanned 200 briefs across ten pages and returned 6 matches, a match ratio of 3.0 per cent. That means `pages` is your recall dial, and a narrow term needs a wide scan.
budget was filled on 20 of 20 rows on every page we sampled, in CNY, with both the parsed amount and the raw string. A separate rate block carries the client's own estimate, and duration carries the expected number of days. This is the only board in the batch where the client's money figure is on the row unconditionally.
The board publishes relative strings rather than timestamps, so the engine returns published_relative as written, published_approx_iso derived from it, and published_approx_days_ago. The word approx is doing real work: a brief marked as over four years old is dated to a round 1,460 days, not to a day. Sort and bucket by it; do not build a strict cutoff on it.
The city, category, contract-shape and sort taxonomies come straight off the site through the free filters action, so you are not hard-coding slugs that may move. Note one shape: the contract-type filter reads a different route from the city and role board, so combining it with the others behaves differently from combining the others with each other.
applicant_count was filled on about 19 of every 20 rows, and sort nobody returns the briefs at zero. For lead generation on a bid board, that is the field that matters more than freshness alone.
The brief and its terms: full requirement text, budget, rate, expected duration, hiring city, contract shape, applicant count and the board link. Not the client's name, not their contact details, not freelancer profiles.
What people build with Shixian
The jobs this data is most often used for.
endpoints
credits per call
Agencies and freelancers call search to find Chinese contract briefs for a skill and read the client's stated CNY budget before pitching.
Rate-benchmarking tools page the board with jobs to chart budget and duration by role category.
Sales teams use job to turn one brief's full requirement text and employer profile into a qualified lead record.
Market analysts read filters first to get the site's own city and category taxonomy before segmenting demand.
What Shixian data costs
The cheapest call here is 1 credit, so $15/mo (Pro) buys 10,000 of them — $1.50 per 1,000 credits. Credits roll over and never expire, and failed or blocked calls are not charged.
Full pricing →- 1,000 free credits on signup, no card
- One key, all 184 APIs, one credit pool
- Failed and blocked calls are never charged
- Credits roll over and never expire
Call it in two lines
Sign up, get 1,000 credits and one key that works on every engine. Then this is the whole protocol.
curl -X POST https://api.reefapi.com/shixian/v1/jobs \
-H "x-api-key: $REEF_KEY" \
-H "content-type: application/json" \
-d '{}'import requests
r = requests.post(
"https://api.reefapi.com/shixian/v1/jobs",
headers={"x-api-key": REEF_KEY},
json={},
)
print(r.json()["data"])Have a question? We got answers.
The questions people actually ask before wiring up Shixian.
Get a free key →Does my search term go to the site, or is it applied here?▾
Applied here, and every response says so in a `note` field. The board accepts a keyword parameter and ignores it, so a nonsense term still returns the full front page. The engine therefore fetches board pages and matches your term against them, then reports exactly what it did: a search for '爬虫' across 6 pages scanned 120 briefs, matched 5, and set match_ratio_pct to 4.17. Raise `pages` to scan deeper, or narrow with category, city or type first so the pages you scan are already relevant.
What does the budget number mean?▾
It depends on contract shape, and getting this backwards will make full-time gigs look ten times cheaper than they are. On type full-time the budget is the per-workday rate multiplied by the quoted duration: one brief returned rate 1000 CNY per 8-hour day, duration 26 days, budget 26000 CNY. On type part-time the budget is the whole engagement: another returned budget 10000 CNY over 15 days with rate.per null and rate.amount simply repeating the budget. The `raw` string under both fields preserves the site's own wording, which is worth keeping for anything you display.
Why is applicant_count null on the zero-applicant list?▾
Because the site prints the applicant badge only when there is at least one, so on the 无人投递 shortlist there is nothing to parse and the field is null rather than 0. That shortlist shared just one of twenty ids with the default board in an earlier measurement, and returned null on all five rows checked, which is the filter proving itself from two directions. Read null as 'no applicants shown' on that sort, and as 'not published' elsewhere.
Why can I not combine city and type?▾
Because the site serves them from two different routes with no shared filter: the contract-shape board sits at /jobs/<type> and the city and role board at /job/<city>/<category>. Sending both is rejected with an INVALID_PARAM that spells this out, rather than one of them being quietly dropped and you receiving the wrong result set. If you need both, use `search` with a type and filter the returned rows yourself. city and category do combine with each other, since they share a route.
What does the `job` action add over a board row?▾
The poster's profile and the engagement's shape. On one brief, the board row gave employer.name null while `job` returned the poster's display name, their district-level location, team_size '10' and a funding_stage string, plus view_count 1105 against applicant_count 10, project_type ('数据挖掘/爬虫') and workdays_per_month. It also reads budget more precisely: the board row said 22000 CNY with period null, while `job` returned the same amount with period 'month' and the raw string identifying it as a monthly salary. meta.body_source confirms the description came out of the page's own structured data block.
Is the requirement text truncated on board rows?▾
No, and this is the unusual part of this board. The listing HTML ships the complete requirement, so a board row's description arrived at 1,244 characters covering responsibilities, required skills and the tech stack, with no fetch of the detail page. That is why `search` can match against fields 'description' and get a real result rather than a teaser: matching 数据采集 against descriptions found 6 briefs across 200 where matching titles alone found 3.
How deep does the board go, and can I page blindly?▾
It bottoms out around page 164 on the unfiltered board, roughly 3,200 live briefs, and a filtered board ends much sooner. Past the end you get a NOT_FOUND that names the measured end rather than an empty success, so a paging loop terminates on a clear signal instead of silently collecting nothing. Consecutive pages carry no shared ids, checked at 0 overlap out of 20 between page 1 and page 2, so you can page without deduplicating.
How accurate are the dates?▾
Day-accurate at best, and the field names say so. The site publishes relative strings such as '2 天前发布' or '大约 1 个月前', which are preserved verbatim in published_relative, and published_approx_iso is that string resolved against the moment of your call, with published_approx_days_ago alongside it. A brief listed as two days old came back as an ISO timestamp exactly 48 hours before the query. Treat it as a bucket, not a publication timestamp, and never sort two same-day briefs by it.
What is the Shixian API?▾
Shixian API is a ReefAPI endpoint group for chinese remote-work briefs with the client's own budget, duration and requirements. It returns live JSON through POST requests under /shixian/v1.
Is the Shixian API free to try?▾
Yes. ReefAPI starts with 1,000 free credits, no card required. Shixian calls use the same shared credit balance as every other ReefAPI engine.
Do I need a Shixian login or account?▾
No login to Shixian 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 Shixian 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 Shixian API use?▾
Shixian actions currently cost 1-2 credits per successful call. Failed or blocked calls are free, and all APIs draw from one credit pool.
Can I call Shixian from an AI assistant or MCP client?▾
Yes. Connect ReefAPI once through MCP and your assistant can call shixian actions with the same key, credit pool and JSON envelope used by normal REST requests.
15 Jobs & Hiring APIs on the same key
One key, one credit pool, one response envelope. If you are pulling Shixian, you are one call away from the rest of the category — no second contract, no second integration.
Need something this API does not do?
Name the endpoint, the field, or a source we do not carry yet. We ship new APIs every week and you would be first to get the key. Real people read every message and reply the same day.
Try it on your own data before you pay anything
The call above is the real endpoint, not a recording. A free key gives you 1,000 credits, the other 183 APIs, and the same envelope everywhere.
Endpoints, parameters and credit costs on this page are read from the live catalog and cannot drift from what the API accepts. Field notes were captured on 2026-08-28.