Looking for the overview — what this API returns, what it costs, and a call you can run without a key? See the Shixian API page →
Jobs & Hiring

Shixian API & Scraper

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 actionsLive JSON1,000 free credits$0.67–$1.50 / 1,000 creditsMCP-ready
Get a free keyOpen in playground

🤖 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.

Every brief carries the client's own posted budget as an amount plus CNY currency, the estimated rate, the project duration in days, the complete requirement text, the job type (remote full-time, part-time or project work), the employer profile and the brief's URL. The primary search endpoint scans the paginated board and matches client-side, and its meta reports jobs_scanned, pages_scanned and the match ratio so you can see exactly how much of the board a run covered. jobs pages the board itself, job returns one brief, and filters exposes the site's own city and category taxonomy. It is built for lead generation into the Chinese contract market and for freelance-rate research. One ReefAPI key, one shared credit pool, the standard envelope.

Reference

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 fieldBehaviorMeasured
search qMatched 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%
fieldsWhich part of the brief the term is matched against'数据采集' over 200 briefs: 3 matches on title only, 6 on description only
pages20 briefs per page, default 5, ceiling 25. Scanning stops early once limit is hitpages 10 scanned exactly 200 briefs
page depthConsecutive pages share no ids. Past the end you get NOT_FOUND, not an empty successpage 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 duration1000 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 typeSeparate routes on the site, so they cannot be combinedcity beijing with type full-time returned INVALID_PARAM explaining both routes
Unknown filter slugRejected here, because the site would silently ignore it and serve the unfiltered boardcity 'wuhan' returned INVALID_PARAM with the 21 allowed slugs in error.detail
sort nobody无人投递, briefs with no applicants yetapplicant_count came back null on 5 of 5 rows, the filter confirming itself
published_approx_isoDerived 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.

Live example

Real request and response JSON

Captured from the indexed primary action, search, on .

