Source research

Enumerable but Unreadable: China's Bankruptcy Register and Ten Other National Court Endpoints

Two days ago we published an inventory of eleven national endpoints under court.gov.cn and, in the same piece, admitted it was incomplete. Pulling the outbound links off the Supreme People's Court home page had surfaced eleven more national hosts that our own inventory did not mention: data, gtpt, rmft, peixun, pccz, ssfw, tiaojie, jubao, zxfw, rmfygg and dyjfalk.

We did not report what those returned, because our first attempt at them returned nothing at all — eleven hosts, eleven transport failures, a clean sweep. A clean sweep is not the shape a real finding usually has, and we said so rather than publishing eleven dead endpoints. This page is the debt being paid. It is also, as it turns out, the most interesting of the three measurements, because one of these eleven is the only national endpoint we have found that a crawler can walk.

Scope and units, stated once. Eleven national hostnames under court.gov.cn, measured from one machine on 30 August 2026. Front page over HTTPS, following redirects; robots.txt; DNS resolution; and for one host, a sample of detail pages. All text counts are of served markup — what a crawler receives — not of a rendered page. Nothing here is a statement about what any of these sites permits; see the closing section, which also records where our own requests and one site's robots file disagreed.

The first finding was our instrument, not the courts

Requested one at a time, four seconds apart, with retries armed and ready, eleven of eleven answered on the first attempt. No retry was needed. Not one of the failures we saw two days ago reproduced.

The explanation was in the DNS, and it is worth more than the correction itself. Ten of the fourteen national hosts we have now measured across three days — including China Judgements Online, the People's Court Case Database and the gazette portal from the earlier inventory — resolve to a single address, 123.6.81.98. Eleven hostnames fanned out concurrently were never eleven targets. They were one front door, hit eleven times at once, behaving exactly as a front door should.

So the lesson generalises past this page: when a batch of targets fails uniformly, the uniformity is usually a property of the measurement. Resolve first, then decide what your concurrency actually means.

Eleven hostnames are not eleven systems

The same resolution data undercuts the counting habit that inventories encourage. Two of the eleven, ssfw.court.gov.cn and zxfw.court.gov.cn, return byte-identical HTML with the same MD5, both 801 bytes, both loading their assets from a /zxfw/ path. They are one application answering on two names. Only tiaojie and rmfygg sit on infrastructure distinct from the main address, and rmfygg gave us two different addresses on two lookups minutes apart, which is what a rotating edge network looks like and is why we are not pinning an address to it.

Counted honestly, then: eleven names, at most ten applications, and most of them behind one address. If you are maintaining a source list, the hostname count is the least meaningful number on it.

The estate is more joined-up than its names suggest

Splitting hostnames apart is only half the correction; the other half is that several of them are pieces of one thing. The bankruptcy register links out to zxfw.court.gov.cn six times from its front page — the sign-in paths for creditors, investors and insolvency administrators. That 801-byte shell yielding four characters of text is not an orphan. It is the identity layer the register hands its users to, and a crawler treating each host as an independent site records the register as having no user-facing functions and the shell as having no content. Neither reading is right: it is one workflow split across two names.

The same holds a level deeper, in what the front ends talk to. The production bundle of the dyjfalk case library issues calls under /cpws_al_api/. So does the People's Court Case Database at rmfyalk.court.gov.cn, measured two days earlier, whose home script calls /cpws_al_api/api/cpwsAl/indexTongji for the case count we reported then. Two separately-branded case libraries, on two hostnames, addressing the same API namespace on the same estate.

We are not asserting the two serve the same corpus — we did not read either API's contents, and this is an observation about namespaces, not about records. But it is enough to change how a source list should be maintained. Deduplicate by what a host talks to, not by what it is called. Names are a branding decision at this layer; addresses and API prefixes are where the systems show through.

What the eleven return

Three of the eleven were down to an anonymous client on the day: data, gtpt and peixun each returned HTTP 502 Bad Gateway with a ~20 KB error page. That is not a transport failure and not an ambiguity — it is the front door reporting that the thing behind it did not answer. Roughly a fifth of the national estate, unavailable, on an ordinary Sunday.

Host (.court.gov.cn)What it isHTTPBytesVisible textLinks
pcczEnterprise bankruptcy & reorganisation register200231,1309,466189
rmftPeople's tribunals information network20098,7692,190112
tiaojieCourt mediation platform20045,0562,07296
rmfyggCourt announcements gazette20040,01491541
peixun50220,8261110
gtpt50220,3831110
data50220,3821100
jubaoJudicial misconduct reporting centre20017,921270
dyjfalkMulti-source dispute resolution case library20015,065250
ssfwOnline services (identical to zxfw)20080140
zxfwOnline services (identical to ssfw)20080140

Across all eleven: 511,148 bytes of HTML yielding 15,035 characters of visible text, 2.94 per cent. That is below the 3.6 per cent we measured on the first national batch and well below the 4.89 per cent across thirty-two provincial high courts. And it is carried almost entirely by one host — remove the bankruptcy register and the other ten return 280,018 bytes for 5,569 characters, 1.99 per cent.

