Performance marketing for AI-era growth – backed by models, not gut feeling.
TL;DR
  • 132 published cost items (dormitory, canteen, insurance, residence permit, transport and others) for 19 universities and their cities; 17 of 132 rows are not_found and record which page was checked.
  • 32 tuition rows. At 10 universities with both tracks, the university's own English-taught programme costs 1.2 to 8.2 times the Chinese-taught one, lowest published fee of each track (Tsinghua: 100,000 against 30,000 CNY, ×3.3).
  • Estimated full year: 4,537 to 13,955 USD on the Chinese-taught track at 15 mainland universities; 35,170 to 46,886 USD on the English-taught track at the 3 Hong Kong universities (CUHK included as a reference). 22 of 32 totals are a floor because a component is not published.
  • 10 of the 15 mainland universities publish no living-cost estimate; their totals carry the full range of the other universities' estimates (8,000 to 20,000 CNY a year), so their ranges are wider than in the article, which uses the midpoint of 14,000 CNY and gets 5.4K to 9.5K USD a year for 13 of the 15 (Fudan and Peking cost more).
  • 35 scholarships for international bachelor students. 25 state what they cover; 9 of these 25 cover tuition, housing and living (full_ride).
  • Chinese Government Scholarship Type A places for 2026/27 are published for 3 of 6 countries checked (Russia 120, Turkey 13, Italy 23).
Download

data.csv. 132 rows, 22 columns.

csc_quotas.csv. 22 rows, 12 columns.

scholarships.csv. 35 rows, 61 columns.

tuition.csv. 32 rows, 19 columns.

year_total.csv. 32 rows, 25 columns.

sources.csv. 163 rows, 6 columns.

data.json: the rows of data.csv as JSON.

schema.json: JSON Schema of data.json.

datapackage.json: Frictionless Data descriptor of every CSV.

Also on Kaggle · Hugging Face

Scope

16 mainland universities in the ARWU 2026 top 100 plus 3 in Hong Kong (HKU and CityUHK are in the top 100, CUHK is kept as a reference).

Codebook

data.csv, 132 rows. Unique key: cost_id.

ColumnTypeValues / unitWhat it holds
cost_idstringtext (132 distinct)Row id: <university_id or city>__<item>__<nn>.
university_idstringtext (19 distinct); null in 14Stable slug of the university, the same id as in the other Long Bet datasets (e.g. tsinghua-university).
citystringtext (15 distinct); null in 6City in English.
itemstringtext (16 distinct)Cost item (snake_case), e.g. dorm_single, canteen_meals, insurance, residence_permit_fee.
periodstringone_off, per_day, per_month, per_semester, per_trip, per_year; null in 19Period the amount refers to, e.g. per_year, per_month, one_off.
academic_cyclestringtext (32 distinct); null in 29Year or cycle of the published amount.
conditionstringtext (75 distinct); null in 55What the amount applies to (room type, campus, who pays).
currencystringtext (3 distinct); null in 3ISO 4217 code of the local amounts in this row.
amount_localnumber0.0 to 50000.0; null in 55Amount in local currency when the source gives one figure. Unit: currency per period.
amount_usdinteger0 to 6371; null in 55amount_local / fx_rate, rounded. Unit: USD per period.
amount_min_localinteger2 to 50000; null in 100Lower end of a published range. Unit: currency per period.
amount_min_usdinteger0 to 6371; null in 103amount_min_local / fx_rate, rounded. Unit: USD per period.
amount_max_localinteger5 to 60000; null in 102Upper end of a published range. Unit: currency per period.
amount_max_usdinteger1 to 7646; null in 105amount_max_local / fx_rate, rounded. Unit: USD per period.
fx_ratenumber1.0 to 7.8476; null in 21Units of currency per 1 USD used for the *_usd columns (CNY 6.6786, HKD 7.8476, USD 1.0).
fx_datestringtext (1 distinct); null in 21Date of the exchange rate, ISO 8601 (2026-10-21).
statusstringfound, not_foundfound = the fact was read on the source page; not_found = the page was checked and the fact is not there: the row records what was looked for, source_url gives the URL tried and note says what was missing.
source_urlstringtext (66 distinct)Page(s) where the fact is stated, "; "-separated, primary pages first. For not_found rows: the page(s) tried.
source_typestringlaw, official, secondary; null in 4official = university, government, embassy, airport or ranking publisher page; law = legal act; secondary = media, Wikipedia, agencies, aggregators.
checked_atstringtext (2 distinct)Date the row was last read on the source, ISO 8601.
confidencestringpartial, verified; null in 17verified = read on an official or legal page for the current cycle; partial = official but older cycle or incomplete, or a reputable secondary source; estimate = derived or calculated, method in note. Empty for not_found rows.
notestringtext (82 distinct); null in 41Caveats in English. "Updated 2026-10-23:" marks text added by the second verification pass of 23 October 2026.

