Update links for CurseForge Projects.

Enable the built-in MinecraftForge Update system or NeoForge Update system with your mod with no code changes or hosting of websites. By using the power of CurseForge, let us manage the JSON so you can focus on creating your mods!

View Documentation ▾

What is CurseUpdate?

We query CurseForge and retrieve all versions of your mod. We parse each of your files and pull the versions from your mods.toml. Using this, we construct the appropriate JSON structure needed for Forge's update checker. This means we provide the most accurate versions of your mod for Forge to look at. We do not rely on specific file names or structures, and can support all the mod ids in your mods.

We also offer this JSON structure for non-Forge files as well. While Fabric and other mod loaders may not offer the same system, we have chosen to provide this structure to those mods, so they can implement their own version checker. For Fabric-based mods, we read the fabric.mod.json or quilt.mod.json file to pull the needed data. For older versions of Forge, we use the file.

For this service to work, a mod must allow third-party downloads. This is required in order for us to download the JAR files for processing. Disabling third-party downloads will prevent us accessing the required files in the JAR to generate a proper response.


The CurseForge UpdateJson API is available at

Project update jsons can be retrieved by making a GET request to this endpoint where the URL contains several pieces of information.


Project IDs can be found by going to your project on CurseForge and looking for the "Project ID" on the right. The mod id is your modid from the mods.toml file.

The loader is the slug name of a mod loader supported by CurseForge. Commonly, this will be forge, fabric, or neoforge.

Alternatively, the hostname can be used to pass the loader. This would follow the following structure:

GET https://{loader}{projectId}/{modid}

Example: GET


Example: GET


Example: GET

    "promos": {
        "1.14.4-latest": "5.7.0",
        "1.14.4-recommended": "5.7.0",
        "1.15.2-latest": "5.7.0",
        "1.15.2-recommended": "5.7.0",
        "1.16.2-latest": "5.7.3",
        "1.16.2-recommended": "5.7.3",
        "1.16.3-latest": "5.7.3",
        "1.16.3-recommended": "5.7.3",
        "1.16.4-latest": "5.7.3",
        "1.16.4-recommended": "5.7.3",
        "1.16.5-latest": "5.8.0beta1",
        "1.16.5-recommended": "5.7.3",
        "1.17.1-latest": "5.8.0beta1",
        "1.17.1-recommended": "5.7.3",
        "1.18-latest": "5.8.0alpha3"
    "homepage": ""


  "1.14.4-latest": "",
  "1.14.4-recommended": "",
  "1.15.2-latest": "",
  "1.15.2-recommended": "",
  "1.16.2-latest": "",
  "1.16.2-recommended": "",
  "1.16.3-latest": "",
  "1.16.3-recommended": "",
  "1.16.4-latest": "",
  "1.16.4-recommended": "",
  "1.16.5-latest": "",
  "1.16.5-recommended": "",
  "1.17.1-latest": "",
  "1.17.1-recommended": "",
  "1.18.1-latest": ""

For non-Forge mods, there is no defined structure offered by other teams. As such, we return the same JSON structure. To get data for those other mods, you can pass the modloader slug (in parenthesis next to each name in the below list) to the URL in the ml query param. This list includes (but not limited to):

Example: GET


Each request response is a JSON document containing either project version data or an error.

Project Data

Data is pulled from CurseForge directly, with mod versions cached locally to avoid heavy pulls from CurseForge. This does mean that if we have not seen a project before, the first call will be slow, as we have to pull files from CurseForge to populate this cache, but future updates and calls will be served quickly.

Each time a new file is released on CurseForge and a call is made to this service, we pull the new file and analyze it to update the json.


All URL calls are cached for a short period of time on the backend server, so that repeated calls to the same URL do not overload CurseForge with requests, and can be quickly served to end users. In the event this cache needs to be purged for a specific URL, /expire can be added to the URL to force it to be expired. Do note this is only meant for updating the JSON immediately after a release. Abuse of this feature will result in it being removed.


We now have a Discord! -

You can also reach out via Private Message on or email —


Traffic may routed through Cloudflare, which follows the Cloudflare Privacy Policy.

The following data is stored on the backend for analytical and security purposes:

Data is not linked to a specific user or account, nor can the data collected be used to do so.

Aggregated data may be provided to mod authors to help provide statistics of their mod usage. This data only will include general counts and will never contain the IP of a user, or raw URL and User Agents.