Two entries deserve to be read slowly. dyjfalk is a case library — its title is the multi-source dispute resolution case database — and it hands a crawler 25 characters and zero links. ssfw and zxfw hand over four characters each, those four being the page title inside an 801-byte application shell. Nothing about any of the three is broken. They are single-page applications, and the content lives in requests a crawler does not make.

Where robots files exist, they more often forbid than permit

Three of eleven served a parseable robots file — the same ratio as the batch measured on 28 August, and the reason to look past the ratio is that the content runs the other way.

Hostrobots.txtEffect
tiaojie200, 26 bytes, catch-all group + Disallow: /All crawlers excluded from everything
dyjfalk200, 26 bytes, catch-all group + Disallow: /All crawlers excluded from everything
rmfygg200, 23 bytes, empty Disallow:Everything permitted
rmft, pccz, ssfw, zxfw404 (HTML error page)No restriction expressed
jubao302 redirectNo restriction expressed
data, gtpt, peixun502Unknown

Two of the three hosts that speak to crawlers at all tell them to leave, and one of the two is the case library. Set against our earlier batches — thirty-one of thirty-two provincial courts silent, most of the first national batch silent — the picture is not a judiciary that has decided to be crawled. It is a judiciary that has mostly not decided, and where it has, the decision is more often no than yes.

Two things follow, and only two. First, a research guide that lists these hosts as public sources is describing availability, not permission; those are different claims and only one of them is supported by a status code. Second, silence is still not consent — these sites carry terms of use and sit under Chinese law, and a missing robots file expresses nothing at all.

The bankruptcy register is the exception, and it is a real one

pccz.court.gov.cn, the national register for enterprise bankruptcy and reorganisation cases, breaks the pattern that has held across every layer we have measured. Its front page is server-rendered: 231,130 bytes yielding 9,466 characters and 189 anchors, against a layer median that struggles past two thousand characters.

More to the point, it is the only one of the eleven that puts case identifiers in served markup. We counted 72 distinct Chinese case numbers on the front page — (2026)粤1821破申4号, (2026)鲁1503破申8号, and so on, with publication dates running to two days before the measurement. Every other host in the batch: zero.

And they are reachable. The front page carries ordinary href attributes with stable id parameters — 34 links to judgment detail pages, 30 to announcements, 27 to public case pages, 20 to debtor records. A crawler with no JavaScript at all can enumerate this register and follow it inward. Nothing else in the national estate has offered that.

Then you open a case, and there is nothing in it

We followed eleven judgment links, across courts in Sichuan, Inner Mongolia, Henan, Jiangxi, Shanxi, Shanghai and Liaoning, with publication dates from December 2020 to August 2026. Every one returned about 13 KB and roughly 700 characters of visible text: the case caption, the publishing court, the publication date, a view count, navigation, and a footer.

Where the decision should be, all eleven serve the same two characters of placeholder — 加载中, loading. The text arrives later, from a request the crawler does not make.

This is the sharpest form we have found of the thing we have been circling for three days. The bankruptcy register is enumerable and unreadable at the same time. You can get a complete, dated, well-formed list of what exists. You cannot get one word of what any of it says. A pipeline pointed at this host produces a beautiful index over an empty corpus, and every check short of reading the body will pass.

The field that will quietly ruin your dataset

There is a worse trap on the same pages, and it is the reason this measurement is worth your time even if you never touch insolvency data.

On all eleven judgment detail pages we sampled, the debtor field in served markup contained the same company name — one Hunan property company — regardless of which case the page was about. Eleven different captions. Eleven different publishing courts. Publication dates spread across six years. One debtor string, identical every time.

It is not the site being broken. On the same pages, the caption, the court, the date and the view count are all correctly case-specific, and view counts differ page to page, so these are genuinely per-record renders. On the register's public case pages, a different template, the parties are correct and specific: a Foshan case names a Qingyuan decoration company and its individual applicant, a Liaocheng case names a Chiping energy company. One field, on one template, is wrong.

That is exactly what makes it expensive. It does not throw. It does not fail a schema check — the field is populated, with a well-formed Chinese company name. It survives a spot check of a single page, because a single page looks entirely plausible. It only becomes visible when you compare two records, which is precisely the step a bulk ingest skips. Anyone extracting structured rows from this register in the last several years, without that comparison, has been attributing every judgment in it to one company in Hunan.

Two smaller observations from the same sample, offered without inference. One document in the register is titled 空白模板-决定书blank template, decision — published 7 December 2020 by a district court in Shenyang, and carrying 41,298 views. And the front-end bundle of the dyjfalk case library still ships the default documentation and repository components of the open-source admin scaffold it was built on, links intact, in production. Neither is a scandal. Both are the sort of thing you find when you actually read what a source hands you, and both are reasons to read it.

What a source list should say about this layer

If you maintain a research guide, a vendor questionnaire or an ingestion plan, the eleven hosts here justify four lines, not eleven entries:

Reproducing this

