Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Analyze most-taught books and texts via Open Syllabus analytics
.claude/skills/brycewang-stanford-open-syllabus-api/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-01 | ✗→✓ | ▲ Improved | 64% | 0% |
| case-02 | ✗→✓ | ▲ Improved | 40% | 0% |
| case-03 | ✗→✓ | ▲ Improved | 9% | 0% |
| case-04 | ✗→✓ | ▲ Improved | 83% | 0% |
| case-09 | ✗→✓ | ▲ Improved | 2% | 0% |
Open Syllabus analyzes 20M+ college course syllabi from 7,000+ institutions in 140+ countries, tracking which books, articles, and media are most frequently assigned in higher education. The Explorer provides teaching frequency rankings and co-assignment patterns. Useful for curriculum research, textbook selection, and understanding disciplinary norms. Free for basic search; institutional subscription for full API access.
bash# The primary interface is the web explorer: # https://explorer.opensyllabus.org/ # Search by title, author, or field # Filter by country, institution, discipline, year range
bash# API requires institutional subscription # Base URL: https://api.opensyllabus.org/v1/ # Search titles curl -H "Authorization: Bearer $OS_TOKEN" \ "https://api.opensyllabus.org/v1/titles?query=republic+plato&limit=20" # Get title details curl -H "Authorization: Bearer $OS_TOKEN" \ "https://api.opensyllabus.org/v1/titles/12345" # Co-assignment analysis curl -H "Authorization: Bearer $OS_TOKEN" \ "https://api.opensyllabus.org/v1/titles/12345/co-assigned?limit=20" # Rankings by field curl -H "Authorization: Bearer $OS_TOKEN" \ "https://api.opensyllabus.org/v1/rankings?field=Economics&limit=50"
| Parameter | Description | Example | |-----------|-------------|---------| | query | Search text | query=machine+learning | | field | Academic discipline | field=Computer Science | | country | Country filter | country=US | | institution | Institution filter | institution=Harvard | | year_from | Start year | year_from=2020 | | year_to | End year | year_to=2026 | | limit | Results per page | limit=50 |
| Metric | Description | |--------|-------------| | Teaching Score | 0-100 normalized frequency of syllabi appearances | | Count | Raw number of syllabi featuring the title | | Rank | Position in overall or field-specific ranking | | Co-assignment | Titles frequently taught alongside this one |
pythonimport requests BASE_URL = "https://api.opensyllabus.org/v1" def search_titles(query: str, field: str = None, country: str = None, limit: int = 20, token: str = "") -> list: """Search Open Syllabus for assigned titles.""" headers = {"Authorization": f"Bearer {token}"} if token else {} params = {"query": query, "limit": limit} if field: params["field"] = field if country: params["country"] = country resp = requests.get( f"{BASE_URL}/titles", headers=headers, params=params, ) resp.raise_for_status() data = resp.json() results = [] for item in data.get("results", []): results.append({ "title": item.get("title"), "authors": item.get("authors"), "teaching_score": item.get("teaching_score"), "count": item.get("appearance_count"), "rank": item.get("rank"), "top_fields": item.get("top_fields", []), }) return results def get_co_assigned(title_id: int, limit: int = 20, token: str = "") -> list: """Get titles frequently co-assigned with a given title.""" headers = {"Authorization": f"Bearer {token}"} if token else {} resp = requests.get( f"{BASE_URL}/titles/{title_id}/co-assigned", headers=headers, params={"limit": limit}, ) resp.raise_for_status() return resp.json().get("results", []) def get_field_rankings(field: str, limit: int = 50, token: str = "") -> list: """Get most-taught titles in a field.""" headers = {"Authorization": f"Bearer {token}"} if token else {} resp = requests.get( f"{BASE_URL}/rankings", headers=headers, params={"field": field, "limit": limit}, ) resp.raise_for_status() return resp.json().get("results", []) # Example: find most-taught economics texts # results = search_titles("microeconomics", field="Economics") # for r in results: # print(f"#{r['rank']} {r['title']} — {r['authors']}") # print(f" Teaching Score: {r['teaching_score']} " # f"({r['count']} syllabi)")
| Rank | Title | Author | Field | |------|-------|--------|-------| | 1 | The Elements of Style | Strunk & White | Writing | | 2 | The Republic | Plato | Philosophy | | 3 | A Manual for Writers | Turabian | Writing | | ~10 | Thinking, Fast and Slow | Kahneman | Psychology | | ~50 | Introduction to Algorithms | CLRS | CS |
| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-24 | pass→pass | 8,570 | 4,490 | -48% | 1 | 1 | 0% | 1,160 | 2,105 | +81% | 0 | 0 | — |
case-01 | fail→pass | 17,039 | 20,523 | +20% | 1 | 1 | 0% | 3,087 | 5,062 | +64% | 0 | 0 | — |
case-02 | fail→pass | 9,043 | 5,089 | -44% | 1 | 1 | 0% | 1,748 | 2,448 | +40% | 0 | 0 | — |
case-03 | fail→pass | 12,047 | 4,392 | -64% | 1 | 1 | 0% | 2,156 | 2,342 | +9% | 0 | 0 | — |
case-13 | pass→pass | 7,935 | 2,017 | -75% | 1 | 1 | 0% | 1,139 | 1,765 | +55% | 0 | 0 | — |
case-04 | fail→pass | 7,478 | 2,810 | -62% | 1 | 1 | 0% | 1,094 | 2,002 | +83% | 0 | 0 | — |
case-05 | pass→pass | 14,191 | 2,760 | -81% | 1 | 1 | 0% | 2,277 | 1,936 | -15% | 0 | 0 | — |
case-06 | pass→pass | 8,252 | 1,675 | -80% | 1 | 1 | 0% | 1,413 | 1,775 | +26% | 0 | 0 | — |
case-07 | pass→pass | 6,564 | 1,891 | -71% | 1 | 1 | 0% | 1,057 | 1,754 | +66% | 0 | 0 | — |
case-08 | pass→pass | 4,906 | 1,557 | -68% | 1 | 1 | 0% | 885 | 1,706 | +93% | 0 | 0 | — |
case-09 | fail→pass | 10,430 | 2,494 | -76% | 1 | 1 | 0% | 1,856 | 1,885 | +2% | 0 | 0 | — |
case-10 | pass→pass | 7,577 | 2,885 | -62% | 1 | 1 | 0% | 1,236 | 1,928 | +56% | 0 | 0 | — |
case-11 | fail→pass | 7,726 | 3,459 | -55% | 1 | 1 | 0% | 1,233 | 1,922 | +56% | 0 | 0 | — |
case-12 | fail→pass | 10,724 | 2,985 | -72% | 1 | 1 | 0% | 1,580 | 1,835 | +16% | 0 | 0 | — |
case-14 | fail→pass | 11,771 | 2,177 | -82% | 1 | 1 | 0% | 1,564 | 1,807 | +16% | 0 | 0 | — |
case-15 | pass→pass | 4,974 | 3,856 | -22% | 1 | 1 | 0% | 809 | 1,726 | +113% | 0 | 0 | — |
case-16 | fail→pass | 16,805 | 7,701 | -54% | 1 | 1 | 0% | 2,588 | 2,962 | +14% | 0 | 0 | — |
case-17 | fail→pass | 12,269 | 9,332 | -24% | 1 | 1 | 0% | 2,225 | 3,015 | +36% | 0 | 0 | — |
case-18 | pass→fail | 5,560 | 2,139 | -62% | 1 | 1 | 0% | 1,014 | 1,931 | +90% | 0 | 0 | — |
case-19 | pass→fail | 5,766 | 2,254 | -61% | 1 | 1 | 0% | 847 | 1,895 | +124% | 0 | 0 | — |
case-20 | pass→pass | 14,352 | 8,597 | -40% | 1 | 1 | 0% | 2,306 | 2,802 | +22% | 0 | 0 | — |
case-21 | fail→pass | 10,064 | 8,733 | -13% | 1 | 1 | 0% | 1,676 | 2,959 | +77% | 0 | 0 | — |
case-22 | fail→pass | 7,652 | 3,858 | -50% | 1 | 1 | 0% | 1,311 | 1,954 | +49% | 0 | 0 | — |
case-23 | pass→pass | 15,092 | 2,093 | -86% | 1 | 1 | 0% | 2,541 | 1,702 | -33% | 0 | 0 | — |
case-25 | fail→pass | 10,950 | 2,211 | -80% | 1 | 1 | 0% | 1,836 | 1,861 | +1% | 0 | 0 | — |
DecimalAI ran this skill against gemini-3.6-flash twice over the same eval suite — once with the skill loaded and once without — and compared the two runs case by case. 25 cases were attempted. The headline lift of +44 percentage points is the difference between those two pass rates over the 25 comparable cases. 2 cases got worse with the skill loaded, and they are included in that figure.
Without the skill loaded, the model failed this case. With it loaded, the same prompt on the same model passed. This is one improved case from the latest verified run; every case, including any that regressed, is in the table above.
Other measured skills in the registry, with their headline benchmark lift.