One Court System, Thirty-Two Domains: What Crawlers Get From China's Provincial High Courts
Yesterday we measured the eleven national endpoints under court.gov.cn and said plainly that provincial and municipal court sites were out of scope. That exclusion was the interesting part. Every research guide we have read stops at the same place: it lists the national portals, notes that local courts also maintain websites, and moves on. Nobody publishes what those local sites return.
This matters more than the national layer does, because the national layer is a small number of well-known hosts and the provincial layer is where the court system actually is. Each province, autonomous region and directly-administered municipality has a high court, and each of those runs a public website. If you are assembling a picture of what the Chinese judiciary publishes, thirty-two sites you have never tested are a larger blind spot than eleven you have.
So we tested them. On 29 August 2026, from one machine, we requested each provincial high court's front page over HTTPS and over plain HTTP, requested its robots.txt, followed redirects to the end, recorded status codes and byte counts, and stripped scripts, comments and tags to count how much text a crawler is left holding. Thirty-two hosts, about a hundred and thirty requests, a few minutes.
The first finding is that there is no list
We expected to start from a directory. There isn't one. There is no *.court.gov.cn namespace covering the provinces, no index page enumerating provincial courts with their addresses, no machine-readable registry. The nearest thing to an authoritative enumeration is the set of outbound links on the Supreme People's Court's own home page, which is where our list came from.
Having taken it from there, we then had to confirm that each host was the court we thought it was, so we read every page title. All thirty-two identify themselves — 河北省高级人民法院, 四川省高级人民法院, and so on — which is how we know the mapping is right rather than assumed. Two of those titles arrived unreadable, for reasons covered further down.
What the list shows is that the Chinese court system has no shared web namespace at the provincial level at all:
| Property | Measured, 29 August 2026 |
|---|---|
| Provincial-level courts measured | 32 |
| Distinct registrable domains | 32 — one per court, no sharing |
Hosted under court.gov.cn | 0 |
Under .gov.cn at all | 31 of 32 |
| Front page reachable (either scheme) | 32 of 32 |
| HTTPS returning 2xx | 22 of 32 |
Serving a parseable robots.txt | 1 of 32 |
Thirty-two courts, thirty-two second-level domains, and no two of them built on the same naming convention. Some are transparent: www.hebeicourt.gov.cn, www.gdcourts.gov.cn — note the plural on one and not the other. Some use the pinyin abbreviation for the province plus a word for court: jsfy.gov.cn, nxfy.gov.cn. Some are opaque unless you already know: Zhejiang is zjsfgkw.gov.cn, Chongqing is cqfygzfw.gov.cn, Sichuan is scssfw.gov.cn, Qinghai is qhwsfy.gov.cn. Jilin's court sits on e-court.gov.cn, a domain whose name says nothing about Jilin. Gansu's is chinagscourt.gov.cn.
Two collisions are worth flagging for anyone building a lookup table. Shanxi and Shaanxi — different provinces, identical romanisation without tone marks — both use the host prefix sxgy, on shanxify.gov.cn and sxfywcourt.gov.cn respectively. And Shanghai's high court is not on a .gov.cn domain at all: it is www.hshfy.sh.cn, the only one of the thirty-two outside the government namespace.
For a research guide, the practical consequence is that the provincial layer cannot be described by a pattern. It has to be enumerated, and the enumeration has to be maintained, because there is no upstream source to inherit it from.
A third of them cannot be fetched over HTTPS — for one reason
Twenty-two of the thirty-two answered HTTPS with a 2xx status. The other ten did not, and nine of those ten failed in exactly the same way: the TLS handshake completed, but the certificate presented was issued for a different name than the one requested. A strict client refuses the connection at that point.
The certificates tell you why. Eight of the nine presented a certificate for *.edgenext.com; the ninth presented one for www.baishan.com. These are content delivery networks. What we are looking at is nine provincial high courts fronted by an edge network on which no certificate has been installed for the court's own hostname, so the edge falls back to serving its own default. The tenth failure, Heilongjiang, was a connection timeout rather than a certificate problem.
| Court | Host | HTTPS result | Certificate presented |
|---|---|---|---|
| Inner Mongolia | gy.nmgfy.gov.cn | Refused | *.edgenext.com |
| Jilin | jlfy.e-court.gov.cn | Refused | *.edgenext.com |
| Anhui | ahfy.ahcourt.gov.cn | Refused | *.edgenext.com |
| Hubei | hubeigy.hbfy.gov.cn | Refused | www.baishan.com |
| Hunan | hngy.hunancourt.gov.cn | Refused | *.edgenext.com |
| Chongqing | cqgy.cqfygzfw.gov.cn | Refused | *.edgenext.com |
| Sichuan | scfy.scssfw.gov.cn | Refused | *.edgenext.com |
| Shaanxi | sxgy.sxfywcourt.gov.cn | Refused | *.edgenext.com |
| XPCC | btfy.btcourt.gov.cn | Refused | *.edgenext.com |
| Heilongjiang | www.hljcourt.gov.cn | Timed out | — |
All ten served their front page normally over plain HTTP. So these sites are up, and a person in a browser reaches them after clicking through a warning, or never sees a warning because they arrived over HTTP in the first place. What breaks is the automated path. A pipeline that requires valid TLS records ten of thirty-two provincial high courts as unreachable, and the failure looks like the site being down rather than like a certificate that was never installed.
The reverse case exists too, in smaller numbers. Henan answered HTTPS cleanly but failed on plain HTTP; Shandong answered HTTP with a 500 and HTTPS with a 200; Gansu answered plain HTTP with a 405. Whichever single scheme you standardise on, you will wrongly conclude that some of these courts have no website.
Thirty-one of thirty-two publish no robots.txt
This is the sharpest result in the set. We requested robots.txt from every host, over both schemes, and treated a response as a robots file only if it parsed as one rather than arriving as HTML.
Exactly one provincial high court publishes a robots file. Shandong's is twenty-two bytes:
User-agent: *
allow:/
Lowercase directive name, CRLF line endings, and a rule that permits everything. It is valid — directive names are case-insensitive — and it is the only crawl instruction any of the thirty-two provincial high courts publishes. The other thirty-one returned an HTML error page with HTTP 404.
Two things follow, and they are easy to conflate. The first is mechanical: under the robots exclusion standard, a 404 on robots.txt means no restrictions are expressed, and a conforming crawler proceeds. So the machine-readable position of thirty-one provincial high courts is silence, and silence is permissive by default.
The second is that silence is not permission. These sites have terms of use, they sit under Chinese law, and a status code is not a licence. We say the same thing about the national portals and we will say it again at the bottom of this page: the absence of a Disallow tells you what a crawler will do, not what you are entitled to do. The gap between those two sentences is where most data-sourcing risk lives.
Two million bytes, a hundred thousand characters
Across all thirty-two front pages we received 2,369,333 bytes of HTML. Stripping scripts, styles, comments and tags left 115,904 characters of visible text — 4.89 per cent. The median site yielded 3,604 characters; the thinnest was Shanghai at 1,346 and the richest Sichuan at 6,556.
That ratio is nearly identical to the 3.64 per cent we measured across the national endpoints the day before, and it has the same cause. These are portal pages: news carousels, notice lists, service tiles, all assembled by client-side script from JSON the crawler never requests. A crawler that does not execute JavaScript comes away with a masthead and a footer.
Encoding adds a second failure mode at this layer that we did not see nationally. Two of the thirty-two — Shanghai and Heilongjiang — returned titles that do not decode as UTF-8, arriving as sequences like ϺиԺ. The pages are served in a legacy Chinese encoding without a declaration that survives to the byte stream. A human browser guesses correctly. A pipeline that assumes UTF-8, as most do, silently ingests two provincial high courts as mojibake and will not raise an error while doing it.
What the provincial layer is actually for
The obvious question after all this is whether these sites hold judgments. Mostly they do not — they point at the ones that do. Twenty-seven of the thirty-two front pages reference China Judgements Online or carry the phrase for judgment documents; nineteen reference the enforcement disclosure portal.
Read structurally, the provincial layer is a signpost layer. It carries local notices, court news, hearing schedules, service links and provincial-level guidance, and for actual decision text it forwards to the national portals. That is a coherent design, and it is worth stating in plain terms because it corrects a natural assumption. Thirty-two provincial court websites are not thirty-two additional judgment sources, and a research guide that lists them alongside China Judgements Online without saying so implies a symmetry that does not exist.
It also means the failures above matter less for corpus building than they first appear, and more for something else: provenance. If you need to confirm that a court exists under the name a judgment gives, or find its jurisdiction, or cite the court's own publication of a notice, the provincial site is the primary source — and it is the primary source that a tenth of the time will not answer an automated request, and twice in thirty-two will hand you unreadable bytes.
A correction to yesterday’s count
Building this list forced a check on our own previous page. Yesterday we published an inventory of eleven official endpoints under court.gov.cn. The provincial hostnames used here came from the Supreme People’s Court’s own home page, and extracting them meant reading every outbound link on that page — which showed that eleven is not the size of the national set.
At least eleven further hosts under court.gov.cn are linked directly from the SPC home page and appear nowhere in yesterday’s inventory: data, gtpt, rmft, peixun, pccz, ssfw, tiaojie, jubao, zxfw, rmfygg and dyjfalk. Yesterday’s page covered the hosts a research guide would name: the ones carrying decisions, dockets, hearings and the Gazette. That was a defensible selection, but the page presented those eleven as the national endpoints rather than as the eleven we had chosen to measure. The accurate statement is that the national layer under court.gov.cn is at least twice the size of the inventory we published, and that our page described a subset without saying so.
We are not publishing measurements for the additional eleven today, and the reason is worth recording. Our first pass returned an identical transport failure for all eleven, which is not the shape a real finding has. Requesting the same hosts individually a few minutes later returned a 502, a 301 and a 200. The uniform failure was almost certainly ours: several of these names resolve to the same web application firewall address as China Judgements Online, and a burst of requests from a single client is the obvious explanation. So those hosts remain unmeasured, which is a different claim from unreachable, and we would rather leave a gap than publish a number we could not reproduce ten minutes later.
That is also the practical caution for anyone reproducing this work: pace the requests, and treat a set of identical failures as a defect in the measurement before treating it as a fact about the target.
The full inventory
All thirty-two, as measured on 29 August 2026. “Front page served over” records the scheme that returned the page; where it reads HTTP only, HTTPS was refused or timed out. Byte and character counts are of the served markup.
| Province / region | Host | Front page served over | HTML bytes | Visible text chars | robots.txt |
|---|---|---|---|---|---|
| Beijing | bjgy.bjcourt.gov.cn | HTTPS | 57,782 | 2,405 | none (404) |
| Tianjin | tjfy.tjcourt.gov.cn | HTTPS | 111,057 | 4,364 | none (404) |
| Hebei | www.hebeicourt.gov.cn | HTTPS | 89,296 | 4,551 | none (404) |
| Shanxi | sxgy.shanxify.gov.cn | HTTPS | 49,662 | 2,126 | none (404) |
| Inner Mongolia | gy.nmgfy.gov.cn | HTTP only | 54,520 | 2,509 | none (404) |
| Liaoning | ln.lncourt.gov.cn | HTTPS | 58,663 | 2,691 | none (404) |
| Jilin | jlfy.e-court.gov.cn | HTTP only | 94,162 | 3,803 | none (404) |
| Heilongjiang | www.hljcourt.gov.cn | HTTP only | 55,688 | 1,680 | none (404) |
| Shanghai | www.hshfy.sh.cn | HTTPS | 44,619 | 1,346 | none (404) |
| Jiangsu | www.jsfy.gov.cn | HTTPS | 71,497 | 5,669 | none (404) |
| Zhejiang | www.zjsfgkw.gov.cn | HTTPS | 66,675 | 1,971 | none (404) |
| Anhui | ahfy.ahcourt.gov.cn | HTTP only | 81,215 | 3,474 | none (404) |
| Fujian | fjfy.fjcourt.gov.cn | HTTPS | 70,935 | 2,732 | none (404) |
| Jiangxi | jxgy.jxfy.gov.cn | HTTPS | 51,381 | 2,559 | none (404) |
| Shandong | www.sdcourt.gov.cn | HTTPS | 110,801 | 3,755 | allow-all (22 B) |
| Henan | www.hncourt.gov.cn | HTTPS | 65,412 | 3,869 | none (404) |
| Hubei | hubeigy.hbfy.gov.cn | HTTP only | 45,156 | 2,243 | none (404) |
| Hunan | hngy.hunancourt.gov.cn | HTTP only | 105,063 | 4,683 | none (404) |
| Guangdong | www.gdcourts.gov.cn | HTTPS | 67,578 | 5,593 | none (404) |
| Guangxi | gxfy.gxcourt.gov.cn | HTTPS | 92,800 | 5,808 | none (404) |
| Hainan | www.hicourt.gov.cn | HTTPS | 66,603 | 3,604 | none (404) |
| Chongqing | cqgy.cqfygzfw.gov.cn | HTTP only | 55,822 | 3,919 | none (404) |
| Sichuan | scfy.scssfw.gov.cn | HTTP only | 83,381 | 6,556 | none (404) |
| Guizhou | www.guizhoucourt.gov.cn | HTTPS | 73,161 | 2,936 | none (404) |
| Yunnan | fy.yngy.gov.cn | HTTPS | 106,291 | 5,884 | none (404) |
| Tibet | xzgy.xzcourt.gov.cn | HTTPS | 42,522 | 2,234 | none (404) |
| Shaanxi | sxgy.sxfywcourt.gov.cn | HTTP only | 121,278 | 5,342 | none (404) |
| Gansu | www.chinagscourt.gov.cn | HTTPS | 79,222 | 4,810 | none (404) |
| Qinghai | qhgy.qhwsfy.gov.cn | HTTPS | 59,149 | 2,519 | none (404) |
| Ningxia | www.nxfy.gov.cn | HTTPS | 67,160 | 2,030 | none (404) |
| Xinjiang | xjfy.xjcourt.gov.cn | HTTPS | 126,659 | 6,270 | none (404) |
| XPCC (Xinjiang Corps) | btfy.btcourt.gov.cn | HTTP only | 44,123 | 1,969 | none (404) |
How to write this into a research guide
If you maintain a guide to Chinese legal research and want an entry for the provincial layer that will still be true when a reader tests it, four sentences do most of the work.
- Say there is no pattern. Each provincial high court is on its own registrable domain, none under
court.gov.cn, and one is outside.gov.cnentirely. The list must be enumerated, not derived. - Say which scheme. Give the URL that answered, and note that a number of these hosts serve correctly only over plain HTTP because of certificates issued for a delivery network rather than the court.
- Say what they hold. Notices, news, hearing information and service links; decision text lives on the national portals they link to.
- Date the entry. Every observation on this page is from one day and one vantage point, and the transport-level facts in particular are the kind that change without announcement.
Reproduce it
Nothing here needs privileged access, and the value of the method is that it can be re-run rather than that our numbers can be cited indefinitely. For each host, request the front page over both schemes and robots.txt over both, recording status, bytes and the final URL after redirects. Then:
- Write each response to a fresh file. Our first pass reused one temporary path, so failed fetches inherited the previous response's body and produced three provinces labelled with a neighbour's page title. We caught it because the titles disagreed with the hosts; the fix is to discard the body whenever the transport failed, and to trust body-derived fields only when it did not.
- Read the page title and check it against the province. This is the cheapest possible validation of a hand-built host list, and it is the check that caught the bug above.
- Treat a 200 as a robots file only if it parses as one. An HTML error page with a success status is not an empty rule set, and the distinction changes what a compliant crawler concludes.
- Pace the sweep, and distrust uniform failures. Several court hostnames sit behind shared web application firewalls, and a fast burst from one client can return a transport error on every host at once. If every member of a set fails identically, suspect the measurement before the target.
- Record the certificate subject on TLS failure. Nine of our ten failures collapsed into one root cause only once we looked at what name the certificate was issued for.
What this page does not settle
It is a single vantage point on a single day. Several of these hosts sit behind edge networks that vary by origin, so a reader in another country may get different codes, and the certificate observations in particular describe a configuration that can be corrected at any time without notice.
It is not a legal conclusion. We did not log in, did not test rate limits, did not read terms of use, and did not evaluate whether any of this material may be collected or reused. Status codes are not permissions, and a missing robots.txt is not a licence.
We did not render pages. Text counts are of served markup, which is what a crawler receives, not what a browser displays. We did not measure intermediate or basic courts, which are far more numerous, and we do not extrapolate from thirty-two provincial sites to them. We have not measured any other data provider's coverage of this layer and make no comparison to one.
And our own record has gaps we have published: a large block of our corpus carries damaged dates and empty cause-of-action fields, a further block is marked as withheld from publication and has no full text, and our own retrieval does not normalise between traditional and simplified Chinese. Those are open engineering items on our side, not solved problems. We are the party selling the data, and a fair reading of this page is that the free official layer is less usable by machine than its published-ness suggests — which is an argument that happens to favour us, so weigh it accordingly and re-run the measurement yourself.
Frequently asked questions
All thirty-two provincial-level high courts — the thirty-one provinces, autonomous regions and directly-administered municipalities plus the Xinjiang Production and Construction Corps court — maintain a public website, and all thirty-two were reachable on 29 August 2026. There is no shared namespace: each sits on its own registrable domain, none of them under court.gov.cn, and Shanghai's is not under .gov.cn at all but on www.hshfy.sh.cn. There is also no official directory enumerating them. The nearest authoritative list is the set of outbound links on the Supreme People's Court's own home page, which is where the list used here came from. Naming conventions do not generalise: Hebei is www.hebeicourt.gov.cn while Zhejiang is www.zjsfgkw.gov.cn and Jilin's court sits on e-court.gov.cn, a domain whose name does not mention Jilin.
Not all of them. On 29 August 2026, twenty-two of thirty-two answered HTTPS with a 2xx status and ten did not. Nine of those ten failed identically: the TLS handshake completed but the certificate presented was issued for a delivery network rather than the court, eight for *.edgenext.com and one for www.baishan.com, so a strict client refuses the connection. The tenth, Heilongjiang, timed out. All ten served the same front page normally over plain HTTP. The asymmetry runs the other way too — Henan answered HTTPS but failed over plain HTTP, Shandong returned 500 over HTTP and 200 over HTTPS, and Gansu returned 405 over HTTP. A pipeline that standardises on one scheme will record some of these courts as having no website at all.
Thirty-one of the thirty-two publish no robots.txt: the request returns an HTML error page with HTTP 404. Exactly one does. Shandong's is twenty-two bytes containing a catch-all user-agent group and a lowercase allow directive permitting everything. Under the robots exclusion standard a 404 means no restrictions are expressed and a conforming crawler proceeds, so the machine-readable position of thirty-one provincial high courts is silence. Silence is not permission. These sites carry terms of use and sit under Chinese law; a status code describes what a crawler will do, not what a collector is entitled to do.
Mostly they point at the portals that do rather than holding decisions themselves. Twenty-seven of the thirty-two front pages measured on 29 August 2026 reference China Judgements Online or carry the phrase for judgment documents, and nineteen reference the enforcement disclosure portal. Structurally the provincial layer is a signpost layer carrying local notices, court news, hearing schedules and service links, forwarding to the national portals for decision text. Thirty-two provincial court websites are therefore not thirty-two additional judgment sources, and a guide that lists them next to China Judgements Online without saying so implies a symmetry that does not hold. Where they are primary is provenance: confirming a court exists under the name a judgment gives, or citing the court's own publication of a notice.
Very little relative to their size. Across all thirty-two front pages the sites returned 2,369,333 bytes of HTML yielding 115,904 characters of visible text once scripts, styles, comments and tags were removed, about 4.89 per cent. The median site yielded 3,604 characters, the thinnest 1,346 and the richest 6,556. The cause is the same as at the national level: these are portal pages whose news lists and service tiles are assembled by client-side script from data the crawler never requests. Encoding adds a second failure mode — two of the thirty-two, Shanghai and Heilongjiang, return titles that do not decode as UTF-8, so a pipeline assuming UTF-8 ingests them as mojibake without raising an error.
Verify the official layer yourself. Then decide what you still need.
SinoVerdict licenses PRC judgment data to teams building legal AI — bulk delivery, a REST API and an MCP endpoint over a 160M+ record corpus, English-indexed, with case-number citations to the original judgments and the known gaps documented before anything is signed. Tell us which questions your product has to answer and we will show you, on your slice and with counts, which of them the record supports and which it does not. Write to chenjiaxin@wenshucha.com or use the form.
Request trial access