CurseForge APIcurseforge.com ↗
Access CurseForge game mods, modpacks, files, and dependency graphs via a structured API. Search projects, list categories, and fetch version details.
What is the CurseForge API?
This API exposes 6 endpoints covering CurseForge's full project catalog — games, mods, modpacks, texture packs, and their associated files and dependencies. Use search_projects to find mods across Minecraft, World of Warcraft, The Sims 4, and dozens of other supported games, filtering by category, sort order, and game version. Each response returns structured fields including download counts, mod loaders, project slugs, and canonical URLs.
No input parameters required.
curl -X GET 'https://api.parse.bot/scraper/f806094d-902d-4b71-ae23-e90d3dfe4ea5/list_games' \ -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 curseforge-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: CurseForge SDK — browse games, search mods, inspect details and files."""
from parse_apis.curseforge_scraper_api import CurseForge, Sort, RelationType, ProjectNotFound
client = CurseForge()
# Browse available games on CurseForge
for game in client.games.list(limit=3):
print(game.name, game.slug, game.mod_count)
# Search for popular magic mods in Minecraft
project = client.projectsummaries.search(
query="botania", sort_by=Sort.DOWNLOADS, limit=1
).first()
if project:
print(project.name, project.author, project.description)
# Navigate to full project details from a search result
try:
detail = project.details()
print(detail.name, detail.downloads, detail.license)
print(detail.mod_loaders, detail.game_versions[:3])
except ProjectNotFound as exc:
print(f"Project gone: {exc.slug}")
# List available files for this project
for f in project.files.list(limit=3):
print(f.name, f.version, f.loader, f.size)
# Check what depends on this project
for rel in project.relations.list(relation_type=RelationType.DEPENDENTS, limit=3):
print(rel.name, rel.downloads, rel.updated)
# List mod categories for filtering
for cat in client.categories.list(limit=5):
print(cat.name, cat.slug)
print("exercised: games.list / projectsummaries.search / details / files.list / relations.list / categories.list")
List all games supported on CurseForge with their mod counts and total download stats. Returns all games in a single page. Each game has a slug usable as input to other endpoints.
No input parameters required.
{
"type": "object",
"fields": {
"games": "array of game objects with name, slug, url, thumbnail, mod_count, and download_count",
"total": "integer total number of games"
},
"sample": {
"data": {
"games": [
{
"url": "https://www.curseforge.com/minecraft",
"name": "Minecraft",
"slug": "minecraft",
"mod_count": "284.5K",
"thumbnail": "https://media.forgecdn.net/game-box-art/432_bc6c42ce-5dd9-496a-a5cd-a51cf3584008.jpg",
"download_count": "115.1B"
}
],
"total": 125
},
"status": "success"
}
}About the CurseForge API
Browsing Games and Categories
list_games returns every game CurseForge supports, with each game object including a slug, thumbnail, and aggregate download stats. That slug is the required input for most other endpoints. Before running a search, call get_categories with a game and class (e.g., minecraft / mc-mods) to retrieve valid slug values for the category filter — passing an invalid category slug to search_projects will silently return unfiltered results.
Searching and Inspecting Projects
search_projects accepts up to six parameters: game, class, query, sort_by, category, and page. Results come back in pages of up to 20 items, each containing a project's name, slug, description, author, and stats such as total downloads. The sort_by field accepts relevancy, popularity, creation, updated, name, or downloads. To get the full project description as HTML, call get_project_details with the same game, class, and the slug from the search result. The details object includes game_versions, mod_loaders, license, project_id, and categories.
Files and Dependency Graph
get_project_files returns every downloadable release for a project. Each file object includes type (e.g., release or beta), version, loader, size, date, and per-file downloads. This is useful for resolving which file matches a specific Minecraft version and loader (Forge, Fabric, NeoForge). get_project_relations maps the dependency graph in both directions: set relation_type to dependencies to see what a mod requires, or dependents to see which other mods list it as a requirement. Each relation object carries the related project's slug, thumbnail, downloads, and updated timestamp.
The CurseForge API is a managed, monitored endpoint for curseforge.com — not a raw scraper you maintain. Every endpoint is automatically health-checked on a schedule, and when curseforge.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 curseforge.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 mod compatibility checker that resolves
dependenciesfor a given modpack usingget_project_relations. - Track download growth over time by periodically calling
search_projectssorted bydownloadsfor a specific game. - Generate a mod catalog for a launcher app by paginating
search_projectsacross all categories returned byget_categories. - Identify the latest stable release for a mod targeting a specific
versionandloaderviaget_project_files. - Index all CurseForge-supported games and their mod counts using the
statsfield fromlist_games. - Map the full dependency tree of a large modpack by recursively calling
get_project_relationswithrelation_type=dependencies. - Filter texture packs by category and sort by
updatedto surface recently maintained resources for a game.
| 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 CurseForge have an official developer API?+
What does `get_project_details` return beyond what `search_projects` already includes?+
search_projects returns summary fields — name, slug, author, thumbnail, and aggregate stats. get_project_details adds description_html (the full formatted project description), license, project_id, game_versions, mod_loaders, and the complete categories list. You need the game, class, and slug from a search result to call it.Are user comments, reviews, or ratings for projects available?+
How does pagination work for `search_projects` and `get_project_relations`?+
page parameter (starting at 1 or 0 depending on your test) to step through results. The total field in the response reflects the count of items on the current page, not the total across all pages, so you cannot determine total project count from a single call.Can I retrieve a project's changelog or patch notes for individual files?+
get_project_files returns per-file metadata including name, type, version, loader, size, date, and downloads, but not changelog text. You can fork this API on Parse and revise it to add a file changelog endpoint.