CUCAS APIcucas.cn ↗
Access CUCAS scholarship listings, university data, and program searches across Chinese universities via 6 structured API endpoints.
What is the CUCAS API?
The CUCAS API provides structured access to China's university admission data across 6 endpoints, covering scholarship listings, program searches, and university directories. The get_scholarship_detail endpoint returns per-program fields including deadlines, eligibility criteria, tuition, scholarship coverage details, and required documents. Whether you're building a study-abroad tool or aggregating funding opportunities, the API gives you machine-readable access to CUCAS data without manual browsing.
curl -X GET 'https://api.parse.bot/scraper/f246e67c-986c-48cd-9524-a116b5423b43/search_scholarships?page=1&category=all_scholarship' \ -H 'X-API-Key: $PARSE_API_KEY'
Typed, relational, agent-ready
A generated client with real types, enums, and the links between objects — the structure a flat JSON response can't carry. Autocompletes in your editor and reads cleanly to coding agents.
- Fully typed · autocompletes
- Objects link to objects
- Typed errors & pagination
Typed Python client. Set up the SDK in your uv project, then pull this API’s typed client:
uv add parse-sdk uv run parse init uv run parse add --marketplace cucas-cn-api
uv run parse add --marketplace pulls a pinned snapshot of this canonical API — it won’t change underneath you. To customize it, subscribe and swap to your own copy.
"""
CUCAS (Study in China) API Client
Get your API key from: https://parse.bot/settings
"""
import os
import requests
from typing import Optional, Any, Dict, List
class ParseClient:
"""Client for CUCAS scholarship and university search API."""
def __init__(self, api_key: Optional[str] = None):
"""Initialize the Parse API client.
Args:
api_key: API key for authentication. If not provided, reads from PARSE_API_KEY env var.
"""
self.base_url = "https://api.parse.bot"
self.scraper_id = "e76e626f-a956-47c4-9e35-8d0aa59ded21"
self.api_key = api_key or os.getenv("PARSE_API_KEY")
if not self.api_key:
raise ValueError("API key not provided and PARSE_API_KEY environment variable not set")
def _call(self, endpoint: str, method: str = "POST", **params) -> Dict[str, Any]:
"""Make a request to the Parse API.
Args:
endpoint: The endpoint name (e.g., 'search_scholarships')
method: HTTP method ('GET' or 'POST')
**params: Query/body parameters
Returns:
Response JSON as dictionary
"""
url = f"{self.base_url}/scraper/{self.scraper_id}/{endpoint}"
headers = {
"X-API-Key": self.api_key,
"Content-Type": "application/json"
}
if method.upper() == "GET":
response = requests.get(url, headers=headers, params=params)
else: # POST
response = requests.post(url, headers=headers, json=params)
response.raise_for_status()
return response.json()
def search_scholarships(
self,
category: str = "all_scholarship",
language: str = "all_languages",
program: str = "all_programs",
page: int = 1,
degree: str = "all_degrees",
city: str = "all_cities",
university: str = "all_universities"
) -> Dict[str, Any]:
"""Search and filter available scholarships in China.
Args:
category: Scholarship category (all_scholarship, full, partial, etc.)
language: Teaching language (English, Chinese, etc.)
program: Program keyword or slug
page: Page number
degree: Academic degree (Bachelor, Master, Doctoral, etc.)
city: City name or slug (e.g. beijing)
university: University slug
Returns:
Dictionary with page, items, and total_results
"""
params = {
"category": category,
"language": language,
"program": program,
"page": page,
"degree": degree,
"city": city,
"university": university
}
return self._call("search_scholarships", method="GET", **params)
def get_scholarship_detail(self, url: str) -> Dict[str, Any]:
"""Get detailed information about a specific scholarship.
Args:
url: Full URL of the scholarship detail page
Returns:
Dictionary with scholarship details including eligibility, deadlines, etc.
"""
params = {"url": url}
return self._call("get_scholarship_detail", method="GET", **params)
def list_popular_scholarships(self) -> Dict[str, Any]:
"""List popular scholarships as featured on CUCAS.
Returns:
Dictionary with items array of scholarship objects
"""
return self._call("list_popular_scholarships", method="GET")
def list_latest_scholarships(self) -> Dict[str, Any]:
"""List latest scholarships added to CUCAS.
Returns:
Dictionary with items array of scholarship objects
"""
return self._call("list_latest_scholarships", method="GET")
def list_universities(self, letter: str = "A", page: int = 1) -> Dict[str, Any]:
"""List Chinese universities with filtering by alphabetical letter.
Args:
letter: Alphabetical letter (A-Z)
page: Page number
Returns:
Dictionary with items array of university objects
"""
params = {"letter": letter, "page": page}
return self._call("list_universities", method="GET", **params)
def search_programs(self, query: str) -> Dict[str, Any]:
"""Search for academic programs across universities.
Args:
query: Search keyword (e.g. Computer Science)
Returns:
Dictionary with results array containing universities and their matching programs
"""
params = {"query": query}
return self._call("search_programs", method="GET", **params)
def main():
"""Demonstrate practical usage of the CUCAS API."""
# Initialize the client
client = ParseClient()
print("=" * 80)
print("CUCAS Scholarship Search - Practical Workflow")
print("=" * 80)
# Step 1: Search for scholarships in Beijing for Master's degree
print("\n1. Searching for Master's scholarships in Beijing...")
search_results = client.search_scholarships(
city="beijing",
degree="Master",
category="full",
page=1
)
total_results = search_results.get("total_results", 0)
items = search_results.get("items", [])
print(f" Found {total_results} total scholarships")
print(f" Displaying {len(items)} results on this page")
if items:
# Step 2: Show summary of first few scholarships
print("\n2. Available scholarships summary:")
for i, scholarship in enumerate(items[:3], 1):
print(f"\n Scholarship {i}:")
print(f" - University: {scholarship.get('university', 'N/A')}")
print(f" - Program: {scholarship.get('program_name', 'N/A')}")
print(f" - Location: {scholarship.get('location', 'N/A')}")
print(f" - Language: {scholarship.get('teaching_language', 'N/A')}")
print(f" - Coverage: {scholarship.get('scholarship_coverage', 'N/A')[:50]}...")
print(f" - Rating: {scholarship.get('university_rating', 'N/A')}")
print(f" - Detail URL: {scholarship.get('detail_url', 'N/A')[:60]}...")
# Step 3: Get detailed information for the first scholarship
if items[0].get('detail_url'):
print("\n3. Fetching detailed information for first scholarship...")
detail_url = items[0]['detail_url']
detail_info = client.get_scholarship_detail(detail_url)
print(f"\n University: {detail_info.get('university', 'N/A')}")
print(f" Program: {detail_info.get('program_title', 'N/A')}")
print(f" Status: {'Available' if detail_info.get('is_still_available') else 'Not Available'}")
if detail_info.get('program_info'):
print(f" Program Info:")
for key, value in detail_info['program_info'].items():
print(f" - {key}: {value}")
if detail_info.get('deadlines'):
print(f" Important Deadlines:")
for key, value in detail_info['deadlines'].items():
print(f" - {key}: {value}")
if detail_info.get('eligibility'):
print(f" Eligibility: {detail_info['eligibility'][:100]}...")
if detail_info.get('scholarship_coverage_details'):
print(f" Coverage: {detail_info['scholarship_coverage_details'][:100]}...")
if detail_info.get('documents_required'):
print(f" Required Documents: {detail_info['documents_required'][:100]}...")
# Step 4: Search for programs
print("\n4. Searching for Computer Science programs...")
program_search = client.search_programs("Computer Science")
results = program_search.get("results", [])
print(f" Found {len(results)} universities with Computer Science programs")
for university_result in results[:3]:
uni_name = university_result.get('university', 'N/A')
programs = university_result.get('programs', [])
print(f" - {uni_name}: {len(programs)} program(s)")
for program in programs[:2]:
print(f" * {program.get('name', 'N/A')}")
# Step 5: List popular scholarships
print("\n5. Fetching popular scholarships...")
popular = client.list_popular_scholarships()
popular_items = popular.get("items", [])
print(f" Found {len(popular_items)} popular scholarships")
for scholarship in popular_items[:3]:
print(f" - {scholarship.get('university', 'N/A')}")
# Step 6: List universities by letter
print("\n6. Listing universities starting with 'T'...")
universities = client.list_universities(letter="T", page=1)
uni_items = universities.get("items", [])
print(f" Found {len(uni_items)} universities starting with 'T'")
for university in uni_items[:3]:
print(f" - {university.get('name', 'N/A')}")
print(f" Location: {university.get('location', 'N/A')}")
print(f" Rating: {university.get('rating', 'N/A')}")
print(f" Living Expenses: {university.get('living_expenses', 'N/A')}")
print("\n" + "=" * 80)
print("Workflow completed successfully!")
print("=" * 80)
if __name__ == "__main__":
main()Search and filter available scholarships in China. Grouped by university.
| Param | Type | Description |
|---|---|---|
| city | string | City name or slug (e.g. beijing) |
| page | integer | Page number |
| degree | string | Academic degree (Bachelor, Master, Doctoral, etc.) |
| program | string | Program keyword or slug |
| category | string | Scholarship category (all_scholarship, full, partial, etc.) |
| language | string | Teaching language (English, Chinese, etc.) |
| university | string | University slug |
{
"type": "object",
"fields": {
"page": "integer",
"items": "array of scholarship objects",
"total_results": "integer"
},
"sample": {
"data": {
"page": 1,
"items": [
{
"location": "Shenzhen",
"detail_url": "https://cucas.cn/china_scholarship/Harbin-Institute-of-Technology--Shenzhen_Physics_scholarship_1954_85358&lang=en",
"university": "Harbin Institute of Technology, Shenzhen",
"program_name": "Physics",
"starting_date": "Sep,2026",
"you_need_to_pay": "Tuition:420000Accommodation: 0-1000/monthLiving Expense: 0-1500",
"teaching_language": "English",
"university_rating": "4.6",
"scholarship_coverage": "Tuition: 42000Accommodation: YesLiving Expenses: Yes"
},
{
"location": "Shenzhen",
"detail_url": "https://cucas.cn/china_scholarship/Harbin-Institute-of-Technology--Shenzhen_Urban-Rural-Planning_scholarship_1954_85359&lang=en",
"university": "Harbin Institute of Technology, Shenzhen",
"program_name": "Urban-Rural Planning",
"starting_date": "Sep,2026",
"you_need_to_pay": "Tuition:420000Accommodation: 0-1000/monthLiving Expense: 0-1500",
"teaching_language": "English",
"university_rating": "4.6",
"scholarship_coverage": "Tuition: 42000Accommodation: YesLiving Expenses: Yes"
},
{
"location": "Shenzhen",
"detail_url": "https://cucas.cn/china_scholarship/Harbin-Institute-of-Technology--Shenzhen_Architecture_scholarship_1954_85353&lang=en",
"university": "Harbin Institute of Technology, Shenzhen",
"program_name": "Architecture",
"starting_date": "Sep,2026",
"you_need_to_pay": "Tuition:420000Accommodation: 0-1000/monthLiving Expense: 0-1500",
"teaching_language": "English",
"university_rating": "4.6",
"scholarship_coverage": "Tuition: 42000Accommodation: YesLiving Expenses: Yes"
}
],
"total_results": 0
},
"status": "success"
}
}About the CUCAS API
Scholarship Search and Discovery
The search_scholarships endpoint accepts up to seven optional filters — city, degree, program, category, language, university, and page — and returns paginated scholarship objects grouped by university alongside a total_results count. The category parameter accepts values like full, partial, and all_scholarship, letting you narrow results to fully funded opportunities. list_popular_scholarships and list_latest_scholarships require no inputs and return curated arrays of scholarship objects, useful for surfacing featured or recently added programs on a landing page.
Scholarship Detail
For any scholarship URL from CUCAS, get_scholarship_detail returns a structured object covering deadlines (with separate self-funded and scholarship deadline keys), eligibility, documents_required, scholarship_coverage_details, and a program_info object containing degree, duration, and tuition. The is_still_available boolean flag lets you filter out expired opportunities without parsing text.
Universities and Programs
list_universities supports alphabetical browsing via the letter parameter (A–Z) and pagination via page, returning an array of university objects. search_programs takes a free-text query (e.g. "Computer Science") and returns an array of university objects each containing their matching programs — useful for finding which institutions offer a specific field of study across China.
The CUCAS API is a managed, monitored endpoint for cucas.cn — not a raw scraper you maintain. Every endpoint is automatically health-checked on a schedule, and when cucas.cn changes and a check fails, the API is automatically queued for repair and re-verified. It is built to keep working as the site underneath it changes.
This isn't an official cucas.cn API — it's an independent, maintained REST wrapper over public data. Where the source has no official API (or only a limited one), Parse gives you a stable contract over a source that never promised one, and keeps it current. Need a new endpoint or field? You can revise it yourself in plain English and the agent rebuilds it against the live site in minutes — contributing the change back to the shared API is free.
Will this API break when the source site changes?+
Is this an official API from the source site?+
Can I fix or extend this API myself if I need a new endpoint or field?+
What happens if I call an endpoint that has an issue?+
- Build a scholarship discovery tool filtered by degree level and teaching language using
search_scholarships - Display a deadline-aware scholarship tracker using the
deadlinesandis_still_availablefields fromget_scholarship_detail - Aggregate full-scholarship listings for a study-abroad comparison site using the
categoryfilter - Power an alphabetical university directory using
list_universitieswith theletterparameter - Find all Chinese universities offering a specific program by querying
search_programswith a subject keyword - Surface recently added funding opportunities in a feed using
list_latest_scholarships - Show required documents and eligibility criteria for individual programs using
get_scholarship_detail
| Tier | Price | Credits/month | Rate limit |
|---|---|---|---|
| Free | $0/mo | 100 | 5 req/min |
| Hobby | $30/mo | 1,000 | 20 req/min |
| Developer | $100/mo | 5,000 | 100 req/min |
One credit = one API call regardless of which marketplace API you call. Exceeding the rate limit returns a 429 response. Authenticate with the X-API-Key header.
Does CUCAS have an official developer API?+
What does `get_scholarship_detail` return beyond basic program info?+
deadlines object with separate self-funded and scholarship deadline values, an eligibility string, a documents_required string, scholarship_coverage_details, and a program_info object containing degree level, duration, and tuition. The is_still_available boolean field indicates whether the scholarship is currently open.How does `search_scholarships` handle pagination and large result sets?+
page integer parameter and returns the current page, an items array of scholarship objects, and a total_results integer. You can iterate pages until the accumulated item count reaches total_results.Does the API return application submission or enrollment endpoints?+
Can I retrieve individual university profile pages with details like rankings or contact info?+
list_universities returns an array of university objects suitable for directory browsing, but a dedicated university detail endpoint with rankings, contact information, or campus data is not included. You can fork this API on Parse and revise it to add a university detail endpoint.