Shixian API

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.

no credit card1,000 free credits · instant API key · live in 10 seconds
Missing a Shixian endpoint, or need a source we don't have yet?Contact us real people · same-day reply.
S
/shixian/v1

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.

4 endpoints

search

2 cr

Find remote-work briefs by keyword.

required
q
optional
match, fields, pages, limit, city, category, type, sort

jobs

1 cr

One page of the shixian board.

required
optional
page, limit, city, category, type, sort

job

1 cr

One brief in full.

required
id
optional

filters

1 cr

The board's own filter taxonomy, read live off the site.

required
optional

Every parameter, every allowed value →

Shixian API

3 of 4 endpoints, ready to run

View docs ↗

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.

1 credit0 required · 4 optional
POST/shixian/v1/jobs
idle
// Press "Try it" and this pane shows exactly what the
// live site returned this second — including an empty
// result, if that is the truth. No key, no account.

How the Shixian API works

Shixian is a normal ReefAPI surface — the same four rules that hold for every other engine on the key.

01
Authenticate
x-api-key header

No OAuth app, no request signing, no per-site account. One key covers all 185 engines.

02
Call
POST /shixian/v1/…

Every route is a POST with a JSON body. Parameters are validated against the published schema before anything is charged.

03
Pay
1 or 2 credits per call

Credits, not seats. Failed and blocked calls are never charged, and cache hits cost nothing.

04
Read
{ ok, data, meta, error }

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.

01jobs
POST/shixian/v1/jobs
{"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.

02search
POST/shixian/v1/search
{"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.

request
curl -X POST https://api.reefapi.com/shixian/v1/jobs \
  -H "x-api-key: $REEF_KEY" \
  -H "content-type: application/json" \
  -d '{}'
response envelope
{
  "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 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.

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 account, and no client identity in the response

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.

⭐ The engine tells you where the board ends

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.

⭐ Depth is age, and here is the curve

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.

🔴 Search is client-side, and the response says so

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.

⭐ Every brief has a budget

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 date is approximate, and honestly labelled

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 filters bite, and you can read them live

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.

The applicant count is the lead-quality signal

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.

What comes back, and what does not

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.

4

endpoints

1/2

credits per call

01

Agencies and freelancers call search to find Chinese contract briefs for a skill and read the client's stated CNY budget before pitching.

02

Rate-benchmarking tools page the board with jobs to chart budget and duration by role category.

03

Sales teams use job to turn one brief's full requirement text and employer profile into a qualified lead record.

04

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 →
$0.67–$1.50 / 1,000 credits
  • 1,000 free credits on signup, no card
  • One key, all 185 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
curl -X POST https://api.reefapi.com/shixian/v1/jobs \
  -H "x-api-key: $REEF_KEY" \
  -H "content-type: application/json" \
  -d '{}'
python
import requests

r = requests.post(
    "https://api.reefapi.com/shixian/v1/jobs",
    headers={"x-api-key": REEF_KEY},
    json={},
)
print(r.json()["data"])
FAQ

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.

0/4000

No account needed · we reply from [email protected]

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