Captured request
{
  "method": "POST",
  "url": "https://api.reefapi.com/shixian/v1/search",
  "headers": {
    "x-api-key": "$REEF_KEY",
    "content-type": "application/json"
  },
  "body": {
    "q": "爬虫",
    "pages": 6
  }
}
Captured response
{
  "ok": true,
  "meta": {
    "api": "shixian",
    "endpoint": "search",
    "mode": "live",
    "latency_ms": 2706.8,
    "record_count": 5,
    "bytes": 659343,
    "cache_hit": false,
    "stop_reason": "pages_exhausted",
    "method": "ssr_html_bare_dc_curl_cffi_no_wall",
    "upstream_keyword_param_ignored": true,
    "search_is_client_side": true,
    "pages_scanned": 6,
    "jobs_scanned": 120,
    "match_ratio_pct": 4.17
  },
  "data": {
    "jobs": [
      {
        "id": "[redacted-phone]",
        "source": "shixian",
        "url": "https://shixian.com/jobs/[redacted-phone]",
        "title": "高级爬虫工程师",
        "job_type": "远程全职",
        "job_type_en": "remote_full_time",
        "description": "高级数据采集工程师(中国互联网数据采集 / 自动化监控方向)\n\n工作地点: 西安/远程\n工作性质: 全职 / 兼职 / 项目合作均可\n\n【关于我们】\n我们是一家来自北欧的品牌保护公司,为全球知名品牌提供电商平台、社交媒体及直播平台的品牌监控、数据分析及侵权治理解决方案。随着中国直播电商和社交电商的快速发展,我们在上海和西安设立研发支持团队,现寻找熟悉中国互联网生态的开发工程师。\n\n【我们正在寻找什么样的人】\n我们需要一位熟悉中国互联网生态、善于解决复杂技术问题的开发工程师,共同打造下一代智能品牌监控系统。\n我们的核心目标很明确:建立一套稳定、高效、可扩展的自动化品牌监控解决方案。\n我们不限制技术路线,无论是官方API、第三方数据平台、浏览器自动化、协议分析还是AI技术,只要能够有效解决业务问题,我们都愿意一起探索。\n\n【您将负责的工作】\n1. 自动化直播监控\n· 研究并实现抖音、淘宝、快手、小红书、视频号等主流直播平台的自动化监控方案\n· 稳定获取直播间商品、价格、销量、主播信息等数据\n\n2. 电商平台数据采集\n· 负责淘宝、天猫、京东、拼多多、1688、闲鱼等平台的数据获取\n· 实现商品Listing的自动发现、持续监控与更新\n3. 数据获取方案研究与选型\n· 评估官方API、第三方数据平台、浏览器自动化、JS逆向、AI/OCR等多种技术路线\n· 针对不同平台选择最优方案,平衡稳",
        "budget": {
          "amount": 22000,
          "currency": "CNY",
          "period": null,
          "label": "预算",
          "raw": "22000 元"
        },
        "rate": {
          "amount": 1000,
          "currency": "CNY",
          "per": "8小时",
          "raw": "预估 1000元  / 8小时"
        },
        "duration": {
          "days": 22,
          "raw": "22天"
        },
        "employer": {
          "id": "158876",
          "url": "https://shixian.com/employers/158876",
          "name": null,
          "avatar": "https://cdn.shixian.com/upload/user/avatar/157292/small_6cff12b1d8ff990aed72e164edeced80.jpeg"
        },
        "published_relative": "30 天前发布",
        "published_approx_iso": "[redacted-phone]T18:29:53Z",
        "published_approx_days_ago": 30,
        "applicant_count": 7
      },
      {
        "id": "[redacted-phone]",
        "source": "shixian",
        "url": "https://shixian.com/jobs/[redacted-phone]",
        "title": "爬虫/安全工程师",
        "job_type": "远程兼职",
        "job_type_en": "remote_part_time",
        "description": "负责将苹果官网 登录/修改个人信息/下单等操作进行自动化\n\n当前已经有selelium版本,希望能升级到api版本解决方案,提升稳定性,效率,可用性\n\n同时考虑网络流量优化 防反爬等策略\n\n希望能交付完整方案",
        "budget": {
          "amount": 3000,
          "currency": "CNY",
          "period": null,
          "label": "预算",
          "raw": "3000元"
        },
        "rate": {
          "amount": 3000,
          "currency": "CNY",
          "per": null,
          "raw": "预估 3000 元"
        },
        "duration": {
          "days": 7,
          "raw": "7天"
        },
        "employer": {
          "id": "38285",
          "url": "https://shixian.com/employers/38285",
          "name": null,
          "avatar": "https://cdn.shixian.com/upload/user/avatar/36160/small_efada7edcb2bc2567ca9fa04a43d0733.jpeg"
        },
        "published_relative": "大约 2 个月前发布",
        "published_approx_iso": "[redacted-phone]T18:29:53Z",
        "published_approx_days_ago": 60,
        "applicant_count": 2
      },
      {
        "id": "[redacted-phone]",
        "source": "shixian",
        "url": "https://shixian.com/jobs/[redacted-phone]",
        "title": "AI 自动化工程师(兼职/项目制)",
        "job_type": "远程兼职",
        "job_type_en": "remote_part_time",
        "description": "招募:AI 自动化工程师(兼职/项目制)\n项目背景\n我们是一个专注 “讲好中国故事” 的短视频出海团队。目前需要在 TikTok / Instagram / YouTube 三大平台实现全自动化热点追踪。\n我们不打算从零开发复杂系统,而是希望利用 AI + 低代码 (No-code/Low-code) 方案,快速构建一套“热点发现与选题分析”引擎,用技术驱动创意。\n\n你的核心任务\n1. 自动化链路搭建: 使用 Make.com、n8n、Coze (扣子) 等平台串联整个工作流。\n2. 多平台数据采集: 调用 Apify 或类似商业 API,定时抓取 TikTok、IG Reels、YT Shorts 上与中国(美景、美食、科技、基建、人文等)相关的热门视频数据。\n3. AI 智能分析: 接入 GPT-4o / DeepSeek / Gemini 等接口,编写高质量 Prompt,对视频内容进行分类、总结,并生成具有专业洞察力的“选题推荐理由”。\n4. 结构化输出: 将分析结果自动推送至 飞书多维表格 (Bitable) 或 Notion,确保团队每天早上能看到一份高质量的热点简报。\n\n我们希望你:\n• 实战派: 熟练掌握 Make.com / n8n / 扣子 等平台,有处理 JSON 数据、Webhook、API 调用的实操经验。\n• 懂爬虫逻辑: 不需要手写复杂代码,但要熟悉 ",
        "budget": {
          "amount": 4000,
          "currency": "CNY",
          "period": null,
          "label": "预算",
          "raw": "4000元"
        },
        "rate": {
          "amount": 4000,
          "currency": "CNY",
          "per": null,
          "raw": "预估 4000 元"
        },
        "duration": {
          "days": 10,
          "raw": "10天"
        },
        "employer": {
          "id": "26338",
          "url": "https://shixian.com/employers/26338",
          "name": null,
          "avatar": "https://cdn.shixian.com/upload/user/avatar/23607/small_b4f5276e4fccd29705e6f9a37298120f.jpg"
        },
        "published_relative": "5 个月前发布",
        "published_approx_iso": "[redacted-phone]T18:29:52Z",
        "published_approx_days_ago": 150,
        "applicant_count": 19
      }
    ],
    "returned": 5,
    "matched": 5,
    "jobs_scanned": 120,
    "pages_scanned": 6,
    "query": "爬虫",
    "match": "any",
    "fields": "both",
    "filters": {
      "city": "all",
      "category": "all",
      "type": "all",
      "sort": "default"
    },
    "note": "shixian publishes no job-search endpoint — its own `keyword=` parameter is accepted and IGNORED (verified: a nonsense keyword still returns the full front page). These 5 matches were found by scanning 6 board page(s) / 120 briefs and matching '爬虫' here (match=any, fields=both). Raise `pages` to scan deeper, or narrow with `category`/`city`/`type` first.",
    "source": "shixian"
  }
}
Actions

