Hyperskill APIhyperskill.org ↗
Access Hyperskill.org learning data via API: browse tracks, projects, stages, topics, and providers. Filter by language, category, or track ID.
What is the Hyperskill API?
The Hyperskill.org API exposes 10 endpoints covering the platform's full curriculum catalog — tracks, projects, project stages, topics, and content providers. Use list_tracks to page through every available learning track with optional category filtering, or call get_topic to retrieve detailed metadata for any individual topic by ID. All list endpoints return paginated results with has_next and has_previous fields for cursor control.
curl -X GET 'https://api.parse.bot/scraper/13ef78bb-f385-4a72-a394-aac986918253/list_tracks?page=1&category=1&page_size=3' \ -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 hyperskill-org-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: Hyperskill SDK — explore tracks, projects, stages, topics, and providers."""
from parse_apis.hyperskill_org_scraper_api import Hyperskill, NotFound
client = Hyperskill()
# List Python tracks, capped to 5 total items
for track in client.tracks.list(page_size=5, limit=5):
print(track.title, track.members_count, track.topics_count)
# Drill into one project and list its stages
project = client.projects.list(language="python", limit=1).first()
if project:
print(project.title, project.language, project.stages_count)
for stage in project.stages.list(limit=3):
print(stage.order, stage.title, stage.description)
# Fetch a specific track by ID and walk its topics
try:
track = client.tracks.get(id=2)
print(track.title, track.slug)
except NotFound as exc:
print(f"Track not found: {exc}")
# Browse topics for a track via sub-resource
if track:
for topic in track.topics.list(page_size=3, limit=3):
print(topic.title, topic.is_group)
# Explore content providers
provider = client.providers.list(limit=1).first()
if provider:
print(provider.title, provider.topics_count, provider.projects_count)
print("exercised: tracks.list / tracks.get / projects.list / project.stages.list / track.topics.list / providers.list")
List all tracks (courses) on Hyperskill. Returns paginated results with track summaries including title, description, member count, and topic count. Requesting a page beyond available results returns an upstream error.
| Param | Type | Description |
|---|---|---|
| page | integer | Page number. |
| category | integer | Filter by track category ID (e.g. 1). |
| page_size | integer | Number of tracks per page. |
{
"type": "object",
"fields": {
"meta": "object with pagination info (page, has_next, has_previous)",
"tracks": "array of track objects with id, title, description, members_count, topics_count, cover, slug, projects, provider_id"
},
"sample": {
"data": {
"meta": {
"page": 1,
"has_next": true,
"has_previous": false
},
"tracks": [
{
"id": 2,
"slug": "python-developer",
"cover": "https://hs.azureedge.net/media/tracks/9368deaab97441f192fd4c8db42cb9bc/python.svg",
"title": "Python Developer",
"is_beta": false,
"projects": [
68,
69,
73
],
"is_public": true,
"description": "Acquire key skills to build a strong foundation for a career in tech.",
"provider_id": 2,
"topics_count": 274,
"members_count": 220994
}
]
},
"status": "success"
}
}About the Hyperskill API
Tracks and Projects
The list_tracks endpoint returns paginated track objects alongside a meta object containing page, has_next, and has_previous. You can narrow results with the category parameter (integer category ID) or adjust page size with page_size. For a single track, get_track accepts an id and returns the full track object inside a tracks array. list_projects works similarly and adds a language filter (e.g. python, java, kotlin) so you can pull only projects for a specific language stack.
Stages and Topics
list_project_stages requires a project_id and returns the ordered stages for that project — useful for mapping out the progression inside any given project. Note that requesting a page number beyond the available stage count returns a 404 rather than an empty list, so you should stop paginating once has_next is false. list_topics accepts an optional track_id to scope topics to a single track, letting you reconstruct the full topic syllabus for any course.
Providers
The list_providers and get_provider endpoints expose the content providers behind Hyperskill's material. Like the other list endpoints, list_providers returns a meta pagination object and a providers array. Fetching beyond the last page returns a 404, not an empty result — handle this in your pagination loop accordingly. Provider detail is available via get_provider with a required integer id.
The Hyperskill API is a managed, monitored endpoint for hyperskill.org — not a raw scraper you maintain. Every endpoint is automatically health-checked on a schedule, and when hyperskill.org 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 hyperskill.org 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 curriculum explorer that maps every topic in a track using
list_topicsfiltered bytrack_id. - Aggregate project metadata by programming language with
list_projectsand thelanguagefilter. - Reconstruct the stage-by-stage structure of any project using
list_project_stageswith aproject_id. - Sync Hyperskill track and project data into an internal learning management or recommendation system.
- Compare content provider offerings by iterating
list_providersand pulling detail withget_provider. - Index Hyperskill's full topic catalog for a searchable developer learning resource directory.
- Monitor curriculum changes over time by periodically diffing
list_trackspaginated responses.
| 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 Hyperskill have an official public developer API?+
What does `list_project_stages` return, and how do I paginate it?+
list_project_stages requires a project_id and returns a stages array alongside a meta object with page, has_next, and has_previous. Requesting a page beyond the last available stage returns a 404 error rather than an empty list, so you should stop pagination as soon as has_next is false rather than relying on an empty response as the termination signal.Can I filter topics by difficulty level or completion status?+
list_topics endpoint supports filtering by track_id and controls pagination via page and page_size. Difficulty level and user completion status are not exposed as filter parameters or response fields. You can fork this API on Parse and revise it to add the missing endpoint if that data is available from the source.Does the API expose user profiles, enrollments, or progress data?+
How does pagination work across list endpoints, and what happens at the boundary?+
list_tracks, list_projects, list_project_stages, list_topics, list_providers) return a meta object with page, has_next, and has_previous fields. Requesting any page number beyond the last available page returns a 404 error from upstream — the API does not return an empty array. Build your pagination loop to stop when has_next is false to avoid triggering this error.