Table 1. Columns of data.csv.

tuition.csv, 32 rows. Unique key: university_id + track + campus.

ColumnTypeValues / unitWhat it holds
university_idstringtext (19 distinct)Stable slug of the university, the same id as in the other Long Bet datasets (e.g. tsinghua-university).
trackstringen_taught, en_taught_international_college, en_taught_joint_institute, zh_taughtProgramme track: zh_taught, en_taught (run by the university), en_taught_joint_institute, en_taught_international_college.
campusstringmain, shenzhenmain = the main campus, or the institute named in institute; shenzhen = the Shenzhen campus of Harbin Institute of Technology, which admits separately from the Harbin campus.
institutestringtext (4 distinct); null in 28Joint institute, separate college or separately admitting campus for that track; null for the university's own programmes on the main campus.
currencystringtext (2 distinct)ISO 4217 code of the local amounts in this row.
periodstringper_yearAlways per_year.
tariff_cyclestringtext (21 distinct)Intake or year the tuition was published for.
amount_min_localinteger16000 to 280000Tuition per year, lower end (equal to amount_max_local when one figure is published). Unit: currency per year.
amount_min_usdinteger2396 to 35680amount_min_local / fx_rate, rounded. Unit: USD per year.
amount_max_localinteger20000 to 280000Tuition per year, upper end. Unit: currency per year.
amount_max_usdinteger2995 to 35680amount_max_local / fx_rate, rounded. Unit: USD per year.
fx_ratenumber6.6786 to 7.8476Units of currency per 1 USD used for the *_usd columns (CNY 6.6786, HKD 7.8476, USD 1.0).
fx_datestringtext (1 distinct)Date of the exchange rate, ISO 8601 (2026-10-21).
statusstringfoundfound = the fact was read on the source page; not_found = the page was checked and the fact is not there: the row records what was looked for, source_url gives the URL tried and note says what was missing.
source_urlstringtext (27 distinct)Page(s) where the fact is stated, "; "-separated, primary pages first. For not_found rows: the page(s) tried.
source_typestringofficialofficial = university, government, embassy, airport or ranking publisher page; law = legal act; secondary = media, Wikipedia, agencies, aggregators.
checked_atstringtext (3 distinct)Date the row was last read on the source, ISO 8601.
confidencestringestimate, partial, verifiedverified = read on an official or legal page for the current cycle; partial = official but older cycle or incomplete, or a reputable secondary source; estimate = derived or calculated, method in note. Empty for not_found rows.
notestringtext (11 distinct); null in 21Caveats in English. "Updated 2026-10-23:" marks text added by the second verification pass of 23 October 2026.

Table 2. Columns of tuition.csv.

year_total.csv, 32 rows. Unique key: university_id + track + campus.