What the Shixian API does

ActionDescriptionConcrete use caseKey params
searchFind remote-work briefs by keyword — the ones that mention 爬虫 (scraping), 数据采集 (data collection), API, 小程序 or any term you care about — each with the client's published CNY budget, duration, full requirement text and applicant count. 🔴 shixian publishes no job-search endpoint (its own `keyword=` parameter is accepted and ignored — verified: a nonsense keyword still returns the full front page), so this action scans the board pages and matches here; the response states exactly how many pages and briefs were scanned.Recruiting teams call search to find remote-work briefs by keyword.q, match, fields, pages, limit, ...
jobsOne page of the shixian board — 20 remote-work briefs with the complete requirement text and the client's published CNY budget on every row. Filter by city, role category, contract shape or the board's own shortlists (newest, zero-applicant, accepts-remote) and page through roughly 3,200 live briefs.Labor-market analysts call jobs to get one page of the shixian board.page, limit, city, category, type, ...
jobOne brief in full: the complete requirement text straight out of the page's own schema.org block, the client's budget, the hiring city and role, the project type, workdays per month, how many people have applied, how many have viewed it, and the poster's public marketplace profile (display name, location, team size, funding stage, product and team blurbs) — the profile fields the board hides behind a login wall on the list page.Job boards call job to get one brief in full.id
filtersThe board's own filter taxonomy, read live off the site: every city slug, every role-category slug, the contract shapes and the sort modes, each with its Chinese label. Use it to discover the exact values `search` and `jobs` accept — the site silently ignores a slug it does not know, so a typo would otherwise return the unfiltered board.Sales intelligence teams call filters to get the board's own filter taxonomy, read live off the site.none
Code samples

