Buyer’s question

The Case Number Is the Only Honest Province Field

Yesterday we published a provincial axis for walking a capped Chinese court registry and ended the piece with an admission: we had built our thirty-two-character alphabet out of abbreviations a reasonable person would guess, we had found one of them wrong by accident, and we had not audited the rest against any authoritative table. Today we audited it — not against a table, against 19,591 case numbers written by the courts themselves, drawn from our own corpus.

The alphabet survived. What did not survive is the field sitting next to it. In the same pass we measured our own province labels and found that 22.3 per cent of records across all thirty-one provincial units are unreachable by that province’s official name, that roughly 11 per cent fall into no region bucket at all, that our own facet list advertises region names which return zero results when you filter on them, and that a handful of judgments are filed under provinces they have nothing to do with — including one whose court name literally contains the correct province.

All of that is our data. We are publishing it because the interesting part is not our defect list. It is that the case number catches every one of these errors and the province field catches none of them, and that is a property of Chinese court data generally, not of us.

Scope, stated once. Roughly 2,100 queries issued on 3 September 2026 against our own search index and our public key-free case endpoint, from one machine. Counts labelled “exact” are result-set totals returned by the index; everything described as a sample is a bounded page walk in the order the index returned, which is not a random sample and is stated as such at each use. Nothing here is a claim about any other vendor’s corpus, because we did not measure one. No personal data appears below: the case numbers quoted identify courts and dockets, not people. Figures are dated because an index changes.

What a Chinese case number actually is

From 2016 onward — the year our own data shows the change land, below — a mainland Chinese case number has a fixed shape: a year in brackets, a court code, a case-type abbreviation, a sequence number. (2025)内0403民初5631号 is the 5,631st first-instance civil case of 2025 at court 0403 in the region whose code is — Inner Mongolia.

Two things follow. The first is that the number is self-certifying. It was assigned by the issuing court and travels inside the document text; it is not a label some pipeline attached afterwards. The second is that the first character after the year is a region code, so if a record’s province field and its case number disagree, one of them is a derived guess and you can tell which.

That is the whole audit. It costs nothing, it needs no reference table, and it works on any sample of any vendor’s output, including ours.

Finding 1: the alphabet is thirty-two characters, and only since 2016

We sampled oldest-first across all thirty-one provincial units, deduplicated by case number, and bucketed 19,591 numbers by the year inside the brackets. For each year we counted how many distinct characters appear in the first position after the year, and what share of them equal the region code of the province we had filtered on.

Year in case numberSampledFirst char equals region codeDistinct first characters
20111,16716.8%219
201256618.2%177
20131,86510.5%351
20142,1958.5%435
20152,0527.1%429
20161,86298.2%38
20172,09099.1%34
201888599.8%32
20201,078100.0%31
20221,62695.0%32

The alphabet collapses from 435 distinct characters to 38 in a single year, and the match rate goes from 7.1 per cent to 98.2 per cent across the same boundary. That is the 2016 case-numbering reform, measured rather than cited.

Before it, courts numbered cases with their own abbreviations, not their province’s. In our oldest-first stratum the most common first characters include for Shenyang, for Kunming, for Harbin, for Lhasa, for Taiyuan, for Guiyang — city codes, prefecture codes, and in a few cases district codes. Across the 6,162 parseable case numbers in our oldest-first stratum we counted 388 distinct first characters, and we have no reason to think that set is closed.

So the honest correction to yesterday’s piece is not that the alphabet was wrong. It is that the alphabet has a start date. A provincial axis built on the first character is a sound partition key for 2016 onward and is close to meaningless before it — and a corpus that spans both eras will let you build the axis, run it, and get a clean-looking result that quietly ignores everything older than 2016.

Two characters that are not provinces