ColumnTypeValues / unitWhat it holds
university_idstringtext (19 distinct)Stable slug of the university, the same id as in the other Long Bet datasets (e.g. tsinghua-university).
regionstringhong_kong, mainlandmainland (mainland China) or hong_kong (Hong Kong SAR).
trackstringen_taught, en_taught_international_college, en_taught_joint_institute, zh_taughtProgramme track: zh_taught, en_taught (run by the university), en_taught_joint_institute, en_taught_international_college.
campusstringmain, shenzhenmain = the main campus, or the institute named in institute; shenzhen = the Shenzhen campus of Harbin Institute of Technology, which admits separately from the Harbin campus.
institutestringtext (4 distinct); null in 28Joint institute, separate college or separately admitting campus for that track; null for the university's own programmes on the main campus.
currencystringtext (2 distinct)ISO 4217 code of the local amounts in this row.
tuition_localstringtext (24 distinct)Tuition per year, min-max range. Unit: currency per year.
dorm_localstringtext (19 distinct); null in 1Dormitory per person per year (10 months), min-max range. Unit: currency per year.
insurance_localinteger152 to 1000; null in 2Student medical insurance per year. Unit: currency per year.
residence_permit_localinteger400 to 400; null in 3Residence permit fee for one year (mainland only). Unit: currency.
living_localstringtext (9 distinct)Food and daily living for 10 months, min-max range. Unit: currency per year.
living_basisstringtext (4 distinct)What living_local is based on: the university's own official estimate, canteen prices, or an envelope of other universities' official estimates.
total_min_localinteger30300 to 347290Sum of the lower ends of the components. Unit: currency per year.
total_max_localinteger50200 to 367940Sum of the upper ends of the components. Unit: currency per year.
total_min_usdinteger4537 to 44254total_min_local / fx_rate, rounded. Unit: USD per year.
total_max_usdinteger7517 to 46886total_max_local / fx_rate, rounded. Unit: USD per year.
fx_ratenumber6.6786 to 7.8476Units of currency per 1 USD used for the *_usd columns (CNY 6.6786, HKD 7.8476, USD 1.0).
fx_datestringtext (1 distinct)Date of the exchange rate, ISO 8601 (2026-10-21).
components_missingstringtext (4 distinct); null in 10Components that were not published and how they were handled; the total is a floor when this is not empty.
statusstringfoundfound = the fact was read on the source page; not_found = the page was checked and the fact is not there: the row records what was looked for, source_url gives the URL tried and note says what was missing.
source_urlstringtext (27 distinct)Page(s) where the fact is stated, "; "-separated, primary pages first. For not_found rows: the page(s) tried.
source_typestringofficialofficial = university, government, embassy, airport or ranking publisher page; law = legal act; secondary = media, Wikipedia, agencies, aggregators.
checked_atstringtext (2 distinct)Date the row was last read on the source, ISO 8601.
confidencestringestimateverified = read on an official or legal page for the current cycle; partial = official but older cycle or incomplete, or a reputable secondary source; estimate = derived or calculated, method in note. Empty for not_found rows.
notestringtext (1 distinct)Caveats in English. "Updated 2026-10-23:" marks text added by the second verification pass of 23 October 2026.

Table 3. Columns of year_total.csv.

scholarships.csv, 35 rows. Unique key: scholarship_id.

