HSK is the standard Chinese proficiency exam. Its new version, HSK 3.0, has nine levels instead of six, and its word lists are published as a PDF. If you are building a flashcard app, a reader, a tokenizer test set or a frequency study, you want rows.
We needed those rows for HSKStory, where every story is checked word by word against its level's list. So we cleaned the lists once and put them on GitHub under CC BY-SA 4.0:
github.com/bezlant/hsk-3-vocabulary
What is in it
| File | Rows | Contents |
|---|---|---|
hsk-3.0-vocabulary.csv / .json | 10,898 | one row per word, with the level that introduces it |
by-level/hsk-1 to by-level/hsk-7-9 | 300 to 5,562 | the words each level adds |
hsk-2.0-to-3.0-changes.csv / .json | 11,087 | every word in either standard, with old level, new level and status |
Each word has five columns:
simplified,traditional,pinyin,level,definitions 爱,愛,ài,1,to love; to be fond of; to like; affection; to be inclined (to do sth); to tend to (happen) 八,八,bā,1,eight In the JSON files definitions is an array. Levels 7, 8 and 9 share one band in the syllabus, so their level value is the string 7-9.
Load it
Python, standard library only:
import csv, io, urllib.request from collections import Counter URL = "https://raw.githubusercontent.com/bezlant/hsk-3-vocabulary/main/hsk-3.0-vocabulary.csv" text = urllib.request.urlopen(URL).read().decode("utf-8") words = list(csv.DictReader(io.StringIO(text))) print(len(words)) # 10898 print(Counter(w["level"] for w in words)) # 7-9: 5562, 6: 1777, 5: 1579, 4: 990, 3: 493, 1: 300, 2: 197 JavaScript:
const url = "https://raw.githubusercontent.com/bezlant/hsk-3-vocabulary/main/hsk-3.0-vocabulary.json"; const words = await (await fetch(url)).json(); const hsk1 = words.filter((w) => w.level === "1"); console.log(hsk1.length); // 300 Why 10,898 and not 11,000
The syllabus says 11,000. That number counts entries cumulatively, and some written forms appear more than once across levels. One row per distinct word gives 10,898.
Two words will trip you up if you rebuild the cumulative lists by filtering on level. 有点儿 is listed at HSK 1, but from HSK 2 upward the syllabus writes it as 有一点儿. 有时 is listed at HSK 2 and becomes 有时候 from HSK 3. The README shows how to reproduce the published cumulative lists exactly.
What changed from the old HSK
The change file answers the question every learner with an old textbook asks.
| Status | Words |
|---|---|
added (new in 3.0) | 6,094 |
same_level | 2,350 |
moved_up | 1,999 |
moved_down | 455 |
removed | 189 |
So fewer than half of the old list's words kept their level, and more than half of the new list was not in the old one at all.
Sources and license
Word scope and levels come from the final HSK examination syllabus published by the Center for Language Education and Cooperation in November 2025. Pinyin and English definitions come from CC-CEDICT, with 105 entries corrected by hand where the dictionary's default sense did not match how the syllabus uses the word. CC-CEDICT is share-alike, so the dataset is CC BY-SA 4.0 too.
If a definition or reading is wrong, open an issue on the repository. The same lists run the vocabulary pages on hskstory.com, so a fix there reaches learners as well.