Analyze most-taught books and texts via Open Syllabus analytics
Scanned 6/6/2026
Install via CLI
openskills install brycewang-stanford/Auto-Empirical-Research-Skills---
name: open-syllabus-api
description: "Analyze most-taught books and texts via Open Syllabus analytics"
metadata:
openclaw:
emoji: "📖"
category: "domains"
subcategory: "education"
keywords: ["Open Syllabus", "syllabi analytics", "teaching data", "textbook rankings", "curriculum analysis", "higher education"]
source: "https://opensyllabus.org/"
---
# Open Syllabus API
## Overview
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.
## Explorer Interface
### Web Search
```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
```
### API Access
```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"
```
### Query Parameters
| 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` |
## Key Metrics
| 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 |
## Python Usage
```python
import 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)")
```
## Top Assigned Works (Examples)
| 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 |
## Use Cases
1. **Curriculum design**: Find canonical texts in a discipline
2. **Textbook market research**: Identify widely adopted materials
3. **Teaching trends**: Track changes in assigned readings over time
4. **Interdisciplinary mapping**: Discover texts bridging fields
5. **Academic publishing**: Understand teaching impact vs. citation impact
## References
- [Open Syllabus](https://opensyllabus.org/)
- [Open Syllabus Explorer](https://explorer.opensyllabus.org/)
- Sinykin, D. & McLaughlin, T. (2021). "Mapping the Disciplinary Canon with Open Syllabus." *Cultural Analytics*.
No comments yet. Be the first to comment!