ColumnTypeValues / unitWhat it holds
scholarship_idstringtext (35 distinct)Row id: <provider-slug>__<name-slug>.
namestringtext (35 distinct)Name of the scholarship.
providerstringtext (32 distinct)Who provides it.
provider_typestringfoundation, government, universityType of provider: university, government, foundation.
country_codestringtext (2 distinct)ISO 3166-1 alpha-2: CN mainland China, HK Hong Kong.
countrystringtext (2 distinct)Country or region name in English.
universitiesstringtext (24 distinct)Universities covered.
university_idsstringtext (17 distinct); null in 1University slugs covered, "; "-separated.
programmesstringtext (26 distinct); null in 4Programmes covered.
levelstringall, bachelorStudy level: bachelor or all.
mechanismstringtext (3 distinct)How the money is awarded: merit_at_admission or government_scholarship.
covers_summarystringtext (35 distinct)What is covered (tuition, stipend, housing, insurance, travel, renewal).
covers_tuition_pctstringtext (2 distinct); null in 26Share of tuition covered, 0-100 (only when stated). Unit: percent.
covers_housingbooleantrue, false; null in 25Housing covered (null when not stated).
stipend_amountinteger1000 to 80000; null in 21Stipend amount when stated. Unit: stipend_currency per stipend_period.
stipend_currencystringtext (2 distinct); null in 19ISO 4217 currency of the stipend.
stipend_periodstringmonth, year; null in 21Period of the stipend: month or year.
citizenship_restrictionsstringtext (24 distinct); null in 10Nationality rule: "open to all", "excluded: ...", "only: ..." or "unclear: ...".
residence_constraintsstringtext (5 distinct); null in 29Residence conditions.
age_limitstringtext (12 distinct); null in 20Age limit.
language_requiredstringtext (22 distinct); null in 10Language or language test required.
tests_requiredstringtext (19 distinct); null in 16Admission tests required.
what_it_takesstringtext (27 distinct); null in 8Grades, essays, interview, recommendations, separate application.
obligationsstringtext (10 distinct); null in 25Obligations after the award (bond, return, work).
numbers_awardsstringtext (21 distinct); null in 10Number of awards, competition, typical award.
deadline_cyclestringtext (30 distinct); null in 5Deadlines of the latest published cycle (2026/27 or 2027/28 as stated).
online_school_recognitionstringtext (11 distinct); null in 15Does the scheme accept online-school diplomas?
grade_criterionstringtext (5 distinct); null in 30What grades the award asks for, as published.
grade_band_minstringtext (2 distinct); null in 30Threshold on the A-level scale A*A*A*A* > AAAA > ABB > BBC. none = not expressed in A-levels or not published; it does NOT mean "no threshold".
grade_sensitivitystringadmission_competitive, merit_decisive; null in 30How grades act on the money: merit_decisive or admission_competitive.
automatic_considerationbooleantrue, false; null in 30true = considered automatically with the admission application; false = separate application or nomination.
full_ridestringfalse, true, unknown; null in 10true only if the source states that tuition, housing and living costs are all covered.
online_school_notestringtext (4 distinct); null in 31What the scheme or university page says about online or distance schools.
covers_maxstringtext (25 distinct); null in 10What the award covers at its top level (amounts and duration).
covers_tuition_pct_maxinteger8 to 100; null in 12Share of tuition covered at the top level of the award, 0-100. Unit: percent.
covers_ge_50pctstringno, unknown, yes; null in 10Does the top level of the award cover at least 50% of tuition: yes, no, unknown.
req_gradesstringtext (18 distinct); null in 16Grades asked for, verbatim or condensed.
req_testsstringtext (15 distinct); null in 16Tests asked for (entrance, subject or language tests).
req_essaysstringtext (16 distinct); null in 16Essays or written answers.
req_recommendationsstringtext (15 distinct); null in 16Recommendations and school documents.
req_nominationstringtext (19 distinct); null in 16Whether a school or another body must nominate the applicant.
nomination_requiredbooleantrue, false; null in 16true = a university, an embassy or a government body has to nominate the applicant; false = direct application or automatic consideration.
req_interviewstringtext (16 distinct); null in 16Interview: whether, when and how.
req_extracurricularstringtext (6 distinct); null in 16What the selectors value beyond grades.
req_documentsstringtext (15 distinct); null in 16Documents asked for.
req_deadlinestringtext (17 distinct); null in 16Deadlines as published for the latest cycle.
recipient_profilestringtext (8 distinct); null in 16Who typically wins (published numbers, profiles).
renewal_conditionsstringtext (20 distinct); null in 14Conditions to keep the award after year 1.
stackablestringtext (6 distinct); null in 15Whether the award can be combined with other awards.
online_school_okstringtext (12 distinct); null in 16What the provider says about diplomas from online or distance schools.
online_school_statusstringexcludes, no_exclusion_found, not_stated; null in 16Classification of online_school_ok: no_exclusion_found, not_stated, excludes.
citizenship_notestringtext (5 distinct); null in 10Nationality rule as read from the source for a generic applicant.
req_source_urlstringtext (25 distinct); null in 10Page(s) the requirement columns (req_*) were read from, "; "-separated.
req_checked_atstringtext (3 distinct); null in 10Date the requirement columns were checked, ISO 8601.
req_confidencestringpartial, verified; null in 10Confidence of the requirement columns: verified, partial.
statusstringfoundfound = the fact was read on the source page; not_found = the page was checked and the fact is not there: the row records what was looked for, source_url gives the URL tried and note says what was missing.
source_urlstringtext (35 distinct)Page(s) where the fact is stated, "; "-separated, primary pages first. For not_found rows: the page(s) tried.
source_typestringlaw, official, secondaryofficial = university, government, embassy, airport or ranking publisher page; law = legal act; secondary = media, Wikipedia, agencies, aggregators.
checked_atstringtext (4 distinct)Date the row was last read on the source, ISO 8601.
confidencestringestimate, partial, verifiedverified = read on an official or legal page for the current cycle; partial = official but older cycle or incomplete, or a reputable secondary source; estimate = derived or calculated, method in note. Empty for not_found rows.
notestringtext (29 distinct); null in 6Caveats in English. "Updated 2026-10-23:" marks text added by the second verification pass of 23 October 2026.