Two codes in the modern alphabet do not correspond to any province. belongs to the Supreme People’s Court — (2024)最高法执监648号 — and in our index those records carry a province field whose value is the court’s own name rather than a province. belongs to the courts of the Xinjiang Production and Construction Corps, which sit inside Xinjiang geographically and number their cases under their own code: in our last-three-years sample for Xinjiang, 198 of 200 case numbers began with and two with . One province, two characters. Any grid that assumes one code per region loses whichever one it did not think of.

Specialised courts do not add to the alphabet. Maritime, railway transport and financial courts keep the province code and take a distinctive court number instead — (2024)辽72执恢129号 for Dalian Maritime Court, (2025)鲁7101执359号 for Jinan Railway Transport Court, (2025)京74民辖终118号 for the Beijing Financial Court. Useful to know before you conclude your alphabet is leaking.

Finding 2: the official province name reaches only part of a province

Our index stores the province in more than one form. Some records say 北京, some say 北京市. Some say 广西壮族, some say 广西壮族自治区. Filtering on the official full name returns only the records stored in that form.

We ran the same broad query for every provincial unit twice, once on the short stem and once on the official administrative name, and took the exact result totals:

ProvinceReached by stemReached by official nameUnreachable by official name
Yunnan2,588,1661,399,80345.9%
Inner Mongolia2,274,0861,587,23430.2%
Hainan268,637187,61030.2%
Shanxi1,579,8651,118,90729.2%
Sichuan5,088,9493,619,44928.9%
Beijing3,196,6812,357,78726.2%
Guangdong6,876,4685,489,62820.2%
Shandong9,483,2677,985,74115.8%
Liaoning6,085,6595,225,59714.1%
All 31 units109,919,82385,425,93422.3%

Every one of the thirty-one loses at least 14.1 per cent. The aggregate gap is 24,493,889 records. Nothing about the query says so: both spellings return HTTP 200, both return real judgments from the right province, and the narrower one simply returns fewer.

You can reproduce the shape of this on our public key-free endpoint without a key, using a slice small enough to escape its ten-thousand-hit counting cap:

curl -sG https://tob.wenshucha.com/api/cases/search \
  --data-urlencode 'q=工伤' --data-urlencode 'province=西藏'
# => "total": 398

curl -sG https://tob.wenshucha.com/api/cases/search \
  --data-urlencode 'q=工伤' --data-urlencode 'province=西藏自治区'
# => "total": 324

Same corpus, same query, one word longer in the filter, 74 records fewer — 18.6 per cent of Tibet’s work-injury cases, invisible to anyone who typed the province’s legal name.

Finding 3: our facet advertises values that filter to nothing

The region facet behind our search returns thirty-four keys. Three of them are not administrative names of anything: 广西壮族省, 新疆维吾尔省, 宁夏回族省. On one query a fourth appeared — a court’s full name with the character for “province” stuck on the end. The pattern is a display layer appending a suffix to a stored stem and having no case for autonomous regions.

The consequence is worse than cosmetic. Filtering on those advertised labels returns zero. The facet offers a value; the filter has never heard of it. On a divorce query the malformed Guangxi key carried 86,880 documents by the facet’s own count and 0 by the filter’s.

And the facet is capped at thirty-four entries — we tried five different size parameters and none moved it. Thirty-four is close enough to the number of provincial units to look complete. It is not: on a work-injury query, the four malformed keys occupied slots and pushed Tibet off the list entirely, while a direct filter shows Tibet has 398 such records. A buyer scanning that facet would conclude, reasonably and wrongly, that we hold no work-injury cases from Tibet.

Why we are showing you this. A vendor’s facet list is the first thing most evaluations look at and the last thing anyone verifies, because it looks like an inventory. It is a rendering. The two ways to catch it are to filter on every value the facet offers and check that none returns zero, and to compare the facet’s key count against the number of regions you expect — if they are equal, ask what fell off the bottom.

Finding 4: about eleven per cent of records land in no region bucket

Summing every bucket the facet returns and subtracting from the query total gives the share of records that fall into no region bucket:

