Duolingo APIduolingo.com ↗
Access Duolingo's full language course catalog via API. Retrieve course listings with learner counts, source languages, and target language pairs.
What is the Duolingo API?
The Duolingo API exposes 1 endpoint — list_courses — that returns the complete catalog of language learning courses available on Duolingo, including learner enrollment counts and source/target language pairings. Each course object identifies the language being taught and the language instruction is delivered in, making it straightforward to map out which learning paths exist across Duolingo's full offering.
curl -X GET 'https://api.parse.bot/scraper/3ea1693d-acff-4d24-a6fb-2564d076ae55/list_courses?from_language=en' \ -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 duolingo-com-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.
"""Walkthrough: Duolingo SDK — bounded, re-runnable; every call capped."""
from parse_apis.duolingo_com_api import Duolingo, ParseError
client = Duolingo()
# List courses available for English speakers, capped at 3
for course in client.courses.list(from_language="en", limit=3):
print(course.learning_language_name, course.num_learners)
# Get the first course from the full catalog
top = client.courses.list(limit=1).first()
if top:
print(top.learning_language_name, "from", top.from_language_name, "-", top.num_learners, "learners")
# Typed error handling around a call
try:
for course in client.courses.list(from_language="es", limit=2):
print(course.learning_language_name, course.from_language_name, course.phase)
except ParseError as e:
print(f"error: {e.code}")
print("exercised: courses.list")
Returns all available Duolingo courses. Each course represents a learning path from one language to another. Results are returned in a single page. Optionally filter by the source language (the language instruction is given in) using from_language.
| Param | Type | Description |
|---|---|---|
| from_language | string | ISO 639-1 language code for the source language (instruction language). Filters courses to only those taught from this language. Example: 'en' for English, 'es' for Spanish. |
{
"type": "object",
"fields": {
"total": "integer total number of courses returned",
"courses": "array of course objects with learning/from language details and learner counts"
},
"sample": {
"data": {
"total": 40,
"courses": [
{
"phase": 3,
"num_learners": 41959815,
"from_language": "en",
"learning_language": "es",
"from_language_name": "English",
"learning_language_name": "Spanish"
},
{
"phase": 3,
"num_learners": 22816034,
"from_language": "en",
"learning_language": "fr",
"from_language_name": "English",
"learning_language_name": "French"
}
]
},
"status": "success"
}
}About the Duolingo API
What the API Returns
The list_courses endpoint returns an array of course objects alongside a total integer indicating how many courses matched. Each course object includes details about the target language (the language being learned), the source language (the language instruction is given in), and the number of learners currently enrolled. This gives a clear, structured view of Duolingo's complete course matrix.
Filtering by Source Language
The from_language parameter accepts an ISO 639-1 language code and narrows results to only those courses taught in that instruction language. For example, passing from_language=es returns all courses where instruction is delivered in Spanish. Omitting the parameter returns the full catalog across all instruction languages.
Response Shape and Coverage
Results are returned in a single, unpaginated response — there is no cursor or page offset to manage. The courses array and total field give a snapshot of currently available course offerings. Learner counts per course reflect enrollment figures as exposed in Duolingo's public course data, useful for understanding relative course popularity across language pairs.
The Duolingo API is a managed, monitored endpoint for duolingo.com — not a raw scraper you maintain. Every endpoint is automatically health-checked on a schedule, and when duolingo.com 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 duolingo.com 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 language course discovery tool that lists all available Duolingo learning paths by target language.
- Analyze course popularity by comparing learner counts across different source/target language pairs.
- Filter courses available to Spanish-speaking learners using the
from_languageparameter to surface relevant options. - Map out which source languages Duolingo supports for instruction to evaluate coverage for a specific user audience.
- Generate a structured dataset of language pair availability for research into global language learning trends.
- Integrate Duolingo course metadata into an education platform to recommend language paths based on a user's native language.
| Tier | Price | Credits/month | Rate limit |
|---|---|---|---|
| Free | $0/mo | 200 | 5 req/min |
| Hobby | $30/mo | 1,000 | 20 req/min |
| Developer | $100/mo | 5,000 | 100 req/min |
| Team | $300/mo | 20,000 | 300 req/min |
| Company | $1,000/mo | 100,000 | 500 req/min |
Each endpoint has a fixed posted price per successful call — most fall between 1 and 10 credits — shown on this API's page before you run it. Exceeding the rate limit returns a 429 response. Authenticate with the X-API-Key header.
Does Duolingo have an official public developer API?+
What does the `list_courses` endpoint actually return for each course?+
total field at the top level tells you how many courses were returned in that response.Does the API return pagination tokens or support offset-based filtering for large result sets?+
list_courses endpoint returns all matching courses in a single response with no pagination. The only available filter is from_language, which scopes results to a specific instruction language.Does the API return individual user progress, XP, streaks, or leaderboard data?+
Can I filter courses by the target language rather than the source language?+
from_language, which filters by the instruction language. Filtering by target language is not a built-in parameter. You can fork this API on Parse and revise it to add target-language filtering logic.