Table 4. Columns of scholarships.csv.

csc_quotas.csv, 22 rows. Unique key: country + programme + cycle.

ColumnTypeValues / unitWhat it holds
countrystringall, eu, france, germany, hong_kong_designated_6, hungary, indonesia_reference, italy, poland, russia, serbia, turkeyCountry (lowercase English) or group the quota belongs to, e.g. turkey, eu, all, hong_kong_designated_6.
programmestringtext (9 distinct)Scholarship programme.
placesinteger6 to 150; null in 7Number of places in the cycle, as published; null = not published.
cyclestringtext (6 distinct)Cycle or intake of places.
levels_coveredstringtext (13 distinct); null in 4Study levels covered and who may apply.
dispatching_authoritystringtext (15 distinct); null in 4Body that selects or nominates candidates.
statusstringfound, not_foundfound = the fact was read on the source page; not_found = the page was checked and the fact is not there: the row records what was looked for, source_url gives the URL tried and note says what was missing.
source_urlstringtext (19 distinct); null in 1Page(s) where the fact is stated, "; "-separated, primary pages first. For not_found rows: the page(s) tried.
source_typestringofficial, secondary; null in 1official = university, government, embassy, airport or ranking publisher page; law = legal act; secondary = media, Wikipedia, agencies, aggregators.
checked_atstringtext (1 distinct)Date the row was last read on the source, ISO 8601.
confidencestringestimate, partial, verified; null in 4verified = read on an official or legal page for the current cycle; partial = official but older cycle or incomplete, or a reputable secondary source; estimate = derived or calculated, method in note. Empty for not_found rows.
notestringtext (22 distinct)Caveats in English. "Updated 2026-10-23:" marks text added by the second verification pass of 23 October 2026.

Table 5. Columns of csc_quotas.csv.

sources.csv, 163 rows. Unique key: source_id. One row per distinct URL in the columns whose name ends in source_url: source_id, url, title (publisher and host), source_type, accessed_at (latest date a row citing it was checked), used_for (file, column and number of rows).

Method