Call search from your stack

curl -X POST https://api.reefapi.com/shixian/v1/search \
  -H "x-api-key: $REEF_KEY" \
  -H "content-type: application/json" \
  -d '{"q":"爬虫","pages":6}'
MCP one-liner
Ask your MCP-connected assistant: call reefapi.shixian.search with {"q":"爬虫","pages":6}.
Use cases

Who uses this API and why

  • 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.
FAQ

Questions developers ask before integrating

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.

docs / shixian

Shixian

Chinese remote-work briefs with the client's own budget, duration and requirements.

base /shixian/v14 endpoints
post/shixian/v1/jobs1 credit

One page of the shixian board — 20 remote-work briefs with the complete requirement text and the client's published CNY budget on every row. Filter by city, role category, contract shape or the board's own shortlists (newest, zero-applicant, accepts-remote) and page through roughly 3,200 live briefs.

ParameterAllowed / rangeDescription
page = 1optional1–300Which board page to return (1–300). Each page holds 20 briefs and consecutive pages share NO ids (measured: p1/p2, p2/p3 and p1/p3 overlap = 0). The unfiltered board bottoms out around page 164 (~3,200 live briefs) and a filtered one much sooner; past the end the site serves an empty page and this action returns NOT_FOUND rather than an empty success.
limit = 20optional1–20How many briefs to return (1–20, default 20).
city = alloptionalall · beijing · shanghai · shenzhen · hangzhou · guangzhou · chengdu · nanjing · xian · hubei · xiamen · shandong · suzhou · zhengzhou · fuzhou · changsha · chongqing · tianjin · ningbo · remote · qitaHiring city / province, as the board's own slug. The filter genuinely bites (measured: 'shanghai' shared 1 of 20 ids with the unfiltered board, 'beijing' 9 of 20). 🔴 An UNKNOWN slug is silently ignored upstream and would hand you the unfiltered board, so anything outside this list is rejected here instead. Cannot be combined with `type` — they are separate routes on the site.
category = alloptionalall · backend · frontend · full_stack · ios · android · ui · pm · operator · tester · othersRole category. Measured bite against the unfiltered board: 'ui' shared 0 of 20 ids, 'ios' 1 of 20, 'backend' 5 of 20. Unknown values are rejected here because the site ignores them silently. Cannot be combined with `type`.
type = alloptionalall · full-time · part-timeContract shape. 🔴 On shixian this is a DIFFERENT route from the city/role board (/jobs/full-time vs /job/<city>/<role>), so it cannot be combined with `city` or `category` — passing both is rejected with INVALID_PARAM rather than silently dropping one.
sort = defaultoptionaldefault · last · nobody · accept_remoteBoard ordering / shortlist. 'nobody' is the interesting one for lead generation — briefs nobody has applied to yet: it shares only 1 of 20 ids with the default board, and `applicant_count` is null on 20/20 of its rows, which is the filter proving itself twice over.
Try in playground →
post/shixian/v1/job1 credit

One brief in full: the complete requirement text straight out of the page's own schema.org block, the client's budget, the hiring city and role, the project type, workdays per month, how many people have applied, how many have viewed it, and the poster's public marketplace profile (display name, location, team size, funding stage, product and team blurbs) — the profile fields the board hides behind a login wall on the list page.

ParameterAllowed / rangeDescription
idrequiredThe brief to fetch: a numeric job id (1192790804) or a full URL (https://shixian.com/jobs/1192790804).
Try in playground →
post/shixian/v1/filters1 credit

The board's own filter taxonomy, read live off the site: every city slug, every role-category slug, the contract shapes and the sort modes, each with its Chinese label. Use it to discover the exact values `search` and `jobs` accept — the site silently ignores a slug it does not know, so a typo would otherwise return the unfiltered board.

Try in playground →