CurseForge API

The CurseForge API allows users to automate managing their projects, and retrieve data such as game versions and dependencies from CurseForge.

Please note URIs relative to the site the project is on (https://minecraft.curseforge.com for example), unless otherwise noted

 


Generate a Token

To access the API, you must first generate an API token. To do that, go to API Tokens.

 


Authentication

To authenticate with the API, you must provide your generated token using the X-Api-Token header, or the tokenquery string parameter.

 


Game Dependencies API

To retrieve a list of game dependencies issue a GET request to /api/game/dependencies. It will return an array of json objects containing the following data:

{
    id: 42,
    name: "Bukkit",
    slug: "bukkit"
}

 


Game Versions API

To retrieve a list of game versions issue a GET request to /api/game/versions. It will return an array of json objects containing the following data:

{
    id: 158,
gameVersionTypeID: 42, name: "1.8.4", slug: "1-8-4" }

 


Project Upload File API

To upload a file, issue a POST multipart/form-data request to /api/projects/<projectID>/upload-file, containing two fields: metadata and file, which must be the actual file. The ID of your project will be in the URL when you go to its overview page.

metadata must contain a json object with the following fields:

{
    changelog: "A string describing changes.", //Can be HTML or markdown if changelogType is set.
changelogType: ['text', 'html', 'markdown'], //Optional: defaults to text displayName: "Foo", // Optional: A friendly display name used on the site if provided. parentFileID: 42, // Optional: The parent file of this file. gameVersions: [157, 158], // A list of supported game versions, see the Game Versions API for details. Not supported if parentFileID is provided. releaseType: "alpha" // One of "alpha", "beta", "release". }

On successful upload, returns a json object containing the new file's ID:

{
    id: 20402
}

 


 

Project File Management API

To update a file, issue a POST multipart/form-data request to /api/projects/<projectID>/update-file, containing the field: metadata. The ID of your project will be in the URL when you go to its overview page.

metadata must contain a json object with the following fields:

{
fileID: 20402, //This is the file ID you are updating. This is required.

//Note: These are all optional fields, you can include any of these in any combination. The API will fail if you do not include any settings to change. changelog: "A string describing changes.", //Can be HTML or markdown if changelogType is set.
changelogType: ['text', 'html', 'markdown'], // displayName: "Foo", //A friendly display name used on the site if provided. gameVersions: [157, 158], // A list of supported game versions, see the Game Versions API for details. Not supported if parentFileID is provided. releaseType: "alpha" // One of "alpha", "beta", "release". }

On successful upload, returns a json object containing the old file ID:

{
    id: 20402
}

 


Maven

CurseForge includes a maven endpoint so that you can include your dependancies using any build scripts that support maven. Please note that due to how maven works you do not provide your API key as a header, but as part of the maven URL. 

 

https://www.curseforge.com/api/maven/{projectSlug}/{mavenArtifact}/{mavenVersion}/{projectFileNameArtifact}-{projectFileNameVersion}-{projectFileNameTag}.jar

 

This is the Maven full URL. Below is the explanation of each part, and where you can find that information. For the examples below we will be using the CoFHCore Project.

 

{projectSlug}: The slug of the project you want to use. In our example its cofhcore

{mavenArtifiact}: This should be the files name, in our example CoFHCore-1.10.2

{mavenVersion}: This should be what release you want, in our case we are going to use release as this gives us the latest, but you can also use the file version in the name (Such as 4.1.0.155 for CoFHCore-1.10.2-4.1.0.155-universal.jar)

{projectFileNameArtifact}: The same as mavenArtifact

{projectFileNameVersion}: The same as mavenVersion

{projectFileNameTag}: The name tag on the file, on older mods it would be dev on newer ones it might be universal, in our case its universal

 

This puts our final example link at:

https://minecraft.curseforge.com/api/maven/cofhcore/CoFHCore-1.10.2/release/CoFHCore-1.10.2-release-universal.jar

 

If you want to use the maven with ForgeGradle I've also provided the same example in the script below

 

This goes above apply plugin: 'forge'

repositories {
    maven {
        name = "CurseForge"
        url = "https://minecraft.curseforge.com/api/maven/"
    }
}


Then add this to dependencies

compile 'cofhcore:CoFHCore-1.10.2:release:universal'

Localization

Export

The localization API allows exporting via a GET request. Below is the list of optional parameters that are accepted by the endpoint. These all correspond to the available feature on the export page, and none are required.

https://wow.curseforge.com/api/projects/{projectID}/localization/export

 

Parameter
Options
Default
Description
export-type [Table, TableAdditions, GlobalStrings] TableAdditions What format you want your export to be in
lang [enUS, deDE, esES, ect] enUS The locale for language you are exporting 
unlocalized [ShowPrimary, ShowPrimaryAsComment, ShowBlankAsComment, Ignore] ShowPrimary What happens to unlocalized phrases must be one of the following
table-name Any string L Name of the your table, this defaults to L
escape-non-ascii-characters [true, false] false Escape non-ASCII characters
true-if-value-equals-key [true, false] false Set value to true if equals to key
concatenante-subnamespaces [true, false] false Concatenate subnamespaces with /
namespaces Any namespace name, comma delimited Base Namespace

List of namespaces you want to include by name, defaults to your base namespace

 

 

Import

The localization API allows importing via a POST request with a JSON data blob. 

https://wow.curseforge.com/api/projects/{projectID}/localization/import

Below is an example payload

{
metadata: {
//Note all of these are optional exception language
language: "enUS", //[enUS, deDE, esES, ect], Required, No Default
namespace: "toc", //Any namespace name, comma delimited. Default: Base Namespace
formatType: TableAdditions, //['GlobalStrings','TableAdditions','SimpleTable']. Default: TableAdditions
missing-phrase-handling: DoNothing //['DoNothing', 'DeleteIfNoTranslations', 'DeleteIfTranslationsOnlyExistForSelectedLanguage', 'DeletePhrase']. Default: DoNothing
},
localizations: "Localizations To Import"
}