Data for 13 mainland and 3 Hong Kong universities were collected between 9 and 23 October 2026 from official pages of the universities (admission and international-office pages, fee tables, catalogues), governments, embassies and visa centres, ranking publishers and, for stable facts only, secondary sources; a second verification pass on 23 October 2026 re-read the rows with gaps. An independent re-check of 69 random rows against the source found 64 matching; the 5 differences were corrected or given a lower confidence before release. The three universities that entered the ARWU top 100 in 2026 (Southeast University, Harbin Institute of Technology, Tianjin University) were collected on 8 November 2026 into the same columns; an independent re-check of 20 random rows of that collection found no difference: 8 matching, 6 matching on a secondary or previous-cycle page (marked partial), 6 whose page could not be opened automatically. A second check of 20 other random rows of the three universities, read in a browser on the same day, found 15 matching, 1 matching in part, 1 whose page is no longer online and 3 differences (Southeast University's 2027 admission brochure had replaced the 2025 language and calendar rules; Tianjin University names A-Level results in its scholarship notice); the 3 were corrected before release.

Every row carries its provenance: source_url (the page where the fact is stated; several pages "; "-separated), source_type (official, law, secondary), checked_at (date read), confidence (verified, partial, estimate) and note. status is found or not_found: a not_found row records what was checked and not found, with the URL tried in source_url and the reason in note; its value columns are empty. Empty means unknown; no value is guessed.

Money is kept as published, in local currency with its ISO 4217 code and period. USD columns are computed with one rate for the whole snapshot: 6.6786 CNY and 7.8476 HKD per USD on 2026-10-21 (fx_rate, fx_date), rounded to whole dollars. Academic cycles are stated per row (e.g. "2026 intake", "2027/28").

Text added by the second verification pass starts with "Updated 2026-10-23:". Ids follow the other Long Bet datasets (university_id slugs).

data.csv lists each published cost item as the source gives it (one figure in amount_local, or a range in amount_min_local / amount_max_local). year_total.csv adds up, per university and track, tuition, a dormitory place for one person, medical insurance, the residence permit (mainland) and living costs for one academic year of 10 months (300 days); one-off fees (application, deposit, medical check) are left out. Harbin Institute of Technology has a second English-taught row for its Shenzhen campus (campus = shenzhen), which admits separately and has its own fees. Living costs use the university's own official estimate where it publishes one, canteen prices where it does not, and otherwise the envelope of the other universities' official estimates (living_basis); components_missing says what was assumed, and the total is a floor when it is not empty. All year totals are estimate. csc_quotas.csv records the Chinese Government Scholarship and Hong Kong Belt and Road places published by the sending country or the Hong Kong government, by cycle.

Known limitations

How to verify

Open the source_url of a row and compare with checked_at. Fees, deadlines, visa fees and scholarship terms change every cycle and are the first values to re-check; rankings change once a year. USD columns can be recomputed as local amount / fx_rate. not_found rows show which page was tried, so a later check can start there. Every URL is listed once in sources.csv.

Where these numbers are used
China: The Second Look (Article 7) The article whose tables are built from this dataset.
Subject Strength of 19 Chinese Universities: GRAS 2026, ARWU Indicators and Highly Cited Researchers 2025 Places of the 19 universities in all 57 GRAS 2026 subjects, top-10 counts by region, ARWU indicator means 2010-2026 and Highly Cited Researcher counts without names.
Bachelor Programmes Open to International Students at Chinese Universities (2026) Every bachelor programme in the international catalogues of the universities, with language of instruction and a STEM flag, plus counts per university.
China and Hong Kong Entry Rules for International Bachelor Applicants (2026) Which school certificates are accepted, admission calendars, language and preparatory routes, the HSK 3.0 transition, apostille, study visas by passport and work rules for students.

Cite this
Atamanova, M. (2026). Studying in China: Tuition, Living Costs, Year Totals and Scholarships (2026) [Data set]. https://mariascales.com/research/long-bet/data/china-study-costs/

License

CC BY 4.0 (Creative Commons Attribution 4.0 International, https://creativecommons.org/licenses/by/4.0/) for this compilation: free to share and adapt with attribution, see Cite this.

About the author

Maria Atamanova is a Senior Growth & Performance Marketing Manager and applied mathematician. Twelve years of growth in apps, e-commerce, EdTech and AI data platforms.

The method here – define the criteria, build the dataset, test every obvious answer – is the same one I use for growth teams; see the case studies.