QueryTotal hitsSum of region bucketsIn no region
合同 (contract)82,420,42573,302,1529,118,273 (11.1%)
执行 (enforcement)76,339,99567,934,3188,405,677 (11.0%)
离婚 (divorce)8,773,2497,664,8911,108,358 (12.6%)
工伤 (work injury)933,083841,62291,461 (9.8%)

Part of that is the facet cap eating the tail, and we say so rather than attributing all of it to missing metadata. But the empty province is real and we have seen it directly: Wuhan Railway Transport Court records in our index carry an empty province field while their case numbers begin with . The case number knows; the field does not.

Finding 5: some province labels are simply wrong

Filtering on one province and reading the case numbers turns up records whose code belongs to a different one. Four we can name:

Case numberIssuing courtProvince field in our index
(2025)鲁0591执1482号之五Dongying Economic & Technological Development Zone People’s Court (Shandong)Hebei
(2023)鲁1681执保1189号Zouping City People’s Court (Shandong)Shanxi
(2023)湘3125执398号Baojing County People’s Court, Hunan ProvinceFujian
(2024)皖1882执232号Guangde City People’s Court (Anhui)Guangdong

The third one is the instructive case: the court’s own name begins with the characters for Hunan Province and the record is filed under Fujian. The fourth suggests the mechanism — 广德, a city in Anhui, matched against 广东, a province — a fuzzy string match on the court name, which is exactly how a province field gets derived when it was never supplied.

Rate, honestly bounded: across 6,180 case numbers in a last-three-years stratum, 252 (4.08 per cent) had a first character other than the filtered province’s code. 198 of those are Xinjiang’s legitimate and not errors at all. The remainder is 54 records, 0.87 per cent. That is a page-walk in relevance order, not a random sample, so treat it as a demonstration that the class exists and that the case number detects it — not as our corpus-wide error rate, which we have not measured and are not going to imply.

The same record has two provinces depending on which door you use

Our public case endpoint reports its own repair counters per page, and one of them is a count of rows whose province was backfilled at read time. Across six broad queries it fired on 5 of 116 rows. So the endpoint derives a province from the court name when the stored one is missing, while the raw index that powers the facet and the filter does not.

That is the deepest version of this problem and it is not specific to us. A region label on a Chinese judgment is almost never a stored fact; it is a derivation. Different doors into the same corpus derive it at different times with different rules, so “how many Guangxi cases do you have” has several true answers and the difference between them is not documented anywhere by default. The case number is the one field in the record that no pipeline invented.

Finding 6: the brackets are not normalised, and that is a silent filter

