- 132 published cost items (dormitory, canteen, insurance, residence permit, transport and others) for 19 universities and their cities; 17 of 132 rows are
not_foundand 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).
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.
| Column | Type | Values / unit | What it holds |
|---|---|---|---|
cost_id | string | text (132 distinct) | Row id: <university_id or city>__<item>__<nn>. |
university_id | string | text (19 distinct); null in 14 | Stable slug of the university, the same id as in the other Long Bet datasets (e.g. tsinghua-university). |
city | string | text (15 distinct); null in 6 | City in English. |
item | string | text (16 distinct) | Cost item (snake_case), e.g. dorm_single, canteen_meals, insurance, residence_permit_fee. |
period | string | one_off, per_day, per_month, per_semester, per_trip, per_year; null in 19 | Period the amount refers to, e.g. per_year, per_month, one_off. |
academic_cycle | string | text (32 distinct); null in 29 | Year or cycle of the published amount. |
condition | string | text (75 distinct); null in 55 | What the amount applies to (room type, campus, who pays). |
currency | string | text (3 distinct); null in 3 | ISO 4217 code of the local amounts in this row. |
amount_local | number | 0.0 to 50000.0; null in 55 | Amount in local currency when the source gives one figure. Unit: currency per period. |
amount_usd | integer | 0 to 6371; null in 55 | amount_local / fx_rate, rounded. Unit: USD per period. |
amount_min_local | integer | 2 to 50000; null in 100 | Lower end of a published range. Unit: currency per period. |
amount_min_usd | integer | 0 to 6371; null in 103 | amount_min_local / fx_rate, rounded. Unit: USD per period. |
amount_max_local | integer | 5 to 60000; null in 102 | Upper end of a published range. Unit: currency per period. |
amount_max_usd | integer | 1 to 7646; null in 105 | amount_max_local / fx_rate, rounded. Unit: USD per period. |
fx_rate | number | 1.0 to 7.8476; null in 21 | Units of currency per 1 USD used for the *_usd columns (CNY 6.6786, HKD 7.8476, USD 1.0). |
fx_date | string | text (1 distinct); null in 21 | Date of the exchange rate, ISO 8601 (2026-10-21). |
status | string | found, not_found | found = 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_url | string | text (66 distinct) | Page(s) where the fact is stated, "; "-separated, primary pages first. For not_found rows: the page(s) tried. |
source_type | string | law, official, secondary; null in 4 | official = university, government, embassy, airport or ranking publisher page; law = legal act; secondary = media, Wikipedia, agencies, aggregators. |
checked_at | string | text (2 distinct) | Date the row was last read on the source, ISO 8601. |
confidence | string | partial, verified; null in 17 | verified = 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. |
note | string | text (82 distinct); null in 41 | Caveats 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.
| Column | Type | Values / unit | What it holds |
|---|---|---|---|
university_id | string | text (19 distinct) | Stable slug of the university, the same id as in the other Long Bet datasets (e.g. tsinghua-university). |
track | string | en_taught, en_taught_international_college, en_taught_joint_institute, zh_taught | Programme track: zh_taught, en_taught (run by the university), en_taught_joint_institute, en_taught_international_college. |
campus | string | main, shenzhen | main = 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. |
institute | string | text (4 distinct); null in 28 | Joint institute, separate college or separately admitting campus for that track; null for the university's own programmes on the main campus. |
currency | string | text (2 distinct) | ISO 4217 code of the local amounts in this row. |
period | string | per_year | Always per_year. |
tariff_cycle | string | text (21 distinct) | Intake or year the tuition was published for. |
amount_min_local | integer | 16000 to 280000 | Tuition per year, lower end (equal to amount_max_local when one figure is published). Unit: currency per year. |
amount_min_usd | integer | 2396 to 35680 | amount_min_local / fx_rate, rounded. Unit: USD per year. |
amount_max_local | integer | 20000 to 280000 | Tuition per year, upper end. Unit: currency per year. |
amount_max_usd | integer | 2995 to 35680 | amount_max_local / fx_rate, rounded. Unit: USD per year. |
fx_rate | number | 6.6786 to 7.8476 | Units of currency per 1 USD used for the *_usd columns (CNY 6.6786, HKD 7.8476, USD 1.0). |
fx_date | string | text (1 distinct) | Date of the exchange rate, ISO 8601 (2026-10-21). |
status | string | found | found = 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_url | string | text (27 distinct) | Page(s) where the fact is stated, "; "-separated, primary pages first. For not_found rows: the page(s) tried. |
source_type | string | official | official = university, government, embassy, airport or ranking publisher page; law = legal act; secondary = media, Wikipedia, agencies, aggregators. |
checked_at | string | text (3 distinct) | Date the row was last read on the source, ISO 8601. |
confidence | string | estimate, partial, verified | verified = 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. |
note | string | text (11 distinct); null in 21 | Caveats 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.
| Column | Type | Values / unit | What it holds |
|---|---|---|---|
university_id | string | text (19 distinct) | Stable slug of the university, the same id as in the other Long Bet datasets (e.g. tsinghua-university). |
region | string | hong_kong, mainland | mainland (mainland China) or hong_kong (Hong Kong SAR). |
track | string | en_taught, en_taught_international_college, en_taught_joint_institute, zh_taught | Programme track: zh_taught, en_taught (run by the university), en_taught_joint_institute, en_taught_international_college. |
campus | string | main, shenzhen | main = 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. |
institute | string | text (4 distinct); null in 28 | Joint institute, separate college or separately admitting campus for that track; null for the university's own programmes on the main campus. |
currency | string | text (2 distinct) | ISO 4217 code of the local amounts in this row. |
tuition_local | string | text (24 distinct) | Tuition per year, min-max range. Unit: currency per year. |
dorm_local | string | text (19 distinct); null in 1 | Dormitory per person per year (10 months), min-max range. Unit: currency per year. |
insurance_local | integer | 152 to 1000; null in 2 | Student medical insurance per year. Unit: currency per year. |
residence_permit_local | integer | 400 to 400; null in 3 | Residence permit fee for one year (mainland only). Unit: currency. |
living_local | string | text (9 distinct) | Food and daily living for 10 months, min-max range. Unit: currency per year. |
living_basis | string | text (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_local | integer | 30300 to 347290 | Sum of the lower ends of the components. Unit: currency per year. |
total_max_local | integer | 50200 to 367940 | Sum of the upper ends of the components. Unit: currency per year. |
total_min_usd | integer | 4537 to 44254 | total_min_local / fx_rate, rounded. Unit: USD per year. |
total_max_usd | integer | 7517 to 46886 | total_max_local / fx_rate, rounded. Unit: USD per year. |
fx_rate | number | 6.6786 to 7.8476 | Units of currency per 1 USD used for the *_usd columns (CNY 6.6786, HKD 7.8476, USD 1.0). |
fx_date | string | text (1 distinct) | Date of the exchange rate, ISO 8601 (2026-10-21). |
components_missing | string | text (4 distinct); null in 10 | Components that were not published and how they were handled; the total is a floor when this is not empty. |
status | string | found | found = 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_url | string | text (27 distinct) | Page(s) where the fact is stated, "; "-separated, primary pages first. For not_found rows: the page(s) tried. |
source_type | string | official | official = university, government, embassy, airport or ranking publisher page; law = legal act; secondary = media, Wikipedia, agencies, aggregators. |
checked_at | string | text (2 distinct) | Date the row was last read on the source, ISO 8601. |
confidence | string | estimate | verified = 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. |
note | string | text (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.
| Column | Type | Values / unit | What it holds |
|---|---|---|---|
scholarship_id | string | text (35 distinct) | Row id: <provider-slug>__<name-slug>. |
name | string | text (35 distinct) | Name of the scholarship. |
provider | string | text (32 distinct) | Who provides it. |
provider_type | string | foundation, government, university | Type of provider: university, government, foundation. |
country_code | string | text (2 distinct) | ISO 3166-1 alpha-2: CN mainland China, HK Hong Kong. |
country | string | text (2 distinct) | Country or region name in English. |
universities | string | text (24 distinct) | Universities covered. |
university_ids | string | text (17 distinct); null in 1 | University slugs covered, "; "-separated. |
programmes | string | text (26 distinct); null in 4 | Programmes covered. |
level | string | all, bachelor | Study level: bachelor or all. |
mechanism | string | text (3 distinct) | How the money is awarded: merit_at_admission or government_scholarship. |
covers_summary | string | text (35 distinct) | What is covered (tuition, stipend, housing, insurance, travel, renewal). |
covers_tuition_pct | string | text (2 distinct); null in 26 | Share of tuition covered, 0-100 (only when stated). Unit: percent. |
covers_housing | boolean | true, false; null in 25 | Housing covered (null when not stated). |
stipend_amount | integer | 1000 to 80000; null in 21 | Stipend amount when stated. Unit: stipend_currency per stipend_period. |
stipend_currency | string | text (2 distinct); null in 19 | ISO 4217 currency of the stipend. |
stipend_period | string | month, year; null in 21 | Period of the stipend: month or year. |
citizenship_restrictions | string | text (24 distinct); null in 10 | Nationality rule: "open to all", "excluded: ...", "only: ..." or "unclear: ...". |
residence_constraints | string | text (5 distinct); null in 29 | Residence conditions. |
age_limit | string | text (12 distinct); null in 20 | Age limit. |
language_required | string | text (22 distinct); null in 10 | Language or language test required. |
tests_required | string | text (19 distinct); null in 16 | Admission tests required. |
what_it_takes | string | text (27 distinct); null in 8 | Grades, essays, interview, recommendations, separate application. |
obligations | string | text (10 distinct); null in 25 | Obligations after the award (bond, return, work). |
numbers_awards | string | text (21 distinct); null in 10 | Number of awards, competition, typical award. |
deadline_cycle | string | text (30 distinct); null in 5 | Deadlines of the latest published cycle (2026/27 or 2027/28 as stated). |
online_school_recognition | string | text (11 distinct); null in 15 | Does the scheme accept online-school diplomas? |
grade_criterion | string | text (5 distinct); null in 30 | What grades the award asks for, as published. |
grade_band_min | string | text (2 distinct); null in 30 | Threshold 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_sensitivity | string | admission_competitive, merit_decisive; null in 30 | How grades act on the money: merit_decisive or admission_competitive. |
automatic_consideration | boolean | true, false; null in 30 | true = considered automatically with the admission application; false = separate application or nomination. |
full_ride | string | false, true, unknown; null in 10 | true only if the source states that tuition, housing and living costs are all covered. |
online_school_note | string | text (4 distinct); null in 31 | What the scheme or university page says about online or distance schools. |
covers_max | string | text (25 distinct); null in 10 | What the award covers at its top level (amounts and duration). |
covers_tuition_pct_max | integer | 8 to 100; null in 12 | Share of tuition covered at the top level of the award, 0-100. Unit: percent. |
covers_ge_50pct | string | no, unknown, yes; null in 10 | Does the top level of the award cover at least 50% of tuition: yes, no, unknown. |
req_grades | string | text (18 distinct); null in 16 | Grades asked for, verbatim or condensed. |
req_tests | string | text (15 distinct); null in 16 | Tests asked for (entrance, subject or language tests). |
req_essays | string | text (16 distinct); null in 16 | Essays or written answers. |
req_recommendations | string | text (15 distinct); null in 16 | Recommendations and school documents. |
req_nomination | string | text (19 distinct); null in 16 | Whether a school or another body must nominate the applicant. |
nomination_required | boolean | true, false; null in 16 | true = a university, an embassy or a government body has to nominate the applicant; false = direct application or automatic consideration. |
req_interview | string | text (16 distinct); null in 16 | Interview: whether, when and how. |
req_extracurricular | string | text (6 distinct); null in 16 | What the selectors value beyond grades. |
req_documents | string | text (15 distinct); null in 16 | Documents asked for. |
req_deadline | string | text (17 distinct); null in 16 | Deadlines as published for the latest cycle. |
recipient_profile | string | text (8 distinct); null in 16 | Who typically wins (published numbers, profiles). |
renewal_conditions | string | text (20 distinct); null in 14 | Conditions to keep the award after year 1. |
stackable | string | text (6 distinct); null in 15 | Whether the award can be combined with other awards. |
online_school_ok | string | text (12 distinct); null in 16 | What the provider says about diplomas from online or distance schools. |
online_school_status | string | excludes, no_exclusion_found, not_stated; null in 16 | Classification of online_school_ok: no_exclusion_found, not_stated, excludes. |
citizenship_note | string | text (5 distinct); null in 10 | Nationality rule as read from the source for a generic applicant. |
req_source_url | string | text (25 distinct); null in 10 | Page(s) the requirement columns (req_*) were read from, "; "-separated. |
req_checked_at | string | text (3 distinct); null in 10 | Date the requirement columns were checked, ISO 8601. |
req_confidence | string | partial, verified; null in 10 | Confidence of the requirement columns: verified, partial. |
status | string | found | found = 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_url | string | text (35 distinct) | Page(s) where the fact is stated, "; "-separated, primary pages first. For not_found rows: the page(s) tried. |
source_type | string | law, official, secondary | official = university, government, embassy, airport or ranking publisher page; law = legal act; secondary = media, Wikipedia, agencies, aggregators. |
checked_at | string | text (4 distinct) | Date the row was last read on the source, ISO 8601. |
confidence | string | estimate, partial, verified | verified = 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. |
note | string | text (29 distinct); null in 6 | Caveats 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.
| Column | Type | Values / unit | What it holds |
|---|---|---|---|
country | string | all, eu, france, germany, hong_kong_designated_6, hungary, indonesia_reference, italy, poland, russia, serbia, turkey | Country (lowercase English) or group the quota belongs to, e.g. turkey, eu, all, hong_kong_designated_6. |
programme | string | text (9 distinct) | Scholarship programme. |
places | integer | 6 to 150; null in 7 | Number of places in the cycle, as published; null = not published. |
cycle | string | text (6 distinct) | Cycle or intake of places. |
levels_covered | string | text (13 distinct); null in 4 | Study levels covered and who may apply. |
dispatching_authority | string | text (15 distinct); null in 4 | Body that selects or nominates candidates. |
status | string | found, not_found | found = 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_url | string | text (19 distinct); null in 1 | Page(s) where the fact is stated, "; "-separated, primary pages first. For not_found rows: the page(s) tried. |
source_type | string | official, secondary; null in 1 | official = university, government, embassy, airport or ranking publisher page; law = legal act; secondary = media, Wikipedia, agencies, aggregators. |
checked_at | string | text (1 distinct) | Date the row was last read on the source, ISO 8601. |
confidence | string | estimate, partial, verified; null in 4 | verified = 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. |
note | string | text (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
- Only 8 of 19 universities publish an official estimate of living costs; the others are filled from canteen prices or from the range of the other universities (
living_basis). - Transport and phone costs were collected for a few cities only (rows with
itemmetro_single_fare,transport_monthly_discount,transport_student_scheme,sim_phone) and are not part of the year totals. Medical insurance amounts are not published by Peking University, Central South University, HKU and CUHK. - Chinese Government Scholarship places for 2026/27 were not found for France, Poland and Hungary; the 2027/28 call for Russia was not yet published on 2026-10-23.
- Tuition tables of several universities carry no year; they are marked by
tariff_cycleandconfidence=partial. - Across all files of this package, 21 of 253 rows are
not_foundand 40 areestimate.
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.
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.