J
← Launcher support

Launcher API

Put a Jace Store browser inside your Minecraft launcher. Search mods, resource packs, shaders, data packs, modpacks, plugins and worlds; resolve the right file for an instance; install it; and check for updates. Public, read-only, no key needed, CORS enabled.

https://jace-store-deb.vercel.app/api/launcher/v1

Spec: openapi.json. Please send a descriptiveUser-Agent (e.g. MyLauncher/2.1 (contact@example.com)).

Endpoints

GET/metaTypes, loaders, categories, game versions and install folders, for building filter UI
GET/search?q=&type=mod&loader=fabric&game_version=1.21.1&category=&sort=downloads&page=1&limit=20Browse/search. type, loader and category take comma lists. edition=bedrock|all for Bedrock content
GET/featured?type=mod&edition=java&limit=10Popular, recently updated and newest rows for a home screen
GET/project/{slug}Details: Markdown description, gallery, links, install info, featured version
GET/project/{slug}/versions?loader=&game_version=&channel=releaseVersion list filtered for an instance
GET/project/{slug}/resolve?loader=fabric&game_version=1.21.1The one file to install for an instance, plus where it goes
POST/updatesSend file hashes from an instance; get back what's installed and available updates
GET/openapi.jsonOpenAPI 3.1 spec, for generating clients

Typical flow

  1. Build filters from /meta (cache it; it rarely changes).
  2. Show a browser with /featured on open and /search as the user types, passing the instance's loader and game version so only compatible content shows.
  3. Open a project with /project/{slug}. The description is Markdown; gallery is a list of image URLs.
  4. Install: call /resolve with the instance's loader + version, download file.url, verify file.hashes.sha1, and save it to install.path inside the instance. Modpacks (install.method = "import_instance") are .mrpack/.zip files to feed your instance importer.
  5. Update: hash the files in mods/, resourcepacks/, shaderpacks/ and POST them to /updates.

Example (JavaScript)

const API = "https://jace-store-deb.vercel.app/api/launcher/v1";
const instance = { loader: "fabric", game_version: "1.21.1" };

// 1. search
const res = await fetch(`${API}/search?${new URLSearchParams({ q: "minimap", type: "mod", ...instance })}`);
const { hits } = await res.json();

// 2. resolve + install
const r = await (await fetch(`${API}/project/${hits[0].slug}/resolve?${new URLSearchParams(instance)}`)).json();
const bytes = new Uint8Array(await (await fetch(r.file.url)).arrayBuffer());
const sha1 = [...new Uint8Array(await crypto.subtle.digest("SHA-1", bytes))].map(b => b.toString(16).padStart(2, "0")).join("");
if (r.file.hashes && sha1 !== r.file.hashes.sha1) throw new Error("hash mismatch");
// write bytes to <instance>/${r.install.path}

Example (Python)

import hashlib, pathlib, requests

API = "https://jace-store-deb.vercel.app/api/launcher/v1"
HEADERS = {"User-Agent": "MyLauncher/1.0"}
mods = pathlib.Path("~/.minecraft/mods").expanduser()

hashes = {hashlib.sha1(p.read_bytes()).hexdigest(): p for p in mods.glob("*.jar")}
r = requests.post(f"{API}/updates", headers=HEADERS, json={
    "hashes": list(hashes), "loader": "fabric", "game_version": "1.21.1",
}).json()

for h, info in r["results"].items():
    if info["update_available"]:
        f = info["latest_file"]
        print(f"{info['project']['title']}: {info['current_version']['version_number']} -> {info['latest_version']['version_number']}")
        data = requests.get(f["url"], headers=HEADERS).content
        assert hashlib.sha1(data).hexdigest() == f["hashes"]["sha1"]
        (mods / f["filename"]).write_bytes(data)
        hashes[h].unlink()

Notes

  • file.url goes through the download counter and redirects to direct_url. Follow redirects.
  • Files can be hosted elsewhere (external: true). Minecraft files always have SHA-1 and SHA-512 so you can verify them.
  • resolve defaults to channel=release and respects a version the creator pinned as primary, if it fits the instance.
  • Responses are cached at the edge for 30-120 seconds; /updates is never cached.
  • Bedrock Edition content (add-ons, texture packs, worlds, skin packs, world templates) hasedition: "bedrock" and install.method = "bedrock_import": open or import the.mcpack/.mcaddon/.mcworld/.mctemplate file with the game instead of copying it to a folder. Without a type, search and featured return Java content only; pass edition=bedrock or edition=all. Bedrock uses its own version numbers (bedrock_game_versions in /meta).
  • Need Modrinth-compatible endpoints instead? See /api/v2.