Case numbers in our corpus use both the ASCII bracket ( and the full-width bracket . The mix moves with era but is nowhere clean:

Stratum (6,200 case numbers each)ASCII (Full-width Neither / empty
Last three years, relevance order93.9%5.8%0.3%
Oldest first0.05%99.3%0.6%

Per province the recent mix is far less tidy than the aggregate suggests. In the same last-three-years stratum, Guangdong came back 109 ASCII to 91 full-width and Fujian 120 to 80. A parser anchored on ^\( would drop about 45 per cent of that Guangdong sample and essentially the entire pre-reform archive, and it would drop them the way these things always drop: no exception, no warning, a smaller number at the end of the run.

We also found case numbers that are empty strings, case numbers that begin with neither bracket, and one where a masked character stands in the position of the court code. If you are keying anything on the case number — deduplication, joins, citation resolution — normalise the bracket and the digits before you compare, and count what fails to parse instead of skipping it.

The audit, in five steps, on anybody’s corpus

  1. Filter by each region twice — once by the short name, once by the full official name. If the totals differ, the field holds more than one spelling and one of your filters is silently narrower.
  2. Filter on every value the facet offers. Any facet value returning zero is a rendered label, not an index value. Count the facet’s keys; if the count equals the number of regions you expect, ask what the cap truncated.
  3. Sum the facet buckets against the reported total. The gap is records with no region, plus whatever the cap hid. Both matter and they are different problems.
  4. Read the first character of the case number and compare it to the region label. Expect a real mismatch for Xinjiang Corps courts and Supreme People’s Court records; anything else is a label error, and the case number is the side that is right.
  5. Bucket by the year in the brackets. If the vendor claims a provincial partition, ask what it does before 2016, when the first character was a court abbreviation out of a set of several hundred rather than a region code out of thirty-two.

Every step is a handful of queries against a search interface. None of it requires the vendor’s cooperation, a sample export, or a reference table. Run it on us: the two curl commands above are the whole method in miniature, and the Guangxi facet value that returns zero is still returning zero as we publish.

What we are not claiming

The reason to publish a defect list rather than a capability list is that everything above is checkable in about ten minutes, and a vendor who tells you where their metadata bends is cheaper to evaluate than one who makes you find out during a pilot.

Frequently asked

How can I tell whether a Chinese judgment’s province label is correct?

Read the first character after the year in the case number. From 2016 onward that character is the region code assigned by the issuing court, so it is the record’s own statement of where it came from, not a label added by a pipeline. Two legitimate exceptions exist: the character for the Xinjiang Production and Construction Corps, whose courts sit inside Xinjiang but number under their own code, and the Supreme People’s Court code, which belongs to no province. Any other disagreement between the case number and the province field is a label error, and the case number is the side that is right.

Does the provincial code in a Chinese case number work for older judgments?

No, and this is the trap. We bucketed 19,591 case numbers by the year in the brackets. For 2015 only 7.1 per cent of first characters matched the province code and we counted 429 distinct characters in that position; for 2016 the figures are 98.2 per cent and 38. Before the 2016 reform courts numbered cases with their own city, prefecture or district abbreviations, and across the 6,162 parseable case numbers in an oldest-first sample we counted 388 distinct first characters, with no reason to believe that set is closed. A provincial partition built on the first character silently excludes the pre-2016 archive.

Why does filtering by a province’s official name return fewer Chinese judgments than the short name?

Because the province is usually a derived field and different ingest paths store it in different forms — the bare stem in some records, the full administrative name in others. Measured on our own index on 3 September 2026 across all thirty-one provincial units, the official name reached 85,425,934 records where the short stem reached 109,919,823: 24,493,889 records, or 22.3 per cent, unreachable by the province’s legal name. Every unit lost at least 14.1 per cent and Yunnan lost 45.9 per cent. The query gives no sign; both spellings return real judgments from the right province.

Can a search facet undercount a region without any error?

Yes, in two ways at once, both of which we found in our own interface. A facet can render a label that does not exist as an index value, so the value appears in the list and filtering on it returns zero — one of ours carried 86,880 documents by the facet’s count and none by the filter’s. And a facet can be capped: ours returns at most thirty-four keys and no size parameter moves it, so on one query four malformed keys occupied slots and pushed Tibet off the list, even though a direct filter returns 398 records for it. Filter on every value the facet offers, and compare the key count against the number of regions you expect.

What should I normalise before joining on Chinese case numbers?

The brackets first. Both the ASCII bracket and the full-width bracket occur in our corpus; in a last-three-years sample the split was 93.9 per cent to 5.8 per cent overall, but per province it was far less tidy — Guangdong came back 109 to 91. In an oldest-first sample the full-width form was 99.3 per cent. A parser anchored on the ASCII bracket drops roughly 45 per cent of that Guangdong sample and nearly the whole pre-reform archive, with no exception raised. Also expect empty case numbers, numbers starting with neither bracket, and occasional masked characters: count parse failures rather than skipping them.

Run the five steps on us, then run them on everyone else.

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 the known gaps written down before anything is signed. If step 1 or step 4 turns up something on our data we have not listed here, send it and we will publish it. Write to chenjiaxin@wenshucha.com or use the form.

Request trial access