Resolve each host first, so you know how many distinct targets you have. Then request each front page serially with a gap, follow redirects, record the status code, byte count and final URL, and read the page title back to confirm the host is the thing you think it is. Strip scripts, styles, comments and tags; count what remains. Fetch robots.txt separately and record its status code as well as its body — a 404 that returns an HTML error page is not a robots file. Then take one host with links in it, follow ten or so inward, and compare the same field across all of them.

Whole sweep, about sixty requests, well under an hour. Two rules earned the findings above: on a transport failure, discard the response body rather than reusing a buffer, and never let a uniform failure across a batch stand as a result until you have retried it serially.

What this page does not claim

It is one vantage point on one day. The three 502s may be a maintenance window; we did not retry them across days and do not assert they are chronically down. Addresses behind edge networks change, and rmfygg demonstrably changed its own within minutes.

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.

On which point, our own conduct, stated rather than glossed: we fetched each host's front page before reading its robots file. Two of them, tiaojie and dyjfalk, disallow all paths to all agents. That is three requests to dyjfalk and two to tiaojie that a compliant crawler would not have made, and after reading the files we made no further requests to either — which is why this page reports the case library's byte count and reports nothing whatsoever about its contents.

We did not render pages, so text counts are of served markup, which is what a crawler receives and not what a browser displays. We have not measured any other data provider's coverage of this layer and make no comparison to one. And our own record has published gaps: a large block of our corpus carries damaged dates and empty cause-of-action fields, a further block is withheld from publication and has no full text, and our retrieval does not yet normalise between traditional and simplified Chinese. We are the party selling the data, and this page's conclusion — that the free official layer is less usable by machine than its published-ness suggests — happens to favour us. Weigh it accordingly, and re-run it yourself.

Frequently asked questions

How many national court.gov.cn endpoints does China actually run?

More than any published inventory we have found, including our own. We listed eleven on 28 August 2026 and named eleven further hosts linked from the Supreme People's Court home page that we had not measured: data, gtpt, rmft, peixun, pccz, ssfw, tiaojie, jubao, zxfw, rmfygg and dyjfalk. Measuring those on 30 August 2026 brings the tested count to twenty-two, and the count of hostnames is still not the count of systems. Ten of the fourteen national hosts we have measured resolve to a single address, 123.6.81.98, and two of the eleven new ones, ssfw and zxfw, return byte-identical HTML with the same MD5, so they are one application answering on two names.

Can a crawler read case data from China's bankruptcy register?

It can enumerate cases and it cannot read them. On 30 August 2026, pccz.court.gov.cn was the only one of the eleven hosts to place case identifiers in served markup: 72 distinct case numbers on the front page, with 34 links to judgment detail pages, 27 to public case pages and 30 to announcements, all as ordinary href attributes with stable id parameters. The detail pages then return roughly 700 characters of metadata — case caption, publishing court, publication date, view count — and where the decision text should be they serve the placeholder for loading. We sampled eleven judgment pages across courts in Sichuan, Inner Mongolia, Henan, Jiangxi, Shanxi, Shanghai and Liaoning and publication dates from December 2020 to August 2026. All eleven carried the placeholder. The register is enumerable to a crawler and unreadable to one.

What is the debtor field problem on pccz.court.gov.cn?

On every judgment detail page we sampled, the debtor field in served markup contained the same company name — one Hunan property company — regardless of which case the page was about. Eleven pages, eleven different case captions, eleven different publishing courts, publication dates spread across six years, one debtor string. The neighbouring fields on the same pages vary correctly: captions, courts, dates and view counts are all case-specific. The same site's public case pages, on a different template, carry parties that match their cases. So this is one field on one template, not a broken site. For anyone extracting structured records from this register it is the expensive kind of defect: it does not throw, it does not look wrong in a spot check of a single page, and it silently attributes every judgment to the same company.

What do the robots.txt files of these court hosts say?

Three of the eleven served a parseable robots file on 30 August 2026, the same ratio as the batch we measured on 28 August, but the content runs the other way. Two of the three forbid everything: tiaojie.court.gov.cn and dyjfalk.court.gov.cn each return twenty-six bytes containing a catch-all user-agent group and Disallow slash. The third, rmfygg.court.gov.cn, returns twenty-three bytes with an empty Disallow, which permits everything. Of the remaining eight, four returned 404, one returned 302 and three returned 502. One of the two hosts excluding all crawlers is a case library. That is worth stating plainly, because a guide that lists these hosts as public sources is describing availability, not permission.

How much text do these endpoints return to a crawler?

Across all eleven front pages, 511,148 bytes of HTML yielded 15,035 characters of visible text once scripts, styles, comments and tags were removed — 2.94 per cent, lower than the 3.6 per cent we measured on the first national batch and the 4.89 per cent across thirty-two provincial high courts. One host carries most of it. Remove the bankruptcy register and the remaining ten return 280,018 bytes for 5,569 characters, 1.99 per cent. Two hosts, ssfw and zxfw, are 801-byte single-page-application shells yielding four characters each; the multi-source dispute case library returns 15,065 bytes for 25 characters. Byte size and legal substance are close to uncorrelated across this layer, for the same reason as at every other layer: the content is assembled client-side from requests the